From 933eef1adb4db6f4754bcb3f982baf1e086a837d Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Tue, 25 Feb 2025 13:15:43 +0800 Subject: [PATCH] =?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 --- .../mes/pcn/api/base/IMesProdOrgExtService.java | 8 +- .../IMesProductionProcessContextStepService.java | 3 + .../pcn/api/busi/IMesQueueOrderPushService.java | 22 ++++ .../serviceimpl/base/MesProdOrgExtService.java | 21 ++-- .../serviceimpl/busi/MesQueueOrderPushService.java | 85 +++++++++++++++ .../step/MesShippingQueueFindStepService.java | 2 +- .../step/MesWorkOrderQueueAcceptStepService.java | 116 +++++++++++++++++++++ .../step/MesWorkOrderQueuePushStepService.java | 81 ++++++++++++++ .../step/MesWorkOrderQueueSaveStepService.java | 8 +- .../MesProductionProcessContextStepService.java | 18 ++++ .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 8 ++ 11 files changed, 355 insertions(+), 17 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueuePushStepService.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesProdOrgExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesProdOrgExtService.java index 979e94d..1e8d145 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesProdOrgExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesProdOrgExtService.java @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.api.base; -import cn.estsh.i3plus.pojo.mes.bean.MesCraft; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCellExtendCfg; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.*; import io.swagger.annotations.ApiOperation; import java.util.List; @@ -56,4 +53,7 @@ public interface IMesProdOrgExtService { @ApiOperation(value = "根据生产线代码,工位代码查询主子工位实虚关系信息") List getWorkCellExtendCfgRvListByBak(String organizeCode, String workCenterCodeBak, String workCellCodeBak); + @ApiOperation(value = "根据生产线代码,工位代码查询生产队列推送工位配置信息") + List getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode, String workCellCode); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java index ea35a52..fc5dc9f 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java @@ -188,4 +188,7 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "获取加工不可用规则, key = 数据来源&来源ID") Map> getProdRuleIgnoreCfgContextMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + @ApiOperation(value = "处理排序线推单配置上下文, 返回推送工位类型对应的配置信息") + List dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean, Integer pushType); + } 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 new file mode 100644 index 0000000..f4d92f8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java @@ -0,0 +1,22 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface IMesQueueOrderPushService { + + //递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30 + @ApiOperation(value = "获取当前工单对应的工位推单队列中最大的顺序号") + Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo); + + @ApiOperation(value = "写入工位工单推送信息") + void insertQueueOrderPush(String organizeCode, String userInfo, MesProduceSn produceSn, List queueOrderPushCellCfgList); + + @ApiOperation(value = "根据配置查询生产队列工位推送信息") + List getQueueOrderPushList(String organizeCode, List queueOrderPushCellCfgList, Integer count); + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdOrgExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdOrgExtService.java index c5a840e..bc4819c 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdOrgExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesProdOrgExtService.java @@ -5,14 +5,8 @@ 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.MesCraft; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCellExtendCfg; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; -import cn.estsh.i3plus.pojo.mes.repository.MesCraftRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellExtendCfgRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkCenterRepository; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,6 +33,9 @@ public class MesProdOrgExtService implements IMesProdOrgExtService { @Autowired private MesWorkCellExtendCfgRepository workCellExtendCfgRepository; + @Autowired + private MesQueueOrderPushCellCfgRepository queueOrderPushCellCfgRepository; + @Override public MesWorkCenter getWorkCenterDb(String organizeCode, String workCenterCode) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null; @@ -186,4 +183,12 @@ public class MesProdOrgExtService implements IMesProdOrgExtService { return getWorkCellExtendCfgList(organizeCode, workCellExtendCfg.getWorkCenterCode(), workCellExtendCfg.getWorkCellCode(), MesExtEnumUtil.WORK_CELL_EXTEND_TYPE.RV.getValue()); } + @Override + public List getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode, String workCellCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; + return queueOrderPushCellCfgRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode}); + } + } 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 new file mode 100644 index 0000000..eb7ad9a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java @@ -0,0 +1,85 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +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.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class MesQueueOrderPushService implements IMesQueueOrderPushService { + + @Autowired + private MesQueueOrderPushRepository queueOrderPushRepository; + + //获取当前工单对应的工位推单队列中最大的顺序号; 递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30 + @Override + public Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return MesPcnExtConstWords.TEN; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PROCESS_SEQ}, packBean); + MesQueueOrderPush queueOrderPushDb2MaxSeq = queueOrderPushRepository.getByProperty(packBean); + return ((null == queueOrderPushDb2MaxSeq || queueOrderPushDb2MaxSeq.getProcessSeq().compareTo(MesPcnExtConstWords.ZERO) == 0) + ? MesPcnExtConstWords.ONE : (queueOrderPushDb2MaxSeq.getProcessSeq() / MesPcnExtConstWords.TEN + 1) + ) * MesPcnExtConstWords.TEN; + } + + //写入工位工单推送信息 + @Override + public void insertQueueOrderPush(String organizeCode, String userInfo, MesProduceSn produceSn, List queueOrderPushCellCfgList) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(userInfo) || null == produceSn || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return; + Integer processSeq = getQueueOrderPushMaxSeq(organizeCode, produceSn.getWorkOrderNo()); + for (MesQueueOrderPushCellCfg queueOrderPushCellCfg : queueOrderPushCellCfgList) { + if (null == queueOrderPushCellCfg) continue; + MesQueueOrderPush queueOrderPush = new MesQueueOrderPush(); + queueOrderPush.setPushSourceCode(queueOrderPushCellCfg.getPushSourceCode()); + queueOrderPush.setWorkOrderNo(produceSn.getWorkOrderNo()); + queueOrderPush.setProductSn(produceSn.getProductSn()); + queueOrderPush.setCustSn(produceSn.getCustSn()); + queueOrderPush.setProcessSeq(processSeq); + queueOrderPush.setQueueStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()); + queueOrderPush.setAreaCode(queueOrderPushCellCfg.getAreaCode()); + queueOrderPush.setWorkCenterCode(queueOrderPushCellCfg.getWorkCenterCode()); + queueOrderPush.setSourceWorkCellCode(queueOrderPushCellCfg.getWorkCellCode()); + queueOrderPush.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(queueOrderPush, userInfo); + queueOrderPushRepository.insert(queueOrderPush); + } + } + + //根据配置查询生产队列工位推送信息 + @Override + public List getQueueOrderPushList(String organizeCode, List queueOrderPushCellCfgList, Integer count) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return null; + + //搜集推送来源代码 去重 + List pushSourceCodeList = (queueOrderPushCellCfgList.stream() + .filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()) + ).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(pushSourceCodeList)) return null; + + //根据生产线代码,推送来源代码集合查询创建状态的生产队列工位推送信息【创建时间正序】 + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(queueOrderPushCellCfgList.get(0).getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue(), MesPcnExtConstWords.QUEUE_STATUS, packBean); + if (pushSourceCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pushSourceCodeList.get(0), MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean); + else DdlPreparedPack.getInPackList(pushSourceCodeList, MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.ASC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); + return queueOrderPushRepository.findByHqlTopWhere(packBean, count); + + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java index 86ba506..ffc7fe1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java @@ -120,7 +120,7 @@ public class MesShippingQueueFindStepService extends BaseStepService { if (null == shippingQueue) { return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, - false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo), + false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo), getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); } 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 new file mode 100644 index 0000000..99d8bf8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java @@ -0,0 +1,116 @@ +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; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +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.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; + +/** + * @Description : 工位工单接收工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderQueueAcceptStepService") +public class MesWorkOrderQueueAcceptStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private IMesQueueOrderPushService queueOrderPushService; + + @Autowired + private IFsmCommonService fsmCommonService; + + protected static Map queueAcceptLockMap = new ConcurrentHashMap<>(); + + @Override + public StepResult init(StationRequestBean reqBean) { + + StepResult stepResult = StepResult.getSuccessComplete(); + + String endlessLoopReadTimes = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES); + if (StringUtils.isEmpty(endlessLoopReadTimes)) endlessLoopReadTimes = MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES_DEFAULT; + if (productionDispatchContextStepService.dispatchOverEndlessLoopReadTimes(reqBean, endlessLoopReadTimes)) { + stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, new StationResultBean().isWs(false), + stepResult.isCompleted(false).msg(String.format("当前未获取到工位工单队列超过[%s]次!", endlessLoopReadTimes)), + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //发送工步内容 + productionCustomContextStepService.sendStepContextMessage(reqBean); + + return stepResult; + + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】 + List queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue()); + if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), + String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getDescription())); + + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //根据配置查询生产队列工位推送信息 + List queueOrderPushList = queueOrderPushService.getQueueOrderPushList(reqBean.getOrganizeCode(), queueOrderPushCellCfgList, cellEquipContext.getCavity()); + if (CollectionUtils.isEmpty(queueOrderPushList) || queueOrderPushList.size() != cellEquipContext.getCavity()) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + CollectionUtils.isEmpty(queueOrderPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", queueOrderPushList.size(), cellEquipContext.getCavity()), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + + + + + + 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/MesWorkOrderQueuePushStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueuePushStepService.java new file mode 100644 index 0000000..f81c911 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueuePushStepService.java @@ -0,0 +1,81 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.util.StringUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description : 工位工单推送工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderQueuePushStepService") +public class MesWorkOrderQueuePushStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesQueueOrderPushService queueOrderPushService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //处理排序线推单配置上下文, 返回推送工位类型对应的配置信息 【来源工位】 + List queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getValue()); + if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), + stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息,当前跳过工位工单推送!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getDescription())); + } + + //获取上下文产出条码数据信息集合 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); + + //写入工位工单推送信息 + productionPsOutContextList.stream().forEach(o -> queueOrderPushService.insertQueueOrderPush(reqBean.getOrganizeCode(), reqBean.getUserInfo(), o, queueOrderPushCellCfgList)); + + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- ORDER:{} --- PUSH_SOURCE_CODE:{}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), + productionPsOutContextList.stream().filter(o -> null != o).map(MesProductionPsOutContext::getWorkOrderNo).collect(Collectors.toList()).toString(), + queueOrderPushCellCfgList.stream().filter(o -> null != o).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()).toString()); + + 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/MesWorkOrderQueueSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java index 31c49e1..bcb6a9c 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java @@ -67,12 +67,12 @@ public class MesWorkOrderQueueSaveStepService extends BaseStepService { } private void saveWorkOrderQueue(StationRequestBean reqBean, MesProductionPsInContext productionPsInContext) { -// if (!StringUtils.isEmpty(productionPsInContext.getProcessCode()) && productionPsInContext.getProcessCode().equals(reqBean.getProcessCode())) return; - queueOrderRepository.updateByProperties( + if (StringUtils.isEmpty(productionPsInContext.getRelateId())) return; + queueOrderRepository.updateByPropertiesNoSync( new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{productionPsInContext.getRelateId(), reqBean.getOrganizeCode()}, - new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.STATUS}, - new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue()}); + new String[]{MesPcnExtConstWords.STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); } } 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 7da3dcb..e817ad2 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 @@ -655,4 +655,22 @@ public class MesProductionProcessContextStepService extends BaseStepService impl .collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getDataSource().toString()).add(o.getEquipmentCode()).add(o.getSourceId().toString()).toString())); } + //处理排序线推单配置上下文, 返回推送工位类型对应的配置信息 + @Override + public List dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean, Integer pushType) { + List queueOrderPushCellCfgList = dispatchQueueOrderPushCellCfgContext(reqBean); + return CollectionUtils.isEmpty(queueOrderPushCellCfgList) ? null : + queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPushType()) && o.getPushType().compareTo(pushType) == 0)).collect(Collectors.toList()); + } + + //处理排序线推单配置上下文 + private List dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean) { + String queuePushCfgJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CFG_CONTEXT); + if (!StringUtils.isEmpty(queuePushCfgJson)) return JSONObject.parseArray(queuePushCfgJson, MesQueueOrderPushCellCfg.class); + //根据生产线代码,工位代码查询生产队列推送工位配置信息 + List queueOrderPushCellCfgList = prodOrgExtService.getQueueOrderPushCellCfgList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + if (!CollectionUtils.isEmpty(queueOrderPushCellCfgList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CFG_CONTEXT, JSONObject.toJSONString(queueOrderPushCellCfgList)); + return queueOrderPushCellCfgList; + } + } 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 62e9488..bf0592f 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,10 @@ public class MesPcnExtConstWords { public static final String SHIPPING_GROUP_NAME = "shippingGroupName"; //队列状态 public static final String QUEUE_STATUS = "queueStatus"; + //工艺顺序号 + public static final String PROCESS_SEQ = "processSeq"; + //推送来源代码 + public static final String PUSH_SOURCE_CODE = "pushSourceCode"; //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties) @@ -517,6 +521,8 @@ public class MesPcnExtConstWords { public static final Integer FOUR = 4; //7 public static final Integer SEVEN = 7; + //10 + public static final Integer TEN = 10; //14 public static final Integer FOURTEEN = 14; //60 @@ -623,6 +629,8 @@ public class MesPcnExtConstWords { public static final String EQUIP_SPOT_CHECK_CONTEXT = "EQUIP_SPOT_CHECK_CONTEXT"; // 加工不可用规则上下文 public static final String PROD_RULE_IGNORE_CFG_CONTEXT = "PROD_RULE_IGNORE_CFG_CONTEXT"; + // 队列推送配置上下文 + public static final String QUEUE_PUSH_CFG_CONTEXT = "QUEUE_PUSH_CFG_CONTEXT"; // 上下文: 展示组件数据 public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT";