From 0819b960e2e268a88baa5eff771f2d85e090da1a Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Sat, 8 Mar 2025 00:16:05 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8E=92=E5=BA=8F=E6=8E=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/busi/IMesProductionCustomContextStepService.java | 6 +++--- .../ext/mes/pcn/api/busi/IMesQueueOrderPushService.java | 2 +- .../serviceimpl/busi/MesQueueOrderPushService.java | 8 ++++---- .../step/MesSendEquipParamsCmdStepService.java | 2 +- .../step/MesWorkOrderQueueAcceptStepService.java | 4 ++-- .../step/MesWorkOrderQueueSavePushStepService.java | 2 +- .../context/MesProductionCustomContextStepService.java | 15 +++++++-------- .../i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 2 ++ 8 files changed, 21 insertions(+), 20 deletions(-) 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 8bf2905..d4a7f08 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 @@ -104,12 +104,12 @@ public interface IMesProductionCustomContextStepService { void removePackageDataContext(StationRequestBean reqBean); @ApiOperation(value = "获取排序线工单队列推送锁数据") - List getSortQueuePushLockContext(String orgainzeCode, String workCenterCode); + String getSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId); @ApiOperation(value = "保存排序线工单队列推送锁数据") - Boolean dispatchSortQueuePushLockContext(String organizeCode, String workCenterCode, Object queuePushId); + Boolean dispatchSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId); @ApiOperation(value = "删除排序线工单队列推送锁数据") - void removeSortQueuePushLockContext(String orgainzeCode, String workCenterCode, String queuePushId); + void removeSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId); } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java index ecd5f85..fd12741 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java @@ -39,6 +39,6 @@ public interface IMesQueueOrderPushService { ListPager queryQueueOrderPushListPager(Map paramMap, List pushSourceCodeList, Pager pager); @ApiOperation(value = "根据条件修改生产队列工位推送信息状态") - void saveQueueOrderPushStatusByDdlPackBean(DdlPackBean packBean, String userInfo, Integer queueStatus); + void saveQueueOrderPushStatusByDdlPackBean(DdlPackBean packBean, String userInfo, Integer queueStatus, String targerWorkCellCode); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java index 5904686..3477019 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java @@ -12,7 +12,6 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesPart; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushCellCfgRepository; @@ -168,11 +167,12 @@ public class MesQueueOrderPushService implements IMesQueueOrderPushService { //根据条件修改生产队列工位推送信息状态 @Override - public void saveQueueOrderPushStatusByDdlPackBean(DdlPackBean packBean, String userInfo, Integer queueStatus) { + public void saveQueueOrderPushStatusByDdlPackBean(DdlPackBean packBean, String userInfo, Integer queueStatus, String targerWorkCellCode) { if (StringUtils.isEmpty(userInfo) || StringUtils.isEmpty(queueStatus)) return; queueOrderPushRepository.updateByPropertiesNoSync( - new String[]{MesPcnExtConstWords.QUEUE_STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, - new Object[]{queueStatus, userInfo, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}, + new String[]{MesPcnExtConstWords.QUEUE_STATUS, MesPcnExtConstWords.TARGET_WORK_CELL_CODE, + MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{queueStatus, targerWorkCellCode, userInfo, TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}, packBean); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java index 29563e8..e1c9cf3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java @@ -140,7 +140,7 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { List sourceIdList = null; for (MesProdRuleContext prodRuleContext : prodRuleContextList) { if (StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; - List itemIdList = prodRuleContext.getSortAssemblyDataContext().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getSourceId()))).map(MesProductionAssemblySortContext::getSourceId).collect(Collectors.toList()); + List itemIdList = prodRuleContext.getSortAssemblyDataContext().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPid()))).map(MesProductionAssemblySortContext::getPid).collect(Collectors.toList()); if (CollectionUtils.isEmpty(itemIdList)) continue; if (CollectionUtils.isEmpty(sourceIdList)) sourceIdList = new ArrayList<>(); sourceIdList.addAll(itemIdList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java index 87013a7..7c0888b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java @@ -131,8 +131,8 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { } else { //当前遍历中的代码考虑加锁; 获取不到锁的情况下退出循环 if (!tryLock(reqBean.getWorkCenterCode(), queueOrderPush.getPushSourceCode())) break; - List queuePushIdList = productionCustomContextStepService.getSortQueuePushLockContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); - if (!CollectionUtils.isEmpty(queuePushIdList) && queuePushIdList.contains(queueOrderPush.getId().toString())) continue; + productionCustomContextStepService.getSortQueuePushLockContext(reqBean, reqBean.getWorkCenterCode()); +// if (!CollectionUtils.isEmpty(queuePushIdList) && queuePushIdList.contains(queueOrderPush.getId().toString())) continue; } } 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 6026fbd..312366c 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 @@ -89,7 +89,7 @@ public class MesWorkOrderQueueSavePushStepService extends BaseStepService { DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); if (idList.size() == 1) DdlPreparedPack.getNumEqualPack(idList.get(0), MesPcnExtConstWords.ID, packBean); else DdlPreparedPack.getInPackList(idList, MesPcnExtConstWords.ID, packBean); - queueOrderPushService.saveQueueOrderPushStatusByDdlPackBean(packBean, reqBean.getUserInfo(), MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue()); + queueOrderPushService.saveQueueOrderPushStatusByDdlPackBean(packBean, reqBean.getUserInfo(), MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), reqBean.getWorkCellCode()); } //写入队列信息,默认状态为已完成 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 c092b52..6b161f0 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 @@ -297,25 +297,24 @@ public class MesProductionCustomContextStepService extends BaseStepService imple } //排序线工单队列推送锁数据KEY 【PS:生产线级别】 - private String getSortQueuePushLockContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(workCenterCode).add(MesPcnExtConstWords.QUEUE_PUSH_LOCK_CONTEXT).toString(); } + private String getSortQueuePushLockContextKey(StationRequestBean reqBean) { return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(MesPcnExtConstWords.QUEUE_PUSH_LOCK_CONTEXT).toString(); } //获取排序线工单队列推送锁数据 @Override - public List getSortQueuePushLockContext(String orgainzeCode, String workCenterCode) { - return getFsmBusiList(orgainzeCode, getSortQueuePushLockContextKey(orgainzeCode, workCenterCode)); + public String getSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId) { + return getFsmBusiData(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); } //保存排序线工单队列推送锁数据 @Override - public Boolean dispatchSortQueuePushLockContext(String organizeCode, String workCenterCode, Object queuePushId) { - if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(queuePushId)) return false; - return dispatchFsmBusiList(organizeCode, getSortQueuePushLockContextKey(organizeCode, workCenterCode), queuePushId); + public Boolean dispatchSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId) { + return dispatchFsmBusiList(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); } //删除排序线工单队列推送锁数据 @Override - public void removeSortQueuePushLockContext(String orgainzeCode, String workCenterCode, String queuePushId) { - removeFsmBusiList(orgainzeCode, getSortQueuePushLockContextKey(orgainzeCode, workCenterCode), queuePushId); + public void removeSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId) { + removeFsmBusiList(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); } } 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 24497c4..1da25f7 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 @@ -359,6 +359,8 @@ public class MesPcnExtConstWords { public static final String SHIPPING_GROUP_NAME = "shippingGroupName"; //队列状态 public static final String QUEUE_STATUS = "queueStatus"; + //目标工位 + public static final String TARGET_WORK_CELL_CODE = "targetWorkCellCode"; //工艺顺序号 public static final String PROCESS_SEQ = "processSeq"; //推送来源代码 From 17ec31db784b895b87fa2c6d169bb66b64b6dcff Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Sat, 8 Mar 2025 21:57:15 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=8A=A0=E5=B7=A5?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E3=80=90=E6=8E=92=E5=BA=8F=E3=80=91=E5=8F=91?= =?UTF-8?q?=E9=80=81=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step/MesSendEquipParamsCmdStepService.java | 99 +++++++++++++--------- 1 file changed, 57 insertions(+), 42 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java index e1c9cf3..0d6e8d1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java @@ -26,11 +26,9 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Description : 发送加工参数 @@ -78,8 +76,11 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { //获取生产线信息 MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + //搜集数据:根据数据关联键分组加工参数关联ID集合 + Map> sourceIdMap2ForeignKey = new HashMap<>(); + //搜集加工参数关联ID集合 根据生产线类型区分 - List sourceIdList = getEquipmentProdParamCfgSourceIdList(productionProcessContext, prodRuleContextList, workCenter); + List sourceIdList = getEquipmentProdParamCfgSourceIdList(productionProcessContext, prodRuleContextList, workCenter, sourceIdMap2ForeignKey); //根据来源ID查询设备加工参数信息 List equipmentProdParamCfgList = equipmentProdParamCfgService.getEquipmentProdParamCfgList(reqBean.getOrganizeCode(), sourceIdList); @@ -123,7 +124,7 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { productionPsOutContexts.stream().filter(i -> (null != i && !StringUtils.isEmpty(i.getForeignKey()) && i.getForeignKey().compareTo(o.getForeignKey()) == 0)).findFirst(); - doSendEquipParamsCmd(reqBean, resultBean, o, cellEquipContext, eppcMap2SourceId, evMap, productResult, productionPartContextOp, productionPsInContextOp, productionPsOutContextOp); + doSendEquipParamsCmd(reqBean, resultBean, o, sourceIdMap2ForeignKey.get(o.getForeignKey()), cellEquipContext, eppcMap2SourceId, evMap, productResult, productionPartContextOp, productionPsInContextOp, productionPsOutContextOp); }); @@ -131,10 +132,15 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { } //搜集加工参数关联ID集合 - private List getEquipmentProdParamCfgSourceIdList(MesProductionProcessContext productionProcessContext, List prodRuleContextList, MesWorkCenter workCenter) { + private List getEquipmentProdParamCfgSourceIdList(MesProductionProcessContext productionProcessContext, List prodRuleContextList, MesWorkCenter workCenter, Map> sourceIdMap2ForeignKey) { if (MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue() == workCenter.getCenterType()) { //非排序 - return prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPid()))).map(MesProdRuleContext::getPid).collect(Collectors.toList()); + List sourceIdList = new ArrayList<>(); + prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPid()))).forEach(o -> { + sourceIdMap2ForeignKey.put(o.getForeignKey(), Stream.of(o.getPid()).collect(Collectors.toList())); + sourceIdList.add(o.getPid()); + }); + return sourceIdList; } else { //排序 List sourceIdList = null; @@ -143,6 +149,7 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { List itemIdList = prodRuleContext.getSortAssemblyDataContext().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPid()))).map(MesProductionAssemblySortContext::getPid).collect(Collectors.toList()); if (CollectionUtils.isEmpty(itemIdList)) continue; if (CollectionUtils.isEmpty(sourceIdList)) sourceIdList = new ArrayList<>(); + sourceIdMap2ForeignKey.put(prodRuleContext.getForeignKey(), itemIdList); sourceIdList.addAll(itemIdList); } return sourceIdList; @@ -150,57 +157,65 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { } //发送设备加工参数 - private void doSendEquipParamsCmd(StationRequestBean reqBean, StationResultBean resultBean, MesProdRuleContext prodRuleContext, MesCellEquipContext cellEquipContext, - Map> eppcMap2SourceId, Map evMap, String productResult, - Optional productionPartContextOp, Optional productionPsInContextOp, Optional productionPsOutContextOp) { + private void doSendEquipParamsCmd(StationRequestBean reqBean, StationResultBean resultBean, MesProdRuleContext prodRuleContext, List sourceIdList, MesCellEquipContext cellEquipContext, + Map> eppcMap2SourceId, Map evMap, String productResult, + Optional productionPartContextOp, Optional productionPsInContextOp, Optional productionPsOutContextOp) { - //当前加工规则的PID对应的设备加工参数 - List equipmentProdParamCfgList = eppcMap2SourceId.get(prodRuleContext.getPid()); + if (CollectionUtils.isEmpty(sourceIdList)) return; - if (CollectionUtils.isEmpty(equipmentProdParamCfgList)) return; + for (Long sourceId : sourceIdList) { - MesProductionPartContext productionPartContext = (null != productionPartContextOp && productionPartContextOp.isPresent()) ? productionPartContextOp.get() : null; + if (StringUtils.isEmpty(sourceId)) continue; - MesProductionPsInContext productionPsInContext = (null != productionPsInContextOp && productionPsInContextOp.isPresent()) ? productionPsInContextOp.get() : null; + //当前加工规则的PID对应的设备加工参数 + List equipmentProdParamCfgList = eppcMap2SourceId.get(sourceId); - MesProductionPsOutContext productionPsOutContext = (null != productionPsOutContextOp && productionPsOutContextOp.isPresent()) ? productionPsOutContextOp.get() : null; + if (CollectionUtils.isEmpty(equipmentProdParamCfgList)) continue; - //搜集发送规则并去重 - List matchRuleList = (equipmentProdParamCfgList.stream().filter(o -> null != o).map(o -> checkTransformUpperCase(o.getMatchRule())).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + MesProductionPartContext productionPartContext = (null != productionPartContextOp && productionPartContextOp.isPresent()) ? productionPartContextOp.get() : null; - for (String matchRule : matchRuleList) { + MesProductionPsInContext productionPsInContext = (null != productionPsInContextOp && productionPsInContextOp.isPresent()) ? productionPsInContextOp.get() : null; - if (StringUtils.isEmpty(matchRule)) continue; + MesProductionPsOutContext productionPsOutContext = (null != productionPsOutContextOp && productionPsOutContextOp.isPresent()) ? productionPsOutContextOp.get() : null; - Optional equipmentProdParamCfgOp = equipmentProdParamCfgList.stream().filter(o -> (null != o && checkTransformUpperCase(o.getMatchRule()).equals(matchRule) && evMap.containsKey(o.getEquipVariableId()))).findFirst(); + //搜集发送规则并去重 + List matchRuleList = (equipmentProdParamCfgList.stream().filter(o -> null != o).map(o -> checkTransformUpperCase(o.getMatchRule())).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); - if (null == equipmentProdParamCfgOp || !equipmentProdParamCfgOp.isPresent()) continue; + for (String matchRule : matchRuleList) { - evMap.remove(equipmentProdParamCfgOp.get().getId()); + if (StringUtils.isEmpty(matchRule)) continue; - //数据转换 - String matchValue = transferValue(matchRule, reqBean, prodRuleContext, productResult, productionPartContext, productionPsInContext, productionPsOutContext); + Optional equipmentProdParamCfgOp = equipmentProdParamCfgList.stream().filter(o -> (null != o && checkTransformUpperCase(o.getMatchRule()).equals(matchRule) && evMap.containsKey(o.getEquipVariableId()))).findFirst(); - if (StringUtils.isEmpty(matchValue)) { - this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("发送设备加工参数:[%s]未匹配到业务数据", matchRule), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); - continue; - } + if (null == equipmentProdParamCfgOp || !equipmentProdParamCfgOp.isPresent()) continue; - MesEquipmentVariable equipmentVariable = evMap.get(equipmentProdParamCfgOp.get().getEquipVariableId()); - if (null == equipmentVariable) { - this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("发送设备加工参数:设备加工参数信息ID[%s]关联的设备数据变量ID[%s]未维护有效的设备数据变量信息!", equipmentProdParamCfgOp.get().getId(), equipmentProdParamCfgOp.get().getEquipVariableId()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); - continue; - } + evMap.remove(equipmentProdParamCfgOp.get().getId()); - //写值 - MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(matchValue, equipmentVariable, cellEquipContext.getKepwareFlag(equipmentVariable.getChannel())); + //数据转换 + String matchValue = transferValue(matchRule, reqBean, prodRuleContext, productResult, productionPartContext, productionPsInContext, productionPsOutContext); - if (!equipVariableRwResult.getIsSuccessed()) { - this.sendMessage(reqBean, new StationResultBean().writeDbLog().checkRepeat(), String.format("设备[%s]:发送设备加工参数失败!原因:%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); - continue; - } + if (StringUtils.isEmpty(matchValue)) { + this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("发送设备加工参数:[%s]未匹配到业务数据", matchRule), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } - this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("设备[%s]:发送设备加工参数成功!%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + MesEquipmentVariable equipmentVariable = evMap.get(equipmentProdParamCfgOp.get().getEquipVariableId()); + if (null == equipmentVariable) { + this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("发送设备加工参数:设备加工参数信息ID[%s]关联的设备数据变量ID[%s]未维护有效的设备数据变量信息!", equipmentProdParamCfgOp.get().getId(), equipmentProdParamCfgOp.get().getEquipVariableId()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } + + //写值 + MesEquipVariableRwResult equipVariableRwResult = equipVariableRwExtService.writeVariable(matchValue, equipmentVariable, cellEquipContext.getKepwareFlag(equipmentVariable.getChannel())); + + if (!equipVariableRwResult.getIsSuccessed()) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog().checkRepeat(), String.format("设备[%s]:发送设备加工参数失败!原因:%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("设备[%s]:发送设备加工参数成功!%s", cellEquipContext.getEquipmentName(), equipVariableRwResult.getMessage()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + } } From 228aa76db7ba74d08a413b58d5779dcf625a6bd9 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Sun, 9 Mar 2025 16:41:44 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=8E=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IMesProductionCustomContextStepService.java | 9 ++- .../step/MesProductionDataSaveStepService.java | 51 ++++++++------ .../step/MesWorkOrderQueueAcceptStepService.java | 79 +++++++++++++--------- .../step/MesWorkOrderQueueSavePushStepService.java | 21 ++++++ .../MesProductionCustomContextStepService.java | 22 ++++-- 5 files changed, 121 insertions(+), 61 deletions(-) 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 d4a7f08..57525ca 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 @@ -103,11 +103,14 @@ public interface IMesProductionCustomContextStepService { @ApiOperation(value = "删除打包数据") void removePackageDataContext(StationRequestBean reqBean); - @ApiOperation(value = "获取排序线工单队列推送锁数据") + @ApiOperation(value = "获取排序线工单队列推送锁数据, 返回的值是工位代码") String getSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId); - @ApiOperation(value = "保存排序线工单队列推送锁数据") - Boolean dispatchSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId); + @ApiOperation(value = "获取排序线工单队列推送锁数据, 返回的值是工单队列ID集合") + List getSortQueuePushLockContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存排序线工单队列推送锁数据【保存LOCK信息:item=id,value=工位】【保存当前工位锁定的信息:item=工位,value=idList】") + Boolean dispatchSortQueuePushLockContext(StationRequestBean reqBean, List queuePushIdList); @ApiOperation(value = "删除排序线工单队列推送锁数据") void removeSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId); 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 94c39c5..bf53035 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 @@ -12,6 +12,11 @@ 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.StringUtils; + +import java.util.LinkedList; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Description : 保存加工结果工步 @@ -24,34 +29,38 @@ public class MesProductionDataSaveStepService extends BaseStepService { @Autowired public IMesProductionProcessContextStepService productionProcessContextStepService; - @Override - public StepResult execute(StationRequestBean reqBean) { - - //是否排序线 - Boolean isSort = MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean) ? true : false; + //【非排序线】保存结果结果工步集合 + //保存开模记录工步>>保存零件条码信息工步>>加工异常处理工步>>生成加工记录工步>>保存装配记录工步>>保存工单信息工步 + private static final LinkedList noSortStepList = new LinkedList<>(Stream.of( + "mesMouldRecordGenerateStepService", "mesProductSnSaveStepService", "mesProductResultErrorHandleStepService", + "mesProductionRecordGenerateStepService", "mesAssemblySaveStepService", "mesWorkOrderSaveStepService").collect(Collectors.toList())); - //保存开模记录工步 - ((IStepService) SpringContextsUtil.getBean("mesMouldRecordGenerateStepService")).executeInState(reqBean); + //【排序线】保存结果结果工步集合 + //保存开模记录工步>>保存零件条码信息工步>>保存工位队列信息工步>>加工异常处理工步>>生成加工记录工步>>保存工单信息工步 + private static final LinkedList sortStepList = new LinkedList<>(Stream.of( + "mesMouldRecordGenerateStepService", "mesProductSnSaveStepService", "mesWorkOrderQueueSaveStepService", + "mesProductResultErrorHandleStepService", "mesProductionRecordGenerateStepService", "mesWorkOrderSaveStepService").collect(Collectors.toList())); - //保存零件条码信息工步 - ((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean); - - //保存工位队列信息工步 【排序】 - if (isSort) ((IStepService) SpringContextsUtil.getBean("mesWorkOrderQueueSaveStepService")).executeInState(reqBean); + @Override + public StepResult execute(StationRequestBean reqBean) { - //加工异常处理工步 - ((IStepService) SpringContextsUtil.getBean("mesProductResultErrorHandleStepService")).executeInState(reqBean); + StationResultBean resultBean = new StationResultBean(); - //生成加工记录工步 - ((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean); + StepResult stepResult = StepResult.getSuccessComplete(); - //保存装配记录工步 【非排序】 - if (!isSort)((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean); + //根据生产线类型赋值工步集合 + Boolean isSort = MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean) ? true : false; + LinkedList stepList = !isSort ? noSortStepList : sortStepList; - //保存工单信息工步 - ((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean); + for (String stepService : stepList) { + if (StringUtils.isEmpty(stepResult)) 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 (!innerStepResult.isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存加工结果失败!"); + } - return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!"); + 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/MesWorkOrderQueueAcceptStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java index 7c0888b..a0d857e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java @@ -10,9 +10,12 @@ 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.mes.pcn.serviceimpl.fsm.IShippingDispatchService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; import cn.estsh.i3plus.mes.pcn.util.StringUtil; +import cn.estsh.i3plus.mes.pcn.websocket.StationWebSocket; import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; @@ -57,6 +60,9 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { @Autowired private IFsmCommonService fsmCommonService; + @Autowired + private IShippingDispatchService shippingDispatchService; + private static Map lockTimeMap = new HashMap<>(); private static Map lockMap = new ConcurrentHashMap<>(); @@ -112,10 +118,10 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); } - //搜集需要考虑加锁的推送来源代码 + //搜集需要加锁的推送来源代码 List pushSourceCodeList2NeedLock = queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsNeedLock()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()); - //当前即将执行的接收队列 + //当前即将执行的推送队列 List curPushList = null; try { @@ -123,18 +129,27 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { for (MesQueueOrderPush queueOrderPush : queueOrderPushList) { if (null == queueOrderPush || StringUtils.isEmpty(queueOrderPush.getWorkOrderNo())) continue; //当前遍历中的代码不考虑加锁 - if (CollectionUtils.isEmpty(pushSourceCodeList2NeedLock) || !pushSourceCodeList2NeedLock.contains(queueOrderPush.getPushSourceCode())) { - if (CollectionUtils.isEmpty(curPushList)) curPushList = new ArrayList<>(); - curPushList.add(queueOrderPush); - //满足腔数的情况下退出循环 - if (curPushList.size() >= cellEquipContext.getCavity()) break; - } else { - //当前遍历中的代码考虑加锁; 获取不到锁的情况下退出循环 - if (!tryLock(reqBean.getWorkCenterCode(), queueOrderPush.getPushSourceCode())) break; - productionCustomContextStepService.getSortQueuePushLockContext(reqBean, reqBean.getWorkCenterCode()); -// if (!CollectionUtils.isEmpty(queuePushIdList) && queuePushIdList.contains(queueOrderPush.getId().toString())) continue; + if (!CollectionUtils.isEmpty(pushSourceCodeList2NeedLock) && pushSourceCodeList2NeedLock.contains(queueOrderPush.getPushSourceCode())) { + //当前遍历中的代码加锁; 获取不到锁的情况下退出循环 + if (!tryLock(reqBean, queueOrderPush.getPushSourceCode())) break; + //获取排序线工单队列推送锁数据, 返回的值是工位代码 + String lockedCellCode = productionCustomContextStepService.getSortQueuePushLockContext(reqBean, queueOrderPush.getId().toString()); + //如果当前推送信息的ID已被其他工位锁定, 验证锁定的工位是否在线, 不在线直接清除当前推送信息的ID的LOCK + if (!StringUtils.isEmpty(lockedCellCode) && !lockedCellCode.equals(reqBean.getWorkCellCode())) { + if (!CollectionUtils.isEmpty(StationWebSocket.getStationWebSocketList( + shippingDispatchService.getActorClientInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), lockedCellCode)))) continue; + else productionCustomContextStepService.removeSortQueuePushLockContext(reqBean, queueOrderPush.getId().toString()); + } + + queueOrderPush.setIsNeedLock(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); } + //ADD到当前即将执行的推送队列中 + if (CollectionUtils.isEmpty(curPushList)) curPushList = new ArrayList<>(); + curPushList.add(queueOrderPush); + + //满足腔数的情况下退出循环 + if (curPushList.size() >= cellEquipContext.getCavity()) break; } //验证是否满足腔数 @@ -171,57 +186,59 @@ public class MesWorkOrderQueueAcceptStepService extends BaseStepService { return stepResult; } finally { - -// //验证是否执行解锁 -// List pushList2NeedLock = (CollectionUtils.isEmpty(curPushList) || CollectionUtils.isEmpty(pushSourceCodeList2NeedLock)) ? null : -// curPushList.stream().filter(o -> (null != o && pushSourceCodeList2NeedLock.contains(o.getPushSourceCode()))).collect(Collectors.toList()); -// //当需要考虑加锁且满足腔数的情况下, 保存排序线工单队列推送锁数据 -// if (!CollectionUtils.isEmpty(pushList2NeedLock) && curPushList.size() >= cellEquipContext.getCavity()) { -// List idList = pushList2NeedLock.stream().filter(o -> null != o).map(o -> String.valueOf(o.getId())).collect(Collectors.toList()); -// productionCustomContextStepService.dispatchSortQueuePushLockContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), idList); -// } -// -// //解锁 -// if (!CollectionUtils.isEmpty(pushList2NeedLock)) pushList2NeedLock.forEach(o -> unLock(reqBean.getWorkCenterCode(), o.getPushSourceCode())); + //当需要加锁且满足腔数的情况下, 保存排序线工单队列推送锁数据【保存LOCK信息:item=id,value=工位】【保存当前工位锁定的信息:item=工位,value=idList】 + List queuePushIdList = CollectionUtils.isEmpty(curPushList) ? null : + curPushList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsNeedLock()))).map(o -> o.getId().toString()).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(queuePushIdList) && curPushList.size() >= cellEquipContext.getCavity()) { + productionCustomContextStepService.dispatchSortQueuePushLockContext(reqBean, queuePushIdList); + } + //解锁 + if (!CollectionUtils.isEmpty(queuePushIdList)) queuePushIdList.forEach(o -> unLock(reqBean, o)); } } //加锁 - private Boolean tryLock(String workCenterCode, String pushSourceCode) { + private Boolean tryLock(StationRequestBean reqBean, String pushSourceCode) { try { - String key = new StringJoiner(MesPcnExtConstWords.AND).add(workCenterCode).add(pushSourceCode).toString(); + String key = new StringJoiner(MesPcnExtConstWords.AND).add(reqBean.getWorkCenterCode()).add(pushSourceCode).toString(); ReentrantLock lock = lockMap.computeIfAbsent(key, item -> new ReentrantLock(true)); //500ms内拿不到锁的情况下监控锁是否已经超时 - if (!lock.tryLock(MesPcnExtConstWords.FIVE_HUNDRED, TimeUnit.MILLISECONDS) && checkTimeOut(key, lock)) return false; + if (!lock.tryLock(MesPcnExtConstWords.FIVE_HUNDRED, TimeUnit.MILLISECONDS) && checkTimeOut(reqBean, pushSourceCode, key, lock)) return false; lockTimeMap.put(key, TimeTool.getNowTime(true)); return true; - } catch (InterruptedException e) { + } catch (Exception e) { + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- tryLock [{}] EXCEPTION: {}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), pushSourceCode, e.toString()); return false; } } //监控超过10秒的情况下进行自动解锁 - private Boolean checkTimeOut(String key, ReentrantLock lock) { + private Boolean checkTimeOut(StationRequestBean reqBean, String pushSourceCode, String key, ReentrantLock lock) { try { String lockTime = lockTimeMap.get(key); if ((StringUtils.isEmpty(lockTime) || TimeTool.getSecoundsBetweenTime(1, lockTime, TimeTool.getNowTime(true)) >= MesPcnExtConstWords.TEN) && lock.isLocked()) lock.unlock(); } catch (Exception e) { if (lock.isLocked()) lock.unlock(); + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- checkTimeOut [{}] EXCEPTION: {}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), pushSourceCode, e.toString()); } return true; } //解锁 - private void unLock(String workCenterCode, String pushSourceCode) { + private void unLock(StationRequestBean reqBean, String pushSourceCode) { try { - String key = new StringJoiner(MesPcnExtConstWords.AND).add(workCenterCode).add(pushSourceCode).toString(); + String key = new StringJoiner(MesPcnExtConstWords.AND).add(reqBean.getWorkCenterCode()).add(pushSourceCode).toString(); lockMap.computeIfPresent(key, (k, v) -> { if (!v.isHeldByCurrentThread() || !v.isLocked()) return v; v.unlock(); return v; }); } catch (Exception e) { + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- unLock [{}] EXCEPTION: {}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), pushSourceCode, e.toString()); } } 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 312366c..2bb4d49 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 @@ -1,5 +1,6 @@ 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.IMesQueueOrderPushService; @@ -8,6 +9,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.util.StringUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; @@ -24,6 +26,7 @@ import org.springframework.beans.BeanUtils; 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.Optional; @@ -44,6 +47,9 @@ public class MesWorkOrderQueueSavePushStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesQueueOrderPushService queueOrderPushService; @Autowired @@ -79,6 +85,10 @@ public class MesWorkOrderQueueSavePushStepService extends BaseStepService { //写入队列信息,默认状态为已完成 productionPsInContextList.stream().filter(o -> null != o).forEach(o -> insertQueueOrder(reqBean, o, productionPartContextList)); + //验证是否存在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())); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "保存工位队列成功!"); } @@ -104,4 +114,15 @@ public class MesWorkOrderQueueSavePushStepService extends BaseStepService { queueOrderRepository.insert(queueOrder); } + //当前工步集完成之后执行当前方法 + @Override + public void executeStepAfterState(StationRequestBean reqBean, StepResult stepResult) { + if (!stepResult.isCompleted()) return; + //获取排序线工单队列推送锁数据, 返回的值是工单队列ID集合 + List queuePushIdList = productionCustomContextStepService.getSortQueuePushLockContext(reqBean); + if (CollectionUtils.isEmpty(queuePushIdList)) return; + //删除排序线工单队列推送锁数据 + queuePushIdList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> productionCustomContextStepService.removeSortQueuePushLockContext(reqBean, o)); + } + } 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 6b161f0..3836714 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 @@ -217,7 +217,6 @@ public class MesProductionCustomContextStepService extends BaseStepService imple @Override public String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, String repeatKey) { String repeatAssemblySnJson = getFsmBusiData(organizeCode, getRepeatAssemblySnContextKey(organizeCode, workCenterCode, workCellCode), repeatKey); - //MesProductionAssemblyContext productionAssemblyContext = !StringUtils.isEmpty(repeatAssemblySnJson) ? JSONObject.parseObject(repeatAssemblySnJson, MesProductionAssemblyContext.class) : null; return repeatAssemblySnJson; } @@ -299,22 +298,33 @@ public class MesProductionCustomContextStepService extends BaseStepService imple //排序线工单队列推送锁数据KEY 【PS:生产线级别】 private String getSortQueuePushLockContextKey(StationRequestBean reqBean) { return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(MesPcnExtConstWords.QUEUE_PUSH_LOCK_CONTEXT).toString(); } - //获取排序线工单队列推送锁数据 + //获取排序线工单队列推送锁数据, 返回的值是工位代码 @Override public String getSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId) { + if (StringUtils.isEmpty(queuePushId)) return null; return getFsmBusiData(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); } - //保存排序线工单队列推送锁数据 + //获取排序线工单队列推送锁数据, 返回的值是工单队列ID集合 @Override - public Boolean dispatchSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId) { - return dispatchFsmBusiList(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); + public List getSortQueuePushLockContext(StationRequestBean reqBean) { + String queuePushIdListJson = getFsmBusiData(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), reqBean.getWorkCellCode()); + return StringUtils.isEmpty(queuePushIdListJson) ? null : JSONObject.parseArray(queuePushIdListJson, String.class); + } + + //保存排序线工单队列推送锁数据【保存LOCK信息:item=id,value=工位】【保存当前工位锁定的信息:item=工位,value=idList】 + @Override + public Boolean dispatchSortQueuePushLockContext(StationRequestBean reqBean, List queuePushIdList) { + if (CollectionUtils.isEmpty(queuePushIdList)) return false; + queuePushIdList.forEach(o -> dispatchFsmBusiData(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), o, reqBean.getWorkCellCode())); + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), reqBean.getWorkCellCode(), JSONObject.toJSONString(queuePushIdList)); } //删除排序线工单队列推送锁数据 @Override public void removeSortQueuePushLockContext(StationRequestBean reqBean, String queuePushId) { - removeFsmBusiList(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); + if (!StringUtils.isEmpty(queuePushId)) return; + removeFsmBusiData(reqBean.getOrganizeCode(), getSortQueuePushLockContextKey(reqBean), queuePushId); } } From 4cbaf37b1314ceb37edbb23a992dd89a727f9370 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Sun, 9 Mar 2025 17:08:29 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=8F=91=E8=BF=90RFID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java | 2 +- .../java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java index 2c93f1a..48356f0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesShippingQueueService.java @@ -45,7 +45,7 @@ public class MesShippingQueueService implements IMesShippingQueueService { public MesCimSeresJisRfid getCimSeresJisRfid(String organizeCode, String vin) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(vin)) return null; return cimSeresJisRfidRepository.getByProperty( - new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.VIN_CODE, MesPcnExtConstWords.STATUS}, + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.VIN, MesPcnExtConstWords.STATUS}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), vin, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}); } } 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 1da25f7..6f1e9e3 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 @@ -834,6 +834,8 @@ public class MesPcnExtConstWords { // 车型名称 public static final String CAR_MODEL_NAME = "carModelName"; + // VIN + public static final String VIN = "vin"; // VIN_CODE public static final String VIN_CODE = "vinCode"; // VIN_CODE 后四位