From da07938e3418b25b5c3c7dd875a6f0dc97649782 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Tue, 17 Sep 2024 16:44:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=AB=E6=8F=8F=E4=B8=BB=E6=9D=A1=E7=A0=81?= =?UTF-8?q?=20=E5=B7=A5=E6=AD=A5=20=E5=89=94=E9=99=A4=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MesProdCraftRouteCheckNosortStepService.java | 9 + .../step/MesProductSnScanNosortStepService.java | 285 --------------------- .../step/MesProductSnScanSortStepService.java | 168 ------------ .../step/MesProductSnScanStepService.java | 245 +++++++++++++++++- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 4 +- 5 files changed, 250 insertions(+), 461 deletions(-) delete mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java delete mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.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 c5ffd29..8e8a16f 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 @@ -10,6 +10,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesCraftRouteDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -65,6 +66,14 @@ public class MesProdCraftRouteCheckNosortStepService extends MesProdCraftRouteCh if (CollectionUtils.isEmpty(productionPsInContextList)) return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前无主条码信息,无需进行前道工艺防错验证!"); + //非排序需要验证主条码是否是自制件[工步参数] + Optional> stepParamMap = getStepParams(reqBean); + Boolean needCheckIsPs = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.NEED_CHECK_IS_PS)) ? true : false; + + //验证是否是自制件 + if (needCheckIsPs && !isExistProductSn(productionPsInContextList)) + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前主条码信息均为外协件,无需进行前道工艺防错验证!"); + //验证是否存在自制件 if (!isExistProductSn(productionPsInContextList)) return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前主条码信息均为外协件,无需进行前道工艺防错验证!"); 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 deleted file mode 100644 index 04f0313..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java +++ /dev/null @@ -1,285 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; - -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.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.base.enumutil.MesPcnEnumUtil; -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 com.alibaba.fastjson.JSONObject; -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; - -/** - * @Description : 扫描主条码工步 【非排序】 - * @Author : wangjie - **/ -@Slf4j -@Service("mesProductSnScanNosortStepService") -public class MesProductSnScanNosortStepService extends BaseStepService { - - @Autowired - private IMesProductionProcessContextStepService productionProcessContextStepService; - - @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; - - @Autowired - private IMesProductionCustomContextStepService productionCustomContextStepService; - - @Autowired - private IFsmCommonService fsmCommonService; - - @Override - public StepResult guide(StationRequestBean reqBean) { - - //发送工步内容 - productionCustomContextStepService.sendStepContextMessage(reqBean); - - return stepSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描主条码!"); - - } - - @Override - public StepResult execute(StationRequestBean reqBean) { - - StationResultBean resultBean = new StationResultBean(); - - StepResult stepResult = StepResult.getSuccessComplete(); - - //扫描信息置空 - String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo()); - - //发送工步内容 - if (!StringUtils.isEmpty(scanInfo)) productionCustomContextStepService.sendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); - - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); - - //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); - - //存储生产过程上下文对象 - productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); - - //当前工位使用的设备 - MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); - - //获取上下文产出零件信息 - List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - - //获取上下文扫/读信息:主条码 - List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); - - //获取进料主条码数据信息 - List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - - //验证扫描信息是否属于工艺强过码 - Boolean isCraftJumpCode = (!StringUtils.isEmpty(scanInfo) && scanInfo.equals(productionProcessContext.getCraftJumpCode())) ? true : false; - - //不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 - if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo) && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = updateProductionPsInContextList(reqBean, productionPsInContextList); - - //先判断前期扫描数量 - Integer scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList); - - //根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量 - Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipContext.getCavity(); - - //验证前期扫描数量是否已超过匹配腔数 - checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipContext); - - //验证是否支持跳过 - Boolean isAllowJump = checkIsAllowJump(productionPsInContextList); - - //当前不允许跳过 - if (isCraftJumpCode && !isAllowJump) - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的主条码信息!", scanInfo)); - - //允许跳过,先更新数据 - if (isCraftJumpCode && isAllowJump) { - updateProductionPsInContextList(reqBean, productionPsInContextList, scanInfo); - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息工艺强过码[%s]!", scanInfo)); - } - - //扫描信息为空 并且 判断当前是否必须要扫描 - if (StringUtils.isEmpty(scanInfo) && (scanedQty.compareTo(needQty) < 0 || isAllowJump)) stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描主条码!"); - - //是否支持混腔扫描[工位参数] - String cavityNosortCfg = getCavityNosortCfg(reqBean); - - //封装待验证的主条码信息 - if (!scanInfo.equals(productionProcessContext.getFinishCode())) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, scanInfo, equipVariableCollectContextList, cavityNosortCfg); - - //验证是否存在重复主条码 - if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息主条码[%s],当前存在重复扫描的主条码!", scanInfo)); - - Boolean scanInfoIsFinishCode = !scanInfo.equals(productionProcessContext.getFinishCode()) ? false : true; - - //比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于 剩余待扫描主条码数量加上已扫描的空腔数量 - if (!checkFinishCodeSize(stepResult, productionPartContextList, productionPsInContextList, scanInfoIsFinishCode).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); - - //保存上下文扫/读信息:主条码 或者 添加了finishCode后的主条码数据 - if (!scanInfoIsFinishCode) productionDispatchContextStepService.dispatchScanProductSnContext(reqBean, equipVariableCollectContextList); - else productionPsInContextList = saveProductionPsInContextList(reqBean, productionPsInContextList); - - //前期扫描数量已等于腔数 - scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList); - - String scanInfoName = !scanInfo.equals(productionProcessContext.getFinishCode()) ? "主条码" : "空腔码"; - - if (scanedQty.compareTo(needQty) < 0 && !StringUtils.isEmpty(cavityNosortCfg)) - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, false, - MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息%s[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfoName, scanInfo, needQty, needQty - equipVariableCollectContextList.size())); - - //扫描场景 验证是否全部为空腔 - if (!checkIsAllFinishCode(productionPsInContextList, equipVariableCollectContextList)) - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息%s[%s]%s!", scanInfoName, scanInfo, scanedQty.compareTo(needQty) == 0 ? String.format(",当前主条码个数[%s]已满足腔数", scanedQty) : MesPcnExtConstWords.EMPTY)); - - //删除上下文扫/读信息:主条码 - productionDispatchContextStepService.removeScanProductSnContext(reqBean); - //删除进料主条码数据 - productionDispatchContextStepService.removeProductionPsInContext(reqBean); - - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描的主条码信息全部为空腔,已清除当前的空腔数据!"); - - } - - //是否支持混腔扫描[工位参数] - private String getCavityNosortCfg(StationRequestBean reqBean) { - String cavityNosortCfg = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG); - return (!StringUtils.isEmpty(cavityNosortCfg) && cavityNosortCfg.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? cavityNosortCfg : null; - } - - private Integer calcScanedQty(List equipVariableCollectContextList, List productionPsInContextList) { - return (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()); - } - - //不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 - private List updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { - Integer sourceSize = productionPsInContextList.size(); - productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() == sourceSize) return productionPsInContextList; - //保存进料主条码数据 - productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); - return productionPsInContextList; - } - - //封装无需验证的finishCode空腔数据 - private List saveProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { - if (CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = new ArrayList<>(); - productionPsInContextList.add(new MesProductionPsInContext().isFinishCode()); - //保存进料主条码数据 - productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); - return productionPsInContextList; - } - - //验证是否支持跳过 - private Boolean checkIsAllowJump(List productionPsInContextList) { - Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - return (null != optional && optional.isPresent()) ? true : false; - } - - //验证扫描信息属于工艺强过码 并且支持跳过,进行数据变更 - private void updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList, String craftJumpCode) { - productionPsInContextList.forEach(o -> { - if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) o.setCraftJumpCode(craftJumpCode); - }); - //保存进料主条码数据 - productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); - } - - //验证前期扫描数量是否已超过匹配腔数 - private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty, - List equipVariableCollectContextList, List productionPsInContextList, List productionPartContextList, MesCellEquipContext cellEquipContext) { - if (scanedQty.compareTo(needQty) <= 0) return; - String message = String.format("请检查相关数据,当前主条码个数[%s]已满足腔数[%s],可重置工序解决!", scanedQty, needQty); - this.sendMessage(reqBean, resultBean, message + - " --- List --- [" + getJsonMessage(equipVariableCollectContextList) + "]" + - " --- List --- [" + getJsonMessage(productionPsInContextList) + "]" + - " --- List --- [" + getJsonMessage(productionPartContextList) + "]" + - " --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); - stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message); - } - - //集合判空转JSON - private String getJsonMessage(List list) { - return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list); - } - - //封装扫/读信息:主条码信息 - private List doHandleScanProductSnContext(StationRequestBean reqBean, String scanInfo, List equipVariableCollectContextList, String cavityNosortCfg) { - - if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>(); - - equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, StringUtils.isEmpty(cavityNosortCfg) ? MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() : MesExtEnumUtil.CELL_MESSAGE_SOURCE.MANY.getValue())); - - return equipVariableCollectContextList; - - } - - //验证是否存在重复主条码 - private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPsInContextList) { - - //扫描条码 - List filterList1 = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); - //已验证条码 剔除finishCode信息 - List filterList2 = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()); - - List filterList = new ArrayList<>(); - if (!CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1); - if (!CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2); - - //验证是否存在重复条码 - if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true; - - return false; - - } - - //比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于等于 剩余待扫描主条码数量加上已扫描的空腔数量 - private StepResult checkFinishCodeSize(StepResult stepResult, List productionPartContextList, List productionPsInContextList, Boolean scanInfoIsFinishCode) { - - //没有产出零件 不需要对比空腔数量 - if (CollectionUtils.isEmpty(productionPartContextList)) return stepResult; - - List finishCodePpList = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList()); - List finishCodePsList = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList()); - - //产出零件的空腔数 - Integer ppSize = CollectionUtils.isEmpty(finishCodePpList) ? MesPcnExtConstWords.ZERO : finishCodePpList.size(); - //已扫描的主条码空腔数量 - Integer psSize = (CollectionUtils.isEmpty(finishCodePsList) ? MesPcnExtConstWords.ZERO : finishCodePsList.size()) + (!scanInfoIsFinishCode ? MesPcnExtConstWords.ZERO : MesPcnExtConstWords.ONE); - //剩余待扫描主条码数量 - Integer remainSize = productionPartContextList.size() - (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()) - MesPcnExtConstWords.ONE; - - return ppSize.compareTo(remainSize + psSize) <= 0 ? stepResult : stepResult.isCompleted(false).msg(String.format("产出零件存在空腔数[%s],扫描的主条码空腔数[%s],当前主条码必须扫描空腔码!", ppSize, psSize)); - - } - - private Boolean checkIsAllFinishCode(List productionPsInContextList, List equipVariableCollectContextList) { - //扫描场景 验证是否全部为空腔 - Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - //已验证的主条码全部空腔 并且 当前待验证主条码不存在数据 则全部空腔 - return ((null == optional || !optional.isPresent()) && CollectionUtils.isEmpty(equipVariableCollectContextList)) ? true : false; - } - -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java deleted file mode 100644 index d650431..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java +++ /dev/null @@ -1,168 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; - -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; -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.context.MesProductionPsInContext; -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.mes.pcn.serviceimpl.fsm.IStepService; -import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; -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.impp.framework.boot.util.SpringContextsUtil; -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("mesProductSnScanSortStepService") -public class MesProductSnScanSortStepService extends BaseStepService { - - @Autowired - private IMesProductionProcessContextStepService productionProcessContextStepService; - - @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; - - @Autowired - private IMesProductionCustomContextStepService productionCustomContextStepService; - - @Autowired - private IFsmCommonService fsmCommonService; - - @Override - public StepResult guide(StationRequestBean reqBean) { - - //发送工步内容 - productionCustomContextStepService.sendStepContextMessage(reqBean); - - return stepSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描主条码!"); - - } - - @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 productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - - if (CollectionUtils.isEmpty(productionPartContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前没有产出零件信息!"); - - //排序是否需要扫描主条码配置【工步参数】 默认不用配置, 目前排序 工单与条码一对一, 当一对多的时候需要配置 - Optional> stepParamMap = getStepParams(reqBean); - Boolean sortNeedScanPs = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.SORT_NEED_SCAN_PS)) ? true : false; - - //需要扫描主条码配置存在 直接复用 非排序线 扫描主条码工步 - if (sortNeedScanPs) return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanNosortStepService")).executeInState(reqBean); - - //获取进料主条码数据信息 - List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - - //保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】 - if (CollectionUtils.isEmpty(productionPsInContextList)) return saveScanProductSnContextSort(reqBean, resultBean, stepResult, productionPartContextList); - - //获取上下文扫/读信息:主条码 【工艺强过码场景】 - List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); - - if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前没有待验证的主条码信息!"); - - //删除上下文扫/读信息:主条码 - if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.removeScanProductSnContext(reqBean); - - //TODO 下面逻辑可能有问题 目前未处理 - - //验证是否匹配工艺强过码 - if (equipVariableCollectContextList.size() != 1 || checkScanInfoMatchCraftJumpCode(reqBean, equipVariableCollectContextList.get(0).getEquipVariableValue())) { - String productSnStr = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(productSnStr), stepResult, String.format("当前待验证的主条码%s无效!", productSnStr)); - } - - //验证是否支持跳过 - if (!checkIsAllowJump(productionPsInContextList)) - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前不支持通过工艺强过码[%s]执行跳过!", equipVariableCollectContextList.get(0).getEquipVariableValue())); - - return updateProductionPsInContextList(reqBean, resultBean, stepResult, productionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue()); - - } - - //保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】 - private StepResult saveScanProductSnContextSort(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List productionPartContextList) { - - List equipVariableCollectContextList = new ArrayList<>(); - List productionPsInContextList = new ArrayList<>(); - - for (MesProductionPartContext productionPartContext : productionPartContextList) { - - if (null == productionPartContext) continue; - - if (productionPartContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) - equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), productionPartContext.getWorkOrderNo(), productionPartContext.getMessageSource())); - else - productionPsInContextList.add(new MesProductionPsInContext().isFinishCode()); - } - - if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.dispatchScanProductSnContext(reqBean, equipVariableCollectContextList); - if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); - - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "根据加工单生成待验证主条码信息执行成功!"); - } - - //验证扫描信息是否属于工艺强过码 - private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) { - if (StringUtils.isEmpty(scanInfo)) return false; - String craftJumpCode = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); - if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE; - return scanInfo.equals(craftJumpCode) ? true : false; - } - - //验证是否支持跳过 - private Boolean checkIsAllowJump(List productionPsInContextList) { - Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - return (null != optional && optional.isPresent()) ? true : false; - } - - //验证扫描信息属于工艺强过码 并且支持跳过,进行数据变更 - private StepResult updateProductionPsInContextList(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List productionPsInContextList, String craftJumpCode) { - productionPsInContextList.forEach(o -> { - if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) o.setCraftJumpCode(craftJumpCode); - }); - //保存进料主条码数据 - productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "已标记当前工艺防错验证失败的主条码信息!"); - } - -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java index 040f1d7..33d0937 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java @@ -1,18 +1,29 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.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.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; 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 cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSONObject; 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; /** * @Description : 扫描主条码工步 【非排序】 @@ -26,8 +37,14 @@ public class MesProductSnScanStepService extends BaseStepService { private IMesProductionProcessContextStepService productionProcessContextStepService; @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired private IMesProductionCustomContextStepService productionCustomContextStepService; + @Autowired + private IFsmCommonService fsmCommonService; + @Override public StepResult guide(StationRequestBean reqBean) { @@ -41,12 +58,228 @@ public class MesProductSnScanStepService extends BaseStepService { @Override public StepResult execute(StationRequestBean reqBean) { - //排序线 扫描主条码工步 - if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == productionProcessContextStepService.getCenterType(reqBean)) return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanSortStepService")).executeInState(reqBean); + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //扫描信息置空 + String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo()); + + //发送工步内容 + if (!StringUtils.isEmpty(scanInfo)) productionCustomContextStepService.sendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //获取上下文产出零件信息 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //获取上下文扫/读信息:主条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + + //获取进料主条码数据信息 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + //验证扫描信息是否属于工艺强过码 + Boolean isCraftJumpCode = (!StringUtils.isEmpty(scanInfo) && scanInfo.equals(productionProcessContext.getCraftJumpCode())) ? true : false; + + //不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 + if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo) && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = updateProductionPsInContextList(reqBean, productionPsInContextList); + + //先判断前期扫描数量 + Integer scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList); + + //根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量 + Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipContext.getCavity(); + + //验证前期扫描数量是否已超过匹配腔数 + checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipContext); + + //验证是否支持跳过 + Boolean isAllowJump = checkIsAllowJump(productionPsInContextList); + + //当前不允许跳过 + if (isCraftJumpCode && !isAllowJump) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的主条码信息!", scanInfo)); + + //允许跳过,先更新数据 + if (isCraftJumpCode && isAllowJump) { + updateProductionPsInContextList(reqBean, productionPsInContextList, scanInfo); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息工艺强过码[%s]!", scanInfo)); + } + + //扫描信息为空 并且 判断当前是否必须要扫描 + if (StringUtils.isEmpty(scanInfo) && (scanedQty.compareTo(needQty) < 0 || isAllowJump)) stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描主条码!"); + + //是否支持混腔扫描[工位参数] + String cavityNosortCfg = getCavityNosortCfg(reqBean); + + //封装待验证的主条码信息 + if (!scanInfo.equals(productionProcessContext.getFinishCode())) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, scanInfo, equipVariableCollectContextList, cavityNosortCfg); + + //验证是否存在重复主条码 + if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息主条码[%s],当前存在重复扫描的主条码!", scanInfo)); + + Boolean scanInfoIsFinishCode = !scanInfo.equals(productionProcessContext.getFinishCode()) ? false : true; + + //比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于 剩余待扫描主条码数量加上已扫描的空腔数量 + if (!checkFinishCodeSize(stepResult, productionPartContextList, productionPsInContextList, scanInfoIsFinishCode).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + + //保存上下文扫/读信息:主条码 或者 添加了finishCode后的主条码数据 + if (!scanInfoIsFinishCode) productionDispatchContextStepService.dispatchScanProductSnContext(reqBean, equipVariableCollectContextList); + else productionPsInContextList = saveProductionPsInContextList(reqBean, productionPsInContextList); + + //前期扫描数量已等于腔数 + scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList); + + String scanInfoName = !scanInfo.equals(productionProcessContext.getFinishCode()) ? "主条码" : "空腔码"; + + if (scanedQty.compareTo(needQty) < 0 && !StringUtils.isEmpty(cavityNosortCfg)) + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, false, + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息%s[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfoName, scanInfo, needQty, needQty - equipVariableCollectContextList.size())); + + //扫描场景 验证是否全部为空腔 + if (!checkIsAllFinishCode(productionPsInContextList, equipVariableCollectContextList)) + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()).scanInfo(scanInfo), stepResult, String.format("当前扫描信息%s[%s]%s!", scanInfoName, scanInfo, scanedQty.compareTo(needQty) == 0 ? String.format(",当前主条码个数[%s]已满足腔数", scanedQty) : MesPcnExtConstWords.EMPTY)); + + //删除上下文扫/读信息:主条码 + productionDispatchContextStepService.removeScanProductSnContext(reqBean); + //删除进料主条码数据 + productionDispatchContextStepService.removeProductionPsInContext(reqBean); + + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描的主条码信息全部为空腔,已清除当前的空腔数据!"); - //非排序线 扫描主条码工步 - return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanNosortStepService")).executeInState(reqBean); + } + + //是否支持混腔扫描[工位参数] + private String getCavityNosortCfg(StationRequestBean reqBean) { + String cavityNosortCfg = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG); + return (!StringUtils.isEmpty(cavityNosortCfg) && cavityNosortCfg.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? cavityNosortCfg : null; + } + + private Integer calcScanedQty(List equipVariableCollectContextList, List productionPsInContextList) { + return (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()); + } + + //不属于工艺强过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 + private List updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { + Integer sourceSize = productionPsInContextList.size(); + productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() == sourceSize) return productionPsInContextList; + //保存进料主条码数据 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + return productionPsInContextList; + } + + //封装无需验证的finishCode空腔数据 + private List saveProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { + if (CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = new ArrayList<>(); + productionPsInContextList.add(new MesProductionPsInContext().isFinishCode()); + //保存进料主条码数据 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + return productionPsInContextList; + } + + //验证是否支持跳过 + private Boolean checkIsAllowJump(List productionPsInContextList) { + Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); + return (null != optional && optional.isPresent()) ? true : false; + } + + //验证扫描信息属于工艺强过码 并且支持跳过,进行数据变更 + private void updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList, String craftJumpCode) { + productionPsInContextList.forEach(o -> { + if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) o.setCraftJumpCode(craftJumpCode); + }); + //保存进料主条码数据 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + } + + //验证前期扫描数量是否已超过匹配腔数 + private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty, + List equipVariableCollectContextList, List productionPsInContextList, List productionPartContextList, MesCellEquipContext cellEquipContext) { + if (scanedQty.compareTo(needQty) <= 0) return; + String message = String.format("请检查相关数据,当前主条码个数[%s]已满足腔数[%s],可重置工序解决!", scanedQty, needQty); + this.sendMessage(reqBean, resultBean, message + + " --- List --- [" + getJsonMessage(equipVariableCollectContextList) + "]" + + " --- List --- [" + getJsonMessage(productionPsInContextList) + "]" + + " --- List --- [" + getJsonMessage(productionPartContextList) + "]" + + " --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message); + } + + //集合判空转JSON + private String getJsonMessage(List list) { + return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list); + } + + //封装扫/读信息:主条码信息 + private List doHandleScanProductSnContext(StationRequestBean reqBean, String scanInfo, List equipVariableCollectContextList, String cavityNosortCfg) { + + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>(); + + equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, StringUtils.isEmpty(cavityNosortCfg) ? MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() : MesExtEnumUtil.CELL_MESSAGE_SOURCE.MANY.getValue())); + + return equipVariableCollectContextList; + + } + + //验证是否存在重复主条码 + private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPsInContextList) { + + //扫描条码 + List filterList1 = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + //已验证条码 剔除finishCode信息 + List filterList2 = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()); + + List filterList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1); + if (!CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2); + + //验证是否存在重复条码 + if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true; + + return false; + + } + + //比对产出零件的空腔数量与主条码的空腔数量, 产出零件的空腔数必须小于等于 剩余待扫描主条码数量加上已扫描的空腔数量 + private StepResult checkFinishCodeSize(StepResult stepResult, List productionPartContextList, List productionPsInContextList, Boolean scanInfoIsFinishCode) { + + //没有产出零件 不需要对比空腔数量 + if (CollectionUtils.isEmpty(productionPartContextList)) return stepResult; + + List finishCodePpList = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList()); + List finishCodePsList = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList()); + + //产出零件的空腔数 + Integer ppSize = CollectionUtils.isEmpty(finishCodePpList) ? MesPcnExtConstWords.ZERO : finishCodePpList.size(); + //已扫描的主条码空腔数量 + Integer psSize = (CollectionUtils.isEmpty(finishCodePsList) ? MesPcnExtConstWords.ZERO : finishCodePsList.size()) + (!scanInfoIsFinishCode ? MesPcnExtConstWords.ZERO : MesPcnExtConstWords.ONE); + //剩余待扫描主条码数量 + Integer remainSize = productionPartContextList.size() - (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()) - MesPcnExtConstWords.ONE; + + return ppSize.compareTo(remainSize + psSize) <= 0 ? stepResult : stepResult.isCompleted(false).msg(String.format("产出零件存在空腔数[%s],扫描的主条码空腔数[%s],当前主条码必须扫描空腔码!", ppSize, psSize)); + + } + private Boolean checkIsAllFinishCode(List productionPsInContextList, List equipVariableCollectContextList) { + //扫描场景 验证是否全部为空腔 + Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); + //已验证的主条码全部空腔 并且 当前待验证主条码不存在数据 则全部空腔 + return ((null == optional || !optional.isPresent()) && CollectionUtils.isEmpty(equipVariableCollectContextList)) ? true : false; } } 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 7d271c0..8abcede 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 @@ -237,8 +237,8 @@ public class MesPcnExtConstWords { public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES"; // 最大重试次数[工步参数] public static final Integer MAX_RETRY_TIMES_DEFAULT = 10; - // 排序需要扫描主条码配置[工步参数] - public static final String SORT_NEED_SCAN_PS = "SORT_NEED_SCAN_PS"; + // 非排序需要验证主条码是否是自制件[工步参数] + public static final String NEED_CHECK_IS_PS = "NEED_CHECK_IS_PS"; // 未知腔数[工位参数]