From 77e48610bfe6eab1a234d2c805858d1c34267756 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Tue, 18 Jun 2024 10:13:38 +0800 Subject: [PATCH] step --- .../step/MesAssemblyMatchNosortStepService.java | 470 ++++++++++----------- .../step/MesProductSnScanNosortStepService.java | 2 +- 2 files changed, 235 insertions(+), 237 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java index efc18ad..ba16efb 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortStepService.java @@ -1,239 +1,237 @@ -//package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdRuleCfgExtService; +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.*; +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.CommonEnumUtil; +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.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @Description : 装配件匹配工步 【非排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesAssemblyMatchNosortStepService") +public class MesAssemblyMatchNosortStepService extends BaseStepService { + + @Autowired + private IFsmCommonService fsmCommonService; + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProdRuleCfgExtService prodRuleCfgExtService; + + @Autowired + private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //从上下文中取出生产线对象 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //获取上下文产出零件数据信息集合 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //获取上下文进料零件条码信息集合 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + + //获取上下文生产扫/读信息:装配件条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean); + + //删除上下文扫/读信息:装配件条码 + if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean); + + //未知腔数[工位参数] + String cavityUnknownCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG); + + //计算实际需要的腔数 +// Integer needCavity = getNeedCavity(productionPartContextList, productionPsInContextList, cellEquipContext); + + if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) //存在产出零件 存在进料主条码 + doMatchAssemblyHasPpAndPs(reqBean, resultBean, stepResult, productionPartContextList, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList); + else if (!CollectionUtils.isEmpty(productionPartContextList)) //存在产出零件 不存在进料主条码 + doMatchAssemblyHasPp(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, prodRuleContextList, equipVariableCollectContextList); + else if (!CollectionUtils.isEmpty(productionPsInContextList)) //不存在产出零件 存在进料主条码 + doMatchAssemblyHasPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList); + else if (StringUtils.isEmpty(cavityUnknownCfg)) //不存在产出零件 不存在进料主条码 根据设备腔数反向匹配加工规则 + doMatchAssemblyHasCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList); + else //不存在产出零件 不存在进料主条码 未知腔数 反向完成匹配后获取对应的加工规则 + doMatchAssemblyUnknowCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList); + + return stepResult; + + } + +// //计算实际需要的腔数 +// private Integer getNeedCavity(List productionPartContextList, List productionPsInContextList, MesCellEquipContext cellEquipContext) { +// +// List ppList = CollectionUtils.isEmpty(productionPartContextList) ? null : productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); +// List psList = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); +// +// Integer ppSize = CollectionUtils.isEmpty(ppList) ? MesPcnExtConstWords.ZERO : ppList.size(); +// Integer psSize = CollectionUtils.isEmpty(psList) ? MesPcnExtConstWords.ZERO : psList.size(); +// +// if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) return (productionPartContextList.size() == productionPsInContextList.size()) ? psSize // -//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService; -//import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdRuleCfgExtService; -//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.*; -//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.CommonEnumUtil; -//import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; -//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; -//import java.util.stream.Collectors; -//import java.util.stream.Stream; -// -///** -// * @Description : 装配件匹配工步 【非排序】 -// * @Author : wangjie -// **/ -//@Slf4j -//@Service("mesAssemblyMatchNosortStepService") -//public class MesAssemblyMatchNosortStepService extends BaseStepService { -// -// @Autowired -// private IFsmCommonService fsmCommonService; -// -// @Autowired -// private IMesProductionProcessContextStepService productionProcessContextStepService; -// -// @Autowired -// private IMesProductionDispatchContextStepService productionDispatchContextStepService; -// -// @Autowired -// private IMesProdRuleCfgExtService prodRuleCfgExtService; -// -// @Autowired -// private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; -// -// @Override -// public StepResult execute(StationRequestBean reqBean) { -// -// StationResultBean resultBean = new StationResultBean(); -// -// StepResult stepResult = StepResult.getSuccessComplete(); -// -// //获取上下文信息 -// MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); -// -// //配置错误 抛出异常 -// if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); -// -// //存储生产过程上下文对象 -// productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); -// -// //从上下文中取出生产线对象 -// MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); -// -// //获取上下文产出零件数据信息集合 -// List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); -// -// //获取上下文进料零件条码信息集合 -// List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); -// -// //获取上下文产品加工规则数据信息集合 -// List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); -// -// //获取上下文生产扫/读信息:装配件条码 -// List equipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean); -// -// //删除上下文扫/读信息:装配件条码 -// if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanAssemblySnContext(reqBean); -// -// //未知腔数[工位参数] -// String cavityUnknownCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG); -// -// //计算实际需要的腔数 -//// Integer needCavity = getNeedCavity(productionPartContextList, productionPsInContextList, cellEquipContext); -// -// if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) //存在产出零件 存在进料主条码 -// doMatchAssemblyHasPpAndPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList); -// else if (!CollectionUtils.isEmpty(productionPartContextList)) //存在产出零件 不存在进料主条码 -// doMatchAssemblyHasPp(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPartContextList, prodRuleContextList, equipVariableCollectContextList); -// else if (!CollectionUtils.isEmpty(productionPsInContextList)) //不存在产出零件 存在进料主条码 -// doMatchAssemblyHasPs(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, productionPsInContextList, prodRuleContextList, equipVariableCollectContextList); -// else if (StringUtils.isEmpty(cavityUnknownCfg)) //不存在产出零件 不存在进料主条码 根据设备腔数反向匹配加工规则 -// doMatchAssemblyHasCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList); -// else //不存在产出零件 不存在进料主条码 未知腔数 反向完成匹配后获取对应的加工规则 -// doMatchAssemblyUnknowCavity(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, equipVariableCollectContextList); -// -// -// return stepResult; -// -// } -// -//// //计算实际需要的腔数 -//// private Integer getNeedCavity(List productionPartContextList, List productionPsInContextList, MesCellEquipContext cellEquipContext) { -//// -//// List ppList = CollectionUtils.isEmpty(productionPartContextList) ? null : productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); -//// List psList = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); -//// -//// Integer ppSize = CollectionUtils.isEmpty(ppList) ? MesPcnExtConstWords.ZERO : ppList.size(); -//// Integer psSize = CollectionUtils.isEmpty(psList) ? MesPcnExtConstWords.ZERO : psList.size(); -//// -//// if (!CollectionUtils.isEmpty(productionPartContextList) && !CollectionUtils.isEmpty(productionPsInContextList)) return (productionPartContextList.size() == productionPsInContextList.size()) ? psSize -//// -//// -//// } -// -// //存在产出零件 存在进料主条码 -// private StepResult doMatchAssemblyHasPpAndPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List productionPartContextList, List productionPsInContextList, List prodRuleContextList, List equipVariableCollectContextList) { -// -// if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中不存在非排序加工规则数据,请重置工序!"); -// -// //存在产出零件 存在进料主条码 不存在待验证装配件条码 -// if (CollectionUtils.isEmpty(equipVariableCollectContextList)) -// return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg("当前上下文中不存在待验证的装配件条码,但存在未装配的装配件清单!") : -// (productionPartContextList.size() == productionPsInContextList.size() ? stepResult : -// stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("当前上下文中不存在待验证的装配件条码,请扫描第[%s]腔主条码,共[%s]腔", productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size()))); -// -// Boolean result = false; -// -// //遍历产品加工规则 -// for (MesProdRuleContext prodRuleContext : prodRuleContextList) { -// -// //没有装配件的条件 -// if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; -// -// //获取非排序装配件清单 -// List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); -// -// //遍历装配件清单 -// for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) { -// -// //已装配 -// if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue; -// -// //遍历装配件条码 -// for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) { -// -// //已被消费 -// if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; -// -// //匹配规则 -// List filterList = (List) numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList())); -// -// //匹配失败 -// if (CollectionUtils.isEmpty(filterList)) continue; -// -// result = true; -// -// //匹配成功 -// equipVariableCollectContext.isConsume(); -// -// //装配件清单该数据标记已装配 -// productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue()); -// -// } -// -// //是否验证顺序装配 -// if (!StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && -// prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 && -// productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) break; -// -// } -// -// //TODO 发送设备加工参数 -// if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0) doSendEquipProdParam(reqBean, resultBean, stepResult, prodRuleContext, productionAssemblyNosortContextList); -// -// } -// -// if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 && result) -// -// -// -// -// return stepResult; -// -// } -// -// //验证是否存在待绑定数据 -// private Boolean hasUnBindAssembly(List prodRuleContextList) { -// Boolean hasUnBindAssembly = false; -// for (MesProdRuleContext prodRuleContext : prodRuleContextList) { -// if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; -// List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); -// Optional optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); -// if (null == optional || !optional.isPresent()) continue; -// hasUnBindAssembly = true; -// break; -// } -// return hasUnBindAssembly; -// } -// -// -// -// -// -// -// -// -// -// -// //存在产出零件 不存在进料主条码 -// private void doMatchAssemblyHasPp(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List productionPartContextList, List prodRuleContextList, List equipVariableCollectContextList) { // } -// -// //不存在产出零件 存在进料主条码 -// private void doMatchAssemblyHasPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List productionPsInContextList, List prodRuleContextList, List equipVariableCollectContextList) { -// } -// -// //不存在产出零件 不存在进料主条码 根据设备腔数反向匹配加工规则 -// private void doMatchAssemblyHasCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List equipVariableCollectContextList) { -// } -// -// //不存在产出零件 不存在进料主条码 未知腔数 反向完成匹配后获取对应的加工规则 -// private void doMatchAssemblyUnknowCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List equipVariableCollectContextList) { -// } -// -// //TODO 发送设备加工参数 -// private void doSendEquipProdParam(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProdRuleContext prodRuleContext, List productionAssemblyNosortContextList) { -// Optional optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); -// if (null != optional && optional.isPresent()) return; -// -// } -// -//} + + //存在产出零件 存在进料主条码 + private StepResult doMatchAssemblyHasPpAndPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, + List productionPartContextList, List productionPsInContextList, + List prodRuleContextList, List equipVariableCollectContextList) { + + if (CollectionUtils.isEmpty(prodRuleContextList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前上下文中不存在非排序加工规则数据,请重置工序!"); + + //存在产出零件 存在进料主条码 不存在待验证装配件条码 + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) + return hasUnBindAssembly(prodRuleContextList) ? + stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg("当前上下文中不存在待验证的装配件条码,但还存在未装配的装配件清单!") : + (productionPartContextList.size() == productionPsInContextList.size() ? stepResult : + stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg( + String.format("当前上下文中不存在待验证的装配件条码,请扫描第[%s]腔主条码,共[%s]腔!", productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size()))); + + //遍历产品加工规则 + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + + //没有装配件的条件 + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + + //获取非排序装配件清单 + List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); + + //遍历装配件清单 + for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) { + + //已装配 + if (null == productionAssemblyNosortContext || productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) continue; + + //遍历装配件条码 + for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextList) { + + //已被消费 + if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; + + //匹配规则 + List filterList = (List) + numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), Stream.of(productionAssemblyNosortContext).collect(Collectors.toList())); + + //匹配失败 + if (CollectionUtils.isEmpty(filterList)) continue; + + //匹配成功 + equipVariableCollectContext.isConsume(); + + //装配件清单该数据标记已装配 + productionAssemblyNosortContext.assemblyStatus().assemblySn(equipVariableCollectContext.getEquipVariableValue()); + + } + + //是否验证顺序装配 + if (!StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && + prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0 && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 && + productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) != 0) break; + + } + + //TODO 发送设备加工参数 + if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0) doSendEquipProdParam(reqBean, resultBean, stepResult, prodRuleContext, productionAssemblyNosortContextList); + + } + + List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filterList)) { + String msg = String.format("当前上下文中的装配件条码%s匹配完成", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString()); + return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) : + (productionPartContextList.size() == productionPsInContextList.size() ? stepResult.msg(msg) : + stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg( + String.format("%s,请扫描第[%s]腔主条码,共[%s]腔!", msg, productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size()))); + } else { + String msg = String.format("当前上下文中的装配件条码%s匹配失败", filterList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString()); + return hasUnBindAssembly(prodRuleContextList) ? stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg(String.format("%s,但还存在未装配的装配件清单!", msg)) : + (productionPartContextList.size() == productionPsInContextList.size() ? stepResult.msg(String.format("%s,但不存在未装配的装配件清单!", msg)) : + stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY).msg( + String.format("%s,请扫描第[%s]腔主条码,共[%s]腔!", msg, productionPsInContextList.size() + MesPcnExtConstWords.ONE, productionPartContextList.size()))); + + } + + } + + //验证是否存在待绑定数据 + private Boolean hasUnBindAssembly(List prodRuleContextList) { + Boolean hasUnBindAssembly = false; + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); + Optional optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); + if (null == optional || !optional.isPresent()) continue; + hasUnBindAssembly = true; + break; + } + return hasUnBindAssembly; + } + + //存在产出零件 不存在进料主条码 + private void doMatchAssemblyHasPp(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List productionPartContextList, List prodRuleContextList, List equipVariableCollectContextList) { + } + + //不存在产出零件 存在进料主条码 + private void doMatchAssemblyHasPs(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List productionPsInContextList, List prodRuleContextList, List equipVariableCollectContextList) { + } + + //不存在产出零件 不存在进料主条码 根据设备腔数反向匹配加工规则 + private void doMatchAssemblyHasCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List equipVariableCollectContextList) { + } + + //不存在产出零件 不存在进料主条码 未知腔数 反向完成匹配后获取对应的加工规则 + private void doMatchAssemblyUnknowCavity(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List equipVariableCollectContextList) { + } + + //TODO 发送设备加工参数 + private void doSendEquipProdParam(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProdRuleContext prodRuleContext, List productionAssemblyNosortContextList) { + Optional optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); + if (null != optional && optional.isPresent()) return; + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java index 04cc6a6..4a83d7a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java @@ -257,7 +257,7 @@ public class MesProductSnScanNosortStepService extends BaseStepService { } - ////比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于 剩余待扫描主条码数量加上已扫描的空腔数量 + ////比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于等于 剩余待扫描主条码数量加上已扫描的空腔数量 private StepResult checkFinishCodeSize(StepResult stepResult, List productionPartContextList, List productionPsInContextList, Boolean scanInfoIsFinishCode) { //没有产出零件 不需要对比空腔数量