From 360d200a4851993a11f377eaafe6b7e76d5ffbdb Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Wed, 16 Jul 2025 13:25:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B8=B8=E7=86=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IMesProductionCustomContextStepService.java | 9 +- .../IMesProductionDispatchContextStepService.java | 6 ++ .../api/busi/IMesStationContainerSnExtService.java | 2 +- .../busi/MesStationContainerSnExtService.java | 11 ++- .../step/MesAssemblySaveStepService.java | 2 +- ...ctionDataSaveBeforeControlOrderStepService.java | 17 ++-- ...oductionDataSaveBeforeLockOrderStepService.java | 14 +++- .../step/MesProductionDataSaveStepService.java | 3 +- .../MesStationDeductionProductSnStepService.java | 95 ++++++++++++++++++++++ .../step/MesStationMatchProductSnStepService.java | 17 ++-- .../step/MesWorkOrderQueueSavePushStepService.java | 2 +- .../step/MesWorkOrderSaveNosortStepService.java | 2 +- .../MesProductionCustomContextStepService.java | 16 ++-- .../MesProductionDispatchContextStepService.java | 14 ++++ ...ionMatchPsProcessMethodStrategyStepService.java | 5 +- ...onMatchPsProcessMethodContainerStepService.java | 12 ++- ...ationMatchPsProcessMethodSingleStepService.java | 11 ++- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 2 + 18 files changed, 200 insertions(+), 40 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionProductSnStepService.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java index 609e781..144bbf8 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java @@ -144,12 +144,15 @@ public interface IMesProductionCustomContextStepService { void dispatchContainerPackageDetailContext(String organizeCode, Map remainQtyMap2Cache); @ApiOperation(value = "验证主条码或容器条码是否被占用的key") - String getContainerPackageDetailPsKey(String organizeCode, String suffix, String psOrContainerSnAppendId); + String getContainerPackageDetailPsLockedKey(String organizeCode, String suffix, String psOrContainerSnAppendId); @ApiOperation(value = "验证主条码或容器条码是否被占用") - Boolean checkContainerPackageDetailPsIsUsed(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId); + Boolean checkContainerPackageDetailPsLockedIsUsed(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId); @ApiOperation(value = "锁定主条码或容器条码") - void dispatchContainerPackageDetailPs(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId); + void dispatchContainerPackageDetailPsLocked(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId); + + @ApiOperation(value = "解锁主条码或容器条码") + void removeContainerPackageDetailPsLocked(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId); } 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 9443c74..6913094 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 @@ -286,4 +286,10 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "保存站点用于缺料时进行上料绑定的容器条码") void dispatchMatchStationFeedContainerSnContext(StationRequestBean reqBean, String sn); + @ApiOperation(value = "获取已被验证了的容器主条码信息") + List getContainerPackageDetailPs(StationRequestBean reqBean); + + @ApiOperation(value = "保存已被验证了的容器主条码信息") + void dispatchContainerPackageDetailPs(StationRequestBean reqBean, List containerPackageDetailContextList); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesStationContainerSnExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesStationContainerSnExtService.java index 792b80e..6ac344d 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesStationContainerSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesStationContainerSnExtService.java @@ -91,7 +91,7 @@ public interface IMesStationContainerSnExtService { void insertContainerPackageDetailFeeding(StationRequestBean reqBean, MesContainerPackageDetailContext containerPackageDetailContext, MesProductionPsOutContext productionPsOutContext); @ApiOperation(value = "修改上料明细表信息状态") - void updateContainerPackageDetail(String organizeCode, String userInfo, Long id, Integer snStatus); + void updateContainerPackageDetail(String organizeCode, String userInfo, Integer snStatus, Long... ids); @ApiOperation(value = "写入容器条码与站点的关系信息") void insertContainerSnStationList(String organizeCode, String userInfo, String station, List containerPackageList, String topContainerSn); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesStationContainerSnExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesStationContainerSnExtService.java index c5c68a0..134c567 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesStationContainerSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesStationContainerSnExtService.java @@ -248,12 +248,15 @@ public class MesStationContainerSnExtService implements IMesStationContainerSnEx } @Override - public void updateContainerPackageDetail(String organizeCode, String userInfo, Long id, Integer snStatus) { + public void updateContainerPackageDetail(String organizeCode, String userInfo, Integer snStatus, Long... ids) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(userInfo) || StringUtils.isEmpty(snStatus) || null == ids) return; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (ids.length == 1) DdlPreparedPack.getNumEqualPack(ids[0], MesPcnExtConstWords.ID, packBean); + else DdlPreparedPack.getInPackArray(ids, MesPcnExtConstWords.ID, packBean); containerPackageDetailRepository.updateByProperties( - new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID}, - new Object[]{organizeCode, id}, new String[]{MesPcnExtConstWords.SN_STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, - new Object[]{snStatus, userInfo, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + new Object[]{snStatus, userInfo, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}, + packBean); } @Override diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java index 07f1061..5fa7aae 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java @@ -210,7 +210,7 @@ public class MesAssemblySaveStepService extends BaseStepService { stationContainerSnExtService.insertContainerPackageDetailFeeding(reqBean, containerPackageDetailContext, productionPsOutContext); //修改上料明细表信息状态【扣减完成】 if (MathOperation.compareTo(containerPackageDetailContext.getRemainQty(), new Double(0)) == 0) { - stationContainerSnExtService.updateContainerPackageDetail(reqBean.getOrganizeCode(), reqBean.getUserInfo(), containerPackageDetailContext.getId(), MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_20.getValue()); + stationContainerSnExtService.updateContainerPackageDetail(reqBean.getOrganizeCode(), reqBean.getUserInfo(), MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_20.getValue(), containerPackageDetailContext.getId()); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeControlOrderStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeControlOrderStepService.java index 3a58009..189de8f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeControlOrderStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionDataSaveBeforeControlOrderStepService.java @@ -132,10 +132,15 @@ public class MesProductionDataSaveBeforeControlOrderStepService extends BaseStep stepResult = ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean); //保存加工结果事务提交之后, 保存工单计数 - if (stepResult.isCompleted() && !StringUtils.isEmpty(stepResult.getStepAfterState())) { - IStepService stepService = ((IStepService) SpringContextsUtil.getBean(stepResult.getStepAfterState())); - stepResult.stepAfterState(null); - stepService.executeStepAfterExecute(reqBean, stepResult); + if (stepResult.isCompleted() && !CollectionUtils.isEmpty(stepResult.getStepAfterStateList())) { + List stepAfterStateList = stepResult.getStepAfterStateList(); + IStepService stepService; + for (String stepAfterState : stepAfterStateList) { + if (StringUtils.isEmpty(stepAfterState)) continue; + stepService = ((IStepService) SpringContextsUtil.getBean(stepAfterState)); + stepService.executeStepAfterExecute(reqBean, stepResult); + } + stepResult.clearStepAfterStateList(); } if (stepResult.isCompleted()) insertWorkOrderControlQtyRecord(reqBean, reportPsMap, shiftTimeMap.get(MesPcnExtConstWords.LOT_NO)); @@ -144,9 +149,9 @@ public class MesProductionDataSaveBeforeControlOrderStepService extends BaseStep } - //非排序线 保存加工结果工步 execute 方法 使用的是 新事务 + //非排序线 保存加工结果工步 executeInState 方法 使用的是 当前事务 if (CollectionUtils.isEmpty(unProductionPartNoList)) - return ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean); + return ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).executeInState(reqBean); stepNonCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, String.format("控制加工单数量验证零件号%s当前无法继续生产!", unProductionPartNoList.toString())); 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 527ee99..504ce67 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 @@ -17,6 +17,7 @@ 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; @@ -78,10 +79,15 @@ public class MesProductionDataSaveBeforeLockOrderStepService extends BaseStepSer stepResult = ((IStepService) SpringContextsUtil.getBean("mesProductionDataSaveStepService")).execute(reqBean); //保存加工结果事务提交之后, 保存工单计数 - if (stepResult.isCompleted() && !StringUtils.isEmpty(stepResult.getStepAfterState())) { - IStepService stepService = ((IStepService) SpringContextsUtil.getBean(stepResult.getStepAfterState())); - stepResult.stepAfterState(null); - stepService.executeStepAfterExecute(reqBean, stepResult); + if (stepResult.isCompleted() && !CollectionUtils.isEmpty(stepResult.getStepAfterStateList())) { + List stepAfterStateList = stepResult.getStepAfterStateList(); + IStepService stepService; + for (String stepAfterState : stepAfterStateList) { + if (StringUtils.isEmpty(stepAfterState)) continue; + stepService = ((IStepService) SpringContextsUtil.getBean(stepAfterState)); + stepService.executeStepAfterExecute(reqBean, stepResult); + } + stepResult.clearStepAfterStateList(); } } 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 aa59548..ab47e0a 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 @@ -14,6 +14,7 @@ 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.LinkedList; @@ -58,7 +59,7 @@ public class MesProductionDataSaveStepService extends BaseStepService { 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()); + if (!CollectionUtils.isEmpty(innerStepResult.getStepAfterStateList())) stepResult.addStepAfterStateList(innerStepResult.getStepAfterStateList()); if (!innerStepResult.isCompleted()) return stepNonCompleteAndSendMsgReturn(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/MesStationDeductionProductSnStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionProductSnStepService.java new file mode 100644 index 0000000..778dbc1 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionProductSnStepService.java @@ -0,0 +1,95 @@ +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.api.busi.IMesStationContainerSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.stationpm.IMesStationMatchPsProcessMethodStrategyStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesContainerPackageDetailContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +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; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +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.List; +import java.util.stream.Collectors; + +/** + * @Description : 原料站点扣减工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesStationDeductionProductSnStepService") +public class MesStationDeductionProductSnStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesStationContainerSnExtService stationContainerSnExtService; + + @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()); + + //获取进料主条码数据信息 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + if (CollectionUtils.isEmpty(productionPsInContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在进料主条码信息,请重置工序解决!"); + + //验证是否需要进行原料站点扣减 + List containerSnDataList = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getContainerSnData()))).map(MesProductionPsInContext::getContainerSnData).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(containerSnDataList)) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "验证每腔不存在容器匹配的主条码,默认跳过原料站点扣减!"); + } + + //修改上料明细表信息状态 【扣减完成】 + Long[] ids = containerSnDataList.stream().filter(o -> !StringUtils.isEmpty(o)).map(Long::parseLong).toArray(Long[]::new); + stationContainerSnExtService.updateContainerPackageDetail(reqBean.getOrganizeCode(), reqBean.getUserInfo(), MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_20.getValue(), ids); + + // 赋值 stepAfterState, 当前工步集执行结束后会执行当前工步重写的executeStepAfterState方法 + stepResult.addStepAfterStateList(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName())); + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "原料站点扣减成功!"); + + } + + //当前工步集完成之后执行当前方法 + @Override + public void executeStepAfterState(StationRequestBean reqBean, StepResult stepResult) { + if (!stepResult.isCompleted()) return; + + //获取已被验证了的容器主条码信息 + List containerPackageDetailContextList = productionDispatchContextStepService.getContainerPackageDetailPs(reqBean); + if (CollectionUtils.isEmpty(containerPackageDetailContextList) || StringUtils.isEmpty(containerPackageDetailContextList.get(0).getProcessMethod())) return; + + //加工模式策略 + IMesStationMatchPsProcessMethodStrategyStepService strategyService = (IMesStationMatchPsProcessMethodStrategyStepService) SpringContextsUtil.getBean(MesExtEnumUtil.STATION_PROCESS_METHOD.valueOfStrategyClass(containerPackageDetailContextList.get(0).getProcessMethod())); + //【原料站点】解锁进料主条码信息 + strategyService.removeContainerPackageDetailPsLocked(reqBean, containerPackageDetailContextList); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnStepService.java index dd07626..c749b6e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnStepService.java @@ -102,7 +102,7 @@ public class MesStationMatchProductSnStepService extends BaseStepService { MesExtEnumUtil.STATION_TYPE.STATION_TYPE_30.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_50.getValue()).collect(Collectors.toList())); //剔除没有加工模式的站点数据 - List filterList = stationList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProcessMethod()))).collect(Collectors.toList()); + List filterList = stationList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProcessMethod()) && !StringUtils.isEmpty(MesExtEnumUtil.STATION_PROCESS_METHOD.valueOfDescription(o.getProcessMethod())))).collect(Collectors.toList()); //原料站点 List stationList10 = productionProcessContextStepService.dispatchEquipmentStationContext(filterList, Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_10.getValue()).collect(Collectors.toList())); //混料站点 @@ -129,7 +129,8 @@ public class MesStationMatchProductSnStepService extends BaseStepService { productionDispatchContextStepService.dispatchMatchStationProductSnContext(reqBean, stationList2Ps); //加工模式策略 - IMesStationMatchPsProcessMethodStrategyStepService strategyService = (IMesStationMatchPsProcessMethodStrategyStepService) SpringContextsUtil.getBean(MesExtEnumUtil.STATION_PROCESS_METHOD.valueOfStrategyClass(stationList.get(0).getProcessMethod())); + MesStation station = stationList2Ps.get(0); + IMesStationMatchPsProcessMethodStrategyStepService strategyService = (IMesStationMatchPsProcessMethodStrategyStepService) SpringContextsUtil.getBean(MesExtEnumUtil.STATION_PROCESS_METHOD.valueOfStrategyClass(station.getProcessMethod())); //【原料站点】获取容器条码上料明细表信息 MesContainerPackageDetailStationContext containerPackageDetailStationContext = strategyService.getContainerPackageDetailStationContext(reqBean.getOrganizeCode(), stationList2Ps); @@ -157,8 +158,12 @@ public class MesStationMatchProductSnStepService extends BaseStepService { //是否验证工艺路线配置 String isCheckCraft = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.IS_CHECK_CRAFT_CFG)) ? stepParamMap.get().get(MesPcnExtConstWords.IS_CHECK_CRAFT_CFG).getParamValue() : null; + //需要进行LOCK的站点 List stationNameList = containerPackageDetailStationContext.getStationList().stream().filter(o -> null != o).map(o -> o.getStation().toUpperCase()).collect(Collectors.toList()); + // 结尾需要缓存锁定的数据 + List needCachedList = null; + List acquiredLocks = new ArrayList<>(); try { if (!MesReentrantLockUtil.tryLock(acquiredLocks, stationNameList, MesPcnExtConstWords.MATCH_STATION_PRODUCT_SN_CONTEXT + MesPcnExtConstWords.COLON, 3000L)) { @@ -166,9 +171,6 @@ public class MesStationMatchProductSnStepService extends BaseStepService { MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "匹配原料站点时LOCK失败,即将重试!"); } - // 结尾需要缓存锁定的数据 - List needCachedList = null; - //循环到全部验证成功或根据场景验证失败结束 for (int i = 0; i >= 0; i ++) { @@ -219,7 +221,7 @@ public class MesStationMatchProductSnStepService extends BaseStepService { } //锁定当前已被验证了的主条码或容器条码 - strategyService.dispatchContainerPackageDetailPs(reqBean, needCachedList); + strategyService.dispatchContainerPackageDetailPsLocked(reqBean, needCachedList); } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -242,6 +244,9 @@ public class MesStationMatchProductSnStepService extends BaseStepService { //生产零件条码业务处理 productSnGenerateStepService.doHandleProductSnGenerate(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, productionPsInContextList, prodRuleContextList, prodShiftContext); + //缓存已被验证了的容器主条码信息 + productionDispatchContextStepService.dispatchContainerPackageDetailPs(reqBean, needCachedList); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "匹配原料站点验证成功!", MesPcnEnumUtil.PROMPT_SOUND.SUCCESS.getValue()); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSavePushStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSavePushStepService.java index 8ddc784..8a055d5 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSavePushStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSavePushStepService.java @@ -88,7 +88,7 @@ public class MesWorkOrderQueueSavePushStepService extends BaseStepService { //验证是否存在LOCK数据, 存在的情况下赋值 stepAfterState, 当前工步集执行结束后会执行当前工步重写的executeStepAfterState方法 Optional optional = CollectionUtils.isEmpty(queueOrderPushList) ? null : queueOrderPushList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsNeedLock()))).findFirst(); - if (null != optional && optional.isPresent()) stepResult.stepAfterState(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName())); + if (null != optional && optional.isPresent()) stepResult.addStepAfterStateList(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName())); 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 209a070..7ed6606 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 @@ -127,7 +127,7 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService { if (MathOperation.compareTo(calcCompleteQty, new Double(MesPcnExtConstWords.ZERO)) == 0) continue; // 赋值 stepAfterState, 当前工步集执行结束后会执行当前工步重写的executeStepAfterState方法 - if (StringUtils.isEmpty(stepResult.getStepAfterState())) stepResult.stepAfterState(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName())); + stepResult.addStepAfterStateList(StringUtil.toLowerCaseFirst(this.getClass().getSimpleName())); //TODO 排序考虑多工位扫描可疑码; 非排序考虑自进自出可疑或报废; 可疑数/报废数是否需要增加的问题[条码+零件+质量状态 增加履历] 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 100edbb..560d67d 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 @@ -446,7 +446,7 @@ public class MesProductionCustomContextStepService extends BaseStepService imple //可扣减条码的缓存key @Override - public String getContainerPackageDetailPsKey(String organizeCode, String suffix, String psOrContainerSnAppendId) { + public String getContainerPackageDetailPsLockedKey(String organizeCode, String suffix, String psOrContainerSnAppendId) { return new StringJoiner(MesPcnExtConstWords.COLON) .add(organizeCode) .add(MesPcnExtConstWords.MATCH_STATION_PRODUCT_SN_CONTEXT) @@ -457,16 +457,22 @@ public class MesProductionCustomContextStepService extends BaseStepService imple //验证主条码或容器条码是否被占用 @Override - public Boolean checkContainerPackageDetailPsIsUsed(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId) { - String location = getFsmBusiData(reqBean.getOrganizeCode(), getContainerPackageDetailPsKey(reqBean.getOrganizeCode(), suffix, psOrContainerSnAppendId)); + public Boolean checkContainerPackageDetailPsLockedIsUsed(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId) { + String location = getFsmBusiData(reqBean.getOrganizeCode(), getContainerPackageDetailPsLockedKey(reqBean.getOrganizeCode(), suffix, psOrContainerSnAppendId)); //此外无需考虑大小写转换 return (StringUtils.isEmpty(location) || StringEqualsUtil.stringEquals(location, reqBean.getClientInfo())) ? false : true; } //锁定主条码或容器条码 @Override - public void dispatchContainerPackageDetailPs(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId) { - dispatchFsmBusiData(reqBean.getOrganizeCode(), getContainerPackageDetailPsKey(reqBean.getOrganizeCode(), suffix, psOrContainerSnAppendId), reqBean.getClientInfo(), MesPcnEnumUtil.EXPIRE_TIME.ONE_QUARTER.getValue()); + public void dispatchContainerPackageDetailPsLocked(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId) { + dispatchFsmBusiData(reqBean.getOrganizeCode(), getContainerPackageDetailPsLockedKey(reqBean.getOrganizeCode(), suffix, psOrContainerSnAppendId), reqBean.getClientInfo(), MesPcnEnumUtil.EXPIRE_TIME.ONE_QUARTER.getValue()); + } + + //解锁主条码或容器条码 + @Override + public void removeContainerPackageDetailPsLocked(StationRequestBean reqBean, String suffix, String psOrContainerSnAppendId) { + removeFsmBusiData(reqBean.getOrganizeCode(), getContainerPackageDetailPsLockedKey(reqBean.getOrganizeCode(), suffix, psOrContainerSnAppendId)); } } 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 26a8385..4e09f31 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 @@ -653,4 +653,18 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_FEED_CONTAINER_SN_CONTEXT, sn); } + //获取已被验证了的容器主条码信息 + @Override + public List getContainerPackageDetailPs(StationRequestBean reqBean) { + String context = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_CONTAINER_PRODUCTSNIN_CONTEXT); + return !StringUtils.isEmpty(context) ? JSONObject.parseArray(context, MesContainerPackageDetailContext.class) : null; + } + + //保存已被验证了的容器主条码信息 + @Override + public void dispatchContainerPackageDetailPs(StationRequestBean reqBean, List containerPackageDetailContextList) { + if (CollectionUtils.isEmpty(containerPackageDetailContextList)) return; + dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_CONTAINER_PRODUCTSNIN_CONTEXT, JSONObject.toJSONString(containerPackageDetailContextList)); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/IMesStationMatchPsProcessMethodStrategyStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/IMesStationMatchPsProcessMethodStrategyStepService.java index 14b7ff5..4b758d3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/IMesStationMatchPsProcessMethodStrategyStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/IMesStationMatchPsProcessMethodStrategyStepService.java @@ -23,6 +23,9 @@ public interface IMesStationMatchPsProcessMethodStrategyStepService { default Boolean checkIsMatchCavity(Integer count1, Integer count2, Integer count3, Integer cavity, Boolean isBeforeCheck) { return true; } @ApiOperation(value = "【原料站点】锁定进料主条码信息") - default void dispatchContainerPackageDetailPs(StationRequestBean reqBean, List needCachedList) {} + default void dispatchContainerPackageDetailPsLocked(StationRequestBean reqBean, List containerPackageDetailContextList) {} + + @ApiOperation(value = "【原料站点】解锁进料主条码信息") + default void removeContainerPackageDetailPsLocked(StationRequestBean reqBean, List containerPackageDetailContextList) {} } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodContainerStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodContainerStepService.java index de1071e..d69ae54 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodContainerStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodContainerStepService.java @@ -55,7 +55,7 @@ public class MesStationMatchPsProcessMethodContainerStepService extends BaseStep for (Map.Entry> entry : containerSnDataMap.entrySet()) { if (null == entry || !StringUtils.isEmpty(entry.getValue().get(0).getIsUsed())) continue; //验证是否被使用 - if (productionCustomContextStepService.checkContainerPackageDetailPsIsUsed(reqBean, MesPcnExtConstWords.CONTAINER_SN, entry.getKey())) { + if (productionCustomContextStepService.checkContainerPackageDetailPsLockedIsUsed(reqBean, MesPcnExtConstWords.CONTAINER_SN, entry.getKey())) { //标记被使用 entry.getValue().get(0).isUsed(); continue; @@ -85,8 +85,14 @@ public class MesStationMatchPsProcessMethodContainerStepService extends BaseStep //【原料站点】锁定进料主条码信息 @Override - public void dispatchContainerPackageDetailPs(StationRequestBean reqBean, List needCachedList) { - productionCustomContextStepService.dispatchContainerPackageDetailPs(reqBean, MesPcnExtConstWords.CONTAINER_SN, needCachedList.get(0).getTopContainerSnKey()); + public void dispatchContainerPackageDetailPsLocked(StationRequestBean reqBean, List containerPackageDetailContextList) { + productionCustomContextStepService.dispatchContainerPackageDetailPsLocked(reqBean, MesPcnExtConstWords.CONTAINER_SN, containerPackageDetailContextList.get(0).getTopContainerSnKey()); + } + + //【原料站点】解锁进料主条码信息 + @Override + public void removeContainerPackageDetailPsLocked(StationRequestBean reqBean, List containerPackageDetailContextList) { + productionCustomContextStepService.removeContainerPackageDetailPsLocked(reqBean, MesPcnExtConstWords.CONTAINER_SN, containerPackageDetailContextList.get(0).getTopContainerSnKey()); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodSingleStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodSingleStepService.java index 401a659..2b7ddb3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodSingleStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/stationpm/MesStationMatchPsProcessMethodSingleStepService.java @@ -77,7 +77,7 @@ public class MesStationMatchPsProcessMethodSingleStepService extends BaseStepSer //已经被匹配失败, 跳到下个站点进行验证第一个未匹配的进料主条码 if (!StringUtils.isEmpty(containerPackageDetailContext.getMatchResult()) && StringEqualsUtil.stringEquals(containerPackageDetailContext.getMatchResult(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValueStr())) break LOOP; //验证是否被使用 - if (productionCustomContextStepService.checkContainerPackageDetailPsIsUsed(reqBean, MesPcnExtConstWords.PRODUCT_SN, containerPackageDetailContext.getBarCodeKey())) { + if (productionCustomContextStepService.checkContainerPackageDetailPsLockedIsUsed(reqBean, MesPcnExtConstWords.PRODUCT_SN, containerPackageDetailContext.getBarCodeKey())) { //标记被使用 containerPackageDetailContext.isUsed(); continue; @@ -122,9 +122,14 @@ public class MesStationMatchPsProcessMethodSingleStepService extends BaseStepSer //【原料站点】锁定进料主条码信息 @Override - public void dispatchContainerPackageDetailPs(StationRequestBean reqBean, List needCachedList) { - needCachedList.forEach(o -> productionCustomContextStepService.dispatchContainerPackageDetailPs(reqBean, MesPcnExtConstWords.PRODUCT_SN, o.getBarCodeKey())); + public void dispatchContainerPackageDetailPsLocked(StationRequestBean reqBean, List containerPackageDetailContextList) { + containerPackageDetailContextList.forEach(o -> productionCustomContextStepService.dispatchContainerPackageDetailPsLocked(reqBean, MesPcnExtConstWords.PRODUCT_SN, o.getBarCodeKey())); } + //【原料站点】解锁进料主条码信息 + @Override + public void removeContainerPackageDetailPsLocked(StationRequestBean reqBean, List containerPackageDetailContextList) { + containerPackageDetailContextList.forEach(o -> productionCustomContextStepService.removeContainerPackageDetailPsLocked(reqBean, MesPcnExtConstWords.PRODUCT_SN, o.getBarCodeKey())); + } } 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 4b90d8a..0ddcc28 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 @@ -750,6 +750,8 @@ public class MesPcnExtConstWords { public static final String MATCH_STATION_ASSEMBLY_CONTEXT = "MATCH_STATION_ASSEMBLY_CONTEXT"; // 用于缺料时进行上料绑定的进料站点 public static final String MATCH_STATION_PRODUCT_SN_CONTEXT = "MATCH_STATION_PRODUCT_SN_CONTEXT"; + // 匹配成功的进料主条码信息 + public static final String MATCH_CONTAINER_PRODUCTSNIN_CONTEXT = "MATCH_CONTAINER_PRODUCTSNIN_CONTEXT"; // 用于扣料业务中进行LOCK public static final String LOCK_STATION_CONTEXT = "LOCK_STATION_CONTEXT";