Ben Lin
2024-07-03 46c3d28c5633baaddad0da441185310b9360a45b
src/views/tigerprojects/system/lowcode/normal/index.vue
@@ -4,33 +4,13 @@
 * @version: 
 * @Date: 2024-05-30 13:28:20
 * @LastEditors: Ben Lin
 * @LastEditTime: 2024-06-22 00:57:52
 * @LastEditTime: 2024-07-03 08:52:44
-->
<template>
  <div>
    <BasicTable @register="registerTable" v-if="isMounted">
      <template #toolbar>
        <a-button type="primary" @click="handleCreate" preIcon="add_02|svg"> 新增 </a-button>
      </template>
      <template #action="{ record }">
        <TableAction :actions="createActions(record)" />
      </template>
      <template #[item]="{ field }" v-for="item in colSlots" :key="item">
        <!-- <template #form-BAS_REASON3aadd="{ field }"> -->
        <a-button
          v-if="field"
          class="mt-1 ml-1"
          size="small"
          @click="handleSelectItem(item)"
          preIcon="search|svg"
        />
        <GeneralModal
          @register="registerItemAdd"
          @success="(d, u) => handleItemSuccess(d, u, item)"
        />
      </template>
    </BasicTable>
    <normalDrawer @register="registerDrawer" @success="handleSuccess" />
    <Suspense>
      <mainTable />
    </Suspense>
    <CustModal
      @register="registerCust"
      @success="custSuccess"
@@ -60,179 +40,50 @@
  </div>
</template>
<script lang="ts" setup>
  import { h, onMounted, ref, unref } from 'vue';
  import {
    BasicTable,
    useTable,
    TableAction,
    BasicColumn,
    FormSchema,
    ActionItem,
  } from '/@/components/Table';
  import { useDrawer } from '/@/components/Drawer';
  import normalDrawer from '../normalDrawer.vue';
  import { Ref, h, onMounted, provide, ref, unref } from 'vue';
  import mainTable from './mainTable.vue';
  import GeneralModal from '/@/views/components/GeneralModal.vue';
  import { DeleteEntity, GetEnum, getEntity, getListByPage } from '/@/api/tigerapi/system';
  import { useGlobSetting } from '/@/hooks/setting';
  import { useRoute } from 'vue-router';
  import { useRoute, useRouter } from 'vue-router';
  import { Tag, Tooltip } from 'ant-design-vue';
  import CustModal from '/@/views/components/CustModal.vue';
  import { BasicForm, FormActionType, useForm } from '/@/components/Form/index';
  import { BasicForm, useForm } from '/@/components/Form/index';
  import { isNullOrEmpty, isNullOrUnDef } from '/@/utils/is';
  import {
    GetActionColumn,
    GetActionsData,
    OpenSelectItem,
    GetSelectSuccess,
    custOnChange,
    getFormSchema,
    OpenCustModal,
    GetUseModalData,
    getCreateAction,
  } from '../data';
  import { custOnChange, OpenCustModal, GetUseModalData } from '../data';
  import { useModal } from '/@/components/Modal';
  import { useLocale } from '/@/locales/useLocale';
  import { uploadApi } from '/@/api/sys/upload';
  import { useGo } from '/@/hooks/web/usePage';
  import { useI18n } from '/@/hooks/web/useI18n';
  import { getRoleButtons } from '/@/api/sys/menu';
  const { getLocale } = useLocale();
  const { t } = useI18n();
  const route = useRoute();
  const { currentRoute } = useRouter();
  const go = useGo();
  const objParams = ref(JSON.parse(decodeURI(route.params?.id as string)));
  const entityName = ref(objParams.value.ID);
  const globSetting = useGlobSetting();
  const _columns = ref([]);
  const _searchFormSchema = ref([]);
  const _crudFormSchema = ref([]);
  const formSchemas = ref({}); //弹出框多表单结构
  const useModalData = ref({}); //表单中插槽渲染按钮打开模态框useModal方法
  const useFormData = ref({});
  const colSlots = ref<any>(objParams.value.colSlots); //按钮插槽
  const crudColSlots = ref<any>(objParams.value.crudColSlots);
  const cType = ref('');
  const dtlSlots = ref([] as any[]);
  const selectVals = ref({});
  const isExistSql = ref('');
  const custImport = ref(null);
  const custImport = ref<any>(null);
  const isMounted = ref(false);
  const buttons = ref([]);
  const keyFieldValues = ref<any>(null);
  provide<Ref<any>>('objParams', objParams.value);
  provide<Ref<any[]>>('_columns', _columns);
  provide<Ref<any[]>>('_searchFormSchema', _searchFormSchema);
  provide<Ref<any[]>>('_crudFormSchema', _crudFormSchema);
  provide<Ref<string>>('isExistSql', isExistSql);
  provide<Ref<any>>('keyFieldValues', keyFieldValues);
  const [registerCust, { openModal: openCustomModal, closeModal }] = useModal();
  const [registerItemAdd, { openModal: openItemModal }] = useModal();
  const [registerDrawer, { openDrawer }] = useDrawer();
  const [registerTable, { getForm, reload }] = useTable({
    title: '列表信息',
    api: getListByPage,
    searchInfo: { TABLE_NAME: objParams.value.ID },
    columns: _columns as unknown as BasicColumn[],
    formConfig: {
      labelWidth: 140,
      schemas: _searchFormSchema as unknown as FormSchema[],
    },
    useSearchForm: true,
    showTableSetting: true,
    bordered: true,
    canResize: true,
    showIndexColumn: false,
    actionColumn: GetActionColumn(objParams.value.ID), //自定义操作列
  });
  /**
   * @description: 生成列表中操作项的按钮
   * @param {*} record
   * @return {*}
   */
  function createActions(record) {
    const params = {
      record,
      isUpdate: true,
      entityName: objParams.value.ID,
      formJson: _crudFormSchema.value,
      cType,
      dtlSlots,
      formSchemas,
      useModalData,
      useFormData,
      crudColSlots,
    };
    const [ActionItem] = custImport.value.default();
    return ActionItem(
      params,
      [
        {
          icon: 'clarity:note-edit-line',
          onClick: editRecord.bind(null, openDrawer, params),
        },
        {
          icon: 'ant-design:delete-outlined',
          color: 'error',
          popConfirm: {
            title: '是否确认删除?',
            placement: 'left',
            confirm: deleteRecord.bind(null, reload, params),
          },
        },
      ],
      openDrawer,
      reload,
      openCustomModal,
      useForm,
      useModal,
      go,
    );
  }
  /**
   * @description: 公用编辑方法
   * @param {Fn} fn
   * @param {*} params
   * @return {*}
   */
  function editRecord(fn: Fn, params: {}) {
    fn(true, params);
  }
  /**
   * @description: 公用删除方法
   * @param {Fn} fn
   * @param {*} params
   * @return {*}
   */
  function deleteRecord(fn: Fn, params: {}) {
    console.log(params['record']);
    //删除
    DeleteEntity(params['record'], params['entityName']).then((action) => {
      if (action.IsSuccessed) {
        fn();
      }
    });
  }
  /**
   * @description: 获取新增按钮的行为
   * @return {*}
   */
  function handleCreate() {
    const result = getCreateAction(objParams.value.ID);
    switch (result.action) {
      case 'go':
        go(`/${result.url}/${encodeURI(JSON.stringify(result.params))}`);
        break;
      case 'drawer':
        openDrawer(true, {
          isUpdate: false,
          entityName: objParams.value.ID,
          formJson: _crudFormSchema.value,
          crudColSlots,
          isExistSql: isExistSql.value,
        });
        break;
    }
  }
  function handleSuccess() {
    reload();
  }
  onMounted(async () => {
    /* 用json获取列 */
@@ -255,14 +106,12 @@
    // }
    // _columns.value = objs;
    // if (objParams.value.ID == 'V_BAS_PROD') {
    //   custImport.value = await import(`../${objParams.value.ID}`);
    // }
    isMounted.value = false;
    /* 动态import实体名.ts的自定义方法 */
    try {
      custImport.value = await import(/* @vite-ignore */ `../entityts/${objParams.value.ID}`);
      custImport.value = await import(`../entityts/${objParams.value.ID}.ts`);
    } catch (e) {}
    isMounted.value = true;
    //获取表单中插槽渲染的按钮点击弹出模态窗口的实例
    useModalData.value = GetUseModalData(objParams.value.ID);
@@ -339,37 +188,8 @@
      }
    }
    _columns.value = objs;
    isMounted.value = true;
    buttons.value = await getRoleButtons(currentRoute.value.meta.menuCode as string);
  });
  /**
   * @description: 弹出选择框选择成功后事件
   * @param {*} d
   * @param {*} u
   * @param {*} item
   * @return {*}
   */
  function handleItemSuccess(d, u, item) {
    getForm().setFieldsValue(
      GetSelectSuccess(
        d,
        u,
        getForm().getFieldsValue()[`${item.replace(/form-/, '').replace(/add/, '')}PSelect_0`],
      ),
    );
  }
  /**
   * @description: 弹出选择框
   * @param {*} item
   * @return {*}
   */
  function handleSelectItem(item) {
    OpenSelectItem(
      openItemModal,
      getForm().getFieldsValue()[`${item.replace(/form-/, '').replace(/add/, '')}PSelect_0`],
    );
  }
  /**
   * @description: Select 自定义onChange方法
@@ -391,7 +211,7 @@
  //弹出框确定返回
  function custSuccess(d) {
    reload();
    // reload();
  }
  /**
@@ -402,11 +222,17 @@
   * @return {*}
   */
  function handleEntSuccess(d, u, item) {
    var values = GetSelectSuccess(d, u, cType.value);
    selectVals.value = values; //保存弹出框选择的结果
    let _val = {};
    _val[d.returnFieldName] = values[d.returnFieldName];
    useFormData.value[item][1].setFieldsValue(_val);
    /* 动态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) {}
  }
  /**