Ben Lin
2024-06-27 226ad601bb8326814c3e94efd6f476014f6a9e66
src/views/tigerprojects/system/lowcode/entityts/ProdRouteBinding.ts
@@ -4,13 +4,30 @@
 * @version:
 * @Date: 2024-06-19 20:34:27
 * @LastEditors: Ben Lin
 * @LastEditTime: 2024-06-23 00:38:02
 * @LastEditTime: 2024-06-27 22:57:45
 */
import { GetRoutePTree } from '/@/api/tigerapi/mes/router';
import { convertToTree } from '/@/api/tigerapi/system';
import { Ref, ref, unref } from 'vue';
import { GetRoutePTree, RouteToCust, RouteToProd } from '/@/api/tigerapi/mes/router';
import { GetEnum, SaveEntity, convertToTree, getEntity } from '/@/api/tigerapi/system';
import { useLocale } from '/@/locales/useLocale';
import { isNullOrEmpty, isNullOrUnDef } from '/@/utils/is';
import { useI18n } from '/@/hooks/web/useI18n';
import { NavItem } from '/@/api/tigerapi/model/basModel';
import { useMessage } from '/@/hooks/web/useMessage';
import { useModal } from '/@/components/Modal';
const { t } = useI18n();
const { createErrorModal } = useMessage();
const { getLocale } = useLocale();
function _default() {
  const isNormal = (type: number) => type === 0;
  const isScan = (type: number) => type === 1;
  const isAssy = (type: number) => type === 2;
  const isTest = (type: number) => type === 3;
  const isAudit = (type: number) => type === 4;
  const isPrint = (type: number) => type === 5;
  const isPackage = (type: number) => type === 6;
  const methods = {
    /**
     * @description: 获取树形图标
@@ -38,6 +55,10 @@
      }
      return icon;
    },
    /**
     * @description: 高级表单和详情页面返回主页面的url
     * @return {*}
     */
    GetHomeUrl: () => {
      return `/V_BAS_PROD/LC/${encodeURI(JSON.stringify({ ID: 'V_BAS_PROD', colSlots: [], crudColSlots: [] }))}`;
    },
@@ -49,11 +70,814 @@
    fetchTreeData: async (type: string, itemCode: string) => {
      let data = { title: '', treeData: [] as any[], fieldNames: {} };
      let prodTreeData = await GetRoutePTree(itemCode);
      data.treeData = convertToTree(prodTreeData, 'pid', 'id', 'root');
      // let uniqueArr = prodTreeData.reduce((acc, current) => {
      //   if (!acc.some((x) => x.pid == current.pid && x.id == current.id && x.seq == current.seq && x.type == current.type)) {
      //     acc.push(current);
      //   }
      //   return acc;
      // }, [] as V_MES_ROUTE_PTREE[]);
      data.treeData = convertToTree(prodTreeData, 'pid', 'tid', 'root');
      data.title = '工艺路线';
      data.fieldNames = { key: 'id', title: 'name' };
      data.fieldNames = { key: 'tid', title: 'name' };
      return data;
    },
    GetCrudForm: (type: string) => {
      let form: any[] = [];
      switch (type) {
        case 'Action':
          form = [
            {
              field: 'PROD_CODE',
              label: '产品编码',
              component: 'Input',
              dynamicDisabled: ({ values }) => {
                return true;
              },
              colProps: { span: 12 },
            },
            {
              field: 'ID',
              label: 'ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'ACT_ID',
              label: 'ACT_ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'ROT_ID',
              label: 'ROT_ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'ACT_CODE',
              label: 'ACT_CODE',
              component: 'Input',
              show: false,
            },
            {
              field: 'NODE_ID',
              label: 'NODE_ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'CUST_CODE',
              label: '客户编码',
              component: 'Input',
              dynamicDisabled: ({ values }) => {
                return true;
              },
              colProps: { span: 12 },
            },
            {
              field: 'ACT_TYPE',
              label: '行为类型',
              component: 'ApiSelect',
              colProps: { span: 12 },
              defaultValue: 0,
              componentProps: {
                api: GetEnum,
                params: { name: 'MES_PROD_ACTION+ACT_TYPEs' },
                resultField: 'Data',
                labelField: unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name',
                valueField: 'Value',
                // onChange: (e, v) => {
                //   alert(e)
                //   console.log('ApiSelect====>:', e, v);
                // },
              },
            },
            {
              field: 'IS_ACTIVE',
              label: '是否启用',
              required: true,
              component: 'Select',
              colProps: { span: 12 },
              componentProps: {
                options: [
                  {
                    label: '是',
                    value: 'Y',
                    key: 'Y',
                  },
                  {
                    label: '否',
                    value: 'N',
                    key: 'N',
                  },
                ],
              },
            },
            {
              field: 'RULE_CODE',
              label: '扫码验证',
              component: 'Input',
              colProps: { span: 10 },
              ifShow: ({ values }) => isScan(values.ACT_TYPE),
            },
            {
              field: '0',
              label: '1',
              defaultValue: '',
              component: 'Input',
              colProps: { span: 2, pull: 1 },
              ifShow: ({ values }) => isScan(values.ACT_TYPE),
              colSlot: 'scanadd',
            },
            {
              field: 'ITEM_CODE',
              label: '组装上料',
              colProps: { span: 10 },
              component: 'Input',
              ifShow: ({ values }) => isAssy(values.ACT_TYPE),
            },
            {
              field: '00',
              label: '1',
              defaultValue: '',
              component: 'Input',
              colProps: { span: 2, pull: 1 },
              ifShow: ({ values }) => isAssy(values.ACT_TYPE),
              colSlot: 'assyadd',
            },
            {
              field: 'TEST_CODE',
              label: '产品测试',
              colProps: { span: 10 },
              component: 'Input',
              ifShow: ({ values }) => isTest(values.ACT_TYPE),
            },
            {
              field: 'test0',
              label: '1',
              defaultValue: '',
              component: 'Input',
              colProps: { span: 2, pull: 1 },
              ifShow: ({ values }) => isTest(values.ACT_TYPE),
              colSlot: 'testadd',
            },
            {
              field: 'SAPL_CODE',
              label: '产品抽检',
              colProps: { span: 10 },
              component: 'Input',
              ifShow: ({ values }) => isAudit(values.ACT_TYPE),
            },
            {
              field: 'audit0',
              label: '1',
              defaultValue: '',
              component: 'Input',
              colProps: { span: 2, pull: 1 },
              ifShow: ({ values }) => isAudit(values.ACT_TYPE),
              colSlot: 'auditadd',
            },
            {
              field: 'LABEL_CODE',
              label: '标签打印',
              colProps: { span: 10 },
              component: 'Input',
              ifShow: ({ values }) => isPrint(values.ACT_TYPE),
            },
            {
              field: 'print0',
              label: '1',
              defaultValue: '',
              component: 'Input',
              colProps: { span: 2, pull: 1 },
              ifShow: ({ values }) => isPrint(values.ACT_TYPE),
              colSlot: 'printadd',
            },
            {
              field: 'pkgRULE_CODE',
              label: '包装规则',
              colProps: { span: 10 },
              component: 'Input',
              ifShow: ({ values }) => isPackage(values.ACT_TYPE),
            },
            {
              field: 'pkg0',
              label: '1',
              defaultValue: '',
              component: 'Input',
              colProps: { span: 2, pull: 1 },
              ifShow: ({ values }) => isPackage(values.ACT_TYPE),
              colSlot: 'pkgadd',
            },
            {
              field: 'REMARK',
              label: '备注',
              component: 'Input',
              colProps: { span: 12 },
            },
          ];
          break;
        case 'Node':
          form = [
            {
              field: 'PROD_CODE',
              label: '产品编码',
              component: 'Input',
              dynamicDisabled: ({ values }) => {
                return true;
              },
              colProps: { span: 12 },
            },
            {
              field: 'ID',
              label: 'ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'ACT_ID',
              label: 'ACT_ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'ROT_ID',
              label: 'ROT_ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'NODE_ID',
              label: 'NODE_ID',
              component: 'Input',
              show: false,
            },
            {
              field: 'NODE_NAME',
              label: '工序节点名称',
              component: 'Input',
            },
            {
              field: 'CUST_CODE',
              label: '客户编码',
              component: 'Input',
              dynamicDisabled: ({ values }) => {
                return true;
              },
              colProps: { span: 12 },
            },
            {
              field: 'OPER_CODE',
              label: '工序编码',
              component: 'Input',
            },
            {
              field: 'IS_ACTIVE',
              label: '是否启用',
              required: true,
              component: 'Select',
              colProps: { span: 12 },
              componentProps: {
                options: [
                  {
                    label: '是',
                    value: 'Y',
                    key: 'Y',
                  },
                  {
                    label: '否',
                    value: 'N',
                    key: 'N',
                  },
                ],
              },
            },
            {
              field: 'IS_CALC_FPY',
              label: '是否计算直通率',
              required: true,
              component: 'Select',
              colProps: { span: 12 },
              componentProps: {
                options: [
                  {
                    label: '是',
                    value: 'Y',
                    key: 'Y',
                  },
                  {
                    label: '否',
                    value: 'N',
                    key: 'N',
                  },
                ],
              },
            },
            {
              field: 'CAN_SKIP',
              label: '是否允许跳站',
              required: true,
              component: 'Select',
              colProps: { span: 12 },
              componentProps: {
                options: [
                  {
                    label: '是',
                    value: 'Y',
                    key: 'Y',
                  },
                  {
                    label: '否',
                    value: 'N',
                    key: 'N',
                  },
                ],
              },
            },
            {
              field: 'IS_INPUT',
              label: '是否投入站',
              required: true,
              component: 'Select',
              colProps: { span: 12 },
              componentProps: {
                options: [
                  {
                    label: '是',
                    value: 'Y',
                    key: 'Y',
                  },
                  {
                    label: '否',
                    value: 'N',
                    key: 'N',
                  },
                ],
              },
            },
            {
              field: 'IS_OUTPUT',
              label: '是否产出站',
              required: true,
              component: 'Select',
              colProps: { span: 12 },
              componentProps: {
                options: [
                  {
                    label: '是',
                    value: 'Y',
                    key: 'Y',
                  },
                  {
                    label: '否',
                    value: 'N',
                    key: 'N',
                  },
                ],
              },
            },
            {
              field: 'REMARK',
              label: '备注',
              component: 'Input',
              colProps: { span: 12 },
            },
          ];
          break;
      }
      return form;
    },
    /**
     * @description: 获取表单中的字段插槽列表
     * @return {*}
     */
    GetCrudColSlots: () => {
      return ['scanadd', 'assyadd', 'testadd', 'auditadd', 'printadd', 'pkgadd'];
    },
    nodeChange: (params: {
      resetFields: any;
      setFieldsValue: any;
      objParams: Ref<any>;
      selectedNodes: Ref<any[]>;
    }) => {
      let sqlcmd = ' 1=1 ';
      if (!isNullOrEmpty(params['objParams'].value['CODE'])) {
        sqlcmd += `And PROD_CODE = '${params['objParams'].value['CODE']}'`;
      }
      if (!isNullOrEmpty(params['selectedNodes'].value[0].cust)) {
        sqlcmd += `And CUST_CODE = '${params['selectedNodes'].value[0].cust}'`;
      }
      if (!isNullOrEmpty(params['selectedNodes'].value[0].id)) {
        sqlcmd +=
          params['selectedNodes'].value[0].type == 'Action'
            ? `And ACT_ID = '${params['selectedNodes'].value[0].id}'`
            : `And NODE_ID = '${params['selectedNodes'].value[0].id}'`;
      }
      getEntity({
        sqlcmd: sqlcmd,
        entityName:
          params['selectedNodes'].value[0].type == 'Action' ? 'MES_PROD_ACTION' : 'MES_PROD_OPER',
      }).then((res) => {
        params['resetFields']();
        if (params['selectedNodes'].value[0].type == 'Action') {
          params['setFieldsValue']({
            ID: res.Data.Items[0].ID,
            ACT_ID: res.Data.Items[0].ACT_ID,
            ROT_ID: res.Data.Items[0].ROT_ID,
            NODE_ID: res.Data.Items[0].NODE_ID,
            IS_ACTIVE: res.Data.Items[0].IS_ACTIVE,
            ITEM_CODE: res.Data.Items[0].ITEM_CODE,
            RULE_CODE: res.Data.Items[0].RULE_CODE,
            TEST_CODE: res.Data.Items[0].TEST_CODE,
            SAPL_CODE: res.Data.Items[0].SAPL_CODE,
            LABEL_CODE: res.Data.Items[0].LABEL_CODE,
            PKG_CODE: res.Data.Items[0].PKG_CODE,
            ACT_CODE: res.Data.Items[0].ACT_CODE,
            REMARK: res.Data.Items[0].REMARK,
            PROD_CODE: params['objParams'].value['CODE'],
            ACT_TYPE: res.Data.Items[0].ACT_TYPE,
            CUST_CODE: params['selectedNodes'].value[0].cust,
          });
        }
        if (params['selectedNodes'].value[0].type == 'Node') {
          params['setFieldsValue']({
            ID: res.Data.Items[0].ID,
            OPER_CODE: res.Data.Items[0].OPER_CODE,
            ROT_ID: res.Data.Items[0].ROT_ID,
            NODE_ID: res.Data.Items[0].NODE_ID,
            NODE_NAME: res.Data.Items[0].NODE_NAME,
            IS_ACTIVE: res.Data.Items[0].IS_ACTIVE,
            IS_CALC_FPY: res.Data.Items[0].IS_CALC_FPY,
            CAN_SKIP: res.Data.Items[0].CAN_SKIP,
            IS_INPUT: res.Data.Items[0].IS_INPUT,
            IS_OUTPUT: res.Data.Items[0].IS_OUTPUT,
            REMARK: res.Data.Items[0].REMARK,
            PROD_CODE: params['objParams'].value['CODE'],
            CUST_CODE: params['selectedNodes'].value[0].cust,
          });
        }
      });
    },
    /**
     * @description: 自定义提交方法
     * @return {*}
     */
    SubmitFunc: (values: Recordable<any>, type: string, emit) => {
      let entityName = '';
      switch (type) {
        case 'Action':
          entityName = 'MES_PROD_ACTION';
          break;
        case 'Node':
          entityName = 'MES_PROD_OPER';
          break;
      }
      SaveEntity(values, true, entityName).then((action) => {
        if (action.IsSuccessed) {
          emit('success');
        }
      });
    },
    /**
     * @description: 弹出选择框打开方法
     * @param {Fn} openItemModal
     * @return {*}
     */
    OpenSelectItem: (openItemModal: Fn, ...args) => {
      let config = {};
      switch (args[0]) {
        case 'scanadd':
          config = ruleModalCfg;
          break;
        case 'assyadd':
          config = itemCodeModalCfg;
          break;
        case 'testadd':
          config = itemCodeModalCfg;
          break;
        case 'printadd':
          config = printModalCfg;
          break;
        case 'pkgadd':
          config = pkgModalCfg;
          break;
      }
      openItemModal(true, config);
    },
    /**
     * @description: 弹出选择框选择成功返回
     * @param {*} d
     * @param {*} u
     * @return {*}
     */
    GetSelectSuccess: (d, u, ...args) => {
      let value = {};
      switch (args[0]) {
        case 'scanadd':
          value = {
            RULE_CODE: d.values['val'],
          };
          break;
        case 'assyadd':
          value = {
            ITEM_CODE: d.values['val'],
          };
          break;
        case 'printadd':
          value = {
            LABEL_CODE: d.values['val'],
          };
          break;
        case 'pkgadd':
          value = {
            pkgRULE_CODE: d.values['val'],
          };
        case 'addRoute':
          if (isNullOrEmpty(args[1]['CODE'])) {
            createErrorModal({
              title: t('sys.api.errorTip'),
              content: '产品为空,不能添加工艺路线,请点击左侧选择产品',
            });
            return;
          }
          let codes = d.values.id.split(',');
          var i;
          for (i = 0; i < codes.length; i++) {
            if (d.which == 'addRoute') {
              RouteToProd({ rotId: codes[i], prodCode: args[1]['CODE'] });
            } else {
              RouteToCust({ rotId: codes[i], prodCode: args[1]['CODE'], custCode: '' });
            }
          }
          args[2]();
          break;
        case 'addCustomer':
          if (isNullOrEmpty(args[1]['CODE'])) {
            createErrorModal({
              title: t('sys.api.errorTip'),
              content: '产品为空,不能添加工艺路线,请点击左侧选择产品',
            });
            return;
          }
          let rotIds = d.ROT_ID.split(',');
          var i;
          for (i = 0; i < rotIds.length; i++) {
            RouteToCust({ rotId: rotIds[i], prodCode: args[1]['CODE'], custCode: d.CUST_CODE });
          }
          args[2]();
          break;
      }
      return value;
    },
    /**
     * @description: 获取模态框应用列表
     * @return {*}
     */
    GetUseModals: () => {
      return {
        addRoute: useModal(),
        addCustomer: useModal(),
      };
    },
    /**
     * @description: 获取标题信息
     * @param {string} type
     * @return {*}
     */
    GetTitle: (type: string) => {
      return {
        configTitle: type == 'Action' ? '行为配置' : '工序配置',
        navTitle: '添加工艺路线',
      };
    },
    /**
     * @description: 根据选中的树节点判断要切换哪个组件
     * @param {Ref} selectedNodes
     * @return {*}
     */
    SelectNode: (selectedNodes: Ref<any[]>) => {
      let result = { showConfig: false, showNav: false, type: selectedNodes.value[0].type };
      if (isNullOrUnDef(selectedNodes)) {
        return result;
      }
      if (selectedNodes.value[0].type == 'Product') {
        result.showNav = true;
        result.showConfig = false;
      }
      if (selectedNodes.value[0].type == 'Action' || selectedNodes.value[0].type == 'Node') {
        result.showNav = false;
        result.showConfig = true;
      }
      return result;
    },
    /**
     * @description: 获取导航项
     * @return {*}
     */
    GetNavItems: () => {
      return [
        {
          title: '添加产品工艺路线',
          icon: 'add_green|svg',
          color: '#1fdaca',
          url: '/addRoute',
          action: 'addRoute',
          isStep: false,
        },
        {
          title: '添加客户工艺路线',
          icon: 'add_customer|svg',
          color: '#bf0c2c',
          url: '/addCustomer',
          action: 'addCustomer',
          isStep: true,
        },
      ] as NavItem[];
    },
    /**
     * @description: 导航页面切换按钮时调用方法
     * @param {any} action
     * @return {*}
     */
    navChangeItem: (action: any, ...args) => {
      switch (action) {
        case 'addRoute':
          args[0](true, {
            title: '工艺路线列表',
            schemas: [
              {
                field: 'ROT_CODE',
                component: 'Input',
                label: '工艺路线编码',
                colProps: {
                  span: 12,
                },
              },
            ],
            ItemColumns: [
              {
                title: t('工艺路线编码'),
                dataIndex: 'ROT_CODE',
                resizable: true,
                sorter: true,
                width: 200,
              },
              {
                title: t('工艺路线名称'),
                dataIndex: 'ROT_NAME',
                resizable: true,
                sorter: true,
                width: 180,
              },
            ],
            tableName: 'MES_ROUTE',
            rowKey: 'ROT_CODE',
            returnFieldName: 'ROUTE_CODE', //返回值要赋值的字段名称
            searchInfo: { TABLE_NAME: 'MES_ROUTE' },
            which: action,
          });
          break;
        case 'addCustomer':
          args[0](true, {
            title: '请完成以下步骤',
          });
          break;
      }
    },
  };
  const itemCodeModalCfg = {
    title: '物料列表',
    schemas: [
      {
        field: 'ITEM_CODE',
        component: 'Input',
        label: '物料编码',
        colProps: {
          span: 12,
        },
      },
    ],
    ItemColumns: [
      {
        title: t('物料编码'),
        dataIndex: 'ITEM_CODE',
        resizable: true,
        sorter: true,
        width: 200,
      },
      {
        title: t('物料名称'),
        dataIndex: 'ITEM_NAME',
        resizable: true,
        sorter: true,
        width: 180,
      },
    ],
    tableName: 'BAS_ITEM',
    rowKey: 'ITEM_CODE',
    searchInfo: { TABLE_NAME: 'BAS_ITEM' },
  };
  const ruleModalCfg = {
    title: '规则列表',
    schemas: [
      {
        field: 'RULE_CODE',
        component: 'Input',
        label: '规则编码',
        colProps: {
          span: 12,
        },
      },
    ],
    ItemColumns: [
      {
        title: t('规则编码'),
        dataIndex: 'RULE_CODE',
        resizable: true,
        sorter: true,
        width: 200,
      },
      {
        title: t('规则名称'),
        dataIndex: 'RULE_NAME',
        resizable: true,
        sorter: true,
        width: 180,
      },
    ],
    tableName: 'BAS_CODE_RULE',
    rowKey: 'RULE_CODE',
    searchInfo: { TABLE_NAME: 'BAS_CODE_RULE' },
  };
  const printModalCfg = {
    title: '打印模板列表',
    schemas: [
      {
        field: 'LABEL_CODE',
        component: 'Input',
        label: '模板编码',
        colProps: {
          span: 12,
        },
      },
    ],
    ItemColumns: [
      {
        title: t('模板编码'),
        dataIndex: 'LABEL_CODE',
        resizable: true,
        sorter: true,
        width: 200,
      },
      {
        title: t('模板名称'),
        dataIndex: 'LABEL_NAME',
        resizable: true,
        sorter: true,
        width: 180,
      },
    ],
    tableName: 'BAS_LABEL_TEMP',
    rowKey: 'LABEL_CODE',
    searchInfo: { TABLE_NAME: 'BAS_LABEL_TEMP' },
  };
  const pkgModalCfg = {
    title: '包装规则列表',
    schemas: [
      {
        field: 'RULE_CODE',
        component: 'Input',
        label: '包装规则编码',
        colProps: {
          span: 12,
        },
      },
    ],
    ItemColumns: [
      {
        title: t('包装规则编码'),
        dataIndex: 'RULE_CODE',
        resizable: true,
        sorter: true,
        width: 200,
      },
      {
        title: t('包装规则名称'),
        dataIndex: 'RULE_NAME',
        resizable: true,
        sorter: true,
        width: 180,
      },
    ],
    tableName: 'BAS_PKG_RULE',
    rowKey: 'RULE_CODE',
    searchInfo: { TABLE_NAME: 'BAS_PKG_RULE' },
  };
  return [methods];