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 8c664c8..cd11249 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 @@ -132,9 +132,15 @@ public interface IMesProductionCustomContextStepService { MesWorkOrderCompleteQtyContext dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, Boolean noCalcOrderQty, String workOrderNo, Double calcCompleteQty); @ApiOperation(value = "可扣减条码的缓存key") - String getContainerSnAtomicityKey(String organizeCode, MesContainerPackageDetailContext context); + String getContainerPackageDetailAtomicityKey(String organizeCode, MesContainerPackageDetailContext context); + + @ApiOperation(value = "获取缓存中的原料剩余数量,用于缓存扣减") + Double getContainerPackageDetailRemainQty(String organizeCode, String key); @ApiOperation(value = "将可扣减的条码通过原子性的方式写到缓存, 并获取最新的实际库存") - void dispatchContainerSnAtomicity(String organizeCode, List containerSnStationList); + List dispatchContainerPackageDetailAtomicity(String organizeCode, List containerPackageDetailContextList); + + @ApiOperation(value = "重置原料条码的缓存库存") + void dispatchContainerPackageDetailContext(String organizeCode, Map remainQtyMap2Cache); } 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 1477770..e0e0f6f 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 @@ -25,7 +25,7 @@ public interface IMesStationContainerSnExtService { List getContainerSnStationListByStation(String organizeCode, List stationList); @ApiOperation(value = "获取容器条码上料明细表信息【可扣减】【根据 主表seq,主表createDatetime,明细表createDatetime 正序】") - List getContainerSnStationContext(String organizeCode, List stationList); + List getContainerPackageDetailContext(String organizeCode, List stationList); @ApiOperation(value = "获取容器条码上料主表信息") List getContainerPackageList(String organizeCode, List containerSnStationList, Integer packageStatus); 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 2104db9..25bc607 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 @@ -85,7 +85,7 @@ public class MesStationContainerSnExtService implements IMesStationContainerSnEx //获取容器条码上料明细表信息【可扣减】【根据 主表seq,主表createDatetime,明细表createDatetime 正序】 @Override @Transactional(propagation = Propagation.NOT_SUPPORTED) - public List getContainerSnStationContext(String organizeCode, List stationList) { + public List getContainerPackageDetailContext(String organizeCode, List stationList) { //获取站点关联的容器条码, key = containerSn Map> containerSnStationMap = getContainerSnStationMap(organizeCode, stationList); if (CollectionUtils.isEmpty(containerSnStationMap)) return null; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionAssemblyStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionAssemblyStepService.java index 2556113..28a3b17 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionAssemblyStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationDeductionAssemblyStepService.java @@ -3,17 +3,22 @@ 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.IMesStationContainerSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesContainerPackageDetailContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; 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.platform.common.tool.MathOperation; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesStation; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; 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.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -43,9 +48,6 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService { private IMesProductionCustomContextStepService productionCustomContextStepService; @Autowired - private IMesStationContainerSnExtService stationContainerSnExtService; - - @Autowired private IFsmCommonService fsmCommonService; private final static Map lockMap = new ConcurrentHashMap<>(); @@ -99,6 +101,11 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService { List stationNameList = CollectionUtils.isEmpty(stationMap2Lock) ? null : new ArrayList<>(stationMap2Lock.keySet()); if (CollectionUtils.isEmpty(stationNameList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前未获取到缓存的扣料站点信息,请重置工序解决!"); + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //获取弹框输入的工单数量, 未弹框默认 数量=1 + Double orderQtyDialogContext = productionDispatchContextStepService.getOrderQtyDialogContext(reqBean); + List acquiredLocks = new ArrayList<>(); try { if (!tryLock(acquiredLocks, stationNameList)) { @@ -106,9 +113,16 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService { MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "站点扣减装配件扣减失败,即将重试!"); } + //用于重置原料条码的缓存库存 + Map remainQtyMap2Cache = new HashMap<>(); + //执行容器装配件的缓存扣减 + dispatchStationDeductionAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, orderQtyDialogContext, remainQtyMap2Cache); + if (!stepResult.isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), stepResult.getMsg()); + //重置原料条码的缓存库存 + productionCustomContextStepService.dispatchContainerPackageDetailContext(reqBean.getOrganizeCode(), remainQtyMap2Cache); } catch (InterruptedException e) { @@ -117,10 +131,96 @@ public class MesStationDeductionAssemblyStepService extends BaseStepService { unLockAll(acquiredLocks); } - return stepResult; + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "站点扣减装配件验证成功!"); + + } + + //执行容器装配件的缓存扣减 + private void dispatchStationDeductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, + List prodRuleContextList, Double orderQtyDialogContext, Map remainQtyMap2Cache) { + + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchContainer())) continue; + List productionAssemblyContextList = dispatchStationDeductionAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, orderQtyDialogContext, remainQtyMap2Cache); + if (!stepResult.isCompleted()) break; + prodRuleContext.assemblyDataJson(productionAssemblyContextList); + } } + //执行容器装配件的缓存扣减 + private List dispatchStationDeductionAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, + MesProdRuleContext prodRuleContext, Double orderQtyDialogContext, Map remainQtyMap2Cache) { + + List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + if (null == productionAssemblyContext || productionAssemblyContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_80.getValue()) != 0) continue; + + //未匹配的工序用量 + Double unMatchQty = MathOperation.mul(productionAssemblyContext.getQty(), orderQtyDialogContext); + //扣料原料条码信息 + List deductionContextList = null; + //用于给装配件清单赋值 + List barCodeList = null; + //解析前面预先匹配的能够进行扣减的原料条码 + List containerSnDataList = JSONObject.parseArray(productionAssemblyContext.getContainerSnData(), MesContainerPackageDetailContext.class); + + for (MesContainerPackageDetailContext containerPackageDetailContext : containerSnDataList) { + if (StringUtils.isEmpty(containerPackageDetailContext)) continue; + + //获取缓存中的原料剩余数量,用于缓存扣减 + Double remainQtyCache; + if (!remainQtyMap2Cache.containsKey(containerPackageDetailContext.getRemainKey())) { + remainQtyCache = productionCustomContextStepService.getContainerPackageDetailRemainQty(reqBean.getOrganizeCode(), containerPackageDetailContext.getRemainKey()); + remainQtyMap2Cache.put(containerPackageDetailContext.getRemainKey(), new MesContainerPackageDetailContext(containerPackageDetailContext).remainQtyCached(remainQtyCache).remainQty(remainQtyCache)); + } else { + remainQtyCache = remainQtyMap2Cache.get(containerPackageDetailContext.getRemainKey()).getRemainQty(); + } + + //当前原料条码已经扣减完成 + if (MathOperation.compareTo(remainQtyCache, new Double(0)) <= 0) continue; + + //剩余未匹配的工序用量 + Double remainQty = MathOperation.sub(remainQtyCache, unMatchQty); + //全部匹配完成 + if (MathOperation.compareTo(remainQty, new Double(0)) >= 0) { + remainQtyMap2Cache.get(containerPackageDetailContext.getRemainKey()).remainQty(remainQty); + unMatchQty = new Double(0); + } else { + //未匹配完成, 0-负数=正数 + remainQtyMap2Cache.get(containerPackageDetailContext.getRemainKey()).remainQty(new Double(0)); + unMatchQty = MathOperation.sub(new Double(0), remainQty); + } + + if (CollectionUtils.isEmpty(deductionContextList)) { + deductionContextList = new ArrayList<>(); + barCodeList = new ArrayList<>(); + } + deductionContextList.add(new MesContainerPackageDetailContext(containerPackageDetailContext).deductionQty(MathOperation.sub(remainQtyCache, remainQtyMap2Cache.get(containerPackageDetailContext.getRemainKey()).getRemainQty()))); + barCodeList.add(containerPackageDetailContext.getBarCode()); + + //如果存在未匹配的工序用量 + if (MathOperation.compareTo(unMatchQty, new Double(0)) <= 0) break; + + } + + if (MathOperation.compareTo(unMatchQty, new Double(0)) > 0) { + if (!StringUtils.isEmpty(productionAssemblyContext.getAssemblySn())) { + productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()); + productionAssemblyContext.setAssemblySn(null); + productionAssemblyContext.setMatchDatetime(null); + } + stepResult.isCompleted(false).msg(String.format("站点扣减装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getPartNo())); + break; + } else { + productionAssemblyContext.setAssemblySn(barCodeList.get(0)); + productionAssemblyContext.setContainerSnData(JSONObject.toJSONString(deductionContextList)); + } + + } + + return productionAssemblyContextList; + } private Boolean tryLock(List acquiredLocks, List stationNameList) throws InterruptedException { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java index c31932d..b9b3c40 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java @@ -29,7 +29,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; /** - * @Description : 容器扣减匹配装配件站点工步 + * @Description : 站点匹配装配件工步 * @Author : wangjie **/ @Slf4j @@ -72,26 +72,26 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { Optional optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsMatchContainer()))).findFirst(); if (null == optional || !optional.isPresent()) { return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, - MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "验证每腔不存在容器匹配的装配件,默认跳过容器扣减匹配站点!"); + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "验证每腔不存在容器匹配的装配件,默认跳过站点匹配装配件!"); } //处理设备站点【装配件站点&&混料站点】 List stationList = productionProcessContextStepService.dispatchEquipmentStationContext(reqBean, productionProcessContext.getCurCellEquip().getEquipmentCode(), Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_20.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getValue()).collect(Collectors.toList())); - if (CollectionUtils.isEmpty(stationList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "容器条码扣减装配件时验证设备未关联支持扣减的站点"); + if (CollectionUtils.isEmpty(stationList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "站点匹配装配件时验证设备未关联支持扣减的站点"); //保存站点用于缺料时进行上料绑定 productionDispatchContextStepService.dispatchMatchStationContext(reqBean, stationList); //获取容器条码上料明细表信息【可扣减】【根据 主表seq,主表createDatetime,明细表createDatetime 正序】 - List containerSnStationList = stationContainerSnExtService.getContainerSnStationContext(reqBean.getOrganizeCode(), stationList); + List containerPackageDetailContextList = stationContainerSnExtService.getContainerPackageDetailContext(reqBean.getOrganizeCode(), stationList); - if (CollectionUtils.isEmpty(containerSnStationList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), - stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), "容器条码扣减装配件时验证当前无可扣减的原材料信息!"); + if (CollectionUtils.isEmpty(containerPackageDetailContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), + stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), "站点匹配装配件时验证当前无可扣减的原材料信息!"); //将可扣减的条码进行原子性缓存, 并获取最新的实际库存 - productionCustomContextStepService.dispatchContainerSnAtomicity(reqBean.getOrganizeCode(), containerSnStationList); + productionCustomContextStepService.dispatchContainerPackageDetailAtomicity(reqBean.getOrganizeCode(), containerPackageDetailContextList); //获取弹框输入的工单数量, 未弹框默认 数量=1 Double orderQtyDialogContext = productionDispatchContextStepService.getOrderQtyDialogContext(reqBean); @@ -102,7 +102,7 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { Map stationMap2Lock = new HashMap<>(); //匹配装配件的工序用量 - dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, containerSnStationList, orderQtyDialogContext, stationMap2Lock); + dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContextList, containerPackageDetailContextList, orderQtyDialogContext, stationMap2Lock); if (!stepResult.isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), stepResult.getMsg()); @@ -117,16 +117,16 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { ((MesAssemblyShowSortStepService) SpringContextsUtil.getBean("mesAssemblyShowSortStepService")).showProductionAssembly(reqBean, resultBean, workCenter, prodRuleContextList, true, true); - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "容器条码扣减装配件验证成功!"); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "站点匹配装配件验证成功!"); } //匹配装配件的工序用量【遍历加工规则】 private void dispatchStationMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, - List prodRuleContextList, List containerSnStationList, + List prodRuleContextList, List containerPackageDetailContextList, Double orderQtyDialogContext, Map stationMap2Lock) { for (MesProdRuleContext prodRuleContext : prodRuleContextList) { if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchContainer())) continue; - List productionAssemblyContextList = dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, containerSnStationList, orderQtyDialogContext, stationMap2Lock); + List productionAssemblyContextList = dispatchStationMatchAssembly(reqBean, resultBean, stepResult, workCenter, prodRuleContext, containerPackageDetailContextList, orderQtyDialogContext, stationMap2Lock); if (!stepResult.isCompleted()) break; prodRuleContext.assemblyDataJson(productionAssemblyContextList); } @@ -134,7 +134,7 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { //匹配装配件的工序用量【遍历装配件】 private List dispatchStationMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, - MesProdRuleContext prodRuleContext, List containerSnStationList, + MesProdRuleContext prodRuleContext, List containerPackageDetailContextList, Double orderQtyDialogContext, Map stationMap2Lock) { List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { @@ -145,11 +145,13 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { //未匹配的工序用量 Double unMatchQty = MathOperation.mul(productionAssemblyContext.getQty(), orderQtyDialogContext); - List containerSnDataList = null; - List containerSnList = null; - for (MesContainerPackageDetailContext containerPackageDetailContext : containerSnStationList) { + //支持被扣减的原料条码 + List containerSnDataList = null; + //用于给装配件清单赋值 + List barCodeList = null; + for (MesContainerPackageDetailContext containerPackageDetailContext : containerPackageDetailContextList) { if (null == containerPackageDetailContext || StringUtils.isEmpty(containerPackageDetailContext.getPartNo())) continue; - if (!containerPackageDetailContext.getPartNo().equals(productionAssemblyContext.getPartNo()) || MathOperation.compareTo(containerPackageDetailContext.getRemainQty(), new Double(0)) <= 0) continue; + if (!containerPackageDetailContext.getPartNo().equals(productionAssemblyContext.getAssemblyPartNo()) || MathOperation.compareTo(containerPackageDetailContext.getRemainQty(), new Double(0)) <= 0) continue; //验证时效性 Map result = timeEfficientCfgMatchService.checkSnTimelinessContainerMatch(reqBean.getOrganizeCode(), containerPackageDetailContext, @@ -173,10 +175,10 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { //将能够扣减的所有条码跟当前装配件关联 if (CollectionUtils.isEmpty(containerSnDataList)) { containerSnDataList = new ArrayList<>(); - containerSnList = new ArrayList<>(); + barCodeList = new ArrayList<>(); } - containerSnDataList.add(productionCustomContextStepService.getContainerSnAtomicityKey(reqBean.getOrganizeCode(), containerPackageDetailContext)); - containerSnList.add(containerPackageDetailContext.getContainerSn()); + containerSnDataList.add(containerPackageDetailContext); + barCodeList.add(containerPackageDetailContext.getBarCode()); if (!stationMap2Lock.containsKey(containerPackageDetailContext.getStation())) stationMap2Lock.put(containerPackageDetailContext.getStation(), containerPackageDetailContext.getStationInfo()); } @@ -186,11 +188,11 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { productionAssemblyContext.setAssemblySn(null); productionAssemblyContext.setMatchDatetime(null); } - stepResult.isCompleted(false).msg(String.format("容器条码扣减装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getPartNo())); + stepResult.isCompleted(false).msg(String.format("站点匹配装配件时验证零件号[%s]当前缺料,请扫描上料条码!", productionAssemblyContext.getPartNo())); break; } else { productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue()); - productionAssemblyContext.setAssemblySn(containerSnList.get(0)); + productionAssemblyContext.setAssemblySn(barCodeList.get(0)); productionAssemblyContext.setMatchDatetime((new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SSS)).format(new Date())); productionAssemblyContext.setContainerSnData(JSONObject.toJSONString(containerSnDataList)); } 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 f8d52a7..7fabd41 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 @@ -396,26 +396,49 @@ public class MesProductionCustomContextStepService extends BaseStepService imple return workOrderCompleteQtyContext; } + //可扣减条码的缓存key @Override - public String getContainerSnAtomicityKey(String organizeCode, MesContainerPackageDetailContext context) { + public String getContainerPackageDetailAtomicityKey(String organizeCode, MesContainerPackageDetailContext context) { return new StringJoiner(MesPcnExtConstWords.COLON) .add(organizeCode) .add(MesPcnExtConstWords.CONTAINER_SN_REMAIN_CONTEXT) .add(context.getStation()) - .add(new StringJoiner(MesPcnExtConstWords.AND).add(context.getContainerSn()).add(context.getId().toString()).toString()) + .add(context.getContainerSn()) + .add(new StringJoiner(MesPcnExtConstWords.AND).add(context.getBarCode()).add(context.getId().toString()).toString()) .toString(); } - //将可扣减的条码通过原子性的方式写到缓存, 并获取最新的实际库存 + //获取缓存中的原料信息,用于缓存扣减 @Override - public void dispatchContainerSnAtomicity(String organizeCode, List containerSnStationList) { - if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(containerSnStationList)) return; -// containerSnStationList.stream().forEach(o -> { -// String key = getContainerSnAtomicityKey(organizeCode, o); -// Boolean success = dispatchFsmBusiDataAtomicity(organizeCode, key, o.getQty().toString(), MesPcnEnumUtil.EXPIRE_TIME.DEFAULT.getValue()); -// if (success) o.remainQty(o.getQty()); -// else o.remainQty(getFsmBusiData(organizeCode, key)); -// }); + public Double getContainerPackageDetailRemainQty(String organizeCode, String key) { + String remainQty = getFsmBusiData(organizeCode, key); + return StringUtils.isEmpty(remainQty) ? new Double(0) : new Double(remainQty); } + //将可扣减的条码通过原子性的方式写到缓存, 并获取最新的实际库存 + @Override + public List dispatchContainerPackageDetailAtomicity(String organizeCode, List containerPackageDetailContextList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(containerPackageDetailContextList)) return containerPackageDetailContextList; + containerPackageDetailContextList.stream().forEach(o -> { + String remainKey = getContainerPackageDetailAtomicityKey(organizeCode, o); + Boolean success = dispatchFsmBusiDataAtomicity(organizeCode, remainKey, o.getQty().toString(), MesPcnEnumUtil.EXPIRE_TIME.DEFAULT.getValue()); + o.remainKey(remainKey); + if (success) { + o.remainQty(o.getQty()); + } else { + o.remainQty(getFsmBusiData(organizeCode, remainKey)); + } + }); + return containerPackageDetailContextList; + } + + @Override + public void dispatchContainerPackageDetailContext(String organizeCode, Map remainQtyMap2Cache) { + for (Map.Entry entry : remainQtyMap2Cache.entrySet()) { + if (null == entry) continue; + MesContainerPackageDetailContext containerPackageDetailContext = entry.getValue(); + if (MathOperation.compareTo(containerPackageDetailContext.getRemainQtyCached(), containerPackageDetailContext.getRemainQty()) == 0) continue; + dispatchFsmBusiData(organizeCode, containerPackageDetailContext.getRemainKey(), containerPackageDetailContext.getRemainQty().toString(), MesPcnEnumUtil.EXPIRE_TIME.DEFAULT.getValue()); + } + } } 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 2eb1b2d..d6fe261 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 @@ -593,7 +593,7 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp @Override public Double getOrderQtyDialogContext(StationRequestBean reqBean) { String orderQty = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ORDER_QTY_DIALOG_CONTEXT); - return StringUtils.isEmpty(orderQty) ? new Double(0) : new Double(orderQty); + return StringUtils.isEmpty(orderQty) ? new Double(1) : new Double(orderQty); } //获取弹框输入的工单数量 diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesContainerPackageDetailContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesContainerPackageDetailContext.java index fde5e8f..32eb38f 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesContainerPackageDetailContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesContainerPackageDetailContext.java @@ -28,10 +28,16 @@ public class MesContainerPackageDetailContext extends MesContainerPackageDetail @ApiParam(value = "主表创建日期") private String createDatetime2Package; - @ApiParam("库存") + @ApiParam("库存数量") private Double remainQty; - @ApiParam("库存") + @ApiParam("库存KEY") + private String remainKey; + + @ApiParam("缓存的库存数量") + private Double remainQtyCached; + + @ApiParam("扣减数量") private Double deductionQty; @ApiParam(name = "设备代码") @@ -49,6 +55,10 @@ public class MesContainerPackageDetailContext extends MesContainerPackageDetail BeanUtils.copyProperties(containerPackageDetail, this); } + public MesContainerPackageDetailContext(MesContainerPackageDetailContext containerPackageDetailContext) { + BeanUtils.copyProperties(containerPackageDetailContext, this); + } + public MesContainerPackageDetailContext containerSnStation(MesContainerSnStation containerSnStation) { this.station = containerSnStation.getStation(); this.seq = !StringUtils.isEmpty(containerSnStation.getSeq()) ? containerSnStation.getSeq() : MesPcnExtConstWords.ZERO; @@ -72,6 +82,21 @@ public class MesContainerPackageDetailContext extends MesContainerPackageDetail return this; } + public MesContainerPackageDetailContext remainQtyCached(Double remainQtyCached) { + this.remainQtyCached = remainQtyCached; + return this; + } + + public MesContainerPackageDetailContext deductionQty(Double deductionQty) { + this.deductionQty = deductionQty; + return this; + } + + public MesContainerPackageDetailContext remainKey(String remainKey) { + this.remainKey = remainKey; + return this; + } + public MesStation getStationInfo() { MesStation station = new MesStation(); station.setEquipmentCode(this.equipmentCode);