From b7ec1aa8c1c67533b3864857d205ae10e52fa217 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Fri, 29 Nov 2024 11:54:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E6=8E=92=E5=BA=8F/=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=20=E5=89=8D=E9=81=93=E9=98=B2=E9=94=99=20=E5=B7=A5=E5=BA=8F?= =?UTF-8?q?=E6=9C=80=E5=A4=A7=E6=89=A7=E8=A1=8C=E6=AC=A1=E6=95=B0=20?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=20=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=20;?= =?UTF-8?q?=20=E5=B7=A5=E5=8D=95=E4=BF=AE=E6=94=B9=E5=B7=A5=E6=AD=A5=20?= =?UTF-8?q?=E5=8F=98=E6=9B=B4=E5=B7=A5=E5=8D=95=E7=8A=B6=E6=80=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MesProdCraftRouteCheckNosortStepService.java | 6 +- .../MesProdCraftRouteCheckSortStepService.java | 5 +- .../step/MesWorkOrderCheckSortStepServiceBak.java | 295 +++++++++++++++++++++ .../step/MesWorkOrderQueueSaveStepService.java | 2 + .../step/MesWorkOrderSaveNosortStepService.java | 2 +- 5 files changed, 304 insertions(+), 6 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckNosortStepService.java index 1877662..c1f6ee9 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckNosortStepService.java @@ -181,14 +181,14 @@ public class MesProdCraftRouteCheckNosortStepService extends MesProdCraftRouteCh List productionRecordList = null; //验证已完成工序最大重复次数: 如果当前工位的工序与主条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数 - //[已完成工序最大重复次数这里判断必须大于1才进行验证的原因: 1.假如每次都进行验证会影响效率 2.即使不验证,只要当前没有配置自进自出的加工规则的情况下,后面也会拦截报错的 3.如果配置了自进自出,看实际业务是否需要自进自出,如果不需要就是配置错误,需要的话那就是允许重复扫描,那这边就应该设置大于1的值,此时就会进行重做次数验证] - if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) { + if (null != optionalPs && optionalPs.isPresent() && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) { //根据零件条码查询加工记录信息 productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn()); //条码+物料+工序+工艺搜集加工记录 List filterList = CollectionUtils.isEmpty(productionRecordList) ? null : productionRecordList.stream().filter(o -> (null != o && o.getPartNo().equals(productionPsInContext.getPartNo()) && o.getProcessCode().equals(reqBean.getProcessCode()) && o.getCraftCode().equals(productionProcessContext.getCraftCode()))).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(filterList) && filterList.size() >= optionalPs.get().getRepeatTimes()) + if (!CollectionUtils.isEmpty(filterList) && filterList.size() >= + ((!StringUtils.isEmpty(optionalPs.get().getRepeatTimes()) && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ZERO) > 0) ? optionalPs.get().getRepeatTimes() : MesPcnExtConstWords.ONE)) return stepResult.isCompleted(false).msg(String.format("%s%s[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]", message, suffix, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted(); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckSortStepService.java index 0a1b906..c6d708e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProdCraftRouteCheckSortStepService.java @@ -11,6 +11,7 @@ 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.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -151,9 +152,9 @@ public class MesProdCraftRouteCheckSortStepService extends MesProdCraftRouteChec } //验证已完成工序最大重复次数: 如果当前工位的工序与产品条码的当前工序一致的情况下, 根据条码+物料+工序+工艺查询加工记录, 判断加工记录条数 - if (null != optionalPs && optionalPs.isPresent() && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ONE) > 0 && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) { + if (null != optionalPs && optionalPs.isPresent() && reqBean.getProcessCode().equals(productionPsInContext.getProcessCode())) { List productionRecordList = productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), productionPsInContext.getPartNo(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()); - if (!CollectionUtils.isEmpty(productionRecordList) && productionRecordList.size() >= optionalPs.get().getRepeatTimes()) + if (!CollectionUtils.isEmpty(productionRecordList) && productionRecordList.size() >= ((!StringUtils.isEmpty(optionalPs.get().getRepeatTimes()) && optionalPs.get().getRepeatTimes().compareTo(MesPcnExtConstWords.ZERO) > 0) ? optionalPs.get().getRepeatTimes() : MesPcnExtConstWords.ONE)) return stepResult.isCompleted(false).msg(String.format("%s产品条码[%s]当前工序[%s]产品工艺路线[%s]已完成工序最大重复次数[%s]", message, productionPsInContext.getProductSn(), reqBean.getProcessCode(), craftRouteDetailList.get(0).getCraftRouteCode(), optionalPs.get().getRepeatTimes())).isCompleted(); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java new file mode 100644 index 0000000..df835e8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java @@ -0,0 +1,295 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; +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.MesProduceSn; +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.model.StationKvBean; +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.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +/** + * @Description : 加工单验证工步 【排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderCheckSortStepServiceBak") +public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepService { + + @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 equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前缺失待验证的加工单信息!"); + + //清除本次已获取得到的加工单信息 + productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean); + + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //获取上下文产出零件信息 + List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + List cachedProductionPsInContextList = null; + List cachedProductionPsOutContextList = null; + if (!CollectionUtils.isEmpty(cachedProductionPartContextList)) { + //获取工单对应的条码数据信息 + cachedProductionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + //获取工单对应的产出条码数据信息 + cachedProductionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + } + + //非扫描场景 清除历史产出零件信息 + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) cachedProductionPartContextList = removeBusiData(reqBean); + + //验证扫描信息是否属于工艺强过码 + Boolean isCraftJumpCode = matchCraftJumpCode(productionProcessContext, equipVariableCollectContextList); + + //验证是否支持跳过 + Boolean isAllowJump = checkIsAllowJump(cachedProductionPartContextList, cachedProductionPsInContextList); + + //不属于工艺强过码,如果此前存在顺序或者工艺验证失败的数据 则清除此前的产出零件信息 + if (!isCraftJumpCode && isAllowJump) { + //删除上下文产出零件信息/产品条码数据 + removeProductionPartAndPsInContext(reqBean); + + cachedProductionPartContextList = null; + cachedProductionPsInContextList = null; + } + + //当前不允许跳过 + if (isCraftJumpCode && !isAllowJump) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()). + scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的加工单信息!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + + //允许跳过,先更新数据 + if (isCraftJumpCode && isAllowJump) { + updateProductionPartAndPsInContextList(reqBean, cachedProductionPartContextList, cachedProductionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue()); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()). + scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + } + + //验证工单的有效性 + List productionPartContextList = new ArrayList<>(); + List productionPsInContextList = new ArrayList<>(); + List productionPsOutContextList = new ArrayList<>(); + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, + equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + + //扫描场景下合并历史产出零件信息/产品条码信息 + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) { + productionPartContextList.addAll(cachedProductionPartContextList); + productionPsInContextList.addAll(cachedProductionPsInContextList); + productionPsOutContextList.addAll(cachedProductionPsOutContextList); + } + + //验证是否全部为空腔 + if (partDataMapSaveStepService.checkIsAllFinishCode(productionPartContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前加工单信息全部为空腔,已清除当前的空腔数据!"); + + //验证是否存在相同的零件生产组的加工单, 存在则清除已缓存的数据 + if (checkPartProdGroupCodeIsExistRepeat(reqBean, productionPartContextList, cachedProductionPartContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "不支持生产相同的零件生产组的加工单,已清除当前的加工单数据!"); + + //保存零件数据信息 + if (!partDataMapSaveStepService.savePartDataMap2PPC(reqBean, resultBean, stepResult, productionPartContextList, true, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + + //保存上下文产出零件信息 + productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList); + //保存上下文产品条码信息 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + //保存上下文产出条码信息 + productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList); + + //存储展示组件MODULE_CONTENT内容 + productionDispatchContextStepService.dispatchModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList)); + + //当前工位使用的设备 + MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0) + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, false, + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!", + equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size())); + + String workOrderStr = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(workOrderStr), stepResult, String.format("当前%s加工单%s验证工单状态成功%s!", + MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource()), workOrderStr, + (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && productionPartContextList.size() > 1) ? String.format(",当前加工单个数[%s]已满足腔数", productionPartContextList.size()) : MesPcnExtConstWords.EMPTY)); + + } + + //验证是否支持跳过 + private Boolean checkIsAllowJump(List productionPartContextList, List productionPsInContextList) { + Optional optional1 = CollectionUtils.isEmpty(productionPartContextList) ? null : + productionPartContextList.stream().filter(o -> (null != o && (o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCustomCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst(); + Optional optional2 = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); + if (null != optional1 && optional1.isPresent()) return true; + if (null != optional2 && optional2.isPresent()) return true; + return false; + } + + //验证扫描信息属于工艺强过码 并且支持跳过,进行数据变更 + private void updateProductionPartAndPsInContextList(StationRequestBean reqBean, List productionPartContextList, List productionPsInContextList, String craftJumpCode) { + productionPartContextList.forEach(o -> { + if (o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && + (o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0 || o.getCustomCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0)) o.setCraftJumpCode(craftJumpCode); + }); + productionPsInContextList.forEach(o -> { + if (o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) o.setCraftJumpCode(craftJumpCode); + }); + //保存上下文产出零件信息 + productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList); + //保存上下文条码信息 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + } + + //验证工单的有效性 + private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, + MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, + List equipVariableCollectContextList, List productionPartContextList, + List productionPsInContextList, List productionPsOutContextList) { + + //搜集生产工单号 + List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + List workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList()); + + Map> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList); + + for (String workOrderNo : workOrderNoList) { + + if (StringUtils.isEmpty(workOrderNo)) continue; + + Map itemMap = CollectionUtils.isEmpty(workOrderMap) ? null : workOrderMap.get(workOrderNo); + if (CollectionUtils.isEmpty(itemMap)) + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单号[%s]无效!", workOrderNo)); + if (itemMap.containsKey(MesPcnExtConstWords.MESSAGE)) + return stepResult.isCompleted(false).msg((String) itemMap.get(MesPcnExtConstWords.MESSAGE)); + + MesWorkOrder workOrder = (MesWorkOrder) itemMap.get(MesWorkOrder.class.getSimpleName()); + MesProduceSn produceSn = (MesProduceSn) itemMap.get(MesProduceSn.class.getSimpleName()); + + if (!workOrder.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrder.getWorkCenterCode(), reqBean.getWorkCenterCode())); + if (StringUtils.isEmpty(workOrder.getPartProdGroupCode())) + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]信息未关联零件生产组!", workOrderNo)); + + //排序线支持当前工序重做, 前道工艺防错工步验证最大重做次数: 如果工单已经是完成状态, 验证当前工位是否是末道工位, 并且条码已经是当前工序的情况下不卡工单完成状态 + if (workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) == 0) { + if (StringUtils.isEmpty(produceSn.getProcessCode()) || !produceSn.getProcessCode().equals(reqBean.getProcessCode()) || + StringUtils.isEmpty(productionProcessContext.getWorkCell().getIsEndWorkCell()) || productionProcessContext.getWorkCell().getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) { + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()))); + } + } else if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workCenter.getCenterType(), workOrder.getWorkOrderStatus())) { + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrder.getWorkOrderStatus()))); + } + + if ((StringUtils.isEmpty(workCenter.getIsIgnoreQc()) || workCenter.getIsIgnoreQc().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) && produceSn.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue()) >= 0) + return stepResult.isCompleted(false).msg(String.format("请检查工单信息,加工单[%s]质量状态[%s]", workOrderNo, MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()))); + if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() <= produceSn.getSnStatus() || MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus()) + return stepResult.isCompleted(false).msg(String.format("请检查工单产品条码信息,产品条码[%s]条码状态[%s]", produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()))); + + MesQueueOrder queueOrder = (MesQueueOrder) itemMap.get(MesQueueOrder.class.getSimpleName()); + //排序线支持当前工序重做, 前道工艺防错工步验证最大重做次数 : 如果条码已经是当前工序的情况下不限制队列状态的完成状态 + if ((StringUtils.isEmpty(produceSn.getProcessCode()) || !produceSn.getProcessCode().equals(reqBean.getProcessCode())) && MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrder.getStatus()) + return stepResult.isCompleted(false).msg(String.format("请检查工单工位队列信息,加工单[%s]工位队列状态[%s]", workOrderNo, MesExtEnumUtil.QUEUE_ORDER_STATUS.valueOfDescription(queueOrder.getStatus()))); + + //封装产成零件 + MesProductionPartContext productionPartContext = new MesProductionPartContext().copyPartNo(workOrder, equipVariableCollectContextList.get(0).getMessageSource()).isCheck(productionProcessContext.getWorkCell()); + if (StringUtils.isEmpty(productionPartContext.getOnlineTime())) productionPartContext.setOnlineTime(TimeTool.getNowTime(true)); + productionPartContextList.add(productionPartContext); + + //封装产品条码 + productionPsInContextList.add(new MesProductionPsInContext(produceSn).isCheck(productionProcessContext.getWorkCell()).messageSource(equipVariableCollectContextList.get(0).getMessageSource()).relateId(queueOrder.getId())); + + //封装产出条码 + MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn); + if (StringUtils.isEmpty(productionPsOutContext.getInWorkCenterTime())) productionPsOutContext.setInWorkCenterTime(productionPartContext.getOnlineTime()); + productionPsOutContextList.add(productionPsOutContext); + + } + + //封装空腔 + equipVariableCollectContextList.stream().filter(o -> (null != o && o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).forEach(o -> { + productionPartContextList.add(new MesProductionPartContext().isFinishCode()); + productionPsInContextList.add(new MesProductionPsInContext().isFinishCode()); + }); + + return stepResult; + + } + + //封装展示组件MODULE_CONTENT内容 + private List> getModuleContextData(StationRequestBean reqBean, List productionPartContextList) { + + List> dataList = new ArrayList<>(); + + List orderList = partDataMapSaveStepService.filterProductionPartContext(productionPartContextList, true); + List finishCodeList = partDataMapSaveStepService.filterProductionPartContext(productionPartContextList, false); + + AtomicReference index = new AtomicReference<>(0); + + if (!CollectionUtils.isEmpty(orderList)) { + orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), + new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), + new StationKvBean(MesPcnExtConstWords.CAR_MODEL_CODE, "车型配置", o.getCarModelCode()), new StationKvBean(MesPcnExtConstWords.CUST_ORDER_NO, "客户订单号", o.getCustOrderNo()), + productionPartContextList.size() == 1 ? null : new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", new StringJoiner(MesPcnExtConstWords.SLANT_R).add(String.valueOf(index.updateAndGet(v -> v + 1))).add(String.valueOf(productionPartContextList.size())).toString()))); + } + + if (!CollectionUtils.isEmpty(finishCodeList)) { + StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY_FINISH_CODE, "空腔数", String.valueOf(finishCodeList.size()))); + } + + return dataList; + } + + //删除上下文产出零件信息/产品条码数据 + private Boolean removeProductionPartAndPsInContext(StationRequestBean reqBean) { + //删除上下文产出零件信息 + productionDispatchContextStepService.removeProductionPartContext(reqBean); + //删除上下文产品条码信息 + productionDispatchContextStepService.removeProductionPsInContext(reqBean); + //删除上下文产出条码信息 + productionDispatchContextStepService.removeProductionPsOutContext(reqBean); + return true; + } + + //验证是否存在相同的零件生产组的加工单, 存在则清除已缓存的数据 + private Boolean checkPartProdGroupCodeIsExistRepeat(StationRequestBean reqBean, List productionPartContextList, List cachedProductionPartContextList) { + List partProdGroupCodeList = (productionPartContextList.stream().filter(o -> (null != o && + !StringUtils.isEmpty(o.getPartProdGroupCode()))).map(MesProductionPartContext::getPartProdGroupCode).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(partProdGroupCodeList) && partProdGroupCodeList.size() == productionPartContextList.size()) return false; + //删除上下文产出零件信息/产品条码数据 + if (!CollectionUtils.isEmpty(cachedProductionPartContextList)) removeProductionPartAndPsInContext(reqBean); + return true; + } + +} 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 5098e2d..31c49e1 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 @@ -18,6 +18,7 @@ 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; @@ -66,6 +67,7 @@ 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( new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{productionPsInContext.getRelateId(), reqBean.getOrganizeCode()}, diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java index cbfc373..d357dd0 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderSaveNosortStepService.java @@ -164,7 +164,7 @@ public class MesWorkOrderSaveNosortStepService extends BaseStepService { if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) { propertyMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); - } else if (workOrder.getCompleteQty() > 0 && workOrder.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) { + } else if (workOrder.getCompleteQty() >= 0 && workOrder.getWorkOrderStatus() == MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()) { propertyMap.put(MesPcnExtConstWords.WORK_ORDER_STATUS, MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); }