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 cdaf2e1..8b9604c 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 @@ -41,8 +41,6 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean); - //根据创建时间倒叙查询零件条码 - DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); return produceSnRepository.findByHqlWhere(packBean); } @@ -53,8 +51,7 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { List produceSnList = getProduceSnList(organizeCode, productSnList); //先排序再分组 - return CollectionUtils.isEmpty(produceSnList) ? null : - produceSnList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSn::getCreateDatetime).reversed()).collect(Collectors.groupingBy(MesProduceSn::getProductSn)); + return CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesProduceSn::getProductSn)); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java index b1bc9cb..3284fc6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java @@ -20,9 +20,7 @@ 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.*; import java.util.stream.Collectors; /** @@ -42,7 +40,6 @@ public class MesProductSnCheckNosortStepService extends BaseStepService { @Autowired private IMesProduceSnExtService produceSnExtService; - @Override public StepResult execute(StationRequestBean reqBean) { @@ -75,19 +72,13 @@ public class MesProductSnCheckNosortStepService extends BaseStepService { //搜集主条码值 List productSnList = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); - //验证上下文中主条码的有效性 - List produceSnList = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList); - - if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg())); - //获取上下文的工位 MesWorkCell workCell = productionProcessContext.getWorkCell(); - Map produceSnMap = CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o)); - - //封装 读/扫主条件信息到进料主条码数据信息中 + //验证上下文中主条码的有效性 封装 读/扫主条件信息到进料主条码数据信息中 List productionPsInContextList = new ArrayList<>(); - if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(workCell, produceSnMap, o, productionPsInContextList)); + if (!checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, workCell, productSnList, productionPsInContextList).isCompleted()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg())); //获取进料主条码数据信息 List productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean); @@ -105,42 +96,46 @@ public class MesProductSnCheckNosortStepService extends BaseStepService { } //获取进料主条码数据信息 - private List checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productSnList) { - + private StepResult checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, + MesProductionProcessContext productionProcessContext, MesWorkCell workCell, List productSnList, List productionPsInContextList) { //根据零件条码查询零件条码信息 - List produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), productSnList); + Map> produceSnMap = produceSnExtService.getProduceSnMap(reqBean.getOrganizeCode(), productSnList); + for (String productSn : productSnList) { + if (StringUtils.isEmpty(productSn)) continue; + if (CollectionUtils.isEmpty(produceSnMap) || !produceSnMap.containsKey(productSn)) productionPsInContextList.add(new MesProductionPsInContext(reqBean.getOrganizeCode(), productSn)); + else createProductionPsInContext(reqBean, resultBean, stepResult, workCell, productSn, produceSnMap.get(productSn), productionPsInContextList); + } + return stepResult; + } - if (CollectionUtils.isEmpty(produceSnList)) return null; + private StepResult createProductionPsInContext(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, + MesWorkCell workCell, String productSn, List produceSnList, List productionPsInContextList) { - //循环获取进料主条码数据信息 - produceSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, o)); + String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY; - return !stepResult.isCompleted() ? null : produceSnList; + List standardList = produceSnList.stream().filter(o -> (null != o && o.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue()) != 0)).sorted(Comparator.comparing(MesProduceSn::getCreateDatetime).reversed()).collect(Collectors.toList()); - } + List unknowList = produceSnList.stream().filter(o -> (null != o && o.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue()) == 0)).collect(Collectors.toList()); - //获取进料主条码数据信息 - private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProduceSn produceSn) { + if (!CollectionUtils.isEmpty(unknowList) && (unknowList.size() > 1 || (!unknowList.get(0).getWorkCenterCode().equals(reqBean.getWorkCenterCode()) || !unknowList.get(0).getWorkCellCode().equals(reqBean.getWorkCellCode())))) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]信息条码状态已被%s标记[未知]", suffixMsg, productSn, + unknowList.stream().filter(o -> null != o).map(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getWorkCenterCode()).add(o.getWorkCellCode()).toString()).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)))); - String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY; + if (CollectionUtils.isEmpty(standardList)) productionPsInContextList.add(new MesProductionPsInContext(reqBean.getOrganizeCode(), productSn).relateId(unknowList.get(0).getId())); + else { - if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSn.getQcStatus()) - return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()))); + if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != standardList.get(0).getQcStatus()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, productSn, MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(standardList.get(0).getQcStatus()))); - if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() < produceSn.getSnStatus() || - (MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus() && (!produceSn.getWorkCenterCode().equals(reqBean.getWorkCenterCode()) || !produceSn.getWorkCellCode().equals(reqBean.getWorkCellCode())))) - return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()))); + if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() < standardList.get(0).getSnStatus()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, productSn, MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(standardList.get(0).getSnStatus()))); - return stepResult; + productionPsInContextList.add(new MesProductionPsInContext(workCell, standardList.get(0)).relateId(CollectionUtils.isEmpty(unknowList) ? null : unknowList.get(0).getId())); - } + } - //封装 读/扫主条件信息到进料主条码数据信息中 - private void createProductionPsInContext(MesWorkCell workCell, Map produceSnMap, String productSn, List productionPsInContextList) { - MesProductionPsInContext productionPsInContext = new MesProductionPsInContext(workCell, - (!CollectionUtils.isEmpty(produceSnMap) && !StringUtils.isEmpty(productSn) && produceSnMap.containsKey(productSn)) ? produceSnMap.get(productSn) : null, productSn); + return stepResult; - productionPsInContextList.add(productionPsInContext); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java index 86c20e7..5dc2928 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java @@ -90,7 +90,7 @@ public class MesProductSnCheckSortStepService extends BaseStepService { //封装 读/扫主条件信息到进料主条码数据信息中 List productionPsInContextList = new ArrayList<>(); - if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> productionPsInContextList.add(new MesProductionPsInContext(workCell, produceSnMap.get(o).get(0), queueOrderMap.get(o).get(0).getId()))); + if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> productionPsInContextList.add(new MesProductionPsInContext(workCell, produceSnMap.get(o).get(0)).relateId(queueOrderMap.get(o).get(0).getId()))); //获取进料主条码数据信息 List productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java index 03c0e1d..fa1ba05 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java @@ -163,6 +163,8 @@ public class MesProductSnReadStepService extends BaseStepService { execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前读取到设备[%s]主条码全部为空腔,持续监听中...", cellEquipContext.getEquipmentCode())), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + + //根据读取条码分组数据 Map> produceSnCollectMap = productSnList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCollectContext::getEquipVariableValue)); diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java index af21806..7a21931 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java @@ -28,8 +28,8 @@ public class MesProductionPsInContext implements Serializable { @ApiParam("零件条码ID") private Long id; - @ApiParam("队列ID") - private Long queueId; + @ApiParam("未知条码ID/队列ID") + private Long relateId; @ApiParam("非排序进料零件条码/排序工单号") private String productSn; @@ -106,16 +106,19 @@ public class MesProductionPsInContext implements Serializable { return this; } - public MesProductionPsInContext(MesWorkCell workCell, MesProduceSn produceSn, String productSn) { - if (null != produceSn) BeanUtils.copyProperties(produceSn, this); - else this.productSn = productSn; - if (!StringUtils.isEmpty(this.getId())) this.isCheck(workCell); + public MesProductionPsInContext relateId(Long relateId) { + this.relateId = relateId; + return this; + } + + public MesProductionPsInContext(String organizeCode, String productSn) { + this.organizeCode = organizeCode; + this.productSn = productSn; } - public MesProductionPsInContext(MesWorkCell workCell, MesProduceSn produceSn, Long queueId) { - if (null != produceSn) BeanUtils.copyProperties(produceSn, this); - if (!StringUtils.isEmpty(queueId)) this.queueId = queueId; - if (!StringUtils.isEmpty(this.getId())) this.isCheck(workCell); + public MesProductionPsInContext(MesWorkCell workCell, MesProduceSn produceSn) { + BeanUtils.copyProperties(produceSn, this); + this.isCheck(workCell); } }