Ben Lin
2025-03-08 745815f637e5385b2cbc23a6ae02401bb8b6c675
src/views/tigerprojects/system/lowcode/detail/index.vue
@@ -4,102 +4,60 @@
 * @version: 
 * @Date: 2024-05-30 13:28:20
 * @LastEditors: Ben Lin
 * @LastEditTime: 2024-06-25 14:41:28
 * @LastEditTime: 2024-07-22 01:55:07
-->
<template>
  <PageWrapper :title="pageTitle" :content="contentStr" contentBackground @back="goBack">
    <template #footer>
      <a-tabs default-active-key="detail" v-model:activeKey="currentKey" @tabClick="tabClkcallback">
        <a-tab-pane key="detailfirst" :tab="firstTabName" />
        <a-tab-pane key="detailsecond" :tab="secondTabName" />
        <a-tab-pane v-for="t in TabList" :tab="t.name" :key="t.key" />
      </a-tabs>
    </template>
    <div>
      <div v-if="currentKey == 'detailfirst'">
      <div  v-for="t in TabList" :key="t.key">
        <Suspense>
          <detail :entityName="entityName" />
          <detail :entityName="t.entityName" v-if="currentKey == t.key"/>
        </Suspense>
      </div>
      <div v-if="currentKey == 'detailsecond'">
        <Suspense></Suspense>
      </div>
    </div>
    <CustModal
      @register="registerCust"
      @success="custSuccess"
      :type="cType"
      :detailSlots="dtlSlots"
    >
      <!-- 用插槽自定义多表单 -->
      <template #[item.name] v-for="item in dtlSlots" :key="item.name">
        <BasicForm @register="useFormData[item.name][0]" v-if="useFormData[item.name]">
          <!-- 用插槽自定义弹出选择框 -->
          <template #[name]="{ field }" v-for="name in item.slots" :key="name">
            <a-button
              class="mt-1 ml-1"
              size="small"
              @click="handleCustClick(field)"
              :preIcon="item.preIcons[name]"
            />
            <GeneralModal
              @register="useModalData[name][0]"
              @success="(d, u) => handleEntSuccess(d, u, item.name)"
            />
          </template>
        </BasicForm>
        <!-- 自定义内容 -->
      </template>
    </CustModal>
  </PageWrapper>
</template>
<script lang="ts" setup>
  import { ref, provide, Ref } from 'vue';
  import { ref, reactive, provide, Ref, defineAsyncComponent } from 'vue';
  import { useRoute } from 'vue-router';
  import { PageWrapper } from '/@/components/Page';
  import { useTabs } from '/@/hooks/web/useTabs';
  import { Tabs } from 'ant-design-vue';
  import { useGo } from '/@/hooks/web/usePage';
  import { OpenCustModal, custOnChange } from '../data';
  import detail from './detail.vue';
  import { custOnChange } from '../data';
  import { useI18n } from '/@/hooks/web/useI18n';
  import { useMessage } from '/@/hooks/web/useMessage';
  import GeneralModal from '/@/views/components/GeneralModal.vue';
  import CustModal from '/@/views/components/CustModal.vue';
  import { BasicForm } from '/@/components/Form/index';
  import { useGlobSetting } from '/@/hooks/setting';
  import { useModal } from '/@/components/Modal';
  const { t } = useI18n();
  const { createMessage } = useMessage();
  const detail = defineAsyncComponent(() => import('./detail.vue'));
  const route = useRoute();
  const objParams = ref(JSON.parse(decodeURI(route.params?.id as string)));
  // const objParams = ref(JSON.parse(decodeURI(route.params?.id as string)));
  const routeParams = ref(JSON.parse(decodeURI(route.params?.id as string)));
  // 从sessionStorage中读取参数并转换回对象
  const savedParams = sessionStorage.getItem(`${routeParams.value.sName}_params`);
  const objParams = savedParams ? ref(JSON.parse(decodeURI(savedParams))) : ref({});
  const ATabs = ref(Tabs);
  const ATabPane = ref(Tabs.TabPane);
  var ITEM_CODE = ref('');
  const go = useGo();
  const pageTitle = ref(objParams.value.pageTitle);
  const contentStr = ref(objParams.value.contentStr);
  const firstTabName = ref(objParams.value.firstTabName);
  const secondTabName = ref(objParams.value.secondTabName);
  const entityName = ref(objParams.value.Name);
  // const firstTabName = ref(objParams.value.firstTabName);
  // const secondTabName = ref(objParams.value.secondTabName);
  const TabList = reactive(objParams.value.Tabs);
  const entityName = ref(routeParams.value.Name);
  const detailName = ref(objParams.value.detailName);
  const globSetting = useGlobSetting();
  const formSchemas = ref({}); //弹出框多表单结构
  const useModalData = ref({}); //表单中插槽渲染按钮打开模态框useModal方法
  const useFormData = ref({});
  const secondColSlots = ref<any>(objParams.value.secondColSlots); //按钮插槽
  const crudColSlots = ref<any>(objParams.value.colSlots);
  const cType = ref('');
  const dtlSlots = ref([] as any[]);
  const selectVals = ref({});
  const others = ref<any>(null);
  const keyFieldValues = ref<any>(null);
  provide<Ref<any>>('objParams', objParams.value);
  provide<Ref<any>>('others', others);
  const [registerCust] = useModal();
  provide<Ref<any>>('keyFieldValues', keyFieldValues);
  var currentKey = ref('detailfirst');
  var currentKey = ref(TabList[0].key);
  const { setTitle } = useTabs();
  // 设置Tab的标题(不会影响页面标题)
@@ -113,7 +71,7 @@
        .then((m) => {
          const [{ GetHomeUrl }] = m.default();
          // 本例的效果时点击返回始终跳转到账号列表页,实际应用时可返回上一页
          go(GetHomeUrl(entityName.value));
          go(GetHomeUrl({ colSlots: crudColSlots.value }));
        })
        .catch(() => {});
    } catch (e) {}
@@ -140,50 +98,5 @@
        };
      };
    }
  }
  /**
   * @description: 自定义弹出框确定返回
   * @param {*} d
   * @return {*}
   */
  function custSuccess(d) {
    // reload();
  }
  /**
   * @description: 各表单内弹出选择框选择成功后方法
   * @param {*} d
   * @param {*} u
   * @param {*} item
   * @return {*}
   */
  function handleEntSuccess(d, u, item) {
    /* 动态import实体名.ts的自定义方法 */
    try {
      import(`../entityts/${cType.value}.ts`).then((m) => {
        const [{ GetSelectSuccess }] = m.default();
        var values = GetSelectSuccess(d, u);
        selectVals.value = values; //保存弹出框选择的结果
        let _val = {};
        _val[d.returnFieldName] = values[d.returnFieldName];
        useFormData.value[item][1].setFieldsValue(_val);
      });
    } catch (e) {}
  }
  /**
   * @description: 打开自定义模态框
   * @param {*} item
   * @return {*}
   */
  function handleCustClick(item) {
    OpenCustModal(
      useModalData.value[item][1].openModal, //带入openModal方法
      cType.value,
      item,
      [],
      // selectVals.value['ROUTE_CODE'],
    ); //[openRvModal], selectVals.value['ID']这是自定义参数,按实际需求
  }
</script>