From a6a28ab4fb19ec69cf31ba43dce0e17234c9f995 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Mon, 23 Jun 2025 15:04:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=B9=E5=99=A8=E6=89=A3=E5=87=8F=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E8=A3=85=E9=85=8D=E4=BB=B6=E7=AB=99=E7=82=B9=E5=B7=A5?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IMesProductionCustomContextStepService.java | 4 + .../IMesProductionDispatchContextStepService.java | 13 ++ .../api/busi/IMesStationContainerSnExtService.java | 14 ++ .../busi/MesStationContainerSnExtService.java | 160 +++++++++++++++++++++ ...ava => MesStationMatchAssemblyStepService.java} | 2 +- .../MesProductionCustomContextStepService.java | 22 +++ .../MesProductionDispatchContextStepService.java | 28 ++++ .../MesProductionProcessContextStepService.java | 22 +++ .../context/MesContainerPackageDetailContext.java | 55 +++++++ .../pojo/context/MesProductionAssemblyContext.java | 6 + .../MesProductionAssemblyNosortContext.java | 3 - .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 14 ++ 12 files changed, 339 insertions(+), 4 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesStationContainerSnExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesStationContainerSnExtService.java rename modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/{MesContainerSnScanStepService.java => MesStationMatchAssemblyStepService.java} (96%) create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesContainerPackageDetailContext.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 14f4151..8c664c8 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 @@ -131,6 +131,10 @@ public interface IMesProductionCustomContextStepService { @ApiOperation(value = "根据noCalcOrderQty判断维度处理处理工单完成数上下文[保存]") MesWorkOrderCompleteQtyContext dispatchWorkOrderCompleteQtyContext(StationRequestBean reqBean, Boolean noCalcOrderQty, String workOrderNo, Double calcCompleteQty); + @ApiOperation(value = "可扣减条码的缓存key") + String getContainerSnAtomicityKey(String organizeCode, MesContainerPackageDetailContext context); + @ApiOperation(value = "将可扣减的条码通过原子性的方式写到缓存, 并获取最新的实际库存") + void dispatchContainerSnAtomicity(String organizeCode, List containerSnStationList); } 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 619940c..8aa282f 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 @@ -5,6 +5,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; import cn.estsh.i3plus.pojo.mes.bean.MesPart; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; +import cn.estsh.i3plus.pojo.mes.bean.MesStation; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -258,4 +259,16 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "保存上下文推单队列信息") Boolean dispatchSortQueuePushContext(StationRequestBean reqBean, List queueOrderPushList); + @ApiOperation(value = "获取弹框输入的工单数量") + Double getOrderQtyDialogContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存弹框输入的工单数量") + void dispatchOrderQtyDialogContext(StationRequestBean reqBean, String orderQty); + + @ApiOperation(value = "获取站点用于缺料时进行上料绑定") + List getMatchStationContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存站点用于缺料时进行上料绑定") + void dispatchMatchStationContext(StationRequestBean reqBean, List stationList); + } 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 new file mode 100644 index 0000000..91e0cba --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesStationContainerSnExtService.java @@ -0,0 +1,14 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.pojo.mes.bean.MesConfig; +import cn.estsh.i3plus.pojo.mes.bean.MesStation; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface IMesStationContainSnExtService { + + @ApiOperation(value = "根据设备代码查询站点信息") + List getStationList(String organizeCode, String equipmentCode); + +} 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 new file mode 100644 index 0000000..356fb9c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesStationContainerSnExtService.java @@ -0,0 +1,160 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +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.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesContainerSnStation; +import cn.estsh.i3plus.pojo.mes.bean.MesStation; +import cn.estsh.i3plus.pojo.mes.repository.MesContainerPackageDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesContainerPackageRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesContainerSnStationRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesStationRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 容器条码上料业务 + */ +@Service +public class MesStationContainerSnExtService implements IMesStationContainerSnExtService { + + @Autowired + private MesStationRepository stationRepository; + + @Autowired + private MesContainerSnStationRepository containerSnStationRepository; + + @Autowired + private MesContainerPackageRepository containerPackageRepository; + + @Autowired + private MesContainerPackageDetailRepository containerPackageDetailRepository; + + //根据设备代码查询站点信息 + @Override + public List getStationList(String organizeCode, String equipmentCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(equipmentCode)) return null; + return stationRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode}); + } + + //获取站点关联的容器条码 + @Override + public Map> getContainerSnStationMap(String organizeCode, List stationList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(stationList)) return null; + List containerSnStationList = getContainerSnStationList(organizeCode, stationList); + return CollectionUtils.isEmpty(containerSnStationList) ? null : + containerSnStationList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesContainerSnStation::getContainerSn)); + } + + //获取站点关联的容器条码 + @Override + public List getContainerSnStationList(String organizeCode, List stationList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(stationList)) return null; + List stations = stationList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getStation()))).map(MesStation::getStation).collect(Collectors.toList()); + return getContainerSnStationListByStation(organizeCode, stations); + } + + //获取站点关联的容器条码 + @Override + public List getContainerSnStationListByStation(String organizeCode, List stationList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(stationList)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (stationList.size() == 1) DdlPreparedPack.getStringEqualPack(stationList.get(0), MesPcnExtConstWords.STATION, packBean); + else DdlPreparedPack.getInPackList(stationList, MesPcnExtConstWords.STATION, packBean); + return containerSnStationRepository.findByHqlWhere(packBean); + } + + //获取容器条码上料明细表信息【可扣减】【根据 主表seq,主表createDatetime,明细表createDatetime 正序】 + @Override + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public List getContainerSnStationContext(String organizeCode, List stationList) { + //获取站点关联的容器条码, key = containerSn + Map> containerSnStationMap = getContainerSnStationMap(organizeCode, stationList); + if (CollectionUtils.isEmpty(containerSnStationMap)) return null; + //获取容器条码上料主表信息【已关箱】 + List containerPackageList = getContainerPackageListByContainerSn(organizeCode, + new ArrayList<>(containerSnStationMap.keySet()), MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue()); + if (CollectionUtils.isEmpty(containerPackageList)) return null; + //获取容器条码上料明细表信息 + List containerPackageDetailList = getContainerPackageDetailList(organizeCode, containerPackageList); + if (CollectionUtils.isEmpty(containerPackageDetailList)) return null; + //封装容器条码对应的【可扣减】的上料明细表信息 + List containerSnStationContextList = new ArrayList<>(); + for (MesContainerPackageDetail containerPackageDetail : containerPackageDetailList) { + if (null == containerPackageDetail) continue; + MesContainerSnStation containerSnStation = containerSnStationMap.get(containerPackageDetail.getContainerSn()).get(0); + containerSnStationContextList.add(new MesContainerPackageDetailContext(containerPackageDetail).station(containerSnStation)); + } + //根据 主表seq,主表createDatetime,明细表createDatetime 正序 + containerSnStationContextList = containerSnStationContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesContainerPackageDetailContext::getSeq) + .thenComparing(MesContainerPackageDetailContext::getCreateDatetime2Package).thenComparing(MesContainerPackageDetailContext::getCreateDatetime)).collect(Collectors.toList()); + return containerSnStationContextList; + } + + //获取容器条码上料主表信息 + @Override + public List getContainerPackageList(String organizeCode, List containerSnStationList, Integer packageStatus) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(containerSnStationList)) return null; + List containerSnList = containerSnStationList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getContainerSn()))).map(MesContainerSnStation::getContainerSn).collect(Collectors.toList()); + return getContainerPackageListByContainerSn(organizeCode, containerSnList, packageStatus); + } + + //获取容器条码上料主表信息 + @Override + public List getContainerPackageListByContainerSn(String organizeCode, List containerSnList, Integer packageStatus) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(containerSnList)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (containerSnList.size() == 1) DdlPreparedPack.getStringEqualPack(containerSnList.get(0), MesPcnExtConstWords.CONTAINER_SN, packBean); + else DdlPreparedPack.getInPackList(containerSnList, MesPcnExtConstWords.STATION, packBean); + DdlPreparedPack.getNumEqualPack(packageStatus, MesPcnExtConstWords.PACKAGE_STATUS, packBean); + return containerPackageRepository.findByHqlWhere(packBean); + } + + //获取容器条码上料明细表信息【可扣减】 + @Override + public List getContainerPackageDetailList(String organizeCode, List containerPackageList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(containerPackageList)) return null; + List idList = containerPackageList.stream().filter(o -> null != o).map(MesContainerPackage::getId).collect(Collectors.toList()); + return getContainerPackageDetailListById(organizeCode, idList); + } + + //获取容器条码上料明细表信息【可扣减】 + @Override + public List getContainerPackageDetailListById(String organizeCode, List idList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(idList)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (idList.size() == 1) DdlPreparedPack.getNumEqualPack(idList.get(0), MesPcnExtConstWords.PID, packBean); + else DdlPreparedPack.getInPackList(idList, MesPcnExtConstWords.PID, packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_10.getValue(), MesPcnExtConstWords.SN_STATUS, packBean); + return containerPackageDetailRepository.findByHqlWhere(packBean); + } + + //获取容器条码的一条上料明细表信息【可扣减】 + @Override + public Boolean checkIsExistContainerPackageDetail(String organizeCode, Long id) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(id, MesPcnExtConstWords.PID, packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_10.getValue(), MesPcnExtConstWords.SN_STATUS, packBean); + return containerPackageDetailRepository.isExitByHql(packBean); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesContainerSnScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java similarity index 96% rename from modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesContainerSnScanStepService.java rename to modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java index 729ffdd..49c9956 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesContainerSnScanStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchAssemblyStepService.java @@ -20,7 +20,7 @@ import org.springframework.util.StringUtils; **/ @Slf4j @Service("mesContainerSnScanStepService") -public class MesContainerSnScanStepService extends BaseStepService { +public class MesContainerMatchStationAssemblyStepService extends BaseStepService { @Autowired private IMesProductionProcessContextStepService productionProcessContextStepService; 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 8470e3b..21448a6 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,4 +396,26 @@ public class MesProductionCustomContextStepService extends BaseStepService imple return workOrderCompleteQtyContext; } + @Override + public String getContainerSnAtomicityKey(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()) + .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)); + }); + } + } 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 9163afc..acd0e84 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 @@ -9,6 +9,7 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesPart; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; +import cn.estsh.i3plus.pojo.mes.bean.MesStation; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -588,4 +589,31 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CONTEXT, JSONObject.toJSONString(queueOrderPushList)); } + //获取弹框输入的工单数量 + @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); + } + + //获取弹框输入的工单数量 + @Override + public void dispatchOrderQtyDialogContext(StationRequestBean reqBean, String orderQty) { + dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.ORDER_QTY_DIALOG_CONTEXT, orderQty); + } + + //获取站点用于缺料时进行上料绑定 + @Override + public List getMatchStationContext(StationRequestBean reqBean) { + String stationContext = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_CONTEXT); + return StringUtils.isEmpty(stationContext) ? null : JSONObject.parseArray(stationContext, MesStation.class); + } + + //保存站点用于缺料时进行上料绑定 + @Override + public void dispatchMatchStationContext(StationRequestBean reqBean, List stationList) { + if (CollectionUtils.isEmpty(stationList)) return; + dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_CONTEXT, JSONObject.toJSONString(stationList)); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index 8190410..5bf6026 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesStationContainerSnExtService; 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.actor.shipping.dispatch.IFsmRouteDataService; @@ -55,6 +56,9 @@ public class MesProductionProcessContextStepService extends BaseStepService impl @Autowired private SnowflakeIdMaker snowflakeIdMaker; + @Autowired + private IMesStationContainerSnExtService stationContainerSnExtService; + private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BASE_DATA_CONTEXT).toString()); } @@ -687,4 +691,22 @@ public class MesProductionProcessContextStepService extends BaseStepService impl return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.CHOOSE_SHIPPING_RFID_ROUTE_MODE, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); } + //处理设备站点 + @Override + public List dispatchEquipmentStationContext(StationRequestBean reqBean, String equipmentCode) { + String station = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.EQUIPMENT_STATION_CONTEXT); + if (!StringUtils.isEmpty(station)) return JSONObject.parseArray(station, MesStation.class); + List stationList = stationContainerSnExtService.getStationList(reqBean.getOrganizeCode(), equipmentCode); + if (!CollectionUtils.isEmpty(stationList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.EQUIPMENT_STATION_CONTEXT, JSONObject.toJSONString(stationList)); + return stationList; + } + + //处理设备站点 + @Override + public List dispatchEquipmentStationContext(StationRequestBean reqBean, String equipmentCode, List stationTypeList) { + List stationList = dispatchEquipmentStationContext(reqBean, equipmentCode); + return CollectionUtils.isEmpty(stationList) ? null : + stationList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getStationType()) && stationTypeList.contains(o.getStationType()))).collect(Collectors.toList()); + } + } 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 new file mode 100644 index 0000000..4d607b0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesContainerPackageDetailContext.java @@ -0,0 +1,55 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.context; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesContainerSnStation; +import io.swagger.annotations.ApiParam; +import lombok.Data; +import org.springframework.beans.BeanUtils; +import org.springframework.util.StringUtils; + +import java.io.Serializable; + +/** + * 生产过程上下文对象-容器条码上料明细 + */ +@Data +public class MesContainerPackageDetailContext extends MesContainerPackageDetail implements Serializable { + + private static final long serialVersionUID = 3519172978836073435L; + + @ApiParam(name = "站点") + private String station; + + @ApiParam("顺序号") + private Integer seq; + + @ApiParam(value = "主表创建日期") + private String createDatetime2Package; + + @ApiParam("库存") + private Double remainQty; + + public MesContainerPackageDetailContext() {} + + public MesContainerPackageDetailContext(MesContainerPackageDetail containerPackageDetail) { + BeanUtils.copyProperties(containerPackageDetail, this); + } + + public MesContainerPackageDetailContext station(MesContainerSnStation containerSnStation) { + this.station = containerSnStation.getStation(); + this.seq = !StringUtils.isEmpty(containerSnStation.getSeq()) ? containerSnStation.getSeq() : MesPcnExtConstWords.ZERO; + this.createDatetime2Package = containerSnStation.getCreateDatetime(); + return this; + } + + public MesContainerPackageDetailContext remainQty(String remainQty) { + return remainQty(!StringUtils.isEmpty(remainQty) ? new Double(remainQty) : new Double(MesPcnExtConstWords.ZERO)); + } + + public MesContainerPackageDetailContext remainQty(Double remainQty) { + this.remainQty = remainQty; + return this; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java index 956e41a..53d68d4 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java @@ -127,6 +127,12 @@ public class MesProductionAssemblyContext implements Serializable { @ApiParam("匹配时间") public String matchDatetime; + @ApiParam(value = "工序用量") + public Double qty; + + @ApiParam("容器匹配信息") + public String containerSnData; + public String repeatKeyToString() { if (StringUtils.isEmpty(this.equipmentCode) || StringUtils.isEmpty(this.matchType) || (StringUtils.isEmpty(this.matchRule) && StringUtils.isEmpty(this.assemblyPartNo))) return null; return String.format("%s:%s&%s:%s&%s:%s&%s:%s", diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java index 8cbc7ab..4881b64 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java @@ -33,9 +33,6 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon @ApiParam(value = "是否忽略回车") private Integer isIgnoreEntry; - @ApiParam(value = "工序用量") - private Double qty; - @ApiParam(name = "产成品图") private String outPartNoPic; 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 b635f56..d5fd4ef 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 @@ -389,6 +389,12 @@ public class MesPcnExtConstWords { public static final String ENUM_CODE = "enumCode"; //计划开始时间 public static final String PLAN_START_TIME = "planStartTime"; + //站点名称 + public static final String STATION = "station"; + //容器条码 + public static final String CONTAINER_SN = "containerSn"; + //容器条码上料状态 + public static final String PACKAGE_STATUS = "packageStatus"; //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties) @@ -685,6 +691,10 @@ public class MesPcnExtConstWords { public static final String SHIPPING_RFID_ROUTE_MODE_CONTEXT = "SHIPPING_RFID_ROUTE_MODE_CONTEXT"; // 选择发运RFID生产模式 public static final String CHOOSE_SHIPPING_RFID_ROUTE_MODE = "CHOOSE_SHIPPING_RFID_ROUTE_MODE"; + // 设备站点 + public static final String EQUIPMENT_STATION_CONTEXT = "EQUIPMENT_STATION_CONTEXT"; + // 容器条码扣减剩余上下文 + public static final String CONTAINER_SN_REMAIN_CONTEXT = "CONTAINER_SN_REMAIN_CONTEXT"; // 上下文: 展示组件数据 public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT"; @@ -730,6 +740,10 @@ public class MesPcnExtConstWords { public static final String PROD_TEMP_DATA_CONTEXT = "PROD_TEMP_DATA_CONTEXT"; // 上下文: 发运队列 public static final String SHIPPING_QUEUE_CONTEXT = "SHIPPING_QUEUE_CONTEXT"; + // 上下文: 获取弹框输入的工单数量 + public static final String ORDER_QTY_DIALOG_CONTEXT = "ORDER_QTY_DIALOG_CONTEXT"; + // 用于缺料时进行上料绑定的站点 + public static final String MATCH_STATION_CONTEXT = "MATCH_STATION_CONTEXT"; //OPC_API_PARAM