diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java index 3a45b7e..725db87 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java @@ -45,4 +45,10 @@ public interface IMesEquipmentExtService { @ApiOperation(value = "根据设备代码查询设备点检上下文") MesEquipSpotCheckContext getEquipSpotCheckContext(String organizeCode, String workCenterCode, String equipmentCode); + @ApiOperation(value = "根据设备代码查询加工不可用规则信息") + List getProdRuleIgnoreCfgListByEquip(String organizeCode, String equipmentCode); + + @ApiOperation(value = "根据生产线代码查询加工不可用规则信息") + List getProdRuleIgnoreCfgListByCenter(String organizeCode, String workCenterCode); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java index 086ac76..0826a43 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java @@ -12,11 +12,11 @@ import java.util.Map; public interface IMesAssemblyExtService { - @ApiOperation(value = "【排序线】获取生产工单装配件绑定记录") - List getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext); + @ApiOperation(value = "【排序线】获取生产工单装配件绑定记录 -同时- 关联不可用规则") + List getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap); - @ApiOperation(value = "【排序线】获取生产工单装配件绑定记录 [前道所有装配件]") - List getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext, Map workCellMap); + @ApiOperation(value = "【排序线】获取生产工单装配件绑定记录 [前道所有装配件] -同时- 关联不可用规则") + List getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext, Map workCellMap, Map> prodRuleIgnoreCfgMap); @ApiOperation(value = "【排序线】获取生产工单装配件清单") List getWorkOrderAssemblyList(MesProdRuleContext prodRuleContext, Boolean isShowAll); @@ -33,8 +33,8 @@ public interface IMesAssemblyExtService { @ApiOperation(value = "根据零件条码或者加工单获取装配件规则且唯一绑定记录") List getProductionAssemblyUniqueListByProductSn(String organizeCode, String productSn); - @ApiOperation(value = "获取非排序装配件配置信息") - List getProductionAssemblyNosortContextList(MesProdRuleContext prodRuleContext); + @ApiOperation(value = "获取非排序装配件配置信息 -同时- 关联不可用规则") + List getProductionAssemblyNosortContextList(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap); @ApiOperation(value = "获取非排序装配件配置信息") List getAssemblyNosortCfgList(String organizeCode, Long pid); @@ -42,8 +42,11 @@ public interface IMesAssemblyExtService { @ApiOperation(value = "获取设备的装配件规则清单") List getAssemblyNosortCfgList(String organizeCode, String equipmentCode); - @ApiOperation(value = "获取设备的装配件规则清单") - List getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode); + @ApiOperation(value = "获取设备的装配件规则清单 -同时- 关联不可用规则") + List getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode, Map> prodRuleIgnoreCfgMap); + + @ApiOperation(value = "获取不可用规则") + String getProdRuleIgnoreCfg(Map> prodRuleIgnoreCfgMap, Long id, String dataSorce); @ApiOperation(value = "【排序线】获取生产工单装配件清单") List getWorkOrderAssemblyList(String organizeCode, String workOrderNo, String productSn, String craftCode); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesNumberRuleMatchDispatchService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesNumberRuleMatchDispatchService.java index d263fde..447a54f 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesNumberRuleMatchDispatchService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesNumberRuleMatchDispatchService.java @@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import io.swagger.annotations.ApiOperation; @@ -28,4 +29,7 @@ public interface IMesNumberRuleMatchDispatchService { @ApiOperation(value = "验证装配件条码在当前开模中的唯一性") default Boolean checkAssemblySnUniqueInMould(List productionAssemblyContextList, String assemblySn) { return true; } + @ApiOperation(value = "匹配不可用规则") + default Map matchIgnoreCfg(String organizeCode, String sn, Map result, List prodRuleIgnoreCfgList) { return null; } + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPartShippingGroupService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPartShippingGroupService.java index 6d65c8e..f7b8362 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPartShippingGroupService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPartShippingGroupService.java @@ -18,10 +18,10 @@ public interface IMesPartShippingGroupService { @ApiOperation(value = "查询发运组数据") - public List findAll(DdlPackBean packBean); + List findAll(MesPartShippingGroup partShippingGroup); @ApiOperation(value = "查询发运组数据") - MesPartShippingGroup getMesPartShippingGroup(String organizeCode,String shippingGroupCode); + MesPartShippingGroup getMesPartShippingGroup(String organizeCode, String shippingGroupCode); @ApiOperation(value = "打印发运单数据") List doMesMesShippingOrderManagementPrint(MesShippingOrderManagement model); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdRuleCfgExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdRuleCfgExtService.java index 578f292..7905bae 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdRuleCfgExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdRuleCfgExtService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import io.swagger.annotations.ApiOperation; @@ -16,19 +17,25 @@ public interface IMesProdRuleCfgExtService { @ApiOperation(value = "【非排序线】获取产品加工规则") List getProdRuleNosortCfgList(MesProdRuleContext... prodRuleContext); - @ApiOperation(value = "【非排序线】获取产品加工规则对应的装配件信息") - MesProdRuleContext getProdRuleNosortContext(MesProdRuleContext prodRuleContext); + @ApiOperation(value = "【非排序线】获取产品加工规则 -之后- 关联不可用规则") + List getProdRuleNosortCfgList(List prodRuleNosortCfgList, Map> prodRuleIgnoreCfgMap); + + @ApiOperation(value = "【非排序线】获取产品加工规则对应的装配件信息 -同时- 关联不可用规则") + MesProdRuleContext getProdRuleNosortContext(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap); + + @ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】") + MesProdRuleNosortCfg getProdRuleNosortCfg(String organizeCode, Long id); @ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】") MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext); - @ApiOperation(value = "【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单)") - MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext); + @ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】 -之后- 关联不可用规则") + MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap); - @ApiOperation(value = "【排序线】获取产品加工规则 [前道所有装配件]") - MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext, Map workCellMap); + @ApiOperation(value = "【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单) -同时- 关联不可用规则") + MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap); - @ApiOperation(value = "【非排序线】获取产品加工规则 【根据PID获取】") - MesProdRuleNosortCfg getProdRuleNosortCfg(String organizeCode, Long id); + @ApiOperation(value = "【排序线】获取产品加工规则 [前道所有装配件] -同时- 关联不可用规则") + MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext, Map workCellMap, Map> prodRuleIgnoreCfgMap); } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java index 0bcbb24..4642a9e 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import io.swagger.annotations.ApiOperation; @@ -105,7 +106,7 @@ public interface IMesProductionDispatchContextStepService { Boolean checkScanWorkOrderNoIsExistContext(StationRequestBean reqBean); @ApiOperation(value = "保存上下文扫/读信息:加工单", notes = "[JSON]List") - Boolean dispatchScanWorkOrderNoContext(StationRequestBean reqBean, List productSnList); + Boolean dispatchScanWorkOrderNoContext(StationRequestBean reqBean, List workOrderNoList); @ApiOperation(value = "删除上下文扫/读信息:加工单") void removeScanWorkOrderNoContext(StationRequestBean reqBean); @@ -129,7 +130,7 @@ public interface IMesProductionDispatchContextStepService { Boolean checkScanAssemblySnIsExistContext(StationRequestBean reqBean); @ApiOperation(value = "保存上下文扫/读信息:装配件条码", notes = "[JSON]List") - Boolean dispatchScanAssemblySnContext(StationRequestBean reqBean, List productSnList); + Boolean dispatchScanAssemblySnContext(StationRequestBean reqBean, List assemblySnList); @ApiOperation(value = "删除上下文扫/读信息:装配件条码") void removeScanAssemblySnContext(StationRequestBean reqBean); @@ -236,4 +237,10 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "删除上下文临时数据信息集合") void removeProdTempDataContext(String organizeCode, String workCenterCode, String workCellCode); + @ApiOperation(value = "获取上下文发运队列信息") + MesShippingQueue getShippingQueueContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存上下文发运队列信息") + Boolean dispatchShippingQueueContext(StationRequestBean reqBean, MesShippingQueue shippingQueue); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java index 1e2a49f..ea35a52 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java @@ -166,4 +166,26 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "获取设备点检上下文对象") MesEquipSpotCheckContext dispatchEquipSpotCheckContext(StationRequestBean reqBean, String equipmentCode); + + @ApiOperation(value = "获取选择/扫描零件发运组信息上下文") + List getFunctionChooseShippingGroupContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存选择/扫描零件发运组信息上下文", notes = "[StationKvBean(key=shippingGroupCode, name=零件发运组代码, value=xxx, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1)]") + Boolean dispatchFunctionChooseShippingGroupContext(StationRequestBean reqBean, List resultList); + + @ApiOperation(value = "删除选择/扫描零件发运组信息上下文") + void removeFunctionChooseShippingGroupContext(StationRequestBean reqBean); + + @ApiOperation(value = "处理加工不可用规则") + MesProductionProcessContext dispatchProdRuleIgnoreCfgContext(StationRequestBean reqBean); + + @ApiOperation(value = "处理加工不可用规则") + MesProductionProcessContext dispatchProdRuleIgnoreCfgContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "获取加工不可用规则") + List getProdRuleIgnoreCfgContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "获取加工不可用规则, key = 数据来源&来源ID") + Map> getProdRuleIgnoreCfgContextMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesShippingQueueService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesShippingQueueService.java new file mode 100644 index 0000000..5c33b19 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesShippingQueueService.java @@ -0,0 +1,18 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.pojo.mes.bean.seres.MesCimSeresJisRfid; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; +import io.swagger.annotations.ApiOperation; + +public interface IMesShippingQueueService { + + @ApiOperation("根据零件发运组代码查询创建时间正序创建状态的一条发运队列") + MesShippingQueue getShippingQueue(String organizeCode, String shippingGroupCode); + + @ApiOperation("根据ID修改发运队列") + void saveShippingQueue(String organizeCode, Long id, String[] propertyName, Object[] propertyValue); + + @ApiOperation("根据VIN查询赛力斯RFID信息") + MesCimSeresJisRfid getCimSeresJisRfid(String organizeCode, String vin); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java index 11150ee..05c4a05 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java @@ -19,9 +19,15 @@ public interface IMesWorkOrderExtService { @ApiOperation(value = "根据生产工单号查询生产工单信息") MesWorkOrder getWorkOrder(String organizeCode, String workOrderNo); - @ApiOperation(value = "根据生产工单顺序号,生产线代码查询上一个生产工单信息") + @ApiOperation(value = "根据生产工单顺序号,生产线代码 查询上一个生产工单信息") MesWorkOrder getWorkOrder(String organizeCode, String workCenterCode, Long productSeq); + @ApiOperation(value = "根据生产工单顺序号,生产线代码,零件号 查询上一个生产工单信息") + MesWorkOrder getWorkOrderByPart(String organizeCode, String workCenterCode, Long productSeq, String partNo); + + @ApiOperation(value = "根据生产工单顺序号,生产线代码,零件号,需要排除的工单集合 查询上一个生产工单信息") + MesWorkOrder getWorkOrderByPartAndOrderNo(String organizeCode, String workCenterCode, Long productSeq, String partNo, List workOrderNoList); + @ApiOperation(value = "根据生产工单顺序号,生产线代码, 零件生产组代码查询上一个生产工单信息【排序】") MesWorkOrder getWorkOrder(String organizeCode, String workCenterCode, Long productSeq, String partProdGroupCode); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPartShippingGroupController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPartShippingGroupController.java index a298ad4..51fc5f1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPartShippingGroupController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesPartShippingGroupController.java @@ -2,7 +2,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPartShippingGroupService; import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant; -import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingOrderManagement; @@ -36,24 +35,19 @@ public class MesPartShippingGroupController { @Autowired private IMesPartShippingGroupService shippingGroupService; - @GetMapping("/list") @ApiOperation(value = "查询所有") public ResultBean list(MesPartShippingGroup partShippingGroup) { - try { - - //默认查询所有 -// DdlPackBean listAllPackBean = DdlPackBean.getDdlPackBean("CK01"); - DdlPackBean listAllPackBean = DdlPackBean.getDdlPackBean(!StringUtils.isEmpty(partShippingGroup.getOrganizeCode())?partShippingGroup.getOrganizeCode():AuthUtil.getOrganizeCode()); - ; - return ResultBean.success("查询成功").setResultList(shippingGroupService.findAll(listAllPackBean)); + if (StringUtils.isEmpty(partShippingGroup.getOrganizeCode())) partShippingGroup.setOrganizeCode(AuthUtil.getOrganize().getOrganizeCode()); + return ResultBean.success("查询成功").setResultList(shippingGroupService.findAll(partShippingGroup)); } catch (ImppBusiException imppException) { return ResultBean.fail(imppException); } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + @PostMapping(value = "/doPrint") @ApiOperation(value = "打印未打印发运单后修改状态") public ResultBean doMesMesShippingOrderManagementPrint(@RequestBody MesShippingOrderManagement model) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java index 8a0e9b0..ecd0b62 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java @@ -50,6 +50,9 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { @Autowired private MesEquipmentSpotCheckDetailRepository equipmentSpotCheckDetailRepository; + @Autowired + private MesProdRuleIgnoreCfgRepository prodRuleIgnoreCfgRepository; + @Override public List getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; @@ -202,4 +205,26 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { return equipSpotCheckContext.isExistSpot().equipmentSpotCheckJson(equipmentSpotCheckList).equipmentSpotCheckDetailJson(equipmentSpotCheckDetailList).equipmentSpotCheckPartJson(equipmentSpotCheckPartList); } + + @Override + public List getProdRuleIgnoreCfgListByEquip(String organizeCode, String equipmentCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode)) return null; + return prodRuleIgnoreCfgRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode}); + } + + @Override + public List getProdRuleIgnoreCfgListByCenter(String organizeCode, String workCenterCode) { + List wcEquipmentList = wcEquipmentRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode}); + List equipmentCodeList = CollectionUtils.isEmpty(wcEquipmentList) ? null : + (wcEquipmentList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipmentCode()))).map(MesWcEquipment::getEquipmentCode).collect(Collectors.toList())).stream().filter(o -> null != o).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(equipmentCodeList)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (equipmentCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(equipmentCodeList.get(0), MesPcnExtConstWords.EQUIPMENT_CODE, packBean); + else DdlPreparedPack.getInPackList(equipmentCodeList, MesPcnExtConstWords.EQUIPMENT_CODE, packBean); + return prodRuleIgnoreCfgRepository.findByHqlWhere(packBean); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java index 27c2b03..47cfd02 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java @@ -18,6 +18,7 @@ import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository; import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyUniqueRepository; import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderAssemblyRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -27,6 +28,7 @@ import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.StringJoiner; import java.util.stream.Collectors; @Slf4j @@ -54,9 +56,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { @Autowired private IMesMediaFileCfgService mediaFileCfgService; - //【排序线】获取生产工单装配件绑定记录 + //【排序线】获取生产工单装配件绑定记录 -同时- 关联不可用规则 @Override - public List getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext) { + public List getProductionAssemblySortContextList(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap) { if (null == prodRuleContext) return null; @@ -78,14 +80,18 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { List productionAssemblySortContextList = new ArrayList<>(); - workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey()))); + workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add( + new MesProductionAssemblySortContext().copy(o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey()) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr())) + ) + ); return productionAssemblySortContextList; } - //【排序线】获取生产工单装配件绑定记录 [前道所有装配件,无爆炸图与音频文件逻辑] + //【排序线】获取生产工单装配件绑定记录 [前道所有装配件,无爆炸图与音频文件逻辑] -同时- 关联不可用规则 @Override - public List getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext, Map workCellMap) { + public List getProductionAssemblySortPreCraftContextList(MesProdRuleContext prodRuleContext, Map workCellMap, Map> prodRuleIgnoreCfgMap) { if (null == prodRuleContext) return null; @@ -110,6 +116,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { new MesProductionAssemblySortContext() .copy(o, getProductionAssembly(productionAssemblyMap, o.getId()), getIsCheckBindSeq(getWorkCell(workCellMap, o.getWorkCellCode()))) .foreignKey(prodRuleContext.getForeignKey()) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr())) ) ); @@ -177,9 +184,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), productSn}); } - //获取非排序装配件配置信息 + //获取非排序装配件配置信息 -同时- 关联不可用规则 @Override - public List getProductionAssemblyNosortContextList(MesProdRuleContext prodRuleContext) { + public List getProductionAssemblyNosortContextList(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap) { if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getOrganizeCode()) || StringUtils.isEmpty(prodRuleContext.getPid())) return null; @@ -196,13 +203,22 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { //遍历装配件规则, 实例化装配件清单对象, 判断是否配置可复用 assemblyNosortCfgList.forEach(o -> { MesProductionAssemblyNosortContext productionAssemblyNosortContext = new MesProductionAssemblyNosortContext().copy(prodRuleContext, o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey()); - productionAssemblyNosortContext.overrideAssemblyStatus(productionCustomContextStepService.getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), productionAssemblyNosortContext)); + productionAssemblyNosortContext.overrideAssemblyStatus(productionCustomContextStepService.getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), productionAssemblyNosortContext)) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr())); productionAssemblyNosortContextList.add(productionAssemblyNosortContext); }); return productionAssemblyNosortContextList; } + //获取不可用规则 + @Override + public String getProdRuleIgnoreCfg(Map> prodRuleIgnoreCfgMap, Long id, String dataSorce) { + if (CollectionUtils.isEmpty(prodRuleIgnoreCfgMap) || StringUtils.isEmpty(id) || StringUtils.isEmpty(dataSorce)) return null; + String key = new StringJoiner(MesPcnExtConstWords.AND).add(dataSorce).add(id.toString()).toString(); + return prodRuleIgnoreCfgMap.containsKey(key) ? JSONObject.toJSONString(prodRuleIgnoreCfgMap.get(key)) : null; + } + //获取非排序装配件配置信息 @Override public List getAssemblyNosortCfgList(String organizeCode, Long pid) { @@ -221,9 +237,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode}); } - //获取设备的装配件规则清单 + //获取设备的装配件规则清单 -同时- 关联不可用规则 @Override - public List getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode) { + public List getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode, Map> prodRuleIgnoreCfgMap) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode)) return null; @@ -232,7 +248,11 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { List productionAssemblyNosortContextList = new ArrayList<>(); - assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add(new MesProductionAssemblyNosortContext().copy(o))); + assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add( + new MesProductionAssemblyNosortContext().copy(o) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr())) + ) + ); return productionAssemblyNosortContextList; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPartShippingGroupService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPartShippingGroupService.java index bbf8f01..9f9c899 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPartShippingGroupService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPartShippingGroupService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPartShippingGroupService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; @@ -22,8 +23,6 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; -import java.util.function.Function; -import java.util.logging.Handler; import java.util.stream.Collectors; @Service @@ -49,7 +48,10 @@ public class MesPartShippingGroupService implements IMesPartShippingGroupService @Autowired private MesConfigRepository mesConfigRao; - public List findAll(DdlPackBean packBean) { + public List findAll(MesPartShippingGroup partShippingGroup) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(partShippingGroup.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(partShippingGroup.getShippingGroupCode(), MesPcnExtConstWords.SHIPPING_GROUP_CODE, packBean); + DdlPreparedPack.getStringEqualPack(partShippingGroup.getShippingGroupName(), MesPcnExtConstWords.SHIPPING_GROUP_NAME, packBean); return shippingGroupRepository.findByHqlWhere(packBean); } @@ -57,7 +59,7 @@ public class MesPartShippingGroupService implements IMesPartShippingGroupService public MesPartShippingGroup getMesPartShippingGroup(String organizeCode, String shippingGroupCode) { if(StringUtil.isEmpty(organizeCode) || StringUtil.isEmpty(shippingGroupCode)) return null; DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(shippingGroupCode, "shippingGroupCode", packBean); + DdlPreparedPack.getStringEqualPack(shippingGroupCode, MesPcnExtConstWords.SHIPPING_GROUP_CODE, packBean); return shippingGroupRepository.getByProperty(packBean); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java index 3d7ec7e..edf2c96 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java @@ -7,9 +7,12 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.repository.MesProdRuleNoSortCfgRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +23,7 @@ import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.StringJoiner; @Slf4j @Service @@ -77,11 +81,19 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService { return prodRuleNosortCfgList; } - //【非排序线】获取产品加工规则对应的装配件信息 + //【非排序线】获取产品加工规则 -之后- 关联不可用规则 @Override - public MesProdRuleContext getProdRuleNosortContext(MesProdRuleContext prodRuleContext) { + public List getProdRuleNosortCfgList(List prodRuleNosortCfgList, Map> prodRuleIgnoreCfgMap) { + if (CollectionUtils.isEmpty(prodRuleNosortCfgList) || CollectionUtils.isEmpty(prodRuleIgnoreCfgMap)) return prodRuleNosortCfgList; + prodRuleNosortCfgList.stream().forEach(o -> o.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr()))); + return null; + } + + //【非排序线】获取产品加工规则对应的装配件信息 -同时- 关联不可用规则 + @Override + public MesProdRuleContext getProdRuleNosortContext(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap) { //获取非排序装配件配置信息 - if (!StringUtils.isEmpty(prodRuleContext.getIsHasBind()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == prodRuleContext.getIsHasBind()) prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblyNosortContextList(prodRuleContext)); + if (!StringUtils.isEmpty(prodRuleContext.getIsHasBind()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == prodRuleContext.getIsHasBind()) prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblyNosortContextList(prodRuleContext, prodRuleIgnoreCfgMap)); return prodRuleContext; } @@ -101,6 +113,7 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService { } + //【非排序线】获取产品加工规则 【根据PID获取】 @Override public MesProdRuleNosortCfg getProdRuleNosortCfg(String organizeCode, Long id) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return null; @@ -109,17 +122,25 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService { new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id}); } - //【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单) + + //【非排序线】获取产品加工规则 【根据PID获取】 -之后- 关联不可用规则 @Override - public MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext) { - return prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblySortContextList(prodRuleContext)); + public MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap) { + if (null == prodRuleContext || CollectionUtils.isEmpty(prodRuleIgnoreCfgMap)) return prodRuleContext; + prodRuleContext.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, prodRuleContext.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr())); + return prodRuleContext; } - //【排序线】获取产品加工规则 [前道所有装配件] + //【排序线】获取产品加工规则(条码对应的装配件绑定记录,目前条码等同工单) -同时- 关联不可用规则 @Override - public MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext, Map workCellMap) { - return prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblySortPreCraftContextList(prodRuleContext, workCellMap)); + public MesProdRuleContext getProdRuleSortContext(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap) { + return prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblySortContextList(prodRuleContext, prodRuleIgnoreCfgMap)); } + //【排序线】获取产品加工规则 [前道所有装配件] -同时- 关联不可用规则 + @Override + public MesProdRuleContext getProdRuleSortPreCraftContext(MesProdRuleContext prodRuleContext, Map workCellMap, Map> prodRuleIgnoreCfgMap) { + return prodRuleContext.assemblyDataJson(assemblyExtService.getProductionAssemblySortPreCraftContextList(prodRuleContext, workCellMap, prodRuleIgnoreCfgMap)); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java new file mode 100644 index 0000000..2c93f1a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java @@ -0,0 +1,51 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesShippingQueueService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.seres.MesCimSeresJisRfid; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; +import cn.estsh.i3plus.pojo.mes.repository.MesShippingQueueRepository; +import cn.estsh.i3plus.pojo.mes.repository.seres.IMesCimSeresJisRfidRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import groovy.util.logging.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +@Service +@Slf4j +public class MesShippingQueueService implements IMesShippingQueueService { + + @Autowired + private MesShippingQueueRepository shippingQueueRepository; + + @Autowired + private IMesCimSeresJisRfidRepository cimSeresJisRfidRepository; + + @Override + public MesShippingQueue getShippingQueue(String organizeCode, String shippingGroupCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(shippingGroupCode)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(shippingGroupCode, MesPcnExtConstWords.SHIPPING_GROUP_CODE, packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue(), MesPcnExtConstWords.QUEUE_STATUS, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); + return shippingQueueRepository.getByProperty(packBean); + } + + @Override + public void saveShippingQueue(String organizeCode, Long id, String[] propertyName, Object[] propertyValue) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return; + shippingQueueRepository.updateByPropertiesNoSync(new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{id, organizeCode}, propertyName, propertyValue); + } + + @Override + public MesCimSeresJisRfid getCimSeresJisRfid(String organizeCode, String vin) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(vin)) return null; + return cimSeresJisRfidRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.VIN_CODE, MesPcnExtConstWords.STATUS}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), vin, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java index 456af24..94ebe0e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java @@ -83,6 +83,31 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService { return workOrderRepository.getByProperty(packBean); } + //根据生产工单顺序号,生产线代码查询上一个生产工单信息 + @Override + public MesWorkOrder getWorkOrderByPart(String organizeCode, String workCenterCode, Long productSeq, String partNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || (StringUtils.isEmpty(productSeq) || productSeq.compareTo(0L) == 0)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getStringEqualPack(partNo, MesPcnExtConstWords.PART_NO, packBean); + DdlPreparedPack.getNumberSmallerPack(productSeq, MesPcnExtConstWords.PRODUCT_SEQ, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PRODUCT_SEQ}, packBean); + return workOrderRepository.getByProperty(packBean); + } + + //根据生产工单顺序号,生产线代码查询上一个生产工单信息 + @Override + public MesWorkOrder getWorkOrderByPartAndOrderNo(String organizeCode, String workCenterCode, Long productSeq, String partNo, List workOrderNoList) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || (StringUtils.isEmpty(productSeq) || productSeq.compareTo(0L) == 0)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getStringEqualPack(partNo, MesPcnExtConstWords.PART_NO, packBean); + DdlPreparedPack.getNumberSmallerPack(productSeq, MesPcnExtConstWords.PRODUCT_SEQ, packBean); + DdlPreparedPack.getNotInPack(workOrderNoList, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PRODUCT_SEQ}, packBean); + return workOrderRepository.getByProperty(packBean); + } + //根据生产工单顺序号,生产线代码,零件生产组代码查询上一个生产工单信息 @Override public MesWorkOrder getWorkOrder(String organizeCode, String workCenterCode, Long productSeq, String partProdGroupCode) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchDispatchService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchDispatchService.java index 743ea29..280bd7a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchDispatchService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchDispatchService.java @@ -6,10 +6,12 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyNosortContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblySortContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; @@ -33,24 +35,29 @@ public class MesNumberRuleMatchDispatchService implements IMesNumberRuleMatchDis List resultList = new ArrayList<>(); - if (numberRuleList.get(0) instanceof MesProdRuleNosortCfg) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), o, ((MesProdRuleNosortCfg) o).getInPartNoRule())); + if (numberRuleList.get(0) instanceof MesProdRuleNosortCfg) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, ((MesProdRuleNosortCfg) o).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), o, ((MesProdRuleNosortCfg) o).getInPartNoRule())); - if (numberRuleList.get(0) instanceof MesProdRuleContext) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), o, ((MesProdRuleContext) o).getInPartNoRule())); + if (numberRuleList.get(0) instanceof MesProdRuleContext) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, ((MesProdRuleContext) o).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), o, ((MesProdRuleContext) o).getInPartNoRule())); - if (numberRuleList.get(0) instanceof MesProductionAssemblyNosortContext) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblyNosortContext) o).getMatchType()), o, ((MesProductionAssemblyNosortContext) o).getMatchRule())); + if (numberRuleList.get(0) instanceof MesProductionAssemblyNosortContext) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, ((MesProductionAssemblyNosortContext) o).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblyNosortContext) o).getMatchType()), o, ((MesProductionAssemblyNosortContext) o).getMatchRule())); - if (numberRuleList.get(0) instanceof MesProductionAssemblySortContext) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblySortContext) o).getMatchType()), o, ((MesProductionAssemblySortContext) o).getMatchRule())); + if (numberRuleList.get(0) instanceof MesProductionAssemblySortContext) numberRuleList.forEach(o -> matchNumberRuleBackList(organizeCode, sn, resultList, ((MesProductionAssemblySortContext) o).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblySortContext) o).getMatchType()), o, ((MesProductionAssemblySortContext) o).getMatchRule())); return resultList; } - private List matchNumberRuleBackList(String organizeCode, String sn, List resultList, String strategyClass, Object... params) { + private List matchNumberRuleBackList(String organizeCode, String sn, List resultList, String prodRuleIgnoreCfg, String strategyClass, Object... params) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(sn) || StringUtils.isEmpty(strategyClass) || null == params[0]) return resultList; Map result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean(strategyClass)).matchNumberRule(organizeCode, sn, params); + if ((Boolean) result.get(MesPcnExtConstWords.RESULT) && !StringUtils.isEmpty(prodRuleIgnoreCfg)) { + result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean( + MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass())).matchIgnoreCfg(organizeCode, sn, result, JSONObject.parseArray(prodRuleIgnoreCfg, MesProdRuleIgnoreCfg.class)); + } + if ((Boolean) result.get(MesPcnExtConstWords.RESULT)) resultList.add(params[0]); return resultList; @@ -68,19 +75,19 @@ public class MesNumberRuleMatchDispatchService implements IMesNumberRuleMatchDis return result; } - if (numberRuleObj instanceof MesProdRuleNosortCfg) return matchNumberRuleBackMap(organizeCode, sn, result, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), numberRuleObj, ((MesProdRuleNosortCfg) numberRuleObj).getInPartNoRule()); + if (numberRuleObj instanceof MesProdRuleNosortCfg) return matchNumberRuleBackMap(organizeCode, sn, result, ((MesProdRuleNosortCfg) numberRuleObj).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), numberRuleObj, ((MesProdRuleNosortCfg) numberRuleObj).getInPartNoRule()); - if (numberRuleObj instanceof MesProdRuleContext) return matchNumberRuleBackMap(organizeCode, sn, result, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), numberRuleObj, ((MesProdRuleContext) numberRuleObj).getInPartNoRule()); + if (numberRuleObj instanceof MesProdRuleContext) return matchNumberRuleBackMap(organizeCode, sn, result, ((MesProdRuleContext) numberRuleObj).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass(), numberRuleObj, ((MesProdRuleContext) numberRuleObj).getInPartNoRule()); - if (numberRuleObj instanceof MesProductionAssemblyNosortContext) return matchNumberRuleBackMap(organizeCode, sn, result, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblyNosortContext) numberRuleObj).getMatchType()), numberRuleObj, ((MesProductionAssemblyNosortContext) numberRuleObj).getMatchRule()); + if (numberRuleObj instanceof MesProductionAssemblyNosortContext) return matchNumberRuleBackMap(organizeCode, sn, result, ((MesProductionAssemblyNosortContext) numberRuleObj).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblyNosortContext) numberRuleObj).getMatchType()), numberRuleObj, ((MesProductionAssemblyNosortContext) numberRuleObj).getMatchRule()); - if (numberRuleObj instanceof MesProductionAssemblySortContext) return matchNumberRuleBackMap(organizeCode, sn, result, MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblySortContext) numberRuleObj).getMatchType()), numberRuleObj, ((MesProductionAssemblySortContext) numberRuleObj).getMatchRule()); + if (numberRuleObj instanceof MesProductionAssemblySortContext) return matchNumberRuleBackMap(organizeCode, sn, result, ((MesProductionAssemblySortContext) numberRuleObj).getProdRuleIgnoreCfg(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfStrategyClass(((MesProductionAssemblySortContext) numberRuleObj).getMatchType()), numberRuleObj, ((MesProductionAssemblySortContext) numberRuleObj).getMatchRule()); return result; } - private Map matchNumberRuleBackMap(String organizeCode, String sn, Map resultMap, String strategyClass, Object... params) { + private Map matchNumberRuleBackMap(String organizeCode, String sn, Map resultMap, String prodRuleIgnoreCfg, String strategyClass, Object... params) { if (StringUtils.isEmpty(strategyClass)) { resultMap.put(MesPcnExtConstWords.MESSAGE, "规则匹配信息的匹配确认方式配置错误,未找到相应的匹配策略!"); @@ -89,6 +96,10 @@ public class MesNumberRuleMatchDispatchService implements IMesNumberRuleMatchDis Map result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean(strategyClass)).matchNumberRule(organizeCode, sn, params); + if ((Boolean) result.get(MesPcnExtConstWords.RESULT) && !StringUtils.isEmpty(prodRuleIgnoreCfg)) { + result = ((IMesNumberRuleMatchDispatchService) SpringContextsUtil.getBean( + MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_20.getStrategyClass())).matchIgnoreCfg(organizeCode, sn, result, JSONObject.parseArray(prodRuleIgnoreCfg, MesProdRuleIgnoreCfg.class)); + } if ((Boolean) result.get(MesPcnExtConstWords.RESULT)) result.put(MesPcnExtConstWords.DATA, params[0]); return result; @@ -134,5 +145,4 @@ public class MesNumberRuleMatchDispatchService implements IMesNumberRuleMatchDis return true; } - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchRegularExpressionService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchRegularExpressionService.java index c10913d..a3e0898 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchRegularExpressionService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/MesNumberRuleMatchRegularExpressionService.java @@ -2,12 +2,15 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import com.google.common.base.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -86,7 +89,21 @@ public class MesNumberRuleMatchRegularExpressionService implements IMesNumberRul return str.replaceAll(regex, ""); } - /* public static void main(String[] args) { + @Override + public Map matchIgnoreCfg(String organizeCode, String sn, Map result, List prodRuleIgnoreCfgList) { + if (StringUtils.isEmpty(sn) || CollectionUtils.isEmpty(prodRuleIgnoreCfgList)) return result; + for (MesProdRuleIgnoreCfg prodRuleIgnoreCfg : prodRuleIgnoreCfgList) { + if (null == prodRuleIgnoreCfg || StringUtils.isEmpty(prodRuleIgnoreCfg.getMatchRule())) continue; + if (match(prodRuleIgnoreCfg.getMatchRule(), sn)) { + result.put(MesPcnExtConstWords.RESULT, false); + result.put(MesPcnExtConstWords.MESSAGE, String.format("条码[%s]匹配不可用规则[%s]!", sn, prodRuleIgnoreCfg.getMatchRule())); + return result; + } + } + return result; + } + + /* public static void main(String[] args) { String sn = "[)>@06@Y8360100000000B@P26462392@12V654406818@T1124107207000344@@"; String matchRule = "*26462392*"; System.out.println(match(matchRule, sn)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseShippingGroupService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseShippingGroupService.java new file mode 100644 index 0000000..9c5027d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseShippingGroupService.java @@ -0,0 +1,77 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPartShippingGroupService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; +import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; +import cn.estsh.i3plus.platform.common.util.MesPcnConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description : 工位参数按钮事件接口实现【选择发运组】 + **/ +@Service +public class MesFunctionChooseShippingGroupService extends BaseSwsService implements IFsmModuleFunctionService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IShippingDispatchService shippingDispatchService; + + @Autowired + private IMesPartShippingGroupService partShippingGroupService; + + @Override + public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + + //验证发运组信息是否有效 + List resultList = checkShippingGroupIsValid(reqBean.getOrganizeCode(), buttonDynamicModel.getFunctionValue()); + if (CollectionUtils.isEmpty(resultList)) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + String.format("生产线[%s]工位[%s]%s失败,请检查选择的发运组信息[%s]的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + + //保存选择的零件发运组信息上下文 + productionProcessContextStepService.dispatchFunctionChooseShippingGroupContext(reqBean, resultList); + + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + String.format("生产线[%s]工位[%s]%s成功,请等待验证!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode()); + reqBean.setTriggerAutoFsm(true); + shippingDispatchService.sendScanQueueIfNoQueue(reqBean, false, this.getClass().getSimpleName()); + + return true; + + } + + //验证发运组信息是否有效 + public List checkShippingGroupIsValid(String organizeCode, String functionValue) { + //查询发运组数据 + if (null == partShippingGroupService.getMesPartShippingGroup(organizeCode, functionValue)) return null; + return StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), + new StationKvBean(MesPcnExtConstWords.SHIPPING_GROUP_CODE, "零件发运组代码", functionValue), + new StationKvBean(MesPcnExtConstWords.CELL_MESSAGE_SOURCE, "工位信息来源", MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValueStr())); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyGeneratePartNoStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyGeneratePartNoStepService.java index e825e69..b1214d6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyGeneratePartNoStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyGeneratePartNoStepService.java @@ -9,6 +9,7 @@ import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -69,8 +70,8 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + //获取上下文信息: 处理加工不可用规则 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchProdRuleIgnoreCfgContext(reqBean); //配置错误 抛出异常 if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -141,13 +142,16 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService { } } + //获取加工不可用规则 + Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); + //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 - Map> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext); + Map> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext, prodRuleIgnoreCfgMap); //无主条码则无加工规则, 有主条码可能无加工规则 prodRuleContextList = CollectionUtils.isEmpty(prodRuleContextList) ? new ArrayList<>() : prodRuleContextList; //生成零件号业务处理 - prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, cavityUnknownCfg, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList); + prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, cavityUnknownCfg, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList, prodRuleIgnoreCfgMap); String suffix = !CollectionUtils.isEmpty(curProductionPsInContextList) ? String.format("当前主条码%s", curProductionPsInContextList.stream().filter(o -> null != o).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()).toString()) : MesPcnExtConstWords.EMPTY; @@ -200,14 +204,15 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService { } //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 - private Map> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext) { + private Map> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, + Map> prodRuleIgnoreCfgMap) { //查询工位设备装配件规则信息 List assemblyNosortCfgList = productionProcessContextStepService.findAssemblyNosortCfgList(reqBean); //获取设备的装配件规则清单 if (CollectionUtils.isEmpty(assemblyNosortCfgList) || !assemblyNosortCfgList.get(0).getEquipmentCode().equals(cellEquipContext.getEquipmentCode())) { - assemblyNosortCfgList = assemblyExtService.getProductionAssemblyNosortContextList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode()); + assemblyNosortCfgList = assemblyExtService.getProductionAssemblyNosortContextList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode(), prodRuleIgnoreCfgMap); if (CollectionUtils.isEmpty(assemblyNosortCfgList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), @@ -226,7 +231,8 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService { //生成零件号业务处理 private List doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, String cavityUnknownCfg, MesProductionProcessContext productionProcessContext, List productionPsInContextList, List prodRuleContextList, - Map> assemblyNosortCfgMap, List equipVariableCollectContextList) { + Map> assemblyNosortCfgMap, List equipVariableCollectContextList, + Map> prodRuleIgnoreCfgMap) { //从上下文中取出生产线对象 MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); @@ -328,6 +334,8 @@ public class MesAssemblyGeneratePartNoStepService extends BaseStepService { //验证加工规则是否有效 MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(new MesProdRuleContext( reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).pid(productionAssemblyNosortContextList.get(0).getPid())); + //加工规则关联不可用规则信息 + prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(prodRuleContext, prodRuleIgnoreCfgMap); //根据PID获取非排序加工规则 数据无效 if (null == prodRuleContext) continue; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java index cf11c6f..50abe73 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java @@ -9,6 +9,7 @@ import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -69,8 +70,8 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService StepResult stepResult = StepResult.getSuccessComplete(); - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + //获取上下文信息: 处理加工不可用规则 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchProdRuleIgnoreCfgContext(reqBean); //配置错误 抛出异常 if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -141,13 +142,16 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService //当前反向匹配最外层的遍历次数 Integer loopTimes = !CollectionUtils.isEmpty(productionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity(); + //获取加工不可用规则 + Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); + //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 - Map> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext); + Map> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext, prodRuleIgnoreCfgMap); //无主条码则无加工规则, 有主条码可能无加工规则 prodRuleContextList = CollectionUtils.isEmpty(prodRuleContextList) ? new ArrayList<>() : prodRuleContextList; //生成零件号业务处理 - prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, loopTimes, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList); + prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, loopTimes, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList, prodRuleIgnoreCfgMap); String suffix = !CollectionUtils.isEmpty(curProductionPsInContextList) ? String.format("当前主条码%s", curProductionPsInContextList.stream().filter(o -> null != o).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()).toString()) : MesPcnExtConstWords.EMPTY; @@ -194,14 +198,15 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService } //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 - private Map> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext) { + private Map> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, + Map> prodRuleIgnoreCfgMap) { //查询工位设备装配件规则信息 List assemblyNosortCfgList = productionProcessContextStepService.findAssemblyNosortCfgList(reqBean); //获取设备的装配件规则清单 if (CollectionUtils.isEmpty(assemblyNosortCfgList) || !assemblyNosortCfgList.get(0).getEquipmentCode().equals(cellEquipContext.getEquipmentCode())) { - assemblyNosortCfgList = assemblyExtService.getProductionAssemblyNosortContextList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode()); + assemblyNosortCfgList = assemblyExtService.getProductionAssemblyNosortContextList(reqBean.getOrganizeCode(), cellEquipContext.getEquipmentCode(), prodRuleIgnoreCfgMap); if (CollectionUtils.isEmpty(assemblyNosortCfgList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), @@ -220,7 +225,8 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService //生成零件号业务处理 private List doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, Integer loopTimes, MesProductionProcessContext productionProcessContext, List productionPsInContextList, List prodRuleContextList, - Map> assemblyNosortCfgMap, List equipVariableCollectContextList) { + Map> assemblyNosortCfgMap, List equipVariableCollectContextList, + Map> prodRuleIgnoreCfgMap) { //从上下文中取出生产线对象 MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); @@ -325,6 +331,8 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService //验证加工规则是否有效 MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(new MesProdRuleContext( reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).pid(productionAssemblyNosortContextList.get(0).getPid())); + //加工规则关联不可用规则信息 + prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(prodRuleContext, prodRuleIgnoreCfgMap); //根据PID获取非排序加工规则 数据无效 if (null == prodRuleContext) continue; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java index 03e4d40..7a16fb5 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java @@ -10,6 +10,7 @@ import cn.estsh.i3plus.mes.pcn.util.StringUtil; import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; @@ -66,8 +67,8 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + //获取上下文信息: 处理加工不可用规则 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchProdRuleIgnoreCfgContext(reqBean); //配置错误 抛出异常 if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -118,21 +119,26 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { MesPcnEnumUtil.PROMPT_SOUND.SUCCESS.getValue()); } + //封装非排序加工规则 private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List productionPsInContextList) { //没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前是生成零件号场景】 if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return stepResult; + //获取加工不可用规则 + Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); + //根据进料条件获取匹配加工规则数据(只能查询到一条,否则报错) - if (CollectionUtils.isEmpty(productionPartContextList)) return doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPsInContextList); + if (CollectionUtils.isEmpty(productionPartContextList)) return doHandleProdRuleDataByProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPsInContextList, prodRuleIgnoreCfgMap); //根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错) - else return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList); + else return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, prodRuleIgnoreCfgMap); } //根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错) private StepResult doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, - MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List productionPsInContextList) { + MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List productionPsInContextList, + Map> prodRuleIgnoreCfgMap) { //加工规则的数据已与产出零件的数量一致 if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return stepResult; @@ -145,15 +151,16 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { List outPartNoList = productionPartContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList()); //没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错) - if (CollectionUtils.isEmpty(productionPsInContextList)) return doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey); + if (CollectionUtils.isEmpty(productionPsInContextList)) return doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, outPartNoList, foreignKey, prodRuleIgnoreCfgMap); //存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错) - else return doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey); + else return doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey, prodRuleIgnoreCfgMap); } //没有【进料零件条码信息】信息, 根据进料[NULL]条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错) private StepResult doHandleProdRuleDataByProductionPartAndEmptyProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, - MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List outPartNoList, Integer foreignKey) { + MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List outPartNoList, Integer foreignKey, + Map> prodRuleIgnoreCfgMap) { //【非排序线】获取产品加工规则 ; 条件进料[NULL] List prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty(true)); @@ -173,10 +180,11 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format( "设备[%s]产出零件[%s]进料零件[空]%s加工规则配置信息!", cellEquipContext.getEquipmentName(), productionPartContext.getPartNo(), CollectionUtils.isEmpty(filterList) ? "未匹配到" : String.format("匹配到[%s]条", filterList.size()))); } - //【非排序线】获取产品加工规则对应的装配件信息 + //【非排序线】获取产品加工规则对应的装配件信息 -同时- 关联不可用规则 MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext( new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) - .copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())); + .copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey()), + prodRuleIgnoreCfgMap); prodRuleContextList.add(prodRuleContext); log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 产出零件信息:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), @@ -254,10 +262,13 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,否则报错) private StepResult doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, - MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPsInContextList) { + MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPsInContextList, + Map> prodRuleIgnoreCfgMap) { //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回 List prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, null); + //加工规则关联不可用规则信息 + prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(prodRuleNosortCfgList, prodRuleIgnoreCfgMap); //拿到当前最大的foreignKey Optional maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey)); @@ -293,12 +304,12 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { } } - //【非排序线】获取产品加工规则对应的装配件信息 + //【非排序线】获取产品加工规则对应的装配件信息 -同时- 关联不可用规则 MesProdRuleContext prodRuleContext = new MesProdRuleContext( reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) .copy(filterList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()); - prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext(prodRuleContext); + prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext(prodRuleContext, prodRuleIgnoreCfgMap); prodRuleContextList.add(prodRuleContext); log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 进料零件条码:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), @@ -317,6 +328,7 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { return true; } + //【非排序线】获取产品加工规则 private List getProdRuleNosortCfgList(StationRequestBean reqBean, MesCellEquipContext cellEquipContext, List productionPsInContextList, List outPartNoList) { //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件可能携带产出零件 List inPartNoList = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList()); @@ -329,10 +341,13 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错) private StepResult doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, - List prodRuleContextList, List productionPartContextList, List productionPsInContextList, List outPartNoList, Integer foreignKey) { + List prodRuleContextList, List productionPartContextList, List productionPsInContextList, List outPartNoList, Integer foreignKey, + Map> prodRuleIgnoreCfgMap) { //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件 List prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList); + //加工规则关联不可用规则信息 + prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(prodRuleNosortCfgList, prodRuleIgnoreCfgMap); //根据产出零件分组数据 Map> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList); @@ -405,10 +420,13 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //【非排序线】获取产品加工规则对应的装配件信息 if (!CollectionUtils.isEmpty(innerfilterList) && innerfilterList.size() == 1) { - MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext( - reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()). - copy(innerfilterList.get(0)).productSn(productSn.getProductSn())).foreignKey(productionPartContext.getForeignKey()); + //【非排序线】获取产品加工规则对应的装配件信息 -同时- 关联不可用规则 + MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext( + new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) + .copy(innerfilterList.get(0)).productSn(productSn.getProductSn()), + prodRuleIgnoreCfgMap); + prodRuleContext.foreignKey(productionPartContext.getForeignKey()); if (!StringUtils.isEmpty(productionPartContext.getWorkOrderNo())) prodRuleContext.workOrderNo(productionPartContext.getWorkOrderNo()); prodRuleContextList.add(prodRuleContext); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortPreCraftStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortPreCraftStepService.java index 35cc9cb..86fa74a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortPreCraftStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortPreCraftStepService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -28,11 +29,12 @@ public class MesAssemblyShowSortPreCraftStepService extends MesAssemblyShowSortS return super.execute(reqBean); } - public MesProdRuleContext getProdRuleSortContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext) { + public MesProdRuleContext getProdRuleSortContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext, + Map> prodRuleIgnoreCfgMap) { Map workCellMap = productionProcessContextStepService.dispatchWorkCellMap(reqBean); MesProdRuleContext prodRuleContext = new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) .equipmentCode(cellEquipContext.getEquipmentCode()).workOrderNo(productionPsInContext.getWorkOrderNo()).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.getForeignKey()); - return prodRuleCfgExtService.getProdRuleSortPreCraftContext(prodRuleContext, workCellMap); + return prodRuleCfgExtService.getProdRuleSortPreCraftContext(prodRuleContext, workCellMap, prodRuleIgnoreCfgMap); } public Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, List prodRuleContextList) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java index aba1cfa..ece4670 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java @@ -11,6 +11,7 @@ import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.AttrBean; @@ -57,8 +58,8 @@ public class MesAssemblyShowSortStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + //获取上下文信息: 处理加工不可用规则 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchProdRuleIgnoreCfgContext(reqBean); //配置错误 抛出异常 if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -113,11 +114,12 @@ public class MesAssemblyShowSortStepService extends BaseStepService { } //获取装配件信息(子类进行重写) - public MesProdRuleContext getProdRuleSortContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext) { + public MesProdRuleContext getProdRuleSortContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProductionPsInContext productionPsInContext, + Map> prodRuleIgnoreCfgMap) { MesProdRuleContext prodRuleContext = new MesProdRuleContext( reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).isCheckBindSeq(getIsCheckBindSeq(productionProcessContext.getWorkCell())) .equipmentCode(cellEquipContext.getEquipmentCode()).workOrderNo(productionPsInContext.getWorkOrderNo()).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.getForeignKey()); - return prodRuleCfgExtService.getProdRuleSortContext(prodRuleContext); + return prodRuleCfgExtService.getProdRuleSortContext(prodRuleContext, prodRuleIgnoreCfgMap); } //判断是否按序扫描 @@ -152,6 +154,9 @@ public class MesAssemblyShowSortStepService extends BaseStepService { List prodRuleContextList, List productionPartContextList, List productionPsInContextList, List productionPsOutContextList) { + //获取加工不可用规则 + Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); + //上下文中不存在进料主条码数据信息 if (CollectionUtils.isEmpty(productionPsInContextList) || CollectionUtils.isEmpty(productionPartContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在加工单或条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); @@ -170,7 +175,7 @@ public class MesAssemblyShowSortStepService extends BaseStepService { productionPsOutContextList.stream().filter(o -> (null != o && o.getWorkOrderNo().equals(productionPsInContext.getWorkOrderNo()))).findFirst().get().foreignKey(productionPsInContext.getForeignKey()); //获取装配件信息 - prodRuleContextList.add(getProdRuleSortContext(reqBean, productionProcessContext, cellEquipContext, productionPsInContext)); + prodRuleContextList.add(getProdRuleSortContext(reqBean, productionProcessContext, cellEquipContext, productionPsInContext, prodRuleIgnoreCfgMap)); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesBarcodeWithWorkOrderRelationFindStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesBarcodeWithWorkOrderRelationFindStepService.java new file mode 100644 index 0000000..4ee444c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesBarcodeWithWorkOrderRelationFindStepService.java @@ -0,0 +1,111 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderReductionSource; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderReductionSourceRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description : 装配件获取匹配工单工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesBarcodeWithWorkOrderRelationFindStepService") +public class MesBarcodeWithWorkOrderRelationFindStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private MesWorkOrderReductionSourceRepository workOrderReductionSourceRepository; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文扫/读信息:装配件条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean); + //搜集装配件条码 + List assemblySnList = CollectionUtils.isEmpty(equipVariableCollectContextList) ? null : + equipVariableCollectContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipVariableValue()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + + //没有待验证的装配件条码 + if (CollectionUtils.isEmpty(assemblySnList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前没有需要验证的装配件条码!"); + + try { + //查询条码与工单对应关系【在前道工序中作为主条码写入次关系表】 + Map> workOrderReductionSourceMap = getWorkOrderReductionSourceMap(reqBean.getOrganizeCode(), assemblySnList); + if (CollectionUtils.isEmpty(workOrderReductionSourceMap)) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("读取的装配件条码%s未获取到匹配工单!", assemblySnList.toString())); + + //用于写入加工单 + equipVariableCollectContextList = new ArrayList<>(); + for (Map.Entry> entry : workOrderReductionSourceMap.entrySet()) { + if (null == entry) continue; + //取最新的数据 + MesWorkOrderReductionSource workOrderReductionSource = entry.getValue().stream() + .filter(o -> null != o).sorted(Comparator.comparing(MesWorkOrderReductionSource::getCreateDatetime).reversed()).collect(Collectors.toList()).get(0); + equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), workOrderReductionSource.getWorkOrderNo(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue())); + } + + //保存上下文扫/读信息:加工单 + productionDispatchContextStepService.dispatchScanWorkOrderNoContext(reqBean, equipVariableCollectContextList); + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("读取的装配件条码%s获取到匹配工单%s!", + assemblySnList.toString(), equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString()), + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + //加工单验证工步 【非排序】 + stepResult = ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckNosortStepService")).executeInState(reqBean); + + } finally { + + //验证失败后, 删除上下文扫/读信息:装配件条码 + if (!stepResult.isCompleted()) productionDispatchContextStepService.removeScanAssemblySnContext(reqBean); + + } + + return stepResult; + + } + + //查询条码与工单对应关系【在前道工序中作为主条码写入次关系表】 + private Map> getWorkOrderReductionSourceMap(String organizeCode, List assemblySnList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (assemblySnList.size() == 1) DdlPreparedPack.getStringEqualPack(assemblySnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); + else DdlPreparedPack.getInPackList(assemblySnList, MesPcnExtConstWords.PRODUCT_SN, packBean); + List workOrderReductionSourceList = workOrderReductionSourceRepository.findByHqlWhere(packBean); + return CollectionUtils.isEmpty(workOrderReductionSourceList) ? null : + workOrderReductionSourceList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderReductionSource::getProductSn)); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesBarcodeWithWorkOrderRelationSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesBarcodeWithWorkOrderRelationSaveStepService.java new file mode 100644 index 0000000..dbafed9 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesBarcodeWithWorkOrderRelationSaveStepService.java @@ -0,0 +1,98 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderReductionSource; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderReductionSourceRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Description : 保存条码与工单对应关系工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesBarcodeWithWorkOrderRelationSaveStepService") +public class MesBarcodeWithWorkOrderRelationSaveStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private MesWorkOrderReductionSourceRepository workOrderReductionSourceRepository; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在非排序加工规则数据,请重置工序!"); + + //获取上下文产出条码数据信息集合 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); + + //验证产出条码是否匹配工单 + Optional optional = productionPsOutContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst(); + if (null != optional && optional.isPresent()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前产出零件条码信息未匹配工单,请重置工序解决!"); + + Map prMap = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toMap(MesProdRuleContext::getForeignKey, o -> o)); + + productionPsOutContextList.stream().filter(o -> null != o).forEach(o -> saveBarcodeWithWorkOrderRelation(reqBean, o, prMap.get(o.getForeignKey()))); + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存条码与工单对应关系成功!"); + + } + + private void saveBarcodeWithWorkOrderRelation(StationRequestBean reqBean, MesProductionPsOutContext productionPsOutContext, MesProdRuleContext prodRuleContext) { + MesWorkOrderReductionSource workOrderReductionSource = new MesWorkOrderReductionSource(); + workOrderReductionSource.setWorkOrderNo(productionPsOutContext.getWorkOrderNo()); + workOrderReductionSource.setProductSn(productionPsOutContext.getProductSn()); + workOrderReductionSource.setPartNo(productionPsOutContext.getPartNo()); + workOrderReductionSource.setPartName(productionPsOutContext.getPartName()); + workOrderReductionSource.setAreaCode(reqBean.getAreaCode()); + workOrderReductionSource.setWorkCenterCode(reqBean.getWorkCenterCode()); + workOrderReductionSource.setProductionRecordId(prodRuleContext.getProductionRecordId()); + workOrderReductionSource.setQty(new Double(1)); + workOrderReductionSource.setSourceType(10); + workOrderReductionSource.setSourceStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + workOrderReductionSource.setOrganizeCode(reqBean.getOrganizeCode()); + ConvertBean.serviceModelInitialize(workOrderReductionSource, reqBean.getUserInfo()); + workOrderReductionSourceRepository.insert(workOrderReductionSource); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java index 4243268..58478b0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; @@ -13,6 +14,7 @@ import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -29,6 +31,9 @@ import java.util.stream.Collectors; @Service("mesProductSeqCheckNosortStepService") public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepService { + @Autowired + private IFsmCommonService fsmCommonService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -84,6 +89,14 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS //顺序防错验证处理 private void doHandleProductSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList) { + //非排序顺序防错级别配置[工位参数] + String cavityNosortCfg = getCheckProductSeqCfg(reqBean); + + //当是零件级别的配置的时候 搜集工单号 去重 + List filterWorkOrderNoList = StringUtils.isEmpty(cavityNosortCfg) ? null : + (productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) + .map(MesProductionPartContext::getWorkOrderNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + List workOrderNoList = new ArrayList<>(); for (MesProductionPartContext productionPartContext : productionPartContextList) { @@ -93,7 +106,7 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS if (productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; //顺序防错验证 - Boolean result = doProductSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext); + Boolean result = doProductSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext, cavityNosortCfg, filterWorkOrderNoList); productionPartContext.checkSeqResult(!result ? CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); @@ -109,13 +122,29 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS } + //非排序顺序防错级别配置[工位参数] + private String getCheckProductSeqCfg(StationRequestBean reqBean) { + String checkProductSeqCfg = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CHECK_PRODUCT_SEQ_CFG); + return (!StringUtils.isEmpty(checkProductSeqCfg) && checkProductSeqCfg.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? checkProductSeqCfg : null; + } + //前道工艺防错验证 【非排序】 - private Boolean doProductSeqCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext) { + private Boolean doProductSeqCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, + MesProductionPartContext productionPartContext, String cavityNosortCfg, List workOrderNoList) { String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; //根据生产工单顺序号,生产线代码查询上一个生产工单信息 - MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProductSeq()); + MesWorkOrder workOrder; + if (StringUtils.isEmpty(cavityNosortCfg)) { + workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProductSeq()); + } else if (workOrderNoList.size() == 1) { + //增加零件号条件 + workOrder = workOrderExtService.getWorkOrderByPart(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProductSeq(), productionPartContext.getPartNo()); + } else { + //增加零件号条件, 查询时排除 搜集的其他腔的工单号 + workOrder = workOrderExtService.getWorkOrderByPartAndOrderNo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProductSeq(), productionPartContext.getPartNo(), filterWorkOrderNoList(workOrderNoList, productionPartContext.getWorkOrderNo())); + } if (null == workOrder) return true; @@ -126,4 +155,9 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS } + //搜集其他腔的工单号 + private List filterWorkOrderNoList(List workOrderNoList, String workOrderNo) { + return workOrderNoList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(workOrderNo))).collect(Collectors.toList()); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateByReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateByReadStepService.java new file mode 100644 index 0000000..703879b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateByReadStepService.java @@ -0,0 +1,81 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description : 根据读取条码生成零件条码工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductSnGenerateByReadStepService") +public class MesProductSnGenerateByReadStepService extends BaseStepService { + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在非排序加工规则数据,请重置工序!"); + + //获取上下文扫/读信息:主条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + + //没有待验证的主条码 + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前没有需要验证的主条码!"); + + //清除本次已获取得到的主条码信息 + productionDispatchContextStepService.removeScanProductSnContext(reqBean); + + //搜集主条码值 + List productSnList = equipVariableCollectContextList.stream().filter( + o -> (null != o && !StringUtils.isEmpty(o.getEquipVariableValue()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(productSnList) || productSnList.size() < prodRuleContextList.size()) { + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, + String.format("当前读取到主条码个数[%s]不满足当前实际产品腔数[%s]", CollectionUtils.isEmpty(productSnList) ? MesPcnExtConstWords.ZERO : productSnList.size(), prodRuleContextList.size())); + } + + //封装上下文进料零件条码信息集合 + List productionPsInContextList = new ArrayList<>(); + Integer index = 0; + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getForeignKey())) continue; + productionPsInContextList.add(new MesProductionPsInContext(reqBean.getOrganizeCode(), productSnList.get(index)).foreignKey(prodRuleContext.getForeignKey())); + index ++; + } + + //保存进料主条码数据 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + + //调用生成零件条码工步 + return ((IStepService) SpringContextsUtil.getBean("mesProductSnGenerateStepService")).executeInState(reqBean); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java index 2e9b57d..40c84d0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java @@ -14,6 +14,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProdParamCfg; import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.MesEquipVariableRwResult; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -243,6 +244,9 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { return null != productionPartContext ? productionPartContext.getWorkOrderSeq() : null; case "%CUSTBARCODE%": return null != productionPsOutContext ? productionPsOutContext.getCustSn() : null; + case "%RFIDSN%": + MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean); + return null != shippingQueue ? shippingQueue.getRfidSn() : null; default: return matchRule; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java new file mode 100644 index 0000000..86ba506 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java @@ -0,0 +1,140 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesShippingQueueService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function.MesFunctionChooseShippingGroupService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description : 发运队列获取工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesShippingQueueFindStepService") +public class MesShippingQueueFindStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private MesFunctionChooseShippingGroupService functionChooseShippingGroupService; + + @Autowired + private IMesShippingQueueService shippingQueueService; + + @Autowired + private IFsmCommonService fsmCommonService; + + @Override + public StepResult init(StationRequestBean reqBean) { + + StepResult stepResult = StepResult.getSuccessComplete(); + + String endlessLoopReadTimes = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES); + if (StringUtils.isEmpty(endlessLoopReadTimes)) endlessLoopReadTimes = MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES_DEFAULT; + if (productionDispatchContextStepService.dispatchOverEndlessLoopReadTimes(reqBean, endlessLoopReadTimes)) { + stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, new StationResultBean().isWs(false), + stepResult.isCompleted(false).msg(String.format("当前未获取到发运队列超过[%s]次!", endlessLoopReadTimes)), + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //发送工步内容 + productionCustomContextStepService.sendStepContextMessage(reqBean); + + return stepResult; + + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //扫描信息置空 + String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo()); + + //验证发运组信息是否有效 + List resultList = null; + + if (!StringUtils.isEmpty(scanInfo)) { + //发送工步内容 + productionCustomContextStepService.sendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); + //验证扫描的发运组信息是否有效 + resultList = functionChooseShippingGroupService.checkShippingGroupIsValid(reqBean.getOrganizeCode(), scanInfo); + } + + //扫描的发运组信息无效,获取缓存中的发运组信息 + if (CollectionUtils.isEmpty(resultList)) resultList = productionProcessContextStepService.getFunctionChooseShippingGroupContext(reqBean); + //扫描的发运组信息有效,保存到上下文 + else productionProcessContextStepService.dispatchFunctionChooseShippingGroupContext(reqBean, resultList); + + //验证是否存在发运组代码 + if (CollectionUtils.isEmpty(resultList)) { + if (!StringUtils.isEmpty(scanInfo)) this.sendMessage(reqBean, new StationResultBean().writeDbLog().scanInfo(scanInfo), String.format("扫描信息零件发运组代码[%s]信息无效", scanInfo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描或选择零件发运组代码!"); + } + + //发送工步内容 + scanInfo = resultList.stream().filter(o -> (null != o && !o.getKey().equals(MesPcnExtConstWords.CELL_MESSAGE_SOURCE))).map(o -> o.getName() + MesPcnExtConstWords.SQUARE_BRACKETS_L + o.getValue() + MesPcnExtConstWords.SQUARE_BRACKETS_R).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); + productionCustomContextStepService.sendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); + + scanInfo = resultList.stream().filter(o -> (null != o && o.getKey().equals(MesPcnExtConstWords.SHIPPING_GROUP_CODE))).findFirst().get().getValue(); + MesShippingQueue shippingQueue = shippingQueueService.getShippingQueue(reqBean.getOrganizeCode(), scanInfo); + + if (null == shippingQueue) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + if (StringUtils.isEmpty(shippingQueue.getVin())) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前零件发运组[%s]匹配的发运队列单号[%s]VIN为空,请人工处理! 持续监听中...", scanInfo, shippingQueue.getShippingCode()), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //保存上下文发运队列信息 + productionDispatchContextStepService.dispatchShippingQueueContext(reqBean, shippingQueue); + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("零件发运组[%s]已匹配发运队列单号[%s]VIN[%s]!", scanInfo, shippingQueue.getShippingCode(), shippingQueue.getVin())); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueRemoveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueRemoveStepService.java new file mode 100644 index 0000000..4e8d497 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueRemoveStepService.java @@ -0,0 +1,71 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesShippingQueueService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; + +/** + * @Description : 发运队列消除工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesShippingQueueRemoveStepService") +public class MesShippingQueueRemoveStepService extends BaseStepService { + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesShippingQueueService shippingQueueService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //保存上下文发运队列信息 + MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean); + if (null == shippingQueue) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, + true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的发运队列,消除队列失败!"); + } + + //获取上下文加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + + //修改字段数组 + String[] propertyName = new String[]{MesPcnExtConstWords.QUEUE_STATUS, MesPcnExtConstWords.PID, MesPcnExtConstWords.PRODUCTION_RECORD_ID, + MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}; + + //修改值数组 + Object[] propertyValue = new Object[]{MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), (!StringUtils.isEmpty(shippingQueue.getPidStr()) ? Long.valueOf(shippingQueue.getPidStr()) : 0L), + ((!CollectionUtils.isEmpty(prodRuleContextList) && !StringUtils.isEmpty(prodRuleContextList.get(0).getProductionRecordId())) ? prodRuleContextList.get(0).getProductionRecordId() : 0L), + reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}; + + //根据ID修改发运队列 + shippingQueueService.saveShippingQueue(reqBean.getOrganizeCode(), shippingQueue.getId(), propertyName, propertyValue); + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("发运单号[%s]已从发运队列中消除成功!", shippingQueue.getShippingCode())); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java new file mode 100644 index 0000000..cd3d005 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java @@ -0,0 +1,80 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesShippingQueueService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description : 发运队列RFID匹配工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesShippingRfidMatchStepService") +public class MesShippingRfidMatchStepService extends BaseStepService { + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesShippingQueueService shippingQueueService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文发运队列信息 + MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean); + if ((null == shippingQueue || StringUtils.isEmpty(shippingQueue.getRfidSn()))) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的发运队列,即将重新获取!", + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //获取上下文进料零件条码信息集合 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + //过滤有效的进料零件条码 + String productSn = filterProductionPsInContextList(productionPsInContextList); + if (StringUtils.isEmpty(productSn)) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN), + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的进料条码,即将重新获取!", + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + if (!shippingQueue.getRfidSn().equals(productSn)) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("RFID匹配失败!读条码[%s]与RFID条码[%s]不一致!", productSn, shippingQueue.getRfidSn()), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "RFID匹配成功!"); + + } + + //过滤有效的进料零件条码 + private String filterProductionPsInContextList(List productionPsInContextList) { + productionPsInContextList = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); + return CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.get(0).getProductSn(); + } + + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java new file mode 100644 index 0000000..f4ee1d8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java @@ -0,0 +1,114 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesShippingQueueService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; +import cn.estsh.i3plus.pojo.mes.bean.seres.MesCimSeresJisRfid; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.util.Map; +import java.util.Optional; + +/** + * @Description : 发运队列获取赛力斯RFID工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesShippingRfidSeresFindStepService") +public class MesShippingRfidSeresFindStepService extends BaseStepService { + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesShippingQueueService shippingQueueService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取工步参数 + Optional> stepParamMap = getStepParams(reqBean); + + //获取上下文发运队列信息 + MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean); + if ((null == shippingQueue || StringUtils.isEmpty(shippingQueue.getVin()))) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的发运队列,即将重新获取!", + stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //根据VIN查询赛力斯RFID信息 + MesCimSeresJisRfid cimSeresJisRfid = shippingQueueService.getCimSeresJisRfid(reqBean.getOrganizeCode(), shippingQueue.getVin()); + if (null == cimSeresJisRfid || StringUtils.isEmpty(cimSeresJisRfid.getRfid())) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, + String.format("当前零件发运组[%s]匹配的发运队列单号[%s]VIN[%s]未查询到有效的赛力斯RFID信息,请人工处理! 持续监听中...", shippingQueue.getShippingGroupCode(), shippingQueue.getShippingCode(), shippingQueue.getVin()), + stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //解析rfidSn + String rfidSn = getRfidSn(stepParamMap, cimSeresJisRfid.getRfid()); + if (StringUtils.isEmpty(rfidSn)) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, + String.format("当前零件发运组[%s]匹配的发运队列单号[%s]VIN[%s]查询到的赛力斯RFID[%s]解析错误,请人工处理! 持续监听中...", shippingQueue.getShippingGroupCode(), shippingQueue.getShippingCode(), shippingQueue.getVin(), cimSeresJisRfid.getRfid()), + stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //保存上下文发运队列信息 + shippingQueue.setPidStr(cimSeresJisRfid.getId().toString()); + shippingQueue.setRfidSn(rfidSn); + productionDispatchContextStepService.dispatchShippingQueueContext(reqBean, shippingQueue); + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, + String.format("零件发运组[%s]发运队列单号[%s]VIN[%s]已匹配到赛力斯RFID信息[%s]!", shippingQueue.getShippingGroupCode(), shippingQueue.getShippingCode(), shippingQueue.getVin(), cimSeresJisRfid.getRfid())); + + } + + /** + * ################## 【拉动单号18位】 + * 3263 【供应商代码 4位】 + * 1 【-个VIN对应几个托盘 1位】 + * 2 【左右区分,0代表做,1代表右;不区分左右为2 1位】 + * JSG1DJ05 【LMS零件类 8位】 + * 默认替换说明: 截取96位后面的32位替换为上面拼接的字符串 + */ + //解析rfidSn + private String getRfidSn(Optional> stepParamMap, String rfid) { + //replaceIndex=替换起始位置; replaceLength=替换长度; replaceInfo=替换信息 + String replaceIndex = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.REPLACE_INDEX)) ? stepParamMap.get().get(MesPcnExtConstWords.REPLACE_INDEX).getParamValue() : null; + String replaceLength = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.REPLACE_LENGTH)) ? stepParamMap.get().get(MesPcnExtConstWords.REPLACE_LENGTH).getParamValue() : null; + String replaceInfo = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.REPLACE_INFO)) ? stepParamMap.get().get(MesPcnExtConstWords.REPLACE_INFO).getParamValue() : null; + if (StringUtils.isEmpty(replaceIndex)) replaceIndex = "96"; + if (StringUtils.isEmpty(replaceLength)) replaceLength = "32"; + if (StringUtils.isEmpty(replaceInfo)) replaceInfo = "##################326312JSG1DJ05"; + try { + return new StringBuilder().append(rfid, MesPcnExtConstWords.ZERO, Integer.parseInt(replaceIndex)).append(replaceInfo).append(rfid, Integer.parseInt(replaceIndex) + Integer.parseInt(replaceLength), rfid.length()).toString(); + } catch (Exception e) { + return null; + } + } + +// public static void main(String[] args) { +// String rfid = "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567"; +// System.out.println(rfid.length()); +// System.out.println(rfid); +// System.out.println(rfid.substring(0, 96) + "##################326312JSG1DJ05" + rfid.substring(128)); +// System.out.println(new StringBuilder().append(rfid, 0, 96).append("##################326312JSG1DJ05").append(rfid, 96+32, rfid.length()).toString()); +// } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java index d729980..c2afd19 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java @@ -1,32 +1,29 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdRuleCfgExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderCutService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil; import cn.estsh.i3plus.mes.pcn.util.StringUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesCutSchemeEquipment; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleIgnoreCfg; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.model.AttrBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; -import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.stream.Collectors; @@ -48,15 +45,6 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService private IMesProdRuleCfgExtService prodRuleCfgExtService; @Autowired - private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; - - @Autowired - private IMesTimeEfficientCfgMatchService timeEfficientCfgMatchService; - - @Autowired - private IMesWorkOrderExtService workOrderExtService; - - @Autowired private IMesWorkOrderCutService workOrderCutService; @Override @@ -66,8 +54,8 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService StepResult stepResult = StepResult.getSuccessComplete(); - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + //获取上下文信息: 处理加工不可用规则 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchProdRuleIgnoreCfgContext(reqBean); //配置错误 抛出异常 if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -92,15 +80,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService Integer initSize = prodRuleContextList.size(); //封装非排序加工规则 - if (!doHandleProdRuleData(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, + if (!doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); - //匹配失败需要清除本次扫描/读取信息 - //if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList)) - // return stepResult.nextTriggerEvent(CollectionUtils.isEmpty(productionPsInContextList) ? - // MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO : - // (!StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO : MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN)); - if (prodRuleContextList.size() != initSize) { //保存上下文产品加工规则信息集合 productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); @@ -113,18 +95,6 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "匹配完成!"); } - private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - MesProductionProcessContext productionProcessContext, - MesCellEquipContext cellEquipContext, List prodRuleContextList, - List productionPartContextList, - List productionPsInContextList) { - - //根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错) - return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, productionProcessContext, - cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList); - - } - //根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错) private StepResult doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, @@ -134,9 +104,6 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService List productionPartContextList, List productionPsInContextList) { - //加工规则的数据已与产出零件的数量一致 - //if (!CollectionUtils.isEmpty(prodRuleContextList) && prodRuleContextList.size() == productionPartContextList.size()) return stepResult; - log.info("doHandleProdRuleDataByProductionPart --- productionPartContextList --- outPartNoList:{}", productionPartContextList.stream().map(MesProductionPartContext::getPartNo).collect(Collectors.toList())); log.info("doHandleProdRuleDataByProductionPart --- productionPartContextList:{}", productionPartContextList); @@ -157,8 +124,6 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService //根据产出零件条件获取匹配当前产出零件的加工规则数据(只能查询到一条,否则报错) return doHandleProdRuleDataByProductionPartAndEmptyProductSn(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey); - //存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错) - //else return doHandleProdRuleDataByProductionPartAndProductSn(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList, outPartNoList, foreignKey); } @@ -167,6 +132,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List productionPsInContextList, List outPartNoList, Integer foreignKey) { + //获取加工不可用规则 + Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); + //【非排序线】获取产品加工规则 ; 条件进料[NULL] List prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList).inPartIsEmpty(true)); @@ -198,10 +166,11 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format( "设备[%s]产出零件[%s]进料零件[空]%s加工规则配置信息!", cellEquipContext.getEquipmentName(), productionPartContext.getPartNo(), CollectionUtils.isEmpty(filterList) ? "未匹配到" : String.format("匹配到[%s]条", filterList.size()))); } - //【非排序线】获取产品加工规则对应的装配件信息 + //【非排序线】获取产品加工规则对应的装配件信息 -同时- 关联不可用规则 MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext( new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) - .copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())); + .copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey()), + prodRuleIgnoreCfgMap); //prodRuleContext.setIsPrint(cutSchemeEquipment.getIsPrint()); prodRuleContextList.add(prodRuleContext); @@ -216,353 +185,10 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService return stepResult; } - /** - * 1 遍历 MesProductionPartContext 对工单号分组 - * 2 不同的单号,查询对应的工单数量和完成数量,进行对比 - * 3 是否超报工和报工比例, - * @param reqBean - * @param productionPartContextList - * @param workCenter - * @param stepResult - * @param resultBean - * @return - */ - private StepResult validSuperWorkOrder(StationRequestBean reqBean, List productionPartContextList, List productionPsInContextList, MesWorkCenter workCenter, StepResult stepResult, StationResultBean resultBean) { - // 验证超工单 - log.info("验证是否超工单begin ->"); - - //判断是否还存在待匹配的主条码信息, 内部循环匹配成功会标记 foreignKey - Optional optional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst(); - if (null == optional || !optional.isPresent()) return stepResult; - - // 对MesProductionPartContext中的工单号经行分组,每个工单可能对应多条数据,筛选掉foreignkey为空的数据 - Map> productionPartContextMap = productionPartContextList.stream().filter(productionPartContext -> !StringUtils.isEmpty(productionPartContext.getForeignKey())) - .collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo)); - // 获取涉及到的所有工单列表 - List workOrderList = workOrderExtService.getWorkOrderList(reqBean.getOrganizeCode(), new ArrayList<>(productionPartContextMap.keySet())); - - // 对工单经行分组 - Map> orderListMap = workOrderList.stream().collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo)); - - for (Map.Entry> entry : productionPartContextMap.entrySet()) { - String workOrder = entry.getKey(); - List productionPartContexts = entry.getValue(); - MesWorkOrder mesWorkOrder = orderListMap.get(workOrder).get(0); - - Double complateQty = mesWorkOrder.getCompleteQty() + productionPartContexts.size(); - Double qty = mesWorkOrder.getQty(); - log.info("验证超工单,工单号【{}】,qty=【{}】,complateQty =【{}】begin ->", mesWorkOrder.getWorkOrderNo(), qty, complateQty); - // 如果预完成数量 小于等于工单数量,则直接过 - if (complateQty <= qty) continue; - - // 以下则是超工单逻辑 - // 如果产线中没有配置超工单,则直接阻断 - if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), workCenter.getIsCheckOrderQty())) { - productionPartContextList.forEach(o -> o.busiCheckToDelete()); - if (!CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.obj(false), String.format("请检查工单数量,工单号[%s],工单数量[%s]预完成数量[%s],且未配置超工单!", workOrder, mesWorkOrder.getQty().intValue(), complateQty.intValue())); - } - // 如果配置了超工单,且比例已经超过了配置的超工单比例,也需要阻断 - Double rate = (complateQty - qty)/qty; - if (rate > workCenter.getOrderRate()/100) { - productionPartContextList.forEach(o -> o.busiCheckToDelete()); - if (!CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.obj(false), String.format("请检查工单数量,工单号[%s],工单数量[%s]预完成数量[%s],配置了超工单,但超过了比例[%s]!", workOrder, mesWorkOrder.getQty().intValue(), complateQty.intValue(), workCenter.getOrderRate())); - } - log.info("验证超工单,工单号【{}】,qty=【{}】,complateQty =【{}】,isCheckOrderQty=【{}】, rate = 【{}】end ->", mesWorkOrder.getWorkOrderNo(), qty, complateQty,workCenter.getIsCheckOrderQty(),rate); - } - log.info("验证是否超工单end ->"); - return stepResult; - } - - //没有【产出零件数据】信息 , 根据进料条件获取匹配加工规则数据(只能查询到一条,否则报错) - private StepResult doHandleProdRuleDataByProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, - MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPsInContextList) { - - //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回 - List prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, null); - - //拿到当前最大的foreignKey - Optional maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey)); - Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO; - - for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { - - //foreignKey有值代表已经匹配过产品加工规则 - if (null == productionPsInContext || productionPsInContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue; - - List filterList; - //搜集进料零件号匹配的产品加工规则 - if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) filterList = filterProdRuleNosortCfgList(prodRuleNosortCfgList, productionPsInContext.getPartNo()); - //进料零件条码匹配进料零件规则 - else filterList = (List) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(prodRuleNosortCfgList)); - - if (CollectionUtils.isEmpty(filterList) || filterList.size() > 1) { - if (productionPsInContext.getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) productionPsInContext.busiCheckToDelete(); - else productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("设备[%s]与进料零件条码%s加工规则配置信息! 进料零件条码[%s]%s", - cellEquipContext.getEquipmentName(), CollectionUtils.isEmpty(filterList) ? "未匹配到" : String.format("匹配到[%s]条", filterList.size()), productionPsInContext.getProductSn(), - StringUtils.isEmpty(productionPsInContext.getPartNo()) ? "为外协件" : String.format("当前零件号[%s]", productionPsInContext.getPartNo()))); - } - - //时效性验证 - if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) { - Map result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterList.get(0).getId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue()); - - if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { - if (productionPsInContext.getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) productionPsInContext.busiCheckToDelete(); - else productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productionPsInContext.getProductSn()), stepResult, (String) result.get(MesPcnExtConstWords.MESSAGE)); - } - } - - //【非排序线】获取产品加工规则对应的装配件信息 - MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext( - new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) - .copy(filterList.get(0)).productSn(productionPsInContext.getProductSn()).foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey())); - prodRuleContextList.add(prodRuleContext); - - log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 进料零件条码:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), - StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPsInContext), JSONObject.toJSONString(prodRuleContext)); - - } - - return stepResult; - - } - - private List getProdRuleNosortCfgList(StationRequestBean reqBean, MesCellEquipContext cellEquipContext, List productionPsInContextList, List outPartNoList) { - //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件可能携带产出零件 - List inPartNoList = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPsInContext::getPartNo).collect(Collectors.toList()); - Optional optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && StringUtils.isEmpty(o.getPartNo()))).findFirst(); - List prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList( - !CollectionUtils.isEmpty(inPartNoList) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartNos(inPartNoList).outPartNos(outPartNoList) : null, - (null != optional && optional.isPresent()) ? new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).inPartIsEmpty(true).inPartRuleIsEmpty(false).outPartNos(outPartNoList) : null); - return prodRuleNosortCfgList; - } - - //存在【产出零件数据】信息, 存在【进料零件条码信息】 获取匹配当前产出零件的加工规则数据 (只能查询到一条,否则报错) - private StepResult doHandleProdRuleDataByProductionPartAndProductSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, - List prodRuleContextList, List productionPartContextList, List productionPsInContextList, List outPartNoList, Integer foreignKey) { - - //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件 - List prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList); - - //TODO 提示优化 直接根除产出零件去查询,判断产出零件对应的加工规则是不是仅仅维护了一个 - //List prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList)); - - //根据产出零件分组数据 - Map> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList); - - for (MesProductionPartContext productionPartContext : productionPartContextList) { - - //foreignKey有值代表已经匹配过产品加工规则 - if (null == productionPartContext || productionPartContext.getIsFinishCode() - .compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPartContext.getForeignKey())) continue; - - //获取匹配产出零件的所有加工规则 - List outPartNoProdRuleList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null; - - MesProductionPsInContext productSn = null; - - //判断是否还存在待匹配的主条码信息, 内部循环匹配成功会标记 foreignKey - Optional optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - if (null == optional || !optional.isPresent()) break; - - List innerfilterList = null; - for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { - - //foreignKey有值代表已经匹配过产品加工规则 - if (null == productionPsInContext || productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 || !StringUtils.isEmpty(productionPsInContext.getForeignKey())) continue; - - //搜集进料零件号匹配的产品加工规则 - if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) innerfilterList = filterProdRuleNosortCfgList(outPartNoProdRuleList, productionPsInContext.getPartNo()); - //进料零件条码匹配进料零件规则 - else innerfilterList = (List) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), filterProdRuleNosortCfgList(outPartNoProdRuleList)); - - if (CollectionUtils.isEmpty(innerfilterList) || innerfilterList.size() > 1) continue; - - //验证进出一致 - if (!StringUtils.isEmpty(productionPsInContext.getPartNo()) && productionPsInContext.getPartNo().equals(productionPartContext.getPartNo())) { - - //进料工单必须与产出工单一致 - if (!StringUtils.isEmpty(productionPartContext.getWorkOrderNo()) && !StringUtils.isEmpty(productionPsInContext.getWorkOrderNo()) && !productionPsInContext.getWorkOrderNo().equals(productionPartContext.getWorkOrderNo())) { - if (productionPsInContext.getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) productionPsInContext.busiCheckToDelete(); - else productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productionPsInContext.getProductSn()), stepResult, String.format("主条码[%s]零件号[%s]关联的加工单[%s]与产出零件[%s]关联的加工单[%s]不一致!", - productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), productionPsInContext.getWorkOrderNo(), productionPartContext.getPartNo(), productionPartContext.getWorkOrderNo())); - } - - //进料存在工单且已经过某工序生产, 不能匹配无工单的产出零件 - if (StringUtils.isEmpty(productionPartContext.getWorkOrderNo()) && !StringUtils.isEmpty(productionPsInContext.getWorkOrderNo()) && !StringUtils.isEmpty(productionPsInContext.getProcessCode())) { - if (productionPsInContext.getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) productionPsInContext.busiCheckToDelete(); - else productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productionPsInContext.getProductSn()), stepResult, String.format("主条码[%s]零件号[%s]已关联加工单[%s]且已经过工序[%s]工艺[%s],不支持匹配当前未关联加工单的产出零件[%s]", - productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), productionPsInContext.getWorkOrderNo(), productionPsInContext.getProcessCode(), productionPsInContext.getCraftCode(), productionPartContext.getPartNo())); - } - - } - - //时效性验证 - //if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) { - // Map result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), innerfilterList.get(0).getId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue()); - // - // if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) { - // if (productionPsInContext.getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) productionPsInContext.busiCheckToDelete(); - // else productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - // return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productionPsInContext.getProductSn()), stepResult, (String) result.get(MesPcnExtConstWords.MESSAGE)); - // } - //} - - productionPartContext.foreignKey(productionPsInContext.foreignKey(foreignKey += 1).getForeignKey()); - productSn = productionPsInContext; - - break; - } - - //【非排序线】获取产品加工规则对应的装配件信息 - if (!CollectionUtils.isEmpty(innerfilterList) && innerfilterList.size() == 1) { - - MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext(new MesProdRuleContext( - reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), - reqBean.getProcessCode(), productionProcessContext.getCraftCode()). - copy(innerfilterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).productSn(productSn.getProductSn())) - .foreignKey(productionPartContext.getForeignKey()); - prodRuleContextList.add(prodRuleContext); - - log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 产出零件信息:{} 进料零件条码:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), - StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPartContext), JSONObject.toJSONString(productSn), JSONObject.toJSONString(prodRuleContext)); - - } - - } - - ////判断是否还存在待匹配的主条码信息 - //Optional optional = productionPsInContextList.stream().filter(o -> - // (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - //if (null != optional && optional.isPresent()) { - // if (optional.get().getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) == 0) optional.get().busiCheckToDelete(); - // else productionPsInContextList.forEach(o -> o.busiCheckToDelete()); - // String productSnStr = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) - // .map(o -> String.format(" 进料零件条码[%s]%s", o.getProductSn(), StringUtils.isEmpty(o.getPartNo()) ? "为外协件" : String.format("当前零件号[%s]", o.getPartNo()))).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); - // return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productSnStr), stepResult, String.format("设备[%s]产出零件%s与进料零件条码未匹配到唯一的加工规则配置信息!%s", cellEquipContext.getEquipmentName(), - // productionPartContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()) && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).map(MesProductionPartContext::getPartNo).collect(Collectors.toList()).toString(), - // productSnStr)); - //} - - // 默认头道才有超工单 - //validSuperWorkOrder(reqBean, productionPartContextList,productionPsInContextList,workCenter, stepResult, resultBean); - return stepResult; - - } - - //搜集进料零件号匹配的产品加工规则 - private List filterProdRuleNosortCfgList(List prodRuleNosortCfgList, String partNo) { - return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getInPartNo()) && o.getInPartNo().equals(partNo))).collect(Collectors.toList()); - } - - //搜集进料零件规则有值的产品加工规则 - private List filterProdRuleNosortCfgList(List prodRuleNosortCfgList) { - return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getInPartNo()) && !StringUtils.isEmpty(o.getInPartNoRule()))).collect(Collectors.toList()); - } - //根据产出零件分组数据 private Map> groupProdRuleNosortCfgList(List prodRuleNosortCfgList) { return CollectionUtils.isEmpty(prodRuleNosortCfgList) ? null : prodRuleNosortCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProdRuleNosortCfg::getOutPartNo)); } - //显示装配件信息 - public Boolean showProductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, MesWorkCenter workCenter, MesCellEquipContext cellEquipContext, List prodRuleContextList) { - - for (MesProdRuleContext prodRuleContext : prodRuleContextList) { - - if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; - - //封装匹配当前设备的装配件信息 - List assemblyShowContextList = getAssemblyShowContextList(cellEquipContext, prodRuleContext.getAssemblyDataContext(workCenter)); - if (CollectionUtils.isEmpty(assemblyShowContextList)) continue; - - //装配件清单列表标题 - List attrBeanList = dataAttrList(prodRuleContext.getWorkOrderNo()); - - //封装多表格 - resultBean.addStationResultBeans(new StationResultBean().dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLE.getValue()).dataAttrList(attrBeanList).resultList(assemblyShowContextList)); - - } - - if (CollectionUtils.isEmpty(resultBean.getStationResultBeans())) return false; - - resultBean.busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue()); - this.sendMessage(reqBean, resultBean); - - return true; - - } - - private String getWorkOrderNo(Map productionPartMap, Integer foreignKey) { - return (!CollectionUtils.isEmpty(productionPartMap) && productionPartMap.containsKey(foreignKey)) ? productionPartMap.get(foreignKey).getWorkOrderNo() : null; - } - - //封装匹配当前设备的装配件信息 - private List getAssemblyShowContextList(MesCellEquipContext cellEquipContext, List productionAssemblyContextList) { - if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null; - List assemblyShowContextList = new ArrayList<>(); - for (MesProductionAssemblyContext item : productionAssemblyContextList) { - //不显示且不扫描/仅目视的不显示出来 - if (null == item || MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNoShow(item.getMatchType())) continue; - assemblyShowContextList.add(assemblyShowContext(item)); - } - - assemblyShowContextList = assemblyShowContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesAssemblyShowContext::getRouteSeq)).collect(Collectors.toList()); - - AtomicReference index = new AtomicReference<>(0); - assemblyShowContextList.forEach(o -> o.index(index.updateAndGet(v -> v + 1))); - - return assemblyShowContextList; - } - - //封装装配件信息 - private MesAssemblyShowContext assemblyShowContext(MesProductionAssemblyContext o) { - MesAssemblyShowContext assemblyShowContext = new MesAssemblyShowContext(); - BeanUtils.copyProperties(o, assemblyShowContext); - assemblyShowContext.setMatchTypeName(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(assemblyShowContext.getMatchType())); - assemblyShowContext.setAssemblyStatusName(MesExtEnumUtil.ASSEMBLY_STATUS.valueOfDescription(assemblyShowContext.getAssemblyStatus())); - if (MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue() != assemblyShowContext.getAssemblyStatus()) - assemblyShowContext.setColor(StringUtils.isEmpty(assemblyShowContext.getShowColor()) ? MesExtEnumUtil.COLOR.GREEN.getValue() : assemblyShowContext.getShowColor()); - return assemblyShowContext; - } - - //装配件清单列表标题 - private List dataAttrList(String workOrderNo) { - List attrBeanList = new ArrayList<>(); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.INDEX, "序号"); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.MATCH_TYPE_NAME, "装配方式"); - if (!StringUtils.isEmpty(workOrderNo)) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.WORK_ORDER_NO, "生产工单编号"); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NO, "零件编码"); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_PART_NO, "原料编码"); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_PART_NAME, "原料名称"); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_SN, "原料条码"); - PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.ASSEMBLY_STATUS_NAME, "装配状态"); - return attrBeanList; - } - - //清除本次扫描/读取信息 有进料【只】需要清除进料,否则存在产出零件需要清除产出零件 【只需要清除被标记的数据】 - private Boolean doBusiCheckToDelete(StationRequestBean reqBean, StepResult stepResult, List productionPartContextList, List productionPsInContextList) { - if (!CollectionUtils.isEmpty(productionPsInContextList) && StringUtils.isEmpty(stepResult.getObj())) { - productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList.stream().filter(o -> (null != o && o.getBusiCheckToDelete().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList())); - } else if (!CollectionUtils.isEmpty(productionPartContextList)) { - if (!StringUtils.isEmpty(stepResult.getObj())) productionDispatchContextStepService.removeProductionPsInContext(reqBean); - productionDispatchContextStepService.removeProductionPartContext(reqBean); - productionDispatchContextStepService.removeProdRuleDataContext(reqBean); - productionProcessContextStepService.removeFunctionChooseCavityOrderContext(reqBean); - if (productionDispatchContextStepService.checkFirstMouldNoIsExistContext(reqBean)) { - //存在头道模具号场景下 必须抛出异常 因为头道模具号的接口逻辑会配置非常变值,也就是每次返回回去都会拿到头道模具号 就会出现死循环线程 - productionDispatchContextStepService.removeFirstMouldNoContext(reqBean); - foundExThrowNoShowMsg(); - } - } - return true; - } - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java index 0a92bcd..96123d1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java @@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; +import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import com.alibaba.fastjson.JSONObject; @@ -235,9 +236,9 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp //保存上下文扫/读信息:加工单 [JSON]List @Override - public Boolean dispatchScanWorkOrderNoContext(StationRequestBean reqBean, List productSnList) { - if (CollectionUtils.isEmpty(productSnList)) return false; - return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_WORK_ORDER_NO_CONTEXT, JSONObject.toJSONString(productSnList)); + public Boolean dispatchScanWorkOrderNoContext(StationRequestBean reqBean, List workOrderNoList) { + if (CollectionUtils.isEmpty(workOrderNoList)) return false; + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SCAN_WORK_ORDER_NO_CONTEXT, JSONObject.toJSONString(workOrderNoList)); } //删除上下文扫/读信息:加工单 @@ -495,38 +496,58 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp return true; } + //获取上下文临时数据信息集合 @Override public List getProdTempDataContext(StationRequestBean reqBean) { String prodTempDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_TEMP_DATA_CONTEXT); return !StringUtils.isEmpty(prodTempDataJson) ? JSONObject.parseArray(prodTempDataJson, MesProdTempDataContext.class) : null; } + //获取上下文临时数据信息集合 @Override public List getProdTempDataContext(String organizeCode, String workCenterCode, String workCellCode) { String prodTempDataJson = getFsmBusiData(organizeCode, getContextKey(organizeCode, workCenterCode, workCellCode), MesPcnExtConstWords.PROD_TEMP_DATA_CONTEXT); return !StringUtils.isEmpty(prodTempDataJson) ? JSONObject.parseArray(prodTempDataJson, MesProdTempDataContext.class) : null; } + //保存上下文临时数据信息集合 @Override public Boolean dispatchProdTempDataContext(StationRequestBean reqBean, List prodTempDataContextList) { if (CollectionUtils.isEmpty(prodTempDataContextList)) return false; return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_TEMP_DATA_CONTEXT, JSONObject.toJSONString(prodTempDataContextList)); } + //保存上下文临时数据信息集合 @Override public Boolean dispatchProdTempDataContext(String organizeCode, String workCenterCode, String workCellCode, List prodTempDataContextList) { if (CollectionUtils.isEmpty(prodTempDataContextList)) return false; return dispatchFsmBusiData(organizeCode, getContextKey(organizeCode, workCenterCode, workCellCode), MesPcnExtConstWords.PROD_TEMP_DATA_CONTEXT, JSONObject.toJSONString(prodTempDataContextList)); } + //删除上下文临时数据信息集合 @Override public void removeProdTempDataContext(StationRequestBean reqBean) { removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_TEMP_DATA_CONTEXT); } + //删除上下文临时数据信息集合 @Override public void removeProdTempDataContext(String organizeCode, String workCenterCode, String workCellCode) { removeFsmBusiData(organizeCode, getContextKey(organizeCode, workCenterCode, workCellCode), MesPcnExtConstWords.PROD_TEMP_DATA_CONTEXT); } + //获取上下文发运队列信息 + @Override + public MesShippingQueue getShippingQueueContext(StationRequestBean reqBean) { + String shippingQueueJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SHIPPING_QUEUE_CONTEXT); + return !StringUtils.isEmpty(shippingQueueJson) ? JSONObject.parseObject(shippingQueueJson, MesShippingQueue.class) : null; + } + + //保存上下文发运队列信息 + @Override + public Boolean dispatchShippingQueueContext(StationRequestBean reqBean, MesShippingQueue shippingQueue) { + if (null == shippingQueue) return false; + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SHIPPING_QUEUE_CONTEXT, JSONObject.toJSONString(shippingQueue)); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index 5cc0733..f920055 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -10,6 +10,7 @@ import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -584,4 +585,67 @@ public class MesProductionProcessContextStepService extends BaseStepService impl return equipSpotCheckContext; } + //获取选择/扫描零件发运组信息上下文 + @Override + public List getFunctionChooseShippingGroupContext(StationRequestBean reqBean) { + String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_SHIPPING_GROUP); + return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null; + } + + //保存选择/扫描零件发运组信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=shippingGroupCode, name=零件发运组代码, value=xxx, seq=0), StationKvBean(key=cellMessageSource, name=工位信息来源, value=10, seq=1)] + @Override + public Boolean dispatchFunctionChooseShippingGroupContext(StationRequestBean reqBean, List resultList) { + if (CollectionUtils.isEmpty(resultList)) return false; + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_SHIPPING_GROUP, JSONObject.toJSONString(resultList)); + } + + //删除选择/扫描零件发运组信息上下文 + @Override + public void removeFunctionChooseShippingGroupContext(StationRequestBean reqBean) { + removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_SHIPPING_GROUP); + } + + //处理加工不可用规则 + @Override + public MesProductionProcessContext dispatchProdRuleIgnoreCfgContext(StationRequestBean reqBean) { + return dispatchProdRuleIgnoreCfgContext(reqBean, getCellEquipmentList(reqBean)); + } + + //处理加工不可用规则 + @Override + public MesProductionProcessContext dispatchProdRuleIgnoreCfgContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); + if (null == cellEquipmentContext) cellEquipmentContext = dispatchCurCellEquipment(reqBean, productionProcessContext).getCurCellEquip(); + if (!productionProcessContext.getSuccess() || !StringUtils.isEmpty(productionProcessContext.getProdRuleIgnoreCfg())) return productionProcessContext; + //根据设备代码查询加工不可用规则信息, 如果是排序线末道工位,需要查询生产线所有设备的不可用规则, 因为末道工位可能会补装配前道 + List prodRuleIgnoreCfgList = (getCenterType(reqBean).compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0 && + (!StringUtils.isEmpty(productionProcessContext.getWorkCell().getIsEndWorkCell()) && productionProcessContext.getWorkCell().getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)) + ? equipmentExtService.getProdRuleIgnoreCfgListByCenter(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()) + : equipmentExtService.getProdRuleIgnoreCfgListByEquip(reqBean.getOrganizeCode(), cellEquipmentContext.getEquipmentCode()); + if (!CollectionUtils.isEmpty(prodRuleIgnoreCfgList)) { + dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_IGNORE_CFG_CONTEXT, JSONObject.toJSONString(prodRuleIgnoreCfgList)); + } + productionProcessContext.prodRuleIgnoreCfg(!CollectionUtils.isEmpty(prodRuleIgnoreCfgList) ? CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValueStr()).isNeedCache(); + return productionProcessContext; + } + + //获取加工不可用规则 + @Override + public List getProdRuleIgnoreCfgContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + if (StringUtils.isEmpty(productionProcessContext.getProdRuleIgnoreCfg())) dispatchProductionProcessContext(reqBean, dispatchProdRuleIgnoreCfgContext(reqBean, productionProcessContext)); + if (!productionProcessContext.getSuccess()) return null; + if (StringUtils.isEmpty(productionProcessContext.getProdRuleIgnoreCfg()) || productionProcessContext.getProdRuleIgnoreCfg().equals(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValueStr())) return null; + String prodRuleIgnoreCfgContextJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_IGNORE_CFG_CONTEXT); + return !StringUtils.isEmpty(prodRuleIgnoreCfgContextJson) ? JSONObject.parseArray(prodRuleIgnoreCfgContextJson, MesProdRuleIgnoreCfg.class) : null; + } + + //获取加工不可用规则, key = 数据来源&来源ID + @Override + public Map> getProdRuleIgnoreCfgContextMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + List prodRuleIgnoreCfgList = getProdRuleIgnoreCfgContext(reqBean, productionProcessContext); + return CollectionUtils.isEmpty(prodRuleIgnoreCfgList) ? null : + prodRuleIgnoreCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getDataSource()) && !StringUtils.isEmpty(o.getSourceId()))) + .collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getDataSource().toString()).add(o.getSourceId().toString()).toString())); + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProdRuleContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProdRuleContext.java index 04e674e..2d3d42d 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProdRuleContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProdRuleContext.java @@ -96,6 +96,9 @@ public class MesProdRuleContext implements Serializable { @ApiParam(name = "子箱设备信号点") private String packageEquSignal; + @ApiParam("不可用规则") + private String prodRuleIgnoreCfg; + //----------仅作为查询条件冗余------------- @ApiParam(name = "进料零件号是否有值") diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java index e6463bb..75a1c0e 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java @@ -46,6 +46,9 @@ public class MesProductionAssemblyContext implements Serializable { @ApiParam("扫描规则") public String matchRule; + @ApiParam("不可用规则") + public String prodRuleIgnoreCfg; + @ApiParam("自制件ID") public Long productSnId; diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java index 3284739..8cbc7ab 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java @@ -140,6 +140,11 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon return this; } + public MesProductionAssemblyNosortContext prodRuleIgnoreCfg(String prodRuleIgnoreCfg) { + if (!StringUtils.isEmpty(prodRuleIgnoreCfg)) this.prodRuleIgnoreCfg = prodRuleIgnoreCfg; + return this; + } + private void matchDatetime() { this.matchDatetime = (new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SSS)).format(new Date()); } } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java index 894e5d9..0e2536f 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java @@ -259,6 +259,11 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte return this; } + public MesProductionAssemblySortContext prodRuleIgnoreCfg(String prodRuleIgnoreCfg) { + if (!StringUtils.isEmpty(prodRuleIgnoreCfg)) this.prodRuleIgnoreCfg = prodRuleIgnoreCfg; + return this; + } + private void matchDatetime() { this.matchDatetime = (new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SSS)).format(new Date()); } } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java index e87a94f..32fa4eb 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java @@ -35,6 +35,9 @@ public class MesProductionProcessContext implements Serializable { @ApiParam("是否需要重新存储") private Boolean isNeedCache; + @ApiParam("是否存在加工不可用规则") + private String prodRuleIgnoreCfg; + @ApiParam("组织代码") private String organizeCode; @@ -113,6 +116,12 @@ public class MesProductionProcessContext implements Serializable { return this; } + //手动赋是否存在加工不可用规则 + public MesProductionProcessContext prodRuleIgnoreCfg(String prodRuleIgnoreCfg) { + this.prodRuleIgnoreCfg = prodRuleIgnoreCfg; + return this; + } + //上下文信息结果信息赋值后给工步使用 public MesProductionProcessContext message(String message) { this.success = false; diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index ca3216a..55cb9b5 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -353,6 +353,12 @@ public class MesPcnExtConstWords { public static final String SPOT_CHECK_TIME = "spotCheckTime"; //点检人 public static final String SPOT_CHECK_USER = "spotCheckUser"; + //发运组代码 + public static final String SHIPPING_GROUP_CODE = "shippingGroupCode"; + //发运组名称 + public static final String SHIPPING_GROUP_NAME = "shippingGroupName"; + //队列状态 + public static final String QUEUE_STATUS = "queueStatus"; //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties) @@ -439,6 +445,12 @@ public class MesPcnExtConstWords { public static final String CONTEXT_UNBINDING_STEP = "CONTEXT_UNBINDING_STEP"; // 零件条码统计OEE共享信息[工步参数] public static final String BARCODE_COUNT_SHARE_INFO = "BARCODE_COUNT_SHARE_INFO"; + //替换起始位置[工步参数] + public static final String REPLACE_INDEX = "replaceIndex"; + //替换长度[工步参数] + public static final String REPLACE_LENGTH = "replaceLength"; + //替换信息[工步参数] + public static final String REPLACE_INFO = "replaceInfo"; // 装配件显示规则配置[工位参数] public static final String ASSEMBLY_SHOW_MR_CFG = "ASSEMBLY_SHOW_MR_CFG"; @@ -460,6 +472,8 @@ public class MesPcnExtConstWords { public static final String ENDLESS_LOOP_READ_TIMES_DEFAULT = "10"; // 所有分屏强制跳过工序密码[工位参数] public static final String MANY_CELL_TRIGGER_JUMP_PROCESS_PWD = "MANY_CELL_TRIGGER_JUMP_PROCESS_PWD"; + // 非排序顺序防错级别配置[工位参数] 1=物料 否则=生产线 + public static final String CHECK_PRODUCT_SEQ_CFG = "CHECK_PRODUCT_SEQ_CFG"; // 工位/工步 参数按钮事件 public static final String FUNCTION_CMD = "FUNCTION_CMD"; @@ -480,6 +494,8 @@ public class MesPcnExtConstWords { public static final String FUNCTION_CHOOSE_CAVITY_ORDER = "FUNCTION_CHOOSE_CAVITY_ORDER"; // 工位参数按钮事件: 选择产成零件(先选腔数, 再选零件) public static final String FUNCTION_CHOOSE_CAVITY_PART = "FUNCTION_CHOOSE_CAVITY_PART"; + // 工位参数按钮事件: 选择发运组 + public static final String FUNCTION_CHOOSE_SHIPPING_GROUP = "FUNCTION_CHOOSE_SHIPPING_GROUP"; // 工位参数按钮事件: 切换工位 public static final String FUNCTION_SWITCH_CELL = "FUNCTION_SWITCH_CELL"; // 工位参数按钮事件: 锁定 @@ -610,6 +626,8 @@ public class MesPcnExtConstWords { public static final String PACKAGE_RULE_CONTEXT = "PACKAGE_RULE_CONTEXT"; // 设备点检上下文 public static final String EQUIP_SPOT_CHECK_CONTEXT = "EQUIP_SPOT_CHECK_CONTEXT"; + // 加工不可用规则上下文 + public static final String PROD_RULE_IGNORE_CFG_CONTEXT = "PROD_RULE_IGNORE_CFG_CONTEXT"; // 上下文: 展示组件数据 public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT"; @@ -653,6 +671,8 @@ public class MesPcnExtConstWords { public static final String WORK_ORDER_CUT_FG_DATA_CONTEXT = "WORK_ORDER_CUT_FG_DATA_CONTEXT"; // 上下文: 临时数据 public static final String PROD_TEMP_DATA_CONTEXT = "PROD_TEMP_DATA_CONTEXT"; + // 上下文: 发运队列 + public static final String SHIPPING_QUEUE_CONTEXT = "SHIPPING_QUEUE_CONTEXT"; //OPC_API_PARAM