| | |
| | | * @version: |
| | | * @Date: 2024-06-19 20:34:27 |
| | | * @LastEditors: Ben Lin |
| | | * @LastEditTime: 2024-07-21 18:26:07 |
| | | * @LastEditTime: 2024-08-13 20:53:26 |
| | | */ |
| | | |
| | | import { Ref, h, ref, render, unref } from 'vue'; |
| | | import { GetRoutePTree, RouteToCust, RouteToProd } from '/@/api/tigerapi/mes/router'; |
| | | import { |
| | | DeleteWoRoute, |
| | | GetWoPTree, |
| | | SP_MES_PROD2WO, |
| | | SP_MES_WO2CUST, |
| | | } 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 { NavItem } from '/@/api/tigerapi/model/basModel'; |
| | | import { useMessage } from '/@/hooks/web/useMessage'; |
| | | import { useModal } from '/@/components/Modal'; |
| | | import { FormSchema } from '/@/components/Table'; |
| | | import { initRoute } from '../data'; |
| | | import { BasicColumn, FormSchema, useTable } from '/@/components/Table'; |
| | | import { CustModalParams } from '/@/api/tigerapi/model/systemModel'; |
| | | import { useUserStore } from '/@/store/modules/user'; |
| | | import { EventDataNode } from 'ant-design-vue/lib/tree'; |
| | | import { ContextMenuItem } from '/@/components/TigerTree'; |
| | | import { UpdateWoStatus } from '/@/api/tigerapi/mes/wo'; |
| | | import { useForm } from '/@/components/Form'; |
| | | |
| | | const { t } = useI18n(); |
| | | const { createErrorModal } = useMessage(); |
| | |
| | | CreateIcon: (params: Recordable<any>) => { |
| | | let icon = ''; |
| | | switch (params['type']) { |
| | | case 'Product': |
| | | icon = 'similar-product|svg'; |
| | | case 'WorkOrder': |
| | | icon = 'workorder|svg'; |
| | | break; |
| | | case 'Route': |
| | | icon = 'route|svg'; |
| | |
| | | * @description: 高级表单和详情页面返回主页面的url |
| | | * @return {*} |
| | | */ |
| | | GetHomeUrl: () => { |
| | | return `/V_BAS_PROD/LC/${encodeURI(JSON.stringify({ ID: 'V_BAS_PROD', colSlots: [], crudColSlots: [] }))}`; |
| | | GetHomeUrl: (params: {}) => { |
| | | return `/BIZ_MES_WO/LC/${encodeURI(JSON.stringify({ ID: 'BIZ_MES_WO', colSlots: params['colSlots'], crudColSlots: [] }))}`; |
| | | }, |
| | | /** |
| | | * @description: 获取树形数据 |
| | | * @param {string} type |
| | | * @return {*} |
| | | */ |
| | | fetchTreeData: async (type: string, itemCode: string) => { |
| | | fetchTreeData: async (type: string, wo: string) => { |
| | | let data = { title: '', treeData: [] as any[], fieldNames: {} }; |
| | | let prodTreeData = await GetRoutePTree({prodCode: itemCode, orgCode: useUserStore().getUserInfo.orgCode}); |
| | | 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'); |
| | | data.title = '工艺路线'; |
| | | if (data.treeData.length == 0) { |
| | | data.treeData.push({ |
| | | pid: 'root', |
| | | tid: '', |
| | | id: '', |
| | | wo: wo, |
| | | prod: '', |
| | | name: wo, |
| | | type: 'WorkOrder', |
| | | }); |
| | | } |
| | | data.title = '工单工艺路线'; |
| | | data.fieldNames = { key: 'tid', title: 'name' }; |
| | | return data; |
| | | }, |
| | |
| | | case 'Node': |
| | | form = nodeFormShema; |
| | | break; |
| | | default: |
| | | form = crudForms[type]; |
| | | break; |
| | | } |
| | | return form; |
| | | }, |
| | |
| | | return ['scanadd', 'assyadd', 'testadd', 'auditadd', 'printadd', 'pkgadd']; |
| | | }, |
| | | /** |
| | | * @description: 获取表格use列表 |
| | | * @param {string} type |
| | | * @param {array} args |
| | | * @return {*} |
| | | */ |
| | | GetUseTables: (data: Ref<{}>, ...args) => { |
| | | return { |
| | | BAS_PKG_DTL: useTable({ |
| | | title: '列表信息', |
| | | // api: getListByPage, |
| | | // searchInfo: { TABLE_NAME: 'V_BAS_PKG_DTL' }, |
| | | dataSource: data.value['BAS_PKG_DTL'], |
| | | columns: GetBaseColumns('BAS_PKG_DTL', args[0], data), |
| | | maxHeight: 520, |
| | | useSearchForm: false, |
| | | showTableSetting: false, |
| | | bordered: true, |
| | | canResize: true, |
| | | showIndexColumn: false, |
| | | // rowSelection: { |
| | | // type: 'radio', //'checkbox' |
| | | // }, |
| | | actionColumn: { |
| | | width: 100, |
| | | title: '操作', |
| | | dataIndex: 'action', |
| | | slots: { customRender: 'action' }, |
| | | fixed: 'right', |
| | | }, //自定义操作列 |
| | | }), |
| | | ItemCode: useTable({ |
| | | title: '列表信息', |
| | | // api: getListByPage, |
| | | // searchInfo: { TABLE_NAME: 'V_BAS_PKG_DTL' }, |
| | | dataSource: data.value['ItemCode'], |
| | | columns: GetBaseColumns('ItemCode', args[0], data), |
| | | maxHeight: 520, |
| | | useSearchForm: false, |
| | | showTableSetting: false, |
| | | bordered: true, |
| | | canResize: true, |
| | | showIndexColumn: false, |
| | | // rowSelection: { |
| | | // type: 'radio', //'checkbox' |
| | | // }, |
| | | actionColumn: { |
| | | width: 100, |
| | | title: '操作', |
| | | dataIndex: 'action', |
| | | slots: { customRender: 'action' }, |
| | | fixed: 'right', |
| | | }, //自定义操作列 |
| | | }), |
| | | }; |
| | | }, |
| | | GetUseForm: () => { |
| | | return { |
| | | Action: useForm({ |
| | | labelWidth: 145, |
| | | schemas: methods.GetCrudForm('Action'), |
| | | actionColOptions: { |
| | | offset: 8, |
| | | span: 24, |
| | | }, |
| | | wrapperCol: { |
| | | span: 15, |
| | | }, |
| | | showActionButtonGroup: true, |
| | | submitButtonOptions: { |
| | | text: '保存', |
| | | }, |
| | | }), |
| | | Node: useForm({ |
| | | labelWidth: 145, |
| | | schemas: methods.GetCrudForm('Node'), |
| | | actionColOptions: { |
| | | offset: 8, |
| | | span: 24, |
| | | }, |
| | | wrapperCol: { |
| | | span: 15, |
| | | }, |
| | | showActionButtonGroup: true, |
| | | submitButtonOptions: { |
| | | text: '保存', |
| | | }, |
| | | }), |
| | | }; |
| | | }, |
| | | /** |
| | | * @description: 切换节点时事件方法 |
| | | * @return {*} |
| | | */ |
| | | 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', |
| | | order: '', |
| | | }).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, |
| | | }); |
| | | nodeChange: (params: { useForms: Ref<any>; objParams: Ref<any>; selectedNodes: any[] }) => |
| | | new Promise<any>(async (resolve, reject) => { |
| | | let result = { isShow: {} }; |
| | | let sqlcmd = ' 1=1 '; |
| | | if (!isNullOrEmpty(params['objParams'].value['CODE'])) { |
| | | sqlcmd += `And WORK_ORDER = '${params['objParams'].value['CODE']}'`; |
| | | } |
| | | 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, |
| | | }); |
| | | if (!isNullOrEmpty(params['selectedNodes'][0].id)) { |
| | | sqlcmd += |
| | | params['selectedNodes'][0].type == 'Action' |
| | | ? `And ACT_ID = '${params['selectedNodes'][0].id}'` |
| | | : `And NODE_ID = '${params['selectedNodes'][0].id}'`; |
| | | } |
| | | }); |
| | | }, |
| | | try { |
| | | const res = await getEntity({ |
| | | sqlcmd: sqlcmd, |
| | | entityName: |
| | | params['selectedNodes'][0].type == 'Action' ? 'MES_WO_ACTION' : 'MES_WO_OPER', |
| | | order: '', |
| | | }); |
| | | const setFieldsValue = params['useForms'].value['Action'][1]['setFieldsValue']; |
| | | const setFieldsValueNode = params['useForms'].value['Node'][1]['setFieldsValue']; |
| | | const resetFields = params['useForms'].value['Action'][1]['resetFields']; |
| | | const resetFieldsNode = params['useForms'].value['Node'][1]['resetFields']; |
| | | if (params['selectedNodes'][0].type == 'Action') { |
| | | resetFields(); |
| | | 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, |
| | | WORK_ORDER: params['objParams'].value['CODE'], |
| | | ACT_TYPE: res.Data.Items[0].ACT_TYPE, |
| | | CUST_CODE: params['selectedNodes'][0].cust, |
| | | PROD_CODE: params['selectedNodes'][0].prod, |
| | | OPTION_1: res.Data.Items[0].OPTION_1, |
| | | }); |
| | | /* 如果是包装规则 */ |
| | | if (res.Data.Items[0].ACT_TYPE == 6) { |
| | | result['name'] = 'BAS_PKG_DTL'; |
| | | result['isShow'] = { |
| | | BAS_PKG_DTL: isNullOrEmpty(res.Data.Items[0].PKG_CODE) ? false : true, |
| | | ItemCode: false, |
| | | }; |
| | | const ents = await getEntity({ |
| | | sqlcmd: `RULE_CODE ='${res.Data.Items[0].PKG_CODE}'`, |
| | | entityName: 'V_BAS_PKG_DTL', |
| | | order: '', |
| | | }); |
| | | result['BAS_PKG_DTL'] = isNullOrEmpty(res.Data.Items[0].OPTION_1) |
| | | ? 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; |
| | | } /* 如果是组装上料 */ |
| | | if (res.Data.Items[0].ACT_TYPE == 2) { |
| | | result['name'] = 'ItemCode'; |
| | | result['ItemCode'] = JSON.parse(res.Data.Items[0].OPTION_1); |
| | | result['isShow'] = { |
| | | BAS_PKG_DTL: false, |
| | | ItemCode: true, |
| | | }; |
| | | } |
| | | result['Action'] = res.Data.Items; |
| | | } |
| | | 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, |
| | | }); |
| | | result['name'] = 'Node'; |
| | | result['isShow'] = { |
| | | BAS_PKG_DTL: false, |
| | | ItemCode: false, |
| | | }; |
| | | } |
| | | resolve(result); |
| | | } catch (e) { |
| | | reject(e); |
| | | } |
| | | }), |
| | | /** |
| | | * @description: 自定义提交方法 |
| | | * @return {*} |
| | |
| | | let entityName = ''; |
| | | switch (type) { |
| | | case 'Action': |
| | | entityName = 'MES_PROD_ACTION'; |
| | | entityName = 'MES_WO_ACTION'; |
| | | break; |
| | | case 'Node': |
| | | entityName = 'MES_PROD_OPER'; |
| | | entityName = 'MES_WO_OPER'; |
| | | break; |
| | | } |
| | | values.AUTH_ORG = useUserStore().getUserInfo.orgCode; |
| | | values.AUTH_PROD = useUserStore().getUserInfo.prodCode; |
| | | SaveEntity(values, true, entityName).then((action) => { |
| | | if (action.IsSuccessed) { |
| | | emit('success'); |
| | |
| | | * @param {*} u |
| | | * @return {*} |
| | | */ |
| | | GetSelectSuccess: (d, u, ...args) => { |
| | | GetSelectSuccess: async (d, u, ...args) => { |
| | | let value = {}; |
| | | switch (args[0]) { |
| | | case 'scanadd': |
| | | value = { |
| | | RULE_CODE: d.values['val'], |
| | | value: { |
| | | RULE_CODE: d.values['val'], |
| | | }, |
| | | isShow: { BAS_PKG_DTL: false, ItemCode: false }, |
| | | }; |
| | | break; |
| | | case 'assyadd': |
| | | const items = d.values['val'].split(','); |
| | | let data: any[] = []; |
| | | if (!isNullOrEmpty(items) && items.length > 0) { |
| | | items.map((x) => { |
| | | data.push({ |
| | | ITEM_CODE: x, |
| | | RULE_CODE: '', |
| | | IsBatchItem: 'N', |
| | | QTY: 1, |
| | | }); |
| | | }); |
| | | } |
| | | value = { |
| | | ITEM_CODE: d.values['val'], |
| | | value: { |
| | | ITEM_CODE: d.values['val'], |
| | | }, |
| | | isShow: { BAS_PKG_DTL: false, ItemCode: true }, |
| | | data: data, |
| | | name: 'ItemCode', |
| | | }; |
| | | break; |
| | | case 'printadd': |
| | | value = { |
| | | LABEL_CODE: d.values['val'], |
| | | value: { |
| | | LABEL_CODE: d.values['val'], |
| | | }, |
| | | isShow: { BAS_PKG_DTL: false, ItemCode: false }, |
| | | }; |
| | | break; |
| | | case 'pkgadd': |
| | | const ents = await getEntity({ |
| | | sqlcmd: `RULE_CODE ='${d.values['val']}'`, |
| | | entityName: 'V_BAS_PKG_DTL', |
| | | order: '', |
| | | }); |
| | | value = { |
| | | pkgRULE_CODE: d.values['val'], |
| | | value: { |
| | | PKG_CODE: d.values['val'], |
| | | }, |
| | | isShow: { BAS_PKG_DTL: true, ItemCode: false }, |
| | | data: ents.Data.Items, |
| | | name: 'BAS_PKG_DTL', |
| | | }; |
| | | break; |
| | | case 'addRoute': |
| | | if (isNullOrEmpty(args[1]['CODE'])) { |
| | | createErrorModal({ |
| | |
| | | }); |
| | | 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'] }); |
| | | /* 更新工单状态并生成工单的工艺路线 */ |
| | | UpdateWoStatus({ |
| | | UserId: useUserStore().getUserInfo.userId as string, |
| | | WorkOrder: args[1]['CODE'], |
| | | Status: -1, |
| | | RouteStatus: 1, |
| | | }).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, |
| | | }); |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: t(action.LocaleMsg), |
| | | }); |
| | | } |
| | | }); |
| | | } else { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: t(action.LocaleMsg), |
| | | }); |
| | | } |
| | | } |
| | | |
| | | args[2](); |
| | | }); |
| | | break; |
| | | case 'addCustomer': |
| | | if (isNullOrEmpty(args[1]['CODE'])) { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: '产品为空,不能添加工艺路线,请点击左侧选择产品', |
| | | 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 }); |
| | | } |
| | | SP_MES_WO2CUST({ wo: args[1]['CODE'] }); |
| | | |
| | | args[2](); |
| | | break; |
| | |
| | | addRoute: useModal(), |
| | | addCustomer: useModal(), |
| | | editRoute: useModal(), |
| | | scanadd: useModal(), |
| | | assyadd: useModal(), |
| | | testadd: useModal(), |
| | | auditadd: useModal(), |
| | | printadd: useModal(), |
| | | pkgadd: useModal(), |
| | | }; |
| | | }, |
| | | /** |
| | |
| | | * @param {string} type |
| | | * @return {*} |
| | | */ |
| | | GetTitle: (type: string) => { |
| | | GetTitle: (type: string, item) => { |
| | | return { |
| | | configTitle: type == 'Action' ? '行为配置' : '工序配置', |
| | | navTitle: type == 'Product' ? '添加工艺路线' : '工艺路线维护', |
| | | tableTitle: type == 'Action' ? (item == 'ItemCode' ? '上料列表' : '包装层级列表') : '', |
| | | }; |
| | | }, |
| | | /** |
| | |
| | | showNav: false, |
| | | type: selectedNodes.value[0].type, |
| | | nodes: selectedNodes.value, |
| | | showOtherTable: { BAS_PKG_DTL: false, ItemCode: false }, |
| | | }; |
| | | if (isNullOrUnDef(selectedNodes)) { |
| | | return result; |
| | | } |
| | | if (selectedNodes.value[0].type == 'Product' || selectedNodes.value[0].type == 'Route') { |
| | | if (selectedNodes.value[0].type == 'WorkOrder' || selectedNodes.value[0].type == 'Route') { |
| | | result.showNav = true; |
| | | result.showConfig = false; |
| | | result.showOtherTable = { BAS_PKG_DTL: false, ItemCode: false }; |
| | | } |
| | | if (selectedNodes.value[0].type == 'Action' || selectedNodes.value[0].type == 'Node') { |
| | | result.showNav = false; |
| | | result.showConfig = true; |
| | | if (selectedNodes.value[0].type == 'Action') { |
| | | result.showOtherTable = { BAS_PKG_DTL: false, ItemCode: false }; |
| | | } else { |
| | | result.showOtherTable = { BAS_PKG_DTL: false, ItemCode: false }; |
| | | } |
| | | } |
| | | return result; |
| | | }, |
| | |
| | | GetNavItems: (type: string) => { |
| | | let item: NavItem[] = []; |
| | | switch (type) { |
| | | case 'Product': |
| | | case 'WorkOrder': |
| | | item = [ |
| | | { |
| | | title: '添加产品工艺路线', |
| | |
| | | action: 'addRoute', |
| | | isStep: false, |
| | | }, |
| | | { |
| | | title: '添加客户工艺路线', |
| | | icon: 'add_customer|svg', |
| | | color: '#bf0c2c', |
| | | url: '/addCustomer', |
| | | action: 'addCustomer', |
| | | isStep: true, |
| | | }, |
| | | // { |
| | | // title: '添加客户工艺路线', |
| | | // icon: 'add_customer|svg', |
| | | // color: '#bf0c2c', |
| | | // url: '/addCustomer', |
| | | // action: 'addCustomer', |
| | | // isStep: true, |
| | | // }, |
| | | ]; |
| | | break; |
| | | case 'Route': |
| | |
| | | }); |
| | | break; |
| | | case 'addCustomer': |
| | | args[0](true, { |
| | | title: '请完成以下步骤', |
| | | }); |
| | | if (isNullOrEmpty(args[2][0]['wo'])) { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: '工单为空,不能添加工艺路线,请点击左侧选择工单', |
| | | }); |
| | | return; |
| | | } |
| | | SP_MES_WO2CUST({ wo: args[2][0]['wo'] }); |
| | | break; |
| | | case 'editRoute': |
| | | args[1](true, { rotId: args[2][0].id, slotName: '' }); |
| | | args[1](true, { rotId: args[2][0].wo, slotName: '', rotType: 'Wo', prodCode:args[3],custCode:args[2][0].cust }); |
| | | break; |
| | | } |
| | | }, |
| | |
| | | GetBaseCards: (type: string) => { |
| | | let reusts: any[] = []; |
| | | switch (type) { |
| | | case 'Product': |
| | | case 'WorkOrder': |
| | | reusts = []; |
| | | break; |
| | | case 'Route': |
| | |
| | | * @param {array} args |
| | | * @return {*} |
| | | */ |
| | | CustFunc: (param: CustModalParams) => { |
| | | if (param.cType == 'Route') { |
| | | // initRoute(args[0], args[1]); |
| | | CustFunc: async (param: CustModalParams) => { |
| | | switch (param['ctype']) { |
| | | case 'BAS_PKG_DTL': |
| | | // const ents = await getEntity({ |
| | | // sqlcmd: `PKG_RULE_ID ='${param.values['PKG_RULE_ID']}'`, |
| | | // entityName: 'V_BAS_PKG_DTL', |
| | | // order: '', |
| | | // }); |
| | | // param.data.value['Table'] = ents.Data.Items; |
| | | param.data.value['BAS_PKG_DTL'].map((x) => { |
| | | if (x.PKG_CODE == param.values['PKG_CODE']) { |
| | | x.LABEL_CODE = param.values['LABEL_CODE']; |
| | | } |
| | | }); |
| | | param.data.value['Action'][0]['OPTION_1'] = JSON.stringify( |
| | | param.data.value['BAS_PKG_DTL'], |
| | | ); |
| | | break; |
| | | case 'ItemCode': |
| | | param.data.value['ItemCode'].map((x) => { |
| | | if (x.ITEM_CODE == param.values['ITEM_CODE']) { |
| | | x.IsBatchItem = param.values['IsBatchItem']; |
| | | x.RULE_CODE = param.values['RULE_CODE']; |
| | | } |
| | | }); |
| | | param.data.value['Action'][0]['OPTION_1'] = JSON.stringify( |
| | | param.data.value['ItemCode'], |
| | | ); |
| | | break; |
| | | } |
| | | }, |
| | | GetUseForm: () => { |
| | | return {}; |
| | | /** |
| | | * @description: 获取右键菜单列表 |
| | | * @param {EventDataNode} node |
| | | * @return {*} |
| | | */ |
| | | GetRightMenuList: (node: EventDataNode, ...args): ContextMenuItem[] => { |
| | | const emit = args[0]; |
| | | const menu = [ |
| | | // { |
| | | // label: '新增', |
| | | // handler: () => { |
| | | // console.log('点击了新增', node); |
| | | // }, |
| | | // icon: 'bi:plus', |
| | | // }, |
| | | { |
| | | label: '删除', |
| | | handler: () => { |
| | | console.log('点击了删除', node); |
| | | DeleteWoRoute({ rotId: '', rotCode: node.code, wo: node.wo }).then((action) => { |
| | | if (action.IsSuccessed) { |
| | | emit('deletenode', node); |
| | | } else { |
| | | createErrorModal({ |
| | | title: t('sys.api.errorTip'), |
| | | content: t(action.LocaleMsg), |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | icon: 'bx:bxs-folder-open', |
| | | }, |
| | | ]; |
| | | return node.type == 'Route' ? menu : []; |
| | | }, |
| | | }; |
| | | |
| | | /* 以下是内部方法,不export,供上面的方法调用 */ |
| | | |
| | | let columns: BasicColumn[] = []; |
| | | /** |
| | | * @description: 获取表格字段Json |
| | | * @param {string} type |
| | | * @return {*} |
| | | */ |
| | | function GetBaseColumns(type: string, emit, data: Ref<{}>) { |
| | | switch (type) { |
| | | case 'BAS_PKG_DTL': |
| | | columns = [ |
| | | { |
| | | dataIndex: 'PKG_RULE_ID', |
| | | title: '包装规则ID', |
| | | ifShow: false, |
| | | sorter: true, |
| | | resizable: true, |
| | | }, |
| | | { |
| | | dataIndex: 'PKG_CODE', |
| | | title: '包装编码', |
| | | ifShow: false, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | { |
| | | dataIndex: 'PKG_NAME', |
| | | title: '包装名称', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | { |
| | | dataIndex: 'PKG_QTY', |
| | | title: '包装数量', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | { |
| | | dataIndex: 'PKG_LEVEL', |
| | | title: '包装层级', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | { |
| | | dataIndex: 'LABEL_CODE', |
| | | title: '标签模板编码', |
| | | // edit: true, |
| | | // editRule: true, |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | // editComponent: 'Input', |
| | | // editComponentProps: (column) => { |
| | | // return { |
| | | // onClick: (event) => { |
| | | // console.log(column); |
| | | // }, |
| | | // }; |
| | | // }, |
| | | // customCell: (record, rowIndex) => { |
| | | // return { |
| | | // onClick: (event) => { |
| | | // console.log(record); |
| | | // }, |
| | | // }; |
| | | // }, |
| | | }, |
| | | ] as BasicColumn[]; |
| | | break; |
| | | case 'ItemCode': |
| | | /* |
| | | public string ITEM_CODE { get; set; } |
| | | public string RULE_CODE { get; set; } |
| | | /// <summary> |
| | | /// 是否批次物料 |
| | | /// </summary> |
| | | public bool IsBatchItem { get; set; } |
| | | /// <summary> |
| | | /// 上料数量 |
| | | /// </summary> |
| | | public int QTY { get; set; } |
| | | */ |
| | | columns = [ |
| | | { |
| | | dataIndex: 'ITEM_CODE', |
| | | title: '物料编码', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | }, |
| | | { |
| | | dataIndex: 'RULE_CODE', |
| | | title: '规则编码', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | { |
| | | dataIndex: 'IsBatchItem', |
| | | title: '是否批次物料', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | { |
| | | dataIndex: 'QTY', |
| | | title: '上料数量', |
| | | ifShow: true, |
| | | sorter: true, |
| | | resizable: true, |
| | | customRender: () => {}, |
| | | }, |
| | | // { |
| | | // dataIndex: 'LABEL_CODE', |
| | | // title: '标签模板编码', |
| | | // // edit: true, |
| | | // // editRule: true, |
| | | // ifShow: true, |
| | | // sorter: true, |
| | | // resizable: true, |
| | | // // editComponent: 'Input', |
| | | // // editComponentProps: (column) => { |
| | | // // return { |
| | | // // onClick: (event) => { |
| | | // // console.log(column); |
| | | // // }, |
| | | // // }; |
| | | // // }, |
| | | // // customCell: (record, rowIndex) => { |
| | | // // return { |
| | | // // onClick: (event) => { |
| | | // // console.log(record); |
| | | // // }, |
| | | // // }; |
| | | // // }, |
| | | // }, |
| | | ] as BasicColumn[]; |
| | | break; |
| | | } |
| | | return columns; |
| | | } |
| | | /** |
| | | * @description: 弹出选择框-物料选择框配置 |
| | | * @return {*} |
| | |
| | | */ |
| | | const actionFormShema: FormSchema[] = [ |
| | | { |
| | | field: 'PROD_CODE', |
| | | label: '产品编码', |
| | | field: 'WORK_ORDER', |
| | | label: '工单号', |
| | | component: 'Input', |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | colProps: { span: 12 }, |
| | | }, |
| | | { |
| | | field: 'PROD_CODE', |
| | | label: 'PROD_CODE', |
| | | component: 'Input', |
| | | show: false, |
| | | }, |
| | | { |
| | | field: 'ID', |
| | |
| | | defaultValue: 0, |
| | | componentProps: { |
| | | api: GetEnum, |
| | | params: { name: 'MES_PROD_ACTION+ACT_TYPEs' }, |
| | | params: { name: 'MES_WO_ACTION+ACT_TYPEs' }, |
| | | resultField: 'Data', |
| | | labelField: unref(getLocale) == 'zh_CN' ? 'Desc' : 'Name', |
| | | valueField: 'Value', |
| | |
| | | field: 'RULE_CODE', |
| | | label: '扫码验证', |
| | | component: 'Input', |
| | | colProps: { span: 10 }, |
| | | colProps: { span: 11 }, |
| | | ifShow: ({ values }) => isScan(values.ACT_TYPE), |
| | | }, |
| | | { |
| | |
| | | label: '1', |
| | | defaultValue: '', |
| | | component: 'Input', |
| | | colProps: { span: 2, pull: 1 }, |
| | | colProps: { span: 1, pull: 1 }, |
| | | ifShow: ({ values }) => isScan(values.ACT_TYPE), |
| | | colSlot: 'scanadd', |
| | | }, |
| | | { |
| | | field: 'ITEM_CODE', |
| | | label: '组装上料', |
| | | colProps: { span: 10 }, |
| | | colProps: { span: 11 }, |
| | | component: 'Input', |
| | | ifShow: ({ values }) => isAssy(values.ACT_TYPE), |
| | | }, |
| | |
| | | label: '1', |
| | | defaultValue: '', |
| | | component: 'Input', |
| | | colProps: { span: 2, pull: 1 }, |
| | | colProps: { span: 1, pull: 1 }, |
| | | ifShow: ({ values }) => isAssy(values.ACT_TYPE), |
| | | colSlot: 'assyadd', |
| | | }, |
| | | { |
| | | field: 'TEST_CODE', |
| | | label: '产品测试', |
| | | colProps: { span: 10 }, |
| | | colProps: { span: 11 }, |
| | | component: 'Input', |
| | | ifShow: ({ values }) => isTest(values.ACT_TYPE), |
| | | }, |
| | |
| | | label: '1', |
| | | defaultValue: '', |
| | | component: 'Input', |
| | | colProps: { span: 2, pull: 1 }, |
| | | colProps: { span: 1, pull: 1 }, |
| | | ifShow: ({ values }) => isTest(values.ACT_TYPE), |
| | | colSlot: 'testadd', |
| | | }, |
| | | { |
| | | field: 'SAPL_CODE', |
| | | label: '产品抽检', |
| | | colProps: { span: 10 }, |
| | | colProps: { span: 11 }, |
| | | component: 'Input', |
| | | ifShow: ({ values }) => isAudit(values.ACT_TYPE), |
| | | }, |
| | |
| | | label: '1', |
| | | defaultValue: '', |
| | | component: 'Input', |
| | | colProps: { span: 2, pull: 1 }, |
| | | colProps: { span: 1, pull: 1 }, |
| | | ifShow: ({ values }) => isAudit(values.ACT_TYPE), |
| | | colSlot: 'auditadd', |
| | | }, |
| | | { |
| | | field: 'LABEL_CODE', |
| | | label: '标签打印', |
| | | colProps: { span: 10 }, |
| | | colProps: { span: 11 }, |
| | | component: 'Input', |
| | | ifShow: ({ values }) => isPrint(values.ACT_TYPE), |
| | | }, |
| | |
| | | label: '1', |
| | | defaultValue: '', |
| | | component: 'Input', |
| | | colProps: { span: 2, pull: 1 }, |
| | | colProps: { span: 1, pull: 1 }, |
| | | ifShow: ({ values }) => isPrint(values.ACT_TYPE), |
| | | colSlot: 'printadd', |
| | | }, |
| | | { |
| | | field: 'pkgRULE_CODE', |
| | | field: 'PKG_CODE', |
| | | label: '包装规则', |
| | | colProps: { span: 10 }, |
| | | colProps: { span: 11 }, |
| | | component: 'Input', |
| | | ifShow: ({ values }) => isPackage(values.ACT_TYPE), |
| | | }, |
| | |
| | | label: '1', |
| | | defaultValue: '', |
| | | component: 'Input', |
| | | colProps: { span: 2, pull: 1 }, |
| | | colProps: { span: 1, pull: 1 }, |
| | | ifShow: ({ values }) => isPackage(values.ACT_TYPE), |
| | | colSlot: 'pkgadd', |
| | | }, |
| | |
| | | component: 'Input', |
| | | colProps: { span: 12 }, |
| | | }, |
| | | { |
| | | field: 'OPTION_1', |
| | | label: '行为选项1', |
| | | component: 'Input', |
| | | colProps: { span: 12 }, |
| | | show: false, |
| | | }, |
| | | ]; |
| | | |
| | | /** |
| | |
| | | */ |
| | | const nodeFormShema: FormSchema[] = [ |
| | | { |
| | | field: 'PROD_CODE', |
| | | label: '产品编码', |
| | | field: 'WORK_ORDER', |
| | | label: '工单号', |
| | | component: 'Input', |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | colProps: { span: 12 }, |
| | | }, |
| | | { |
| | | field: 'PROD_CODE', |
| | | label: 'PROD_CODE', |
| | | component: 'Input', |
| | | show: false, |
| | | }, |
| | | { |
| | | field: 'ID', |
| | |
| | | }, |
| | | }, |
| | | { |
| | | field: 'ALLOW_DFT_IN', |
| | | 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', |
| | |
| | | }, |
| | | ]; |
| | | |
| | | const crudForms = { |
| | | BAS_PKG_DTL: [ |
| | | { |
| | | label: '包装规则ID', |
| | | field: 'PKG_RULE_ID', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | }, |
| | | { |
| | | label: '包装层级', |
| | | field: 'PKG_LEVEL', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | }, |
| | | { |
| | | field: 'PKG_CODE', |
| | | label: '包装/载具编码', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | }, |
| | | { |
| | | label: '包装数量', |
| | | field: 'PKG_QTY', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | }, |
| | | { |
| | | field: 'LABEL_CODE', |
| | | label: '模板编码', |
| | | component: 'Input', |
| | | show: true, |
| | | // required: true, |
| | | colProps: { |
| | | span: 22, |
| | | }, |
| | | }, |
| | | { |
| | | field: 'BAS_LABEL_TEMP1PSelect_0', //按低代码配置的规则,实体名+序号+PSelect_0,序号用来区分多个的时候,PSelect_0这是个固定后缀 |
| | | label: '1', |
| | | defaultValue: 'BAS_LABEL_TEMP', |
| | | component: 'Input', |
| | | colProps: { span: 2 }, |
| | | colSlot: 'BAS_LABEL_TEMP1add', //按低代码配置的规则,实体名+序号+add,序号用来区分多个的时候,add这是个固定后缀 |
| | | }, |
| | | { |
| | | label: '包装名称', |
| | | field: 'PKG_NAME', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | show: false, |
| | | }, |
| | | { |
| | | label: '备注', |
| | | field: 'REMARK', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return true; |
| | | }, |
| | | }, |
| | | { |
| | | label: 'ID', |
| | | field: 'ID', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | show: false, |
| | | }, |
| | | ] as FormSchema[], |
| | | ItemCode: [ |
| | | { |
| | | label: '物料编码', |
| | | field: 'ITEM_CODE', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return false; |
| | | }, |
| | | }, |
| | | { |
| | | field: 'RULE_CODE', |
| | | label: '规则编码', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 22, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return false; |
| | | }, |
| | | }, |
| | | { |
| | | field: 'BAS_CODE_RULE1PSelect_0', //按低代码配置的规则,实体名+序号+PSelect_0,序号用来区分多个的时候,PSelect_0这是个固定后缀 |
| | | label: '1', |
| | | defaultValue: 'BAS_CODE_RULE', |
| | | component: 'Input', |
| | | colProps: { span: 2 }, |
| | | colSlot: 'BAS_CODE_RULE1add', //按低代码配置的规则,实体名+序号+add,序号用来区分多个的时候,add这是个固定后缀 |
| | | }, |
| | | { |
| | | label: '是否批次物料', |
| | | field: 'IsBatchItem', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | component: 'Select', |
| | | componentProps: { |
| | | options: [ |
| | | { |
| | | label: '是', |
| | | value: 'Y', |
| | | key: 'Y', |
| | | }, |
| | | { |
| | | label: '否', |
| | | value: 'N', |
| | | key: 'N', |
| | | }, |
| | | ], |
| | | }, |
| | | }, |
| | | { |
| | | label: '上料数量', |
| | | field: 'QTY', |
| | | component: 'Input', |
| | | colProps: { |
| | | span: 24, |
| | | }, |
| | | dynamicDisabled: ({ values }) => { |
| | | return false; |
| | | }, |
| | | }, |
| | | ] as FormSchema[], |
| | | }; |
| | | |
| | | return [methods]; |
| | | } |
| | | |