| | |
| | | /* eslint-disable no-var */ |
| | | /* eslint-disable no-fallthrough */ |
| | | /* |
| | | * @Description: 产品工艺路线相关 |
| | | * @Author: Ben Lin |
| | | * @version: |
| | | * @Date: 2024-06-19 20:34:27 |
| | | * @LastEditors: Ben Lin |
| | | * @LastEditTime: 2024-10-22 09:28:36 |
| | | * @LastEditTime: 2024-10-24 01:21:57 |
| | | */ |
| | | |
| | | import { Ref, h, ref, render, unref } from 'vue'; |
| | | import { Ref, unref } from 'vue'; |
| | | import { |
| | | DeleteProdRoute, |
| | | GetRoutePTree, |
| | | RouteToCust, |
| | | RouteToProd, |
| | | SetDefaultRoute, |
| | | } from '/@/api/tigerapi/mes/router'; |
| | | import { GetEnum, SaveEntity, convertToTree, getEntity } from '/@/api/tigerapi/system'; |
| | | import { useLocale } from '/@/locales/useLocale'; |
| | |
| | | import { buildUUID } from '/@/utils/uuid'; |
| | | import { AddOrEditLabelVarByWorkOrder } from '/@/api/tigerapi/mes/wo'; |
| | | import { useProdRouteStore } from '/@/store/modules/prodRoute'; |
| | | import { useWebSocketStore } from '/@/store/modules/websocket'; |
| | | |
| | | const { t } = useI18n(); |
| | | const { createErrorModal } = useMessage(); |
| | |
| | | * @return {*} |
| | | */ |
| | | GetHomeUrl: (params) => { |
| | | return `/V_BAS_PROD_R/LC/${encodeURI(JSON.stringify({ ID: 'V_BAS_PROD_R', colSlots: [], crudColSlots: [], sName: params['sName'] }))}`; |
| | | return `/V_BAS_PROD_R/LC/${encodeURI(JSON.stringify({ ID: 'V_BAS_PROD_R',"EntityName":"V_BAS_PROD_R", colSlots: [], crudColSlots: [], sName: params['sName'] }))}`; |
| | | }, |
| | | /** |
| | | * @description: 获取树形数据 |
| | |
| | | * @return {*} |
| | | */ |
| | | fetchTreeData: async (type: string, itemCode: string) => { |
| | | let data = { title: '', treeData: [] as any[], fieldNames: {} }; |
| | | let prodTreeData = (await GetRoutePTree({ |
| | | const data = { title: '', treeData: [] as any[], fieldNames: {} }; |
| | | const prodTreeData = (await GetRoutePTree({ |
| | | prodCode: itemCode, |
| | | orgCode: useUserStore().getUserInfo.orgCode, |
| | | })) as unknown as MesRotTree[]; |
| | | let _treeData = convertToTree(prodTreeData, 'pid', 'tid', 'root'); |
| | | const _treeData = convertToTree(prodTreeData, 'pid', 'tid', 'root'); |
| | | data.title = '工艺路线'; |
| | | data.fieldNames = { key: 'tid', title: 'name' }; |
| | | if ( |
| | |
| | | }); |
| | | } |
| | | useProdRoute.setItemCode(itemCode); |
| | | useProdRoute.setname(itemCode); |
| | | if (useProdRoute.curProdRotTree.some((q) => q.name == itemCode)) { |
| | | data.treeData = useProdRoute.curProdRotTree.filter((q) => q.name == itemCode)[0].treeInfo; |
| | | } |
| | |
| | | { name: 'auditadd', icon: 'search|svg' }, |
| | | { name: 'printadd', icon: 'search|svg' }, |
| | | { name: 'pkgadd', icon: 'search|svg' }, |
| | | { name: 'labeladd', icon: 'search|svg' }, |
| | | { name: 'labeladd', icon: 'template|svg' }, |
| | | ]; |
| | | }, |
| | | /** |
| | |
| | | nodeChange: (params: { useForms: Ref<any>; objParams: Ref<any>; selectedNodes: any[] }) => |
| | | new Promise<any>(async (resolve, reject) => { |
| | | // params['useForms'].value = methods.GetUseForm(); |
| | | let result = { isShow: {} }; |
| | | const result = { isShow: {} }; |
| | | let sqlcmd = ' 1=1 '; |
| | | if (!isNullOrEmpty(params['objParams'].value['CODE'])) { |
| | | sqlcmd += `And PROD_CODE = '${params['objParams'].value['CODE']}'`; |
| | | } |
| | | if (!isNullOrEmpty(params['selectedNodes'][0].cust)) { |
| | | sqlcmd += `And CUST_CODE = '${params['selectedNodes'][0].cust}'`; |
| | | } |
| | | sqlcmd += `And ISNULL(CUST_CODE, '') = ISNULL('${params['selectedNodes'][0].cust}', '')`; |
| | | |
| | | if (!isNullOrEmpty(params['selectedNodes'][0].id)) { |
| | | sqlcmd += |
| | | params['selectedNodes'][0].type == 'Action' |
| | |
| | | ? 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'; |
| | |
| | | } |
| | | 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: isNullOrEmpty(res.Data.Items[0].IS_ACTIVE) |
| | | ? 'N' |
| | | : res.Data.Items[0].IS_ACTIVE, |
| | | IS_CALC_FPY: isNullOrEmpty(res.Data.Items[0].IS_CALC_FPY) |
| | | ? 'N' |
| | | : res.Data.Items[0].IS_CALC_FPY, |
| | | CAN_SKIP: isNullOrEmpty(res.Data.Items[0].CAN_SKIP) |
| | | ? 'N' |
| | | : res.Data.Items[0].CAN_SKIP, |
| | | IS_INPUT: isNullOrEmpty(res.Data.Items[0].IS_INPUT) |
| | | ? 'N' |
| | | : res.Data.Items[0].IS_INPUT, |
| | | IS_OUTPUT: isNullOrEmpty(res.Data.Items[0].IS_OUTPUT) |
| | | ? 'N' |
| | | : res.Data.Items[0].IS_OUTPUT, |
| | | ALLOW_DFT_IN: isNullOrEmpty(res.Data.Items[0].ALLOW_DFT_IN) |
| | | ? 'N' |
| | | : res.Data.Items[0].ALLOW_DFT_IN, |
| | | REMARK: res.Data.Items[0].REMARK, |
| | | PROD_CODE: params['objParams'].value['CODE'], |
| | | CUST_CODE: params['selectedNodes'][0].cust, |
| | | }); |
| | | 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].PROD_CODE = params['objParams'].value['CODE'] |
| | | } |
| | | 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_PROD_OPER'); |
| | | |
| | | // result['Node'] = res.Data.Items; |
| | | result['name'] = 'Node'; |
| | | result['isShow'] = { |
| | |
| | | ItemColumns: TemplateBasColumn, //弹出框中表格字段结构 |
| | | schemas: [], //查询条件字段结构 |
| | | others: { WORK_ORDER: OrderNo }, //需要带到弹出窗口中的数据 |
| | | alertConfig: { |
| | | showAlert: false, |
| | | message: '销售订单备注', |
| | | description: '', |
| | | }, |
| | | searchInfo: { |
| | | TABLE_NAME: 'BAS_LABEL_VAR_WO', //实体名称 |
| | | LabelId: record.LABEL_CODE, //模板ID |
| | |
| | | break; |
| | | case 'assyadd': |
| | | const items = d.values['val'].split(','); |
| | | let data: any[] = []; |
| | | const data: any[] = []; |
| | | if (!isNullOrEmpty(items) && items.length > 0) { |
| | | items.map((x) => { |
| | | data.push({ |
| | |
| | | }); |
| | | return; |
| | | } |
| | | let codes = d.values.id.split(','); |
| | | const codes = d.values.id.split(','); |
| | | var i; |
| | | for (i = 0; i < codes.length; i++) { |
| | | if (d.which == 'addRoute') { |
| | |
| | | }); |
| | | return; |
| | | } |
| | | let rotIds = d.ROT_ID.split(','); |
| | | const 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 }); |
| | |
| | | * @return {*} |
| | | */ |
| | | GetUseTables: (data: Ref<{}>, ...args) => { |
| | | // data.value['Table'] = []; |
| | | 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, |
| | | // scroll: { y: window.screen.width == 1366? 400: 450 }, |
| | |
| | | * @return {*} |
| | | */ |
| | | SelectNode: (selectedNodes: Ref<any[]>, code: string) => { |
| | | let result = { |
| | | const result = { |
| | | showConfig: false, |
| | | showNav: false, |
| | | type: selectedNodes.value[0].type, |
| | |
| | | resolve('OK'); |
| | | break; |
| | | case 'BAS_LABEL_VAR_WO': |
| | | param.values['WORK_ORDER'] = param.others['WORK_ORDER']; |
| | | param.values['PROD_CODE'] = param.others['PROD_CODE']; |
| | | param.values['ID'] = buildUUID(); |
| | | var action = await AddOrEditLabelVarByWorkOrder( |
| | | param.values as unknown as BAS_LABEL_VAR_WO, |
| | |
| | | /* 设置默认工艺路线 */ |
| | | var action = await useProdRoute.setDefaulRoute(param); |
| | | resolve(action); |
| | | case 'delete': |
| | | const webSocketStore = useWebSocketStore(); |
| | | if (webSocketStore.GetSocketState == 1) { |
| | | webSocketStore.sendMessage( |
| | | `wsGetNew ${param.values['LABEL_ID']}_#_${param.values['PROD_CODE']}`, |
| | | ); |
| | | } |
| | | break; |
| | | } |
| | | } catch (e) { |
| | | reject(e); |
| | |
| | | label: '删除', |
| | | handler: () => { |
| | | console.log('点击了删除', node); |
| | | DeleteProdRoute({ rotId: node.id, rotCode: node.code, prodCode: args[1] }).then( |
| | | (action) => { |
| | | if (action.IsSuccessed) { |
| | | emit('deletenode', node); |
| | | } else { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: t(action.LocaleMsg), |
| | | }); |
| | | } |
| | | }, |
| | | ); |
| | | DeleteProdRoute({ |
| | | rotId: node.id, |
| | | rotCode: node.code, |
| | | prodCode: args[1], |
| | | custCode: node.cust, |
| | | }).then((action) => { |
| | | if (action.IsSuccessed) { |
| | | emit('deletenode', node); |
| | | } else { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: t(action.LocaleMsg), |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | icon: 'bx:bxs-folder-open', |
| | | }, |
| | |
| | | }, |
| | | }, |
| | | { |
| | | 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', |
| | |
| | | const openCrudModal = args[0]; |
| | | // const OrderNo = args[2]; |
| | | const ProdCode = args[2]; |
| | | const WoRecord = args[4]; |
| | | openCrudModal(true, { |
| | | isUpdate: true, //是否更新操作 |
| | | entityName: 'ProdRouteBinding', //是哪个页面 |
| | |
| | | ItemColumns: TemplateBasColumn, //弹出框中表格字段结构 |
| | | schemas: [], //查询条件字段结构 |
| | | others: { WORK_ORDER: '', PROD_CODE: ProdCode }, //需要带到弹出窗口中的数据 |
| | | alertConfig: { |
| | | showAlert: false, |
| | | message: '销售订单备注', |
| | | description: '', |
| | | }, |
| | | searchInfo: { |
| | | TABLE_NAME: 'BAS_LABEL_VAR_WO', //实体名称 |
| | | LabelId: params['record'].LABEL_ID, //模板ID |
| | |
| | | title: '工单号', |
| | | dataIndex: 'WORK_ORDER', |
| | | width: 280, |
| | | editRow: true, |
| | | // editRow: true, |
| | | // editable: true, |
| | | ifShow: false, |
| | | }, |
| | | { |
| | | title: '工单号', |
| | | dataIndex: 'PROD_CODE', |
| | | width: 280, |
| | | ifShow: false, |
| | | }, |
| | | { |
| | | title: '变量名', |
| | | dataIndex: 'VAR_NAME', |
| | | }, |