From fbea1bb2f3dfd0ad19d58c7486e8238524aeb02c Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Thu, 3 Jul 2025 23:08:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IMesProductionDispatchContextStepService.java | 6 ++ .../step/MesStationMatchAssemblyStepService.java | 2 +- .../MesStationMatchProductSnInStepService.java | 70 ++++++++++++++++------ .../MesProductionDispatchContextStepService.java | 14 +++++ .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 3 + 5 files changed, 76 insertions(+), 19 deletions(-) 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 5a4ecaa..2433bf5 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 @@ -277,4 +277,10 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "保存站点用于缺料时进行上料绑定的容器条码") void dispatchMatchStationFeedContainerSnContext(StationRequestBean reqBean, String sn); + @ApiOperation(value = "获取站点用于进料时进行上料绑定") + List getPsMatchStationContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存站点用于进料时进行上料绑定") + void dispatchPsMatchStationContext(StationRequestBean reqBean, List stationList); + } 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 8f386b8..244315b 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 @@ -79,7 +79,7 @@ public class MesStationMatchAssemblyStepService extends BaseStepService { 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); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnInStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnInStepService.java index 7bda682..a8b9935 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnInStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationMatchProductSnInStepService.java @@ -1,30 +1,26 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; -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.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.MesContainerPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesContainerSnStation; 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 cn.estsh.impp.framework.boot.util.SpringContextsUtil; -import com.alibaba.fastjson.JSONObject; 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.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -68,21 +64,59 @@ public class MesStationMatchProductSnInStepService extends BaseStepService { List stationList = productionProcessContextStepService.dispatchEquipmentStationContext(reqBean, productionProcessContext.getCurCellEquip().getEquipmentCode(), Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_10.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_30.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_50.getValue()).collect(Collectors.toList())); - //搜集设备站点【原料站点&&混料站点】 + + //搜集设备站点 【进料】【原料站点&&混料站点】 + String suffix = new StringJoiner(MesPcnExtConstWords.SLANT_R).add(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_10.getDescription()).add(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getDescription()).toString(); List stationList2PsIn = productionProcessContextStepService.dispatchEquipmentStationContext(stationList, Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_10.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getValue()).collect(Collectors.toList())); - //搜集设备站点【混料站点&&成品站点&&可疑站点】 - List stationList2PsOut = productionProcessContextStepService.dispatchEquipmentStationContext(stationList, - Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_30.getValue(), MesExtEnumUtil.STATION_TYPE.STATION_TYPE_50.getValue()).collect(Collectors.toList())); + if (CollectionUtils.isEmpty(stationList2PsIn)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("站点匹配进料时验证设备未关联[%s]站点!", suffix)); + + //验证【原料站点&&混料站点】是否存在【已关箱】的容器条码 + if (!checkIsFeedContainerSn(reqBean, resultBean, stepResult, stationList2PsIn, suffix, MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20).isCompleted()) return stepResult; - if (CollectionUtils.isEmpty(stationList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "站点匹配装配件时验证设备未关联支持扣减的站点"); + //验证【成品站点】是否存在【未关箱】的容器条码 + if (!checkIsFeedContainerSn(reqBean, resultBean, stepResult, + productionProcessContextStepService.dispatchEquipmentStationContext(stationList, Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_30.getValue()).collect(Collectors.toList())), + MesExtEnumUtil.STATION_TYPE.STATION_TYPE_30.getDescription(), MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_10).isCompleted()) return stepResult; - //保存站点用于缺料时进行上料绑定 - productionDispatchContextStepService.dispatchMatchStationContext(reqBean, stationList); + //验证【可疑站点】是否存在【未关箱】的容器条码 + if (!checkIsFeedContainerSn(reqBean, resultBean, stepResult, + productionProcessContextStepService.dispatchEquipmentStationContext(stationList, Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_50.getValue()).collect(Collectors.toList())), + MesExtEnumUtil.STATION_TYPE.STATION_TYPE_50.getDescription(), MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_10).isCompleted()) return stepResult; + //验证【混料站点】是否存在容器条码 + if (!checkIsFeedContainerSn(reqBean, resultBean, stepResult, + productionProcessContextStepService.dispatchEquipmentStationContext(stationList, Stream.of(MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getValue()).collect(Collectors.toList())), + MesExtEnumUtil.STATION_TYPE.STATION_TYPE_40.getDescription(), null).isCompleted()) return stepResult; + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "站点匹配进料验证成功!"); + + } - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "站点匹配装配件验证成功!"); + private StepResult checkIsFeedContainerSn(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, + List stationList, String suffix, MesExtEnumUtil.CONTAINER_PACKAGE_STATUS containerPackageStatus) { + //获取站点关联的容器条码【进料】 + Map> containerSnStationMap = stationContainerSnExtService.getContainerSnStationMap(reqBean.getOrganizeCode(), stationList); + //获取容器条码上料主表信息【进料】 除了混料不带状态查询, 其他均查询【已关箱】的数据 + List containerPackageList = stationContainerSnExtService.getContainerPackageListByContainerSn(reqBean.getOrganizeCode(), + CollectionUtils.isEmpty(containerSnStationMap) ? null : new ArrayList<>(containerSnStationMap.keySet()), + null != containerPackageStatus ? MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue() : null); + if (CollectionUtils.isEmpty(stationList)) return stepResult; + //混料站点 或 判断已关箱的情况下 , containerPackageList 存在数据则通过 + if ((null == containerPackageStatus || MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue() == containerPackageStatus.getValue()) + && !CollectionUtils.isEmpty(containerPackageList)) return stepResult; + //判断未关箱的情况下,需要看当前的容器条码是否全部是已关箱的,如果是则验证不通过 【不存在已关箱状态的数据就默认是未关箱的, 及不存在数据也默认是未关箱的】 + if (null != containerPackageStatus && MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_10.getValue() == containerPackageStatus.getValue()) { + List containerSnList = CollectionUtils.isEmpty(containerPackageList) ? null : + (containerPackageList.stream().filter(o -> null != o).map(MesContainerPackage::getContainerSn).collect(Collectors.toList())) + .stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(containerSnList) || containerSnList.size() != containerSnStationMap.keySet().size()) return stepResult; + } + + //保存站点用于绑定进料容器条码 + productionDispatchContextStepService.dispatchPsMatchStationContext(reqBean, stationList); + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_FEEDING), + String.format("站点匹配进料时验证[%s]站点未绑定[%s]的容器条码!", suffix, containerPackageStatus.getDescription())); } 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 a1e84b6..31e9989 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 @@ -630,4 +630,18 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.MATCH_STATION_FEED_CONTAINER_SN_CONTEXT, sn); } + //获取站点用于进料时进行上料绑定 + @Override + public List getPsMatchStationContext(StationRequestBean reqBean) { + String stationContext = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PS_MATCH_STATION_CONTEXT); + return !StringUtils.isEmpty(stationContext) ? JSONObject.parseArray(stationContext, MesStation.class) : null; + } + + //保存站点用于进料时进行上料绑定 + @Override + public void dispatchPsMatchStationContext(StationRequestBean reqBean, List stationList) { + if (CollectionUtils.isEmpty(stationList)) return; + dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PS_MATCH_STATION_CONTEXT, JSONObject.toJSONString(stationList)); + } + } 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 040e5f7..c42d810 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 @@ -754,6 +754,9 @@ public class MesPcnExtConstWords { // 工步上料关箱码 public static final String MATCH_STATION_FEED_CLOSE_PACKAGE = "MATCH_STATION_FEED_CLOSE_PACKAGE"; + // 用于进料绑定的站点 + public static final String PS_MATCH_STATION_CONTEXT = "PS_MATCH_STATION_CONTEXT"; + //OPC_API_PARAM public static final String OPC_LINK_URL = "OPC_LINK_URL";