From a07ebfb5457586e927af2d88a2e88dc657694a74 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Mon, 17 Mar 2025 21:37:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=B1=E6=B1=95=E5=B7=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step/MesAssemblyShowNosortStepService.java | 91 +--------------------- ...oductionDataSaveBeforeLockOrderStepService.java | 52 +++++++++++-- .../MesWorkOrderCheckCompleteQtyStepService.java | 39 ++++++++-- 3 files changed, 81 insertions(+), 101 deletions(-) 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 d7d0352..c1fdadc 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 @@ -8,13 +8,11 @@ import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; 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.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; import cn.estsh.i3plus.pojo.mes.model.AttrBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -107,10 +105,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList); //验证加工单完成数量, 验证的前提条件: 每腔均已匹配到加工规则 - workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); + workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); //匹配失败需要清除本次扫描/读取信息 - if (!stepResult.isCompleted() && doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList)) + if (!stepResult.isCompleted() && workOrderCheckCompleteQtyStepService.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) { @@ -200,75 +198,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPartContext), JSONObject.toJSONString(prodRuleContext)); } - // 默认头道才有超工单 - validSuperWorkOrder(reqBean, productionPartContextList, null, workCenter, stepResult, resultBean); 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), - MathOperation.compareTo(mesWorkOrder.getQty(), mesWorkOrder.getCompleteQty()) == 0 - ? String.format("请检查工单数量,工单[%s]计划数量[%s]已完成数量[%s],当前已完成!", workOrder, mesWorkOrder.getQty().intValue(), mesWorkOrder.getCompleteQty().intValue()) - : String.format("请检查工单数量,工单[%s]计划数量[%s]已完成数量[%s],当前不支持超工单!", workOrder, mesWorkOrder.getQty().intValue(), mesWorkOrder.getCompleteQty().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(), mesWorkOrder.getCompleteQty().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, @@ -460,8 +393,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { productSnStr)); } - // 默认头道才有超工单 - validSuperWorkOrder(reqBean, productionPartContextList,productionPsInContextList,workCenter, stepResult, resultBean); return stepResult; } @@ -599,22 +530,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { 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/MesProductionDataSaveBeforeLockOrderStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeLockOrderStepService.java index cdb4f7f..e39863f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeLockOrderStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeLockOrderStepService.java @@ -1,9 +1,15 @@ 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.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService; +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.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.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; @@ -11,6 +17,11 @@ 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.List; +import java.util.StringJoiner; /** * @Description : 验证加工单数量后保存加工结果工步 @@ -21,7 +32,15 @@ import org.springframework.stereotype.Service; public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepService { @Autowired - public IMesProductionProcessContextStepService productionProcessContextStepService; + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + + + @Autowired + private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService; @Override public StepResult execute(StationRequestBean reqBean) { @@ -30,14 +49,37 @@ public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepSer StepResult stepResult = StepResult.getSuccessComplete(); - synchronized () + //获取上下文信息: 处理加工不可用规则 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchProdRuleIgnoreCfgContext(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文产出零件数据信息集合 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //获取上下文进料零件条码信息集合 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + synchronized (new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).toString().intern()) { + //验证加工单完成数量flag=1【验证】 + workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); - //非排序线 保存加工结果工步 execute 方法 使用的是 新事务 - ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean); + //匹配失败需要清除本次扫描/读取信息 + if (!stepResult.isCompleted() && workOrderCheckCompleteQtyStepService.doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList)) + return stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO); + //非排序线 保存加工结果工步 execute 方法 使用的是 新事务 + ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean); + //验证加工单完成数量flag=2【累加完成数】 + workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); + } return stepResult; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/MesWorkOrderCheckCompleteQtyStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/MesWorkOrderCheckCompleteQtyStepService.java index 80b77c4..3ce84a3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/MesWorkOrderCheckCompleteQtyStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/MesWorkOrderCheckCompleteQtyStepService.java @@ -1,6 +1,8 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method; 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.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; @@ -31,11 +33,17 @@ import java.util.stream.Collectors; public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired private IMesProductionCustomContextStepService productionCustomContextStepService; - //flag=1【验证】; flag=2【累加完成数】 + //flag=1【验证】 //验证加工单完成数量, 验证的前提条件: 每腔均已匹配到加工规则;存在工单; - public void dispatchWorkOrderCompleteQtyContext(Integer flag, StationRequestBean reqBean, StationResultBean resultBean, + public void dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList, List productionPsInContextList) { //是否存在产成零件信息 @@ -66,7 +74,7 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { for (Map.Entry> entry : productionPartContextMap.entrySet()) { if (null == entry) continue; //验证加工单完成数量 - dispatchWorkOrderCompleteQty(flag, reqBean, resultBean, stepResult, workCenter, isCellNoCalcQty, entry.getValue(), productionPsInContextMap); + dispatchWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, isCellNoCalcQty, entry.getValue(), productionPsInContextMap); //验证失败直接退出 if (!stepResult.isCompleted()) break; } @@ -80,7 +88,7 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { } //验证加工单完成数量 - private void dispatchWorkOrderCompleteQty(Integer flag, StationRequestBean reqBean, StationResultBean resultBean, + private void dispatchWorkOrderCompleteQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, Boolean isCellNoCalcQty, List productionPartContextList, Map productionPsInContextMap) { Double calcCompleteQty = new Double(MesPcnExtConstWords.ZERO); @@ -96,10 +104,7 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { if (MathOperation.compareTo(calcCompleteQty, new Double(MesPcnExtConstWords.ZERO)) == 0) return; //处理工位维度的工单完成数上下文 - MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext = productionCustomContextStepService.dispatchWorkOrderCompleteQtyCellContext(flag, isCellNoCalcQty, reqBean, productionPartContextList.get(0), calcCompleteQty); - - //flag=2【累加完成数】 - if (flag == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) return; + MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext = productionCustomContextStepService.dispatchWorkOrderCompleteQtyCellContext(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), isCellNoCalcQty, reqBean, productionPartContextList.get(0), calcCompleteQty); //验证工单完成数 checkWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, workOrderCompleteQtyContext, calcCompleteQty); @@ -171,4 +176,22 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { } } + //清除本次扫描/读取信息 有进料【只】需要清除进料,否则存在产出零件需要清除产出零件 【只需要清除被标记的数据】 + public 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; + } + }