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 e39863f..393547e 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,14 +1,17 @@ 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.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.context.MesWorkOrderCompleteQtyContext; 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.platform.common.tool.MathOperation; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -37,7 +40,8 @@ public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepSer @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; - + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; @Autowired private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService; @@ -64,20 +68,27 @@ public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepSer //获取上下文进料零件条码信息集合 List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - synchronized (new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).toString().intern()) { + synchronized (new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT).toString().intern()) { - //验证加工单完成数量flag=1【验证】 - workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); + //验证加工单完成数量 + List workOrderCompleteQtyContextList = workOrderCheckCompleteQtyStepService + .dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); //匹配失败需要清除本次扫描/读取信息 if (!stepResult.isCompleted() && workOrderCheckCompleteQtyStepService.doBusiCheckToDelete(reqBean, stepResult, productionPartContextList, productionPsInContextList)) return stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PART_NO); + reqBean.getDataMap().put(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); //非排序线 保存加工结果工步 execute 方法 使用的是 新事务 ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean); - //验证加工单完成数量flag=2【累加完成数】 - workOrderCheckCompleteQtyStepService.dispatchWorkOrderCompleteQtyContext(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList); + for (MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext : workOrderCompleteQtyContextList) { + if (null == workOrderCompleteQtyContext) continue; + if (MathOperation.compareTo(workOrderCompleteQtyContext.getCalcCompleteQty(), new Double(MesPcnExtConstWords.ZERO)) == 0) continue; + //保存加工单完成数量 + //【isCellNoCalcQty=true代表工位维度的统计,最终不一定会实际累加到工单上】【isCellNoCalcQty=false代表生产线维度的统计】 + productionCustomContextStepService.dispatchWorkOrderCompleteQtyCellContext(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), workOrderCompleteQtyContext.getIsCellNoCalcQty(), reqBean, productionPartContextList.get(0), workOrderCompleteQtyContext.getCalcCompleteQty()); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java index bf53035..aa59548 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveStepService.java @@ -1,8 +1,10 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; 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.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.mes.pcn.util.StringUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -53,7 +55,7 @@ public class MesProductionDataSaveStepService extends BaseStepService { LinkedList stepList = !isSort ? noSortStepList : sortStepList; for (String stepService : stepList) { - if (StringUtils.isEmpty(stepResult)) continue; + if (StringUtils.isEmpty(stepService)) continue; StepResult innerStepResult = ((IStepService) SpringContextsUtil.getBean(stepService)).executeInState(reqBean); if (!StringUtils.isEmpty(innerStepResult.getNextTriggerEvent())) stepResult.nextTriggerEvent(innerStepResult.getNextTriggerEvent()); if (!StringUtils.isEmpty(innerStepResult.getStepAfterState())) stepResult.stepAfterState(innerStepResult.getStepAfterState()); @@ -63,5 +65,4 @@ public class MesProductionDataSaveStepService extends BaseStepService { return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存加工结果成功!"); } - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java index 3902246..a86f452 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java @@ -85,6 +85,12 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService { //保存生产工单数据 doHandleWorkOrderData(reqBean, resultBean, productionPartContextList, productionPsOutContextList); + //【非排序线】WORK_ORDER_COMPLETE_CONTEXT由验证加工单数量后保存加工结果工步[MesProductionDataSaveBeforeLockOrderStepService]标记 + // true的情况下赋值 stepAfterState, 当前工步集执行结束后会执行当前工步重写的executeStepAfterState方法 + Boolean isNeedDispatchWorkOrderCompleteContext = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT); + if (!isNeedDispatchWorkOrderCompleteContext) reqBean.getDataMap().remove(MesPcnExtConstWords.WORK_ORDER_COMPLETE_CONTEXT); + else stepResult.stepAfterState(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName())); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存加工单信息成功!"); } @@ -189,5 +195,11 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService { } } + //当前工步集完成之后执行当前方法 + @Override + public void executeStepAfterState(StationRequestBean reqBean, StepResult stepResult) { + if (!stepResult.isCompleted()) return; + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java index 995a837..2dd5a00 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java @@ -334,6 +334,8 @@ public class MesProductionCustomContextStepService extends BaseStepService imple } //处理工位维度的工单完成数上下文, 有效期三天 + //flag查询=1;保存=2 + //【isCellNoCalcQty=true代表工位维度的统计,最终不一定会实际累加到工单上】【isCellNoCalcQty=false代表生产线维度的统计】 @Override public MesWorkOrderCompleteQtyContext dispatchWorkOrderCompleteQtyCellContext(Integer flag, Boolean isCellNoCalcQty, StationRequestBean reqBean, MesProductionPartContext productionPartContext, Double calcCompleteQty) { String key = getWorkOrderCompleteQtyContextCellKey(reqBean, isCellNoCalcQty, productionPartContext.getWorkOrderNo()); 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 ee7f73c..d00a4f7 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 @@ -20,6 +20,7 @@ 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.Map; import java.util.stream.Collectors; @@ -41,24 +42,23 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { @Autowired private IMesProductionCustomContextStepService productionCustomContextStepService; - //flag=1【验证】 //验证加工单完成数量, 验证的前提条件: 每腔均已匹配到加工规则;存在工单; - public void dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, StationResultBean resultBean, + public List dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList, List productionPsInContextList) { //是否存在产成零件信息 - if (!stepResult.isCompleted() || CollectionUtils.isEmpty(productionPartContextList)) return; + if (!stepResult.isCompleted() || CollectionUtils.isEmpty(productionPartContextList)) return null; //根据产出零件或者腔数拿到需要的加工规则数量, 优先使用产出零件数量 Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : productionProcessContext.getCurCellEquip().getCavity(); //验证是否满足腔数 - if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() < needQty) return; + if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() < needQty) return null; //对MesProductionPartContext中的工单号经行分组,每个工单可能对应多条数据, 筛选掉foreignkey为空的数据 Map> productionPartContextMap = productionPartContextList.stream().filter(o -> (!StringUtils.isEmpty(o.getWorkOrderNo()) && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.groupingBy(MesProductionPartContext::getWorkOrderNo)); - if (CollectionUtils.isEmpty(productionPartContextMap)) return; + if (CollectionUtils.isEmpty(productionPartContextMap)) return null; //根据foreignkey分组进料零件条码 Map productionPsInContextMap = CollectionUtils.isEmpty(productionPsInContextList) ? null : @@ -71,20 +71,32 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { Boolean isCellNoCalcQty = isCellNoCalcQty(workCell.getNoCalcOrderQty()); //遍历验证加工单完成数量 + List workOrderCompleteQtyContextList = null; for (Map.Entry> entry : productionPartContextMap.entrySet()) { if (null == entry) continue; + //验证加工单完成数量 - dispatchWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, isCellNoCalcQty, entry.getValue(), productionPsInContextMap); + MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext = dispatchWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, isCellNoCalcQty, entry.getValue(), productionPsInContextMap); + //验证失败直接退出 if (!stepResult.isCompleted()) break; + + if (null != workOrderCompleteQtyContext) { + if (CollectionUtils.isEmpty(workOrderCompleteQtyContextList)) workOrderCompleteQtyContextList = new ArrayList<>(); + workOrderCompleteQtyContextList.add(workOrderCompleteQtyContext); + } + } //验证失败标记删除标志 if (!stepResult.isCompleted()) { productionPartContextList.forEach(o -> o.busiCheckToDelete()); if (!CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList.forEach(o -> o.busiCheckToDelete()); + if (!CollectionUtils.isEmpty(workOrderCompleteQtyContextList)) workOrderCompleteQtyContextList.clear(); } + return workOrderCompleteQtyContextList; + } //验证加工单完成数量 @@ -101,14 +113,23 @@ public class MesWorkOrderCheckCompleteQtyStepService extends BaseStepService { if (isCalcCompleteQty) calcCompleteQty = MathOperation.add(calcCompleteQty, new Double(MesPcnExtConstWords.ONE)); } //当前工单无须计算工单完成数 - if (MathOperation.compareTo(calcCompleteQty, new Double(MesPcnExtConstWords.ZERO)) == 0) return; + if (MathOperation.compareTo(calcCompleteQty, new Double(MesPcnExtConstWords.ZERO)) == 0) return null; - //处理工位维度的工单完成数上下文 + //处理工位维度的工单完成数上下文; + //flag查询=1;保存=2 + //【isCellNoCalcQty=true代表工位维度的统计,最终不一定会实际累加到工单上】【isCellNoCalcQty=false代表生产线维度的统计】 MesWorkOrderCompleteQtyContext workOrderCompleteQtyContext = productionCustomContextStepService.dispatchWorkOrderCompleteQtyCellContext(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), isCellNoCalcQty, reqBean, productionPartContextList.get(0), calcCompleteQty); //验证工单完成数 checkWorkOrderCompleteQty(reqBean, resultBean, stepResult, workCenter, workOrderCompleteQtyContext, calcCompleteQty); + if (!stepResult.isCompleted()) return null; + + //标记累加数量 + workOrderCompleteQtyContext.calcCompleteQty(calcCompleteQty, isCellNoCalcQty); + + return workOrderCompleteQtyContext; + } //工位是否不累计工单完成数 diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesWorkOrderCompleteQtyContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesWorkOrderCompleteQtyContext.java index 40047dd..8ba09e2 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesWorkOrderCompleteQtyContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesWorkOrderCompleteQtyContext.java @@ -24,6 +24,12 @@ public class MesWorkOrderCompleteQtyContext implements Serializable { @ApiParam("完成数量") private Double completeQty; + @ApiParam("累加数量") + private Double calcCompleteQty = new Double(MesPcnExtConstWords.ZERO); + + @ApiParam(name = "是否不累计工单完成数") + private Boolean isCellNoCalcQty; + public MesWorkOrderCompleteQtyContext(String workOrderNo, Double qty, Double completeQty) { this.workOrderNo = workOrderNo; this.qty = qty; @@ -34,4 +40,10 @@ public class MesWorkOrderCompleteQtyContext implements Serializable { this.completeQty = completeQty; return this; } + + public MesWorkOrderCompleteQtyContext calcCompleteQty(Double calcCompleteQty, Boolean isCellNoCalcQty) { + this.calcCompleteQty = calcCompleteQty; + this.isCellNoCalcQty = isCellNoCalcQty; + return this; + } }