Ben Lin
2025-03-05 abbc201b41a1a25a19ccf7cff8df633dadcf5d88
src/views/tigerprojects/system/lowcode/entityts/WoRouteBinding.ts
@@ -4,14 +4,14 @@
 * @version:
 * @Date: 2024-06-19 20:34:27
 * @LastEditors: Ben Lin
 * @LastEditTime: 2024-09-25 15:01:51
 * @LastEditTime: 2024-10-23 23:55:56
 */
import { Ref, h, ref, render, unref } from 'vue';
import { Ref, unref } from 'vue';
import {
  DeleteWoRoute,
  GetWoPTree,
  SP_MES_PROD2WO,
  ProdRouteToWo,
  SP_MES_WO2CUST,
} from '/@/api/tigerapi/mes/router';
import { GetEnum, SaveEntity, convertToTree, getEntity } from '/@/api/tigerapi/system';
@@ -28,13 +28,19 @@
import { ContextMenuItem } from '/@/components/TigerTree';
import { AddOrEditLabelVarByWorkOrder, UpdateWoStatus } from '/@/api/tigerapi/mes/wo';
import { useForm } from '/@/components/Form';
import { BAS_LABEL_VAR_WO } from '/@/api/tigerapi/model/mesModel';
import { BAS_LABEL_VAR_WO, MesRotTree } from '/@/api/tigerapi/model/mesModel';
import { buildUUID } from '/@/utils/uuid';
import { mesApi } from '/@/api/tigerapi/mes/mesApi';
import { useProdRouteStore } from '/@/store/modules/prodRoute';
import { useWebSocketStore } from '/@/store/modules/websocket';
import { useGlobSetting } from '/@/hooks/setting';
import { cloneDeep } from 'vue-json-pretty/types/utils';
const { t } = useI18n();
const { createErrorModal } = useMessage();
const useProdRoute = useProdRouteStore();
const { getLocale } = useLocale();
const globSetting = useGlobSetting();
function _default() {
  /* 定义变量 */
  const isNormal = (type: number) => type === 0;
@@ -90,15 +96,9 @@
    fetchTreeData: async (type: string, wo: string) => {
      let data = { title: '', treeData: [] as any[], fieldNames: {} };
      let prodTreeData = await GetWoPTree({ wo: wo });
      // 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');
      if (data.treeData.length == 0) {
        data.treeData.push({
      let _treeData = convertToTree(prodTreeData, 'pid', 'tid', 'root');
      if (_treeData.length == 0) {
        _treeData.push({
          pid: 'root',
          tid: '',
          id: '',
@@ -106,10 +106,25 @@
          prod: '',
          name: wo,
          type: 'WorkOrder',
          cust: '',
          code: '',
          seq: 0,
        });
      }
      data.title = '工单工艺路线';
      data.fieldNames = { key: 'tid', title: 'name' };
      if (!useProdRoute.changeToCPPage || !useProdRoute.curProdRotTree.some((q) => q.name == wo)) {
        /* 保存工艺树形数据到状态管理 */
        useProdRoute.setCurProdRotTree({
          name: wo,
          treeInfo: _treeData as unknown as MesRotTree[],
        });
      }
      useProdRoute.setWo(wo);
      useProdRoute.setname(wo);
      if (useProdRoute.curProdRotTree.some((q) => q.name == wo)) {
        data.treeData = useProdRoute.curProdRotTree.filter((q) => q.name == wo)[0].treeInfo;
      }
      return data;
    },
    /**
@@ -167,18 +182,24 @@
     * @return {*}
     */
    GetUseTables: (data: Ref<{}>, ...args) => {
      let sortData = isNullOrUnDef(data.value['BAS_PKG_DTL'])
        ? data.value['BAS_PKG_DTL']
        : data.value['BAS_PKG_DTL'].sort((a, b) => {
            return a.PKG_LEVEL - b.PKG_LEVEL;
          });
      return {
        BAS_PKG_DTL: useTable({
          title: '列表信息',
          // api: getListByPage,
          // searchInfo: { TABLE_NAME: 'V_BAS_PKG_DTL' },
          dataSource: data.value['BAS_PKG_DTL'],
          dataSource: sortData,
          columns: GetBaseColumns('BAS_PKG_DTL', args[0], data),
          maxHeight: 520,
          // maxHeight: 520,
          useSearchForm: false,
          showTableSetting: false,
          bordered: true,
          canResize: true,
          isCanResizeParent: true,
          // canResize: true,
          showIndexColumn: false,
          // rowSelection: {
          //   type: 'radio', //'checkbox'
@@ -197,11 +218,12 @@
          // searchInfo: { TABLE_NAME: 'V_BAS_PKG_DTL' },
          dataSource: data.value['ItemCode'],
          columns: GetBaseColumns('ItemCode', args[0], data),
          maxHeight: 520,
          // maxHeight: 520,
          useSearchForm: false,
          showTableSetting: false,
          bordered: true,
          canResize: true,
          isCanResizeParent: true,
          // canResize: true,
          showIndexColumn: false,
          // rowSelection: {
          //   type: 'radio', //'checkbox'
@@ -317,10 +339,9 @@
                ? ents.Data.Items
                : JSON.parse(res.Data.Items[0].OPTION_1);
              /* 如果OPTION_1字段为空就把包装信息转JSON存到OPTION_1字段 */
              res.Data.Items[0].OPTION_1 = isNullOrEmpty(res.Data.Items[0].OPTION_1)
                ? JSON.stringify(ents.Data.Items)
                : res.Data.Items[0].OPTION_1;
            } /* 如果是组装上料 */
              res.Data.Items[0].OPTION_1 = JSON.stringify(result['BAS_PKG_DTL']);
            }
            /* 如果是组装上料 */
            if (res.Data.Items[0].ACT_TYPE == 2) {
              result['name'] = 'ItemCode';
              result['ItemCode'] = JSON.parse(res.Data.Items[0].OPTION_1);
@@ -333,29 +354,53 @@
          }
          if (params['selectedNodes'][0].type == 'Node') {
            resetFieldsNode();
            setFieldsValueNode({
              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,
              ALLOW_DFT_IN: res.Data.Items[0].ALLOW_DFT_IN,
              REMARK: res.Data.Items[0].REMARK,
              WORK_ORDER: params['objParams'].value['CODE'],
              CUST_CODE: params['selectedNodes'][0].cust,
              PROD_CODE: params['selectedNodes'][0].prod,
            });
            // const wonode = await getEntity({
            //   sqlcmd: `WORK_ORDER ='${params['objParams'].value['CODE']}' AND ID = '${res.Data.Items[0].NODE_ID}'`,
            //   entityName: 'MES_WO_NODE',
            //   order: '',
            // });
            if(isNullOrEmpty(res.Data.Items[0].IS_ACTIVE)){
              res.Data.Items[0].IS_ACTIVE = 'N'
            }
            if(isNullOrEmpty(res.Data.Items[0].IS_CALC_FPY)){
              res.Data.Items[0].IS_CALC_FPY = 'N'
            }
            if(isNullOrEmpty(res.Data.Items[0].CAN_SKIP)){
              res.Data.Items[0].CAN_SKIP = 'N'
            }
            if(isNullOrEmpty(res.Data.Items[0].IS_INPUT)){
              res.Data.Items[0].IS_INPUT = 'N'
            }
            if(isNullOrEmpty(res.Data.Items[0].IS_OUTPUT)){
              res.Data.Items[0].IS_OUTPUT = 'N'
            }
            if(isNullOrEmpty(res.Data.Items[0].ALLOW_DFT_IN)){
              res.Data.Items[0].ALLOW_DFT_IN = 'N'
            }
            if(isNullOrEmpty(res.Data.Items[0].IF_DFT_OFFLINE)){
              res.Data.Items[0].IF_DFT_OFFLINE = 'N'
            }
            if(!isNullOrEmpty(params['objParams'].value['CODE'])){
              res.Data.Items[0].WORK_ORDER = params['objParams'].value['CODE']
            }
            if(!isNullOrEmpty(params['selectedNodes'][0].prod)){
              res.Data.Items[0].PROD_CODE = params['selectedNodes'][0].prod
            }
            if(!isNullOrEmpty(params['selectedNodes'][0].cust)){
              res.Data.Items[0].CUST_CODE = params['selectedNodes'][0].cust
            }
            setFieldsValueNode(res.Data.Items[0]);
            /* 默认保存 */
            SaveEntity(res.Data.Items[0], true, 'MES_WO_OPER');
            result['name'] = 'Node';
            result['isShow'] = {
              BAS_PKG_DTL: false,
              ItemCode: false,
            };
          }
          useProdRoute.setcurDtl(result);
          resolve(result);
        } catch (e) {
          reject(e);
@@ -377,6 +422,9 @@
      }
      values.AUTH_ORG = useUserStore().getUserInfo.orgCode;
      values.AUTH_PROD = useUserStore().getUserInfo.prodCode;
      if (type == 'Action') {
        values.OPTION_1 = JSON.stringify(useProdRoute.getcurDtl['BAS_PKG_DTL']);
      }
      SaveEntity(values, true, entityName).then((action) => {
        if (action.IsSuccessed) {
          emit('success');
@@ -391,9 +439,11 @@
    OpenSelectItem: (openItemModal: Fn, ...args) => {
      let config = {};
      const openCrudModal = args[1];
      const record = args[2];
      const record = args[2]; //带过来的记录
      const OrderNo = args[3];
      switch (args[0]) {
      const WoRecord = args[4];
      /* args[0]是界面上的slot名字,根据slot名字来写不同的逻辑实现 */
      switch (args[0]) {
        case 'scanadd':
          config = ruleModalCfg;
          break;
@@ -410,6 +460,7 @@
          config = pkgModalCfg;
          break;
      }
      /* 如果slot是'labeladd',打开增删改模态窗口,可编辑行 */
      if (args[0] == 'labeladd') {
        openCrudModal(true, {
          isUpdate: true, //是否更新操作
@@ -419,7 +470,12 @@
          width: '1024px', //弹出框宽度
          ItemColumns: TemplateBasColumn, //弹出框中表格字段结构
          schemas: [], //查询条件字段结构
          others: { WORK_ORDER: OrderNo }, //需要带到弹出窗口中的数据
          others: { WORK_ORDER: OrderNo}, //需要带到弹出窗口中的数据
          alertConfig: {
            showAlert: true,
            message: '销售订单备注',
            description: WoRecord.SALES_REMARK,
          },  /* 在弹出窗口最上位置显示提醒信息,显示销售订单备注 */
          searchInfo: {
            TABLE_NAME: 'BAS_LABEL_VAR_WO', //实体名称
            LabelId: record.LABEL_CODE, //模板ID
@@ -513,31 +569,19 @@
            return;
          }
          /* 更新工单状态并生成工单的工艺路线 */
          UpdateWoStatus({
            UserId: useUserStore().getUserInfo.userId as string,
            WorkOrder: args[1]['CODE'],
            Status: -1,
            RouteStatus: 1,
            WoBatch: '',
          ProdRouteToWo({
            rotId: d.values.id,
            wo: args[1]['CODE'],
            rotCode: '',
            options: {
              //根据据点查询,必需带这个参数
              UserId: useUserStore().getUserInfo.userId,
              ByOrg: true,
              CurOrg: useUserStore().getUserInfo.orgCode,
            },
          }).then((action) => {
            if (action.IsSuccessed) {
              SP_MES_PROD2WO({ rotId: d.values.id, wo: args[1]['CODE'] }).then((action) => {
                if (action.IsSuccessed) {
                  args[2]();
                } else {
                  UpdateWoStatus({
                    UserId: useUserStore().getUserInfo.userId as string,
                    WorkOrder: args[1]['CODE'],
                    Status: -1,
                    RouteStatus: 0,
                    WoBatch: '',
                  });
                  createErrorModal({
                    title: t('sys.api.errorTip'),
                    content: t(action.LocaleMsg),
                  });
                }
              });
              args[2]();
            } else {
              createErrorModal({
                title: t('sys.api.errorTip'),
@@ -614,7 +658,7 @@
     * @param {Ref} selectedNodes
     * @return {*}
     */
    SelectNode: (selectedNodes: Ref<any[]>) => {
    SelectNode: (selectedNodes: Ref<any[]>, code: string) => {
      let result = {
        showConfig: false,
        showNav: false,
@@ -639,6 +683,7 @@
          result.showOtherTable = { BAS_PKG_DTL: false, ItemCode: false };
        }
      }
      useProdRoute.setCurSelectedNodes({ name: code, SelectedNodes: selectedNodes.value });
      return result;
    },
    /**
@@ -657,6 +702,7 @@
              url: '/addRoute',
              action: 'addRoute',
              isStep: false,
              isCustEl: false,
            },
            // {
            //   title: '添加客户工艺路线',
@@ -677,6 +723,7 @@
              url: '/editRoute',
              action: 'editRoute',
              isStep: false,
              isCustEl: false,
            },
          ];
          break;
@@ -812,7 +859,7 @@
              param.data.value['BAS_PKG_DTL'].map((x) => {
                if (x.PKG_CODE == param.values['PKG_CODE']) {
                  x.LABEL_CODE = param.values['LABEL_CODE'];
                  x.LABEL_ID =  param.values['LABEL_CODE'];
                  x.LABEL_ID = param.values['LABEL_CODE'];
                }
              });
              param.data.value['Action'][0]['OPTION_1'] = JSON.stringify(
@@ -833,7 +880,26 @@
            case 'BAS_LABEL_VAR_WO':
              param.values['WORK_ORDER'] = param.others['WORK_ORDER'];
              param.values['ID'] = buildUUID();
              await AddOrEditLabelVarByWorkOrder(param.values as unknown as BAS_LABEL_VAR_WO);
              const apiaction = await AddOrEditLabelVarByWorkOrder(
                param.values as unknown as BAS_LABEL_VAR_WO,
              );
              if (apiaction.IsSuccessed) {
                const webSocketStore = useWebSocketStore();
                if (webSocketStore.GetSocketState == 1) {
                  webSocketStore.sendMessage(
                    `wsGetNew ${param.values['LABEL_ID']}_#_${param.values['WORK_ORDER']}`,
                  );
                }
              }
            case 'delete':
              const webSocketStore = useWebSocketStore();
              if (webSocketStore.GetSocketState == 1) {
                webSocketStore.sendMessage(
                  `wsGetNew ${param.values['LABEL_ID']}_#_${param.values['WORK_ORDER']}`,
                );
              }
              break;
          }
          resolve('OK');
        } catch (e) {
@@ -1125,6 +1191,14 @@
          span: 12,
        },
      },
      {
        field: 'LABEL_NAME',
        component: 'Input',
        label: '模板名称',
        colProps: {
          span: 12,
        },
      },
    ],
    ItemColumns: [
      {
@@ -1370,7 +1444,7 @@
    {
      field: 'PKG_CODE',
      label: '包装规则',
      colProps: { span: 11 },
      colProps: window.screen.width == 2560 ? { span: 10 } : { span: 11 },
      component: 'Input',
      ifShow: ({ values }) => isPackage(values.ACT_TYPE),
    },
@@ -1379,7 +1453,10 @@
      label: '1',
      defaultValue: '',
      component: 'Input',
      colProps: { span: 1, pull: window.screen.width == 1366 ? -1 : 1 },
      colProps:
        window.screen.width == 2560
          ? { span: 2, pull: 1 }
          : { span: 1, pull: window.screen.width == 1366 ? -1 : 1 },
      ifShow: ({ values }) => isPackage(values.ACT_TYPE),
      colSlot: 'pkgadd',
    },
@@ -1610,6 +1687,29 @@
      },
    },
    {
      field: 'IF_DFT_OFFLINE',
      label: '判断不良后是否下线',
      required: true,
      defaultValue: 'N',
      component: 'Select',
      colProps: { span: 12 },
      componentProps: {
        options: [
          {
            label: '是',
            value: 'Y',
            key: 'Y',
          },
          {
            label: '否',
            value: 'N',
            key: 'N',
          },
        ],
      },
      ifShow: ({ values }) => values.OPER_CODE == 'TestNode',
    },
    {
      field: 'REMARK',
      label: '备注',
      component: 'Input',
@@ -1787,6 +1887,7 @@
  function handleTemplate(args, params: Recordable) {
    const openCrudModal = args[0];
    const OrderNo = args[2];
    const WoRecord = params['mainRecord'];
    openCrudModal(true, {
      isUpdate: true, //是否更新操作
      entityName: 'WoRouteBinding', //是哪个页面
@@ -1796,6 +1897,11 @@
      ItemColumns: TemplateBasColumn, //弹出框中表格字段结构
      schemas: [], //查询条件字段结构
      others: { WORK_ORDER: OrderNo }, //需要带到弹出窗口中的数据
      alertConfig: {
        showAlert: true,
        message: '销售订单备注',
        description: WoRecord.SALES_REMARK,
      }, /* 在弹出窗口最上位置显示提醒信息,显示销售订单备注 */
      searchInfo: {
        TABLE_NAME: 'BAS_LABEL_VAR_WO', //实体名称
        LabelId: params['record'].LABEL_ID, //模板ID
@@ -1844,8 +1950,8 @@
    {
      title: '默认值',
      dataIndex: 'DEFAULT_VALUE',
      editRow: true,
      editRule: true,
      // editRow: true,
      // editRule: true,
    },
  ] as BasicColumn[];