Ben Lin
2024-07-16 5a4d79d9765dfca8812638b57d5f5fe21f7a06ee
src/views/tigerprojects/system/lowcode/normal/index.vue
@@ -3,284 +3,256 @@
 * @Author: Ben Lin
 * @version: 
 * @Date: 2024-05-30 13:28:20
 * @LastEditors: your name
 * @LastEditTime: 2024-06-13 14:54:54
 * @LastEditors: Ben Lin
 * @LastEditTime: 2024-07-16 16:24:23
-->
<template>
  <div>
    <BasicTable @register="registerTable">
      <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" />
        <NormalModal @register="registerItemAdd" @success="(d, u) => handleItemSuccess(d, u, item)" />
      </template>
    </BasicTable>
    <normalDrawer @register="registerDrawer" @success="handleSuccess" />
    <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]" />
            <NormalModal @register="useModalData[name][0]" @success="(d, u) => handleEntSuccess(d, u, item.name)" />
          </template>
        </BasicForm>
        <!-- 自定义内容 -->
      </template>
    </CustModal>
    <Suspense>
      <mainTable />
    </Suspense>
    <Suspense>
      <CustModal
        @register="registerCust"
        @success="custSuccess"
        :type="cType"
        :detailSlots="dtlSlots"
        :entityName="entityName"
      >
        <!-- 用插槽自定义多表单 -->
        <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>
    </Suspense>
  </div>
</template>
<script lang="ts" setup>
import { h, onMounted, ref, unref } from 'vue';
import { BasicTable, useTable, TableAction, BasicColumn, FormSchema } from '/@/components/Table';
import { useDrawer } from '/@/components/Drawer';
import normalDrawer from '../normalDrawer.vue';
import NormalModal from '/@/views/components/NormalModal.vue';
import { GetEnum, getEntity, getListByPage } from '/@/api/tigerapi/system';
import { useGlobSetting } from '/@/hooks/setting';
import { useRoute } 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 { isNullOrEmpty, isNullOrUnDef } from '/@/utils/is';
import {
  GetActionColumn,
  GetActionsData,
  OpenSelectItem,
  GetSelectSuccess,
  custOnChange,
  getFormSchema,
  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 { 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 { useRoute, useRouter } from 'vue-router';
  import { Tag, Tooltip } from 'ant-design-vue';
  import CustModal from '/@/views/components/CustModal.vue';
  import { BasicForm, useForm } from '/@/components/Form/index';
  import { isNullOrEmpty, isNullOrUnDef } from '/@/utils/is';
  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 route = useRoute();
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 { 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 _columns = ref([]);
  const _searchFormSchema = ref([]);
  const _crudFormSchema = ref([]);
  const useModalData = ref({}); //表单中插槽渲染按钮打开模态框useModal方法
  const useFormData = ref({});
  const cType = ref('');
  const dtlSlots = ref([] as any[]);
  const selectVals = ref({});
  const isExistSql = ref('');
  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), //自定义操作列
});
/* 生成列表中操作项的按钮 */
function createActions(record) {
  return GetActionsData(
    {
      record,
      isUpdate: true,
      entityName: objParams.value.ID,
      formJson: _crudFormSchema.value,
      cType,
      dtlSlots,
      formSchemas,
      useModalData,
      useFormData,
      crudColSlots,
    },
    openDrawer,
    reload,
    openCustomModal,
    useForm,
    useModal,
    go,
  );
}
  const [registerCust, { openModal: openCustomModal, closeModal }] = useModal();
function handleCreate() {
  openDrawer(true, {
    isUpdate: false,
    entityName: objParams.value.ID,
    formJson: _crudFormSchema.value,
    crudColSlots,
  onMounted(async () => {
    /* 用json获取列 */
    // _searchFormSchema.value = await fetchJson(
    //   `${globSetting.downloadUrl}/LowCode/${objParams.value.ID}/${objParams.value.ID}_Searchform.json`,
    // );
    // var objs = await fetchJson(
    //   `${globSetting.downloadUrl}/LowCode/${objParams.value.ID}/${objParams.value.ID}_Baseform.json`,
    // );
    // for (const i in objs) {
    //   if (!isNullOrEmpty(objs[i].customRender)) {
    //     const func = new Function(objs[i].customRender)();
    //     objs[i].customRender = ({ record }) => {
    //       let texts = func(record);
    //       return h(Tooltip, { title: texts.text }, () =>
    //         h(Tag, { color: texts.color }, () => texts.text),
    //       );
    //     };
    //   }
    // }
    // _columns.value = objs;
    isMounted.value = false;
    /* 动态import实体名.ts的自定义方法 */
    try {
      custImport.value = await import(`../entityts/${objParams.value.ID}.ts`);
    } catch (e) {}
    isMounted.value = true;
    //获取表单中插槽渲染的按钮点击弹出模态窗口的实例
    useModalData.value = GetUseModalData(objParams.value.ID);
    const data = await getEntity({
      sqlcmd: "ASSEMBLY_NAME ='" + objParams.value.ID + "'",
      entityName: 'SYS_LOW_CODE',
      order: '',
    });
    var searchForms = JSON.parse(data.Data.Items[0].SEARCH_FORM_JSON);
    for (const i in searchForms) {
      if (
        !isNullOrEmpty(searchForms[i].componentProps) &&
        !isNullOrEmpty(searchForms[i].componentProps.api) &&
        searchForms[i].componentProps.api == 'GetEnum'
      ) {
        searchForms[i].componentProps.api = GetEnum;
        searchForms[i].componentProps.params.name =
          `${objParams.value.ID}+${searchForms[i].field}s`;
        searchForms[i].componentProps.labelField = unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name';
      }
      if (
        !isNullOrEmpty(searchForms[i].componentProps) &&
        !isNullOrEmpty(searchForms[i].componentProps.api) &&
        searchForms[i].componentProps.api == 'getEntity'
      ) {
        searchForms[i].componentProps.api = getEntity;
        searchForms[i].componentProps.resultField = 'Data.Items';
      }
      onChangeConfig(searchForms[i]);
    }
    _searchFormSchema.value = searchForms;
    var _cruds = JSON.parse(data.Data.Items[0].FORM_JSON);
    for (const i in _cruds) {
      if (
        !isNullOrEmpty(_cruds[i].componentProps) &&
        !isNullOrEmpty(_cruds[i].componentProps.api) &&
        _cruds[i].componentProps.api == 'GetEnum'
      ) {
        _cruds[i].componentProps.api = GetEnum;
        _cruds[i].componentProps.params.name = `${objParams.value.ID}+${_cruds[i].field}s`;
        _cruds[i].componentProps.labelField = unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name';
      }
      if (
        !isNullOrEmpty(_cruds[i].componentProps) &&
        !isNullOrEmpty(_cruds[i].componentProps.api) &&
        _cruds[i].componentProps.api == 'getEntity'
      ) {
        _cruds[i].componentProps.api = getEntity;
        _cruds[i].componentProps.resultField = 'Data.Items';
      }
      if (_cruds[i].component == 'Upload') {
        _cruds[i].componentProps = {};
        _cruds[i].componentProps.api = uploadApi;
        _cruds[i].componentProps.multiple = false;
        _cruds[i].componentProps.maxNumber = 1;
        _cruds[i].componentProps.uploadParams = { entityName: objParams.value.ID };
        _cruds[i].rules = [{ required: true, message: '请选择上传文件' }];
      }
      if (_cruds[i].isexist == 'Y') {
        isExistSql.value = _cruds[i].field;
      }
      onChangeConfig(_cruds[i]);
    }
    _crudFormSchema.value = _cruds;
    var objs = JSON.parse(data.Data.Items[0].BASE_FORM_JSON);
    for (const i in objs) {
      if (!isNullOrEmpty(objs[i].customRender)) {
        const func = new Function(objs[i].customRender)();
        objs[i].customRender = ({ record }) => {
          let texts = func(record);
          return h(Tooltip, { title: texts.text }, () =>
            h(Tag, { color: texts.color }, () => texts.text),
          );
        };
      }
    }
    _columns.value = objs;
    buttons.value = await getRoleButtons(currentRoute.value.meta.menuCode as string);
  });
}
function handleSuccess() {
  reload();
}
onMounted(async () => {
  /* 用json获取列 */
  // _searchFormSchema.value = await fetchJson(
  //   `${globSetting.downloadUrl}/LowCode/${objParams.value.ID}/${objParams.value.ID}_Searchform.json`,
  // );
  // var objs = await fetchJson(
  //   `${globSetting.downloadUrl}/LowCode/${objParams.value.ID}/${objParams.value.ID}_Baseform.json`,
  // );
  // for (const i in objs) {
  //   if (!isNullOrEmpty(objs[i].customRender)) {
  //     const func = new Function(objs[i].customRender)();
  //     objs[i].customRender = ({ record }) => {
  //       let texts = func(record);
  //       return h(Tooltip, { title: texts.text }, () =>
  //         h(Tag, { color: texts.color }, () => texts.text),
  //       );
  //     };
  //   }
  // }
  // _columns.value = objs;
  //获取表单中插槽渲染的按钮点击弹出模态窗口的实例
  useModalData.value = GetUseModalData(objParams.value.ID);
  const data = await getEntity({
    sqlcmd: "ASSEMBLY_NAME ='" + objParams.value.ID + "'",
    entityName: 'SYS_LOW_CODE',
  });
  var searchForms = JSON.parse(data.Data.Items[0].SEARCH_FORM_JSON);
  for (const i in searchForms) {
    if (
      !isNullOrEmpty(searchForms[i].componentProps) &&
      !isNullOrEmpty(searchForms[i].componentProps.api) &&
      searchForms[i].componentProps.api == 'GetEnum'
    ) {
      searchForms[i].componentProps.api = GetEnum;
      searchForms[
        i
      ].componentProps.params.name = `${objParams.value.ID}+${searchForms[i].field}s`;
      searchForms[i].componentProps.labelField = unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name';
    }
    if (
      !isNullOrEmpty(searchForms[i].componentProps) &&
      !isNullOrEmpty(searchForms[i].componentProps.api) &&
      searchForms[i].componentProps.api == 'getEntity'
    ) {
      searchForms[i].componentProps.api = getEntity;
      searchForms[i].componentProps.resultField = 'Data.Items';
    }
    onChangeConfig(searchForms[i]);
  }
  _searchFormSchema.value = searchForms;
  var _cruds = JSON.parse(data.Data.Items[0].FORM_JSON);
  for (const i in _cruds) {
    if (
      !isNullOrEmpty(_cruds[i].componentProps) &&
      !isNullOrEmpty(_cruds[i].componentProps.api) &&
      _cruds[i].componentProps.api == 'GetEnum'
    ) {
      _cruds[i].componentProps.api = GetEnum;
      _cruds[i].componentProps.params.name = `${objParams.value.ID}+${_cruds[i].field}s`;
      _cruds[i].componentProps.labelField = unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name';
    }
    if (
      !isNullOrEmpty(_cruds[i].componentProps) &&
      !isNullOrEmpty(_cruds[i].componentProps.api) &&
      _cruds[i].componentProps.api == 'getEntity'
    ) {
      _cruds[i].componentProps.api = getEntity;
      _cruds[i].componentProps.resultField = 'Data.Items';
    }
    if (_cruds[i].component == 'Upload') {
      _cruds[i].componentProps = {};
      _cruds[i].componentProps.api = uploadApi;
      _cruds[i].componentProps.multiple = false;
      _cruds[i].componentProps.maxNumber = 1;
      _cruds[i].rules = [{ required: true, message: '请选择上传文件' }];
    }
    onChangeConfig(_cruds[i]);
  }
  _crudFormSchema.value = _cruds;
  var objs = JSON.parse(data.Data.Items[0].BASE_FORM_JSON);
  for (const i in objs) {
    if (!isNullOrEmpty(objs[i].customRender)) {
      const func = new Function(objs[i].customRender)();
      objs[i].customRender = ({ record }) => {
        let texts = func(record);
        return h(Tooltip, { title: texts.text }, () =>
          h(Tag, { color: texts.color }, () => texts.text),
        );
  /**
   * @description: Select 自定义onChange方法
   * @param {*} obj
   * @return {*}
   */
  function onChangeConfig(obj: any) {
    if (obj.component == 'Select') {
      var options = obj.componentProps.options;
      var onChange = obj.componentProps.onChange;
      obj.componentProps = ({ schema, tableAction, formActionType, formModel }) => {
        return {
          options: options,
          onChange: (e) => custOnChange(e, onChange, objParams.value.ID),
        };
      };
    }
  }
  _columns.value = objs;
});
/* 弹出选择框选择成功后事件 */
function handleItemSuccess(d, u, item) {
  getForm().setFieldsValue(GetSelectSuccess(d, u, getForm().getFieldsValue()[`${item.replace(/form-/, '').replace(/add/, '')}PSelect_0`]));
}
/* 弹出选择框 */
function handleSelectItem(item) {
  OpenSelectItem(openItemModal, getForm().getFieldsValue()[`${item.replace(/form-/, '').replace(/add/, '')}PSelect_0`]);
}
/* Select 自定义onChange方法 */
function onChangeConfig(obj: any) {
  if (obj.component == 'Select') {
    var options = obj.componentProps.options;
    var onChange = obj.componentProps.onChange;
    obj.componentProps = ({ schema, tableAction, formActionType, formModel }) => {
      return {
        options: options,
        onChange: (e) => custOnChange(e, onChange, objParams.value.ID),
      };
    };
  //弹出框确定返回
  function custSuccess(d) {
    // reload();
  }
}
//弹出框确定返回
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) {}
  }
/* 各表单内弹出选择框选择成功后方法 */
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);
}
/* 打开自定义模态框 */
function handleCustClick(item) {
  OpenCustModal(
    useModalData.value[item][1].openModal, //带入openModal方法
    cType.value,
    item,
    [],
    // selectVals.value['ROUTE_CODE'],
  ); //[openRvModal], selectVals.value['ID']这是自定义参数,按实际需求
}
  /**
   * @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>