| | |
| | | * @version: |
| | | * @Date: 2024-06-19 20:34:27 |
| | | * @LastEditors: Ben Lin |
| | | * @LastEditTime: 2024-10-05 16:49:39 |
| | | * @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'; |
| | |
| | | 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; |
| | |
| | | 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: '', |
| | |
| | | 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; |
| | | }, |
| | | /** |
| | |
| | | * @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' |
| | |
| | | // 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' |
| | |
| | | ? 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); |
| | |
| | | } |
| | | 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); |
| | |
| | | } |
| | | 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'); |
| | |
| | | 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; |
| | |
| | | config = pkgModalCfg; |
| | | break; |
| | | } |
| | | /* 如果slot是'labeladd',打开增删改模态窗口,可编辑行 */ |
| | | if (args[0] == 'labeladd') { |
| | | openCrudModal(true, { |
| | | isUpdate: true, //是否更新操作 |
| | |
| | | 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 |
| | |
| | | return; |
| | | } |
| | | /* 更新工单状态并生成工单的工艺路线 */ |
| | | UpdateWoStatus({ |
| | | UserId: useUserStore().getUserInfo.userId as string, |
| | | WorkOrder: args[1]['CODE'], |
| | | Status: -1, |
| | | RouteStatus: 1, |
| | | WoBatch: '', |
| | | ActLine: '' |
| | | 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: '', |
| | | ActLine: '' |
| | | }); |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: t(action.LocaleMsg), |
| | | }); |
| | | } |
| | | }); |
| | | args[2](); |
| | | } else { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | |
| | | * @param {Ref} selectedNodes |
| | | * @return {*} |
| | | */ |
| | | SelectNode: (selectedNodes: Ref<any[]>) => { |
| | | SelectNode: (selectedNodes: Ref<any[]>, code: string) => { |
| | | let result = { |
| | | showConfig: false, |
| | | showNav: false, |
| | |
| | | result.showOtherTable = { BAS_PKG_DTL: false, ItemCode: false }; |
| | | } |
| | | } |
| | | useProdRoute.setCurSelectedNodes({ name: code, SelectedNodes: selectedNodes.value }); |
| | | return result; |
| | | }, |
| | | /** |
| | |
| | | url: '/addRoute', |
| | | action: 'addRoute', |
| | | isStep: false, |
| | | isCustEl: false |
| | | isCustEl: false, |
| | | }, |
| | | // { |
| | | // title: '添加客户工艺路线', |
| | |
| | | url: '/editRoute', |
| | | action: 'editRoute', |
| | | isStep: false, |
| | | isCustEl: false |
| | | isCustEl: false, |
| | | }, |
| | | ]; |
| | | break; |
| | |
| | | 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( |
| | |
| | | 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) { |
| | |
| | | span: 12, |
| | | }, |
| | | }, |
| | | { |
| | | field: 'LABEL_NAME', |
| | | component: 'Input', |
| | | label: '模板名称', |
| | | colProps: { |
| | | span: 12, |
| | | }, |
| | | }, |
| | | ], |
| | | ItemColumns: [ |
| | | { |
| | |
| | | { |
| | | field: 'PKG_CODE', |
| | | label: '包装规则', |
| | | colProps: { span: 11 }, |
| | | colProps: window.screen.width == 2560 ? { span: 10 } : { span: 11 }, |
| | | component: 'Input', |
| | | ifShow: ({ values }) => isPackage(values.ACT_TYPE), |
| | | }, |
| | |
| | | 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', |
| | | }, |
| | |
| | | }, |
| | | }, |
| | | { |
| | | 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', |
| | |
| | | function handleTemplate(args, params: Recordable) { |
| | | const openCrudModal = args[0]; |
| | | const OrderNo = args[2]; |
| | | const WoRecord = params['mainRecord']; |
| | | openCrudModal(true, { |
| | | isUpdate: true, //是否更新操作 |
| | | entityName: 'WoRouteBinding', //是哪个页面 |
| | |
| | | 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 |
| | |
| | | { |
| | | title: '默认值', |
| | | dataIndex: 'DEFAULT_VALUE', |
| | | editRow: true, |
| | | editRule: true, |
| | | // editRow: true, |
| | | // editRule: true, |
| | | }, |
| | | ] as BasicColumn[]; |
| | | |