From cfea02b3b70430ae37903a734ae601fc7fd36de1 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Tue, 9 Jul 2024 09:14:37 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E9=98=B2=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/api/busi/IMesAssemblyExtService.java | 3 + .../mes/pcn/api/busi/IMesProduceSnExtService.java | 3 + .../mes/pcn/api/busi/IMesWorkOrderExtService.java | 3 + .../serviceimpl/busi/MesAssemblyExtService.java | 12 + .../serviceimpl/busi/MesProduceSnExtService.java | 9 + .../serviceimpl/busi/MesWorkOrderExtService.java | 10 + .../step/MesProduceSeqCheckStepService.java | 412 ++++++++++++--------- .../pcn/pojo/context/MesProductionPartContext.java | 3 + .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 4 + 9 files changed, 277 insertions(+), 182 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java index a346317..0dd5ceb 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java @@ -36,4 +36,7 @@ public interface IMesAssemblyExtService { @ApiOperation(value = "【排序线】获取生产工单装配件清单") List getWorkOrderAssemblyList(String organizeCode, String workOrderNo, String productSn, String craftCode); + @ApiOperation(value = "【排序线】获取生产工单装配件清单") + List getWorkOrderAssemblyList(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo, List productSnList); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java index 785abcf..c59ed65 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java @@ -19,6 +19,9 @@ public interface IMesProduceSnExtService { @ApiOperation(value = "根据零件条码查询零件条码信息") Map> getProduceSnMap(String organizeCode, List productSnList); + @ApiOperation(value = "根据生产工单,生产线,工位查询工位队列信息") + List getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo); + @ApiOperation(value = "根据零件条码,生产线,工位查询工位队列信息") List getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, List productSnList); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java index 75afd21..f8d2e4e 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java @@ -14,6 +14,9 @@ public interface IMesWorkOrderExtService { @ApiOperation(value = "根据生产工单ID查询生产工单信息") MesWorkOrder getWorkOrder(String organizeCode, Long id); + @ApiOperation(value = "根据生产工单顺序号,生产线代码查询上一个生产工单信息") + MesWorkOrder getWorkOrder(String organizeCode, String workCenterCode, Long produceSeq); + MesWorkOrder insert(MesWorkOrder item); void update(MesWorkOrder item); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java index b28536a..623afd3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java @@ -164,6 +164,18 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workOrderNo, productSn, craftCode}); } + @Override + public List getWorkOrderAssemblyList(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo, List productSnList) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || StringUtils.isEmpty(workOrderNo) || CollectionUtils.isEmpty(productSnList)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getStringEqualPack(workCellCode, MesPcnExtConstWords.WORK_CELL_CODE, packBean); + DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); + else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean); + return workOrderAssemblyRepository.findByHqlWhere(packBean); + } + //剔除解绑的数据 private List filterProductionAssemblyList(List productionAssemblyList) { return CollectionUtils.isEmpty(productionAssemblyList) ? null : productionAssemblyList.stream().filter(o -> (null != o && MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_20.getValue() != o.getAssemblyStatus())).collect(Collectors.toList()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java index a6c721d..4b0c3de 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java @@ -65,6 +65,15 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { } + //根据生产工单,生产线,工位查询工位队列信息 + @Override + public List getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return null; + return queueOrderRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE, MesPcnExtConstWords.WORK_ORDER_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode, workOrderNo}); + } + //根据零件条码,生产线,工位查询工位队列信息 @Override public List getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, List productSnList) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java index d814c70..01e6ecd 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java @@ -50,6 +50,16 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService { new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id}); } + //根据生产工单顺序号,生产线代码查询上一个生产工单信息 + @Override + public MesWorkOrder getWorkOrder(String organizeCode, String workCenterCode, Long produceSeq) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || (StringUtils.isEmpty(produceSeq) || produceSeq.compareTo(0L) == 0)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getNumberSmallerPack(produceSeq, MesPcnExtConstWords.PRODUCE_SEQ, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PRODUCE_SEQ}, packBean); + return workOrderRepository.getByProperty(packBean); + } @Override @MonitorLog diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProduceSeqCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProduceSeqCheckStepService.java index 749be2e..a7cf0f7 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProduceSeqCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProduceSeqCheckStepService.java @@ -1,182 +1,230 @@ -//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.pojo.context.MesProductionPartContext; -//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.pojo.base.enumutil.CommonEnumUtil; -//import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -//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 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.ArrayList; -//import java.util.List; -//import java.util.Optional; -// -///** -// * @Description : 生产工单顺序防错 -// * @Author : wangjie -// **/ -//@Slf4j -//@Service("mesProduceSeqCheckStepService") -//public class MesProduceSeqCheckStepService extends BaseStepService { -// -// @Autowired -// private IMesProductionProcessContextStepService productionProcessContextStepService; -// -// @Autowired -// private IMesProductionDispatchContextStepService productionDispatchContextStepService; -// -// @Override -// public StepResult execute(StationRequestBean reqBean) { -// -// StationResultBean resultBean = new StationResultBean(); -// -// StepResult stepResult = StepResult.getSuccessComplete(); -// -// //获取上下文信息 -// MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean); -// -// //获取生产过程上下文对象有异常信息 抛出异常 -// if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); -// -// //存储生产过程上下文对象 -// productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); -// -// //获取上下文产出零件信息 -// List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); -// -// //验证是否存在加工单 -// if (!checkIsExistWorkOrder(productionPartContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无加工单信息,无需进行顺序防错验证!"); -// -// //验证工位是否设置需要顺序防错 -// if (!isNeedCheckProduceSeq(productionPartContextList)) -// return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("生产线[%s]工位[%s]未设置顺序防错,无需进行顺序防错验证!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); -// -// //验证是否存在工艺强过码, 存在则保存 并返回强过的加工单 -// List workOrderNoList2Jump = doHandleCraftJumpCode(reqBean, productionPartContextList); -// if (!CollectionUtils.isEmpty(workOrderNoList2Jump)) -// return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(workOrderNoList2Jump.toString()), stepResult, String.format("加工单%s跳过顺序防错验证成功!", workOrderNoList2Jump.toString())); -// -// //验证是否已经全部通过 -// if (!isExistNeedCheckProduceSeq(productionPartContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "加工单均已通过顺序防错验证!"); -// -// //顺序防错验证处理 -// doHandleProduceSeqCheck(reqBean, resultBean, stepResult, productionProcessContext, productionProcessContext.getWorkCenter(), productionPartContextList); -// -// return stepResult; -// -// } -// -// //验证是否存在加工单 -// private Boolean checkIsExistWorkOrder(List productionPartContextList) { -// -// if (CollectionUtils.isEmpty(productionPartContextList)) return false; -// -// Optional optional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst(); -// -// return (null == optional || !optional.isPresent()) ? false : true; -// -// } -// -// //验证工位是否设置需要前道防错 -// private Boolean isNeedCheckProduceSeq(List productionPartContextList) { -// Optional optional = productionPartContextList.stream().filter(o -> (null != o && -// o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getIsCheckSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst(); -// return (null == optional || !optional.isPresent()) ? false : true; -// } -// -// //验证是否已经全部通过 -// private Boolean isExistNeedCheckProduceSeq(List productionPartContextList) { -// Optional optional = productionPartContextList.stream().filter(o -> (null != o && -// o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).findFirst(); -// return (null == optional || !optional.isPresent()) ? false : true; -// } -// -// //验证是否存在工艺强过码, 存在则保存 并返回强过的加工单 -// private List doHandleCraftJumpCode(StationRequestBean reqBean, List productionPartContextList) { -// -// List workOrderNoList2Jump = null; -// -// for (MesProductionPartContext productionPartContext : productionPartContextList) { -// -// if (null == productionPartContext || productionPartContext.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 || StringUtils.isEmpty(productionPartContext.getCraftJumpCode())) continue; -// -// if (CollectionUtils.isEmpty(workOrderNoList2Jump)) workOrderNoList2Jump = new ArrayList<>(); -// -// workOrderNoList2Jump.add(productionPartContext.getWorkOrderNo()); -// -// productionPartContext.checkSeqResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); -// -// } -// -// //保存上下文产出零件信息 -// if (!CollectionUtils.isEmpty(workOrderNoList2Jump)) productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); -// -// return workOrderNoList2Jump; -// -// } -// -// //顺序防错验证处理 -// private void doHandleProduceSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, List productionPartContextList) { -// -// List workOrderNoList = new ArrayList<>(); -// -// for (MesProductionPartContext productionPartContext : productionPartContextList) { -// -// if (null == productionPartContext || StringUtils.isEmpty(productionPartContext.getWorkOrderNo()) || productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; -// -// //顺序防错验证 -// Boolean result = doProduceSeqCheck(reqBean, stepResult, productionProcessContext, workCenter, productionPartContextList); -// -// if (!result) productionPartContext.setCheckSeqResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); -// else productionPartContext.setCheckSeqResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); -// -// workOrderNoList.add(productionPartContext.getWorkOrderNo()); -// -// } -// -// //保存上下文产出零件信息 -// productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); -// -// if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean.writeDbLog().scanInfo(workOrderNoList.toString()), String.format("加工单%s顺序防错验证成功!", workOrderNoList.toString()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); -// else this.sendMessage(reqBean, resultBean.writeDbLog().scanInfo(workOrderNoList.toString()), stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); -// -// } -// -// //顺序防错验证 -// private Boolean doProduceSeqCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, List productionPartContextList) { -// -// //排序 -// if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0) return doProduceSeqCheckSort(reqBean, stepResult, productionProcessContext, productionPartContextList); -// -// //非排序 -// return doProduceSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContextList); -// -// } -// -// //前道工艺防错验证 【排序】 -// private Boolean doProduceSeqCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList) { -// -// -// -// } -// -// //前道工艺防错验证 【非排序】 -// private Boolean doProduceSeqCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList) { -// -// -// -// } -// -//} +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.MesProductionPartContext; +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.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly; +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.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Description : 生产工单顺序防错 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProduceSeqCheckStepService") +public class MesProduceSeqCheckStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesWorkOrderExtService workOrderExtService; + + @Autowired + private IMesProduceSnExtService produceSnExtService; + + @Autowired + private IMesAssemblyExtService assemblyExtService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.doHandleCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文产出零件信息 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //验证是否存在加工单 + if (!checkIsExistWorkOrder(productionPartContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无加工单信息,无需进行顺序防错验证!"); + + //验证工位是否设置需要顺序防错 + if (!isNeedCheckProduceSeq(productionPartContextList)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("生产线[%s]工位[%s]未设置顺序防错,无需进行顺序防错验证!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + //验证是否存在工艺强过码, 存在则保存 并返回强过的加工单 + List workOrderNoList2Jump = doHandleCraftJumpCode(reqBean, productionPartContextList); + if (!CollectionUtils.isEmpty(workOrderNoList2Jump)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(workOrderNoList2Jump.toString()), stepResult, String.format("加工单%s跳过顺序防错验证成功!", workOrderNoList2Jump.toString())); + + //验证是否已经全部通过 + if (!isExistNeedCheckProduceSeq(productionPartContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "加工单均已通过顺序防错验证!"); + + //顺序防错验证处理 + doHandleProduceSeqCheck(reqBean, resultBean, stepResult, productionProcessContext, productionProcessContext.getWorkCenter(), productionPartContextList); + + return stepResult; + + } + + //验证是否存在加工单 + private Boolean checkIsExistWorkOrder(List productionPartContextList) { + + if (CollectionUtils.isEmpty(productionPartContextList)) return false; + + Optional optional = productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst(); + + return (null == optional || !optional.isPresent()) ? false : true; + + } + + //验证工位是否设置需要前道防错 + private Boolean isNeedCheckProduceSeq(List productionPartContextList) { + Optional optional = productionPartContextList.stream().filter(o -> (null != o && + o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getIsCheckSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst(); + return (null == optional || !optional.isPresent()) ? false : true; + } + + //验证是否已经全部通过 + private Boolean isExistNeedCheckProduceSeq(List productionPartContextList) { + Optional optional = productionPartContextList.stream().filter(o -> (null != o && + o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)).findFirst(); + return (null == optional || !optional.isPresent()) ? false : true; + } + + //验证是否存在工艺强过码, 存在则保存 并返回强过的加工单 + private List doHandleCraftJumpCode(StationRequestBean reqBean, List productionPartContextList) { + + List workOrderNoList2Jump = null; + + for (MesProductionPartContext productionPartContext : productionPartContextList) { + + if (null == productionPartContext || productionPartContext.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 || StringUtils.isEmpty(productionPartContext.getCraftJumpCode())) continue; + + if (CollectionUtils.isEmpty(workOrderNoList2Jump)) workOrderNoList2Jump = new ArrayList<>(); + + workOrderNoList2Jump.add(productionPartContext.getWorkOrderNo()); + + productionPartContext.checkSeqResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + + } + + //保存上下文产出零件信息 + if (!CollectionUtils.isEmpty(workOrderNoList2Jump)) productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); + + return workOrderNoList2Jump; + + } + + //顺序防错验证处理 + private void doHandleProduceSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, List productionPartContextList) { + + List workOrderNoList = new ArrayList<>(); + + for (MesProductionPartContext productionPartContext : productionPartContextList) { + + if (null == productionPartContext || StringUtils.isEmpty(productionPartContext.getWorkOrderNo()) || productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; + + //顺序防错验证 + Boolean result = doProduceSeqCheck(reqBean, stepResult, productionProcessContext, workCenter, productionPartContext); + + if (!result) productionPartContext.setCheckSeqResult(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + else productionPartContext.setCheckSeqResult(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + + workOrderNoList.add(productionPartContext.getWorkOrderNo()); + + } + + //保存上下文产出零件信息 + productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); + + if (stepResult.isCompleted()) this.sendMessage(reqBean, resultBean.writeDbLog().scanInfo(workOrderNoList.toString()), String.format("加工单%s顺序防错验证成功!", workOrderNoList.toString()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + else this.sendMessage(reqBean, resultBean.writeDbLog().scanInfo(workOrderNoList.toString()), stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + + } + + //顺序防错验证 + private Boolean doProduceSeqCheck(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, MesProductionPartContext productionPartContext) { + + //排序 + if (workCenter.getCenterType().compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0) return doProduceSeqCheckSort(reqBean, stepResult, productionProcessContext, productionPartContext); + + //非排序 + return doProduceSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext); + + } + + //前道工艺防错验证 【排序】 + private Boolean doProduceSeqCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext) { + + String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; + + //根据生产工单顺序号,生产线代码查询上一个生产工单信息 + MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProduceSeq()); + + if (null == workOrder) return true; + + if (workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()) < 0) + return stepResult.isCompleted(false).msg(String.format("%s加工单[%s]生产顺序号[%s]顺序防错验证失败,前一个加工单[%s]生产顺序号[%s]工单状态[%s]", + message, productionPartContext.getWorkOrderNo(), productionPartContext.getProduceSeq(), workOrder.getWorkOrderNo(), workOrder.getProduceSeq(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()))).isCompleted(); + + if (workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()) >= 0) return true; + + //根据生产工单,生产线,工位查询工位队列信息 + List queueOrderList = produceSnExtService.getQueueOrderList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrder.getWorkOrderNo()); + Optional optional = CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).findFirst(); + if (null == optional || !optional.isPresent()) return true; + + //根据未完成零件条码获取生产工单装配件清单 + List productSnList = queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).map(MesQueueOrder::getProductSn).collect(Collectors.toList()); + List workOrderAssemblyList = assemblyExtService.getWorkOrderAssemblyList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrder.getWorkOrderNo(), productSnList); + Map> productSnMap = CollectionUtils.isEmpty(workOrderAssemblyList) ? null : workOrderAssemblyList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssembly::getProductSn)); + if (CollectionUtils.isEmpty(productSnMap))return true; + + return stepResult.isCompleted(false).msg(String.format("%s加工单[%s]生产顺序号[%s]顺序防错验证失败,前一个加工单[%s]生产顺序号[%s]在当前工位[%s]存在未完成队列条码%s", + message, productionPartContext.getWorkOrderNo(), productionPartContext.getProduceSeq(), workOrder.getWorkOrderNo(), workOrder.getProduceSeq(), reqBean.getWorkCellCode(), productSnMap.keySet().toString())).isCompleted(); + + } + + //前道工艺防错验证 【非排序】 + private Boolean doProduceSeqCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext) { + + String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; + + //根据生产工单顺序号,生产线代码查询上一个生产工单信息 + MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProduceSeq()); + + if (null == workOrder) return true; + + if (workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()) >= 0) return true; + + return stepResult.isCompleted(false).msg(String.format("%s加工单[%s]生产顺序号[%s]顺序防错验证失败,前一个加工单[%s]生产顺序号[%s]工单状态[%s]", + message, productionPartContext.getWorkOrderNo(), productionPartContext.getProduceSeq(), workOrder.getWorkOrderNo(), workOrder.getProduceSeq(), MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()))).isCompleted(); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java index 1ef8ef7..76313c5 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java @@ -64,6 +64,9 @@ public class MesProductionPartContext implements Serializable { @ApiParam("信息来源") private Integer messageSource; + @ApiParam("生产序号") + private Long produceSeq; + @ApiParam("客户订单号【用于发送设备加工参数】") private String custOrderNo; 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 a979fc8..7caee13 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 @@ -147,6 +147,8 @@ public class MesPcnExtConstWords { public static final String MOULD_RECORD_ID = "mouldRecordId"; // 工步代码 public static final String STEP_CODE = "stepCode"; + // 生产顺序号 + public static final String PRODUCE_SEQ = "produceSeq"; // 时间格式 public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; @@ -231,6 +233,8 @@ public class MesPcnExtConstWords { public static final String NEXT_TRIGGER_EVENT_ASSEMBLY = "ASSEMBLY"; // 自定义触发事件: 主条码 public static final String NEXT_TRIGGER_EVENT_PRODUCT_SN = "PRODUCT_SN"; + // 自定义触发事件: 工单 + public static final String NEXT_TRIGGER_EVENT_ORDER = "ORDER"; // 工序完成 public static final String PROCESS_COMPLETE = "processComplete";