Ben Lin
2024-07-25 cdd0a28197fb9b432a45bbf9ebc0cfd8db939125
src/views/tigerprojects/system/lowcode/normal/index.vue
@@ -1,100 +1,74 @@
<!--
 * @Description: 低代码呈现页面
 * @Author: Ben Lin
 * @version:
 * @Date: 2024-05-30 13:28:20
 * @LastEditors: Ben Lin
 * @LastEditTime: 2024-07-24 23:47:07
-->
<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 #form-add="{ field }">
        <a-button
          v-if="field"
          class="mt-1 ml-1"
          size="small"
          @click="handleSelectItem"
          preIcon="search|svg"
        />
        <NormalModal @register="registerItemAdd" @success="handleItemSuccess" />
      </template>
    </BasicTable>
    <normalDrawer @register="registerDrawer" @success="handleSuccess" />
    <Suspense>
      <mainTable />
    </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 { Ref, defineAsyncComponent, h, onMounted, provide, ref, unref, watch } from 'vue';
  import mainTable from './mainTable.vue';
  import { DeleteEntity, GetEnum, getEntity, getListByPage } from '/@/api/tigerapi/system';
  import { useRoute, useRouter } from 'vue-router';
  import { Tag, Tooltip } from 'ant-design-vue';
  import { isNullOrEmpty } from '/@/utils/is';
  import {
    GetActionColumn,
    GetActionsData,
    OpenSelectItem,
    GetSelectSuccess,
    custOnChange,
  } from './data';
  import { useModal } from '/@/components/Modal';
  import { isNullOrEmpty, isNullOrUnDef } from '/@/utils/is';
  import { custOnChange, OpenCustModal, GetUseModalData, initRoute } from '../data';
  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';
  import { useWebSocketStore } from '/@/store/modules/websocket';
  const { getLocale } = useLocale();
  const webSocketStore = useWebSocketStore();
  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 [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), //自定义操作列
  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 readyState = ref<number>(WebSocket.CONNECTING);
  const AuthOption = ref({
    BY_ORG: '',
    BY_PROD: '',
    BY_WH: '',
  });
  /* 生成列表中操作项的按钮 */
  function createActions(record) {
    return GetActionsData(
      {
        record,
        isUpdate: true,
        entityName: objParams.value.ID,
        formJson: _crudFormSchema.value,
      },
      openDrawer,
      reload,
    );
  }
  function handleCreate() {
    openDrawer(true, {
      isUpdate: false,
      entityName: objParams.value.ID,
      formJson: _crudFormSchema.value,
    });
  }
  function handleSuccess() {
    reload();
  }
  const keyFieldValues = ref<any>(null);
  provide<Ref<any>>('objParams', objParams);
  provide<Ref<any[]>>('_columns', _columns);
  provide<Ref<any[]>>('_searchFormSchema', _searchFormSchema);
  provide<Ref<any[]>>('_crudFormSchema', _crudFormSchema);
  provide<Ref<string>>('isExistSql', isExistSql);
  provide<Ref<{}>>('AuthOption', AuthOption);
  provide<Ref<any>>('keyFieldValues', keyFieldValues);
  // 监听readyState变化
  watch(readyState, (newState) => {
    if (newState === WebSocket.CLOSED || newState === WebSocket.CLOSING) {
      // 尝试重连
      setTimeout(webSocketStore.connectWebSocket, 3000);
    }
  });
  onMounted(async () => {
    /* 用json获取列 */
    // _searchFormSchema.value = await fetchJson(
@@ -115,10 +89,25 @@
    //   }
    // }
    // _columns.value = objs;
    webSocketStore.connectWebSocket();
    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: '',
    });
    AuthOption.value.BY_ORG = data.Data.Items[0].BY_ORG;
    AuthOption.value.BY_PROD = data.Data.Items[0].BY_PROD;
    AuthOption.value.BY_WH = data.Data.Items[0].BY_WH;
    var searchForms = JSON.parse(data.Data.Items[0].SEARCH_FORM_JSON);
    for (const i in searchForms) {
      if (
@@ -127,9 +116,8 @@
        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.params.name =
          `${objParams.value.ID}+${searchForms[i].field}s`;
        searchForms[i].componentProps.labelField = unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name';
      }
      if (
@@ -162,6 +150,17 @@
        _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;
@@ -179,19 +178,14 @@
      }
    }
    _columns.value = objs;
    buttons.value = await getRoleButtons(currentRoute.value.meta.menuCode as string);
  });
  /* 弹出选择框选择成功后事件 */
  function handleItemSuccess(d, u) {
    getForm().setFieldsValue(GetSelectSuccess(d, u, getForm().getFieldsValue()['0']));
  }
  /* 弹出选择框 */
  function handleSelectItem() {
    OpenSelectItem(openItemModal, getForm().getFieldsValue()['0']);
  }
  /* Select 自定义onChange方法 */
  /**
   * @description: Select 自定义onChange方法
   * @param {*} obj
   * @return {*}
   */
  function onChangeConfig(obj: any) {
    if (obj.component == 'Select') {
      var options = obj.componentProps.options;