diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java index 61536ea..764b915 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java @@ -64,7 +64,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { List productionAssemblySortContextList = new ArrayList<>(); - workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o).fileUrl(fileMap))); + workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey()))); return productionAssemblySortContextList; } @@ -92,7 +92,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { List productionAssemblySortContextList = new ArrayList<>(); - workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o, getProductionAssembly(productionAssemblyMap, o.getId())))); + workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add(new MesProductionAssemblySortContext().copy(o, getProductionAssembly(productionAssemblyMap, o.getId())).foreignKey(prodRuleContext.getForeignKey()))); return productionAssemblySortContextList; } @@ -167,7 +167,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { //遍历装配件规则, 实例化装配件清单对象, 判断是否配置可复用 assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add( - new MesProductionAssemblyNosortContext().copy(prodRuleContext, o, getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), o)).fileUrl(fileMap)) + new MesProductionAssemblyNosortContext().copy(prodRuleContext, o, getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), o)).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey())) ); return productionAssemblyNosortContextList; 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 e3a747f..4fefd4a 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 @@ -84,7 +84,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); //验证是否存在待绑定数据 - Boolean IsNeedScanAssembly = checkIsNeedScanAssembly(prodRuleContextList); + Boolean isNeedScanAssembly = checkIsNeedScanAssembly(prodRuleContextList); Boolean hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList); //根据产出零件或者腔数拿到需要的加工规则数量, 优先使用产出零件数量 @@ -96,10 +96,10 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { } //没有待绑定数据, 验证当前是否满足腔数 没有进料主条码代码当前加工规则已经全部加载, 有的话需要判断是否全部扫完 没有扫完需要返回false继续扫描主条码 - if (!IsNeedScanAssembly || !hasUnBindAssembly) { + if (!isNeedScanAssembly || !hasUnBindAssembly) { return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, (CollectionUtils.isEmpty(productionPsInContextList) || productionPsInContextList.size() >= needQty) ? true : stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN).isCompleted(), - MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, !IsNeedScanAssembly ? "当前加工规则未配置装配件扫描项,当前无需匹配装配件条码!" : "当前加工规则对应的装配件扫描项均匹配完毕!"); + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, !isNeedScanAssembly ? "当前加工规则未配置装配件扫描项,当前无需匹配装配件条码!" : "当前加工规则对应的装配件扫描项均匹配完毕!"); } //获取上下文生产扫/读信息:装配件条码 @@ -113,17 +113,19 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { Boolean isSkip = checkIsSkip(productionProcessContext, equipVariableCollectContextList); //处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成] - Boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, prodRuleContextList, equipVariableCollectContextList, isSkip); + Boolean result = doHandleMatchAssembly(reqBean, stepResult, prodRuleContextList, equipVariableCollectContextList, isSkip); //验证是否存在待绑定数据 hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList); //搜集装配件条码 + String suffix = MesPcnExtConstWords.EMPTY; String assemblySn = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); //匹配成功 【result=true 代表单次扫描匹配成功; hasUnBindAssembly=false 代表浑腔模式全部匹配成功】 if (result || !hasUnBindAssembly) { productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), cellEquipContext, prodRuleContextList); + suffix = isSkip ? stepResult.getMsg() : String.format("装配件条码%s匹配成功!", assemblySn); } //全部匹配完毕,存在进料且进料数量满足腔数的时候直接调用 生成零件条码工步 @@ -133,12 +135,12 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { if (!hasUnBindAssembly) { return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn), stepResult, (CollectionUtils.isEmpty(productionPsInContextList) || productionPsInContextList.size() >= needQty) ? true : stepResult.isCompleted(false).nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN).isCompleted(), - MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("%s当前加工规则对应的装配件扫描项均匹配完毕!", isSkip ? stepResult.getMsg() : String.format("装配件条码%s匹配成功!", assemblySn))); + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("%s当前加工规则对应的装配件扫描项均匹配完毕!", suffix)); } //单次匹配成功 if (result) return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn), - stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, isSkip ? stepResult.getMsg() : String.format("装配件条码%s匹配成功!", assemblySn)); + stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, suffix); //匹配失败验证是否重置装配件扫描项 MesWorkCell workCell = productionProcessContext.getWorkCell(); @@ -221,7 +223,7 @@ public class MesAssemblyMatchNosortStepService extends BaseStepService { } //处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成] - private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List prodRuleContextList, List equipVariableCollectContextList, Boolean isSkip) { + private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StepResult stepResult, List prodRuleContextList, List equipVariableCollectContextList, Boolean isSkip) { //遍历产品加工规则 for (MesProdRuleContext prodRuleContext : prodRuleContextList) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchSortStepService.java new file mode 100644 index 0000000..09525e3 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchSortStepService.java @@ -0,0 +1,312 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +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 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.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Description : 装配件匹配工步 【排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesAssemblyMatchSortStepService") +public class MesAssemblyMatchSortStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; + + @Autowired + private MesAssemblyShowNosortStepService assemblyShowNosortStepService; + + @Autowired + private IMesProductionRecordService productionRecordService; + + @Autowired + private IMesTimeEfficientCfgMatchService timeEfficientCfgMatchService; + + @Autowired + private IFsmCommonService fsmCommonService; + + @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 prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在非排序加工规则数据,请重置工序!"); + + //从上下文中取出生产线对象 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //获取上下文产出零件数据信息集合 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //获取上下文进料零件条码信息集合 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + //判断是否存在装配件清单 + if (!checkIsNeedScanAssembly(prodRuleContextList)) return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前加工规则未配置装配件扫描项,当前无需匹配装配件条码!"); + + //验证是否存在待绑定数据 + Boolean hasUnBindAssembly = hasUnBindAssembly(prodRuleContextList); + if (!hasUnBindAssembly) return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前加工规则对应的装配件扫描项均匹配完毕!"); + + //获取上下文生产扫/读信息:装配件条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanAssemblySnContext(reqBean); + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), "当前不存在装配件条码!"); + + //删除上下文扫/读信息:装配件条码 + productionDispatchContextStepService.removeScanAssemblySnContext(reqBean); + + //验证当前是否属于装配件跳过码 + Boolean isSkip = checkIsSkip(productionProcessContext, equipVariableCollectContextList); + //验证当前是否属于装配件整体跳过码 + Boolean isAllSkip = checkIsAllSkip(productionProcessContext, equipVariableCollectContextList, prodRuleContextList, stepResult); + + //处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成] + Boolean result = isAllSkip ? true : doHandleMatchAssembly(reqBean, stepResult, prodRuleContextList, equipVariableCollectContextList, isSkip); + + //验证是否存在待绑定数据 + hasUnBindAssembly = isAllSkip ? true : hasUnBindAssembly(prodRuleContextList); + + //搜集装配件条码 + String suffix = MesPcnExtConstWords.EMPTY; + String assemblySn = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); + //匹配成功 【result=true 代表单次扫描匹配成功; hasUnBindAssembly=false 代表浑腔模式全部匹配成功】 + if (result || !hasUnBindAssembly) { + productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); + assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), cellEquipContext, prodRuleContextList); + suffix = (isSkip || isAllSkip) ? stepResult.getMsg() : String.format("装配件条码%s匹配成功!", assemblySn); + } + + //验证是否存在待绑定数据 + if (!hasUnBindAssembly) return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("%s当前加工规则对应的装配件扫描项均匹配完毕!", suffix)); + + //单次匹配成功 + if (result) return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().scanInfo(assemblySn), + stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, suffix); + + stepResult.msg(String.format("装配件条码%s匹配失败!%s", assemblySn, StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg())); + + this.sendMessage(reqBean, new StationResultBean().writeDbLog().scanInfo(assemblySn), + String.format("%s%s", stepResult.getMsg(), StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.EMPTY : stepResult.getObj()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), stepResult.getMsg()); + + } + + private List resetAssembly(StationRequestBean reqBean, List prodRuleContextList) { + + //是否支持混腔扫描[工位参数] + String cavityNosortCfg = getCavityNosortCfg(reqBean); + + prodRuleContextList.forEach(o -> { + + if (!StringUtils.isEmpty(o.getAssemblyDataJson())) { + + List productionAssemblyNosortContextList = o.getNosortAssemblyDataContext(); + + if (!StringUtils.isEmpty(cavityNosortCfg) || hasUnBindAssemblyOptional(productionAssemblyNosortContextList)) { + + productionAssemblyNosortContextList.forEach(i -> { if (i.getIsResetScan().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) i.assemblyStatusReset(); }); + + o.assemblyDataJson(productionAssemblyNosortContextList); + + } + + } + + }); + + return prodRuleContextList; + } + + //是否支持混腔扫描[工位参数] + 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 Boolean checkIsSkip(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList) { + if (equipVariableCollectContextList.size() > 1) return false; + if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) != 0) return false; + if (!equipVariableCollectContextList.get(0).getEquipVariableValue().equals(productionProcessContext.getAssemblySkipCode())) return false; + return true; + } + + //验证当前是否属于装配件整体跳过码 + private Boolean checkIsAllSkip(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List prodRuleContextList, StepResult stepResult) { + if (equipVariableCollectContextList.size() > 1) return false; + if (equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue()) != 0) return false; + if (!equipVariableCollectContextList.get(0).getEquipVariableValue().equals(productionProcessContext.getAssemblyAllSkipCode())) return false; + + //TODO + return true; + } + + //判断是否存在装配件清单 + private Boolean checkIsNeedScanAssembly(List prodRuleContextList) { + Optional optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getAssemblyDataJson()))).findFirst(); + return (null == optional || !optional.isPresent()) ? false : true; + } + + //验证是否存在待绑定数据 + private Boolean hasUnBindAssembly(List prodRuleContextList) { + Boolean hasUnBindAssembly = false; + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); + if (!hasUnBindAssemblyOptional(productionAssemblyNosortContextList)) continue; + hasUnBindAssembly = true; + break; + } + return hasUnBindAssembly; + } + + private Boolean hasUnBindAssemblyOptional(List productionAssemblyNosortContextList) { + Optional optional = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); + return (null == optional || !optional.isPresent()) ? false : true; + } + + //处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成] + private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StepResult stepResult, List prodRuleContextList, List equipVariableCollectContextList, Boolean isSkip) { + + //遍历产品加工规则 + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + + //没有装配件的条件 + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + + //获取非排序装配件清单 + List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); + + Boolean flag = false; + + //遍历装配件清单 + LOOP: + 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; + + //装配件跳过, 必须顺序扫描才生效 + if (isSkip && !StringUtils.isEmpty(prodRuleContext.getIsCheckBindSeq()) && prodRuleContext.getIsCheckBindSeq().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) { + + //匹配成功 + equipVariableCollectContext.isConsume(); + + flag = true; + + //装配件清单该数据标记跳过 + productionAssemblyNosortContext.assemblySkip(); + + stepResult.msg(String.format("装配件跳过码验证成功,已跳过当前装配项!")); + + break LOOP; + + } + + //匹配规则 + Map result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext); + + //匹配失败 + if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { + String msg = (String) result.get(MesPcnExtConstWords.MESSAGE); + stepResult.obj(String.format("%s%s", StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.EMPTY : stepResult.getObj(), StringUtils.isEmpty(msg) ? MesPcnExtConstWords.EMPTY : msg)); + continue; + } + + MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA); + + //前道防错 + if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblyNosortContext.getPreCraftCode())) { + if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode()))) { + stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), + String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getPartNo(), productionAssemblyNosortContext.getPreCraftCode()))); + continue; + } + } + + //时效性验证 + if (!StringUtils.isEmpty(filter.getProductSnId())) { + result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE30.getValue()); + + if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) { + stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), result.get(MesPcnExtConstWords.MESSAGE))); + continue; + } + } + + //匹配成功 + equipVariableCollectContext.isConsume(); + + flag = true; + + //装配件清单该数据标记已装配 (如果是自制件赋值productSnId) + productionAssemblyNosortContext.assemblyStatus(equipVariableCollectContext.getEquipVariableValue()).productSnId(filter.getProductSnId()); + + break; + + } + + //是否验证顺序装配 + 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; + + } + + //存在匹配成功的数据 + if (flag) prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList); + if (flag && equipVariableCollectContextList.get(0).getMessageSource().compareTo(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()) != 0 && equipVariableCollectContextList.size() == 1) return true; + + } + + return false; + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java index 2068534..1d35e38 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java @@ -314,9 +314,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //【非排序线】获取产品加工规则 ; 分别根据 进料零件有值 与 进料规则不为空 查询 再合并数据返回, 条件携带产出零件 List prodRuleNosortCfgList = getProdRuleNosortCfgList(reqBean, cellEquipContext, productionPsInContextList, outPartNoList); - //TODO 提示优化 直接根除产出零件去查询,判断产出零件对应的加工规则是不是仅仅维护了一个 - //List prodRuleNosortCfgList = prodRuleCfgExtService.getProdRuleNosortCfgList(new MesProdRuleContext(reqBean.getOrganizeCode()).equipmentCode(cellEquipContext.getEquipmentCode()).outPartNos(outPartNoList)); - //根据产出零件分组数据 Map> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index 0a792f5..13f05df 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -110,7 +110,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl if (isCheckProcess && (StringUtils.isEmpty(productionProcessContext.getProcessCode()) || !productionProcessContext.getProcessCode().equals(reqBean.getProcessCode()))) processContext(reqBean, productionProcessContext); //生产过程上下文对象赋值生产过程控制全局密码 - if (StringUtils.isEmpty(productionProcessContext.getFinishCode()) || StringUtils.isEmpty(productionProcessContext.getCraftJumpCode()) || StringUtils.isEmpty(productionProcessContext.getAssemblySkipCode())) productionPwdContext(reqBean, productionProcessContext); + if (StringUtils.isEmpty(productionProcessContext.getFinishCode()) || StringUtils.isEmpty(productionProcessContext.getCraftJumpCode()) || StringUtils.isEmpty(productionProcessContext.getAssemblySkipCode()) || StringUtils.isEmpty(productionProcessContext.getAssemblyAllSkipCode())) productionPwdContext(reqBean, productionProcessContext); return productionProcessContext; @@ -147,7 +147,8 @@ public class MesProductionProcessContextStepService extends BaseStepService impl Map> cfgKeyMap = CollectionUtils.isEmpty(configList) ? null : configList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getCfgKey()))).collect(Collectors.groupingBy(MesConfig::getCfgKey)); return productionProcessContext.finishCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.CAVITY_FINISH_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.CAVITY_FINISH_CODE).get(0).getCfgValue() : MesPcnExtConstWords.CAVITY_FINISH_CODE) .craftJumpCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.CRAFT_JUMP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.CRAFT_JUMP_CODE).get(0).getCfgValue() : MesPcnExtConstWords.CRAFT_JUMP_CODE) - .assemblySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE).get(0).getCfgValue() : MesPcnExtConstWords.ASSEMBLY_SKIP_CODE); + .assemblySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE).get(0).getCfgValue() : MesPcnExtConstWords.ASSEMBLY_SKIP_CODE) + .assemblyAllSkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_ALL_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_ALL_SKIP_CODE).get(0).getCfgValue() : MesPcnExtConstWords.ASSEMBLY_ALL_SKIP_CODE); } //验证组织模型有效性 diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java index 1e71cc4..ecaf1de 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyContext.java @@ -107,4 +107,7 @@ public class MesProductionAssemblyContext implements Serializable { @ApiParam("工艺名称") public String craftName; + @ApiParam(name = "数据关联键") + public Integer foreignKey; + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java index 4d5b264..9dfde0e 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblyNosortContext.java @@ -72,6 +72,11 @@ public class MesProductionAssemblyNosortContext extends MesProductionAssemblyCon return this; } + public MesProductionAssemblyNosortContext foreignKey(Integer foreignKey) { + this.foreignKey = foreignKey; + return this; + } + public MesProductionAssemblyNosortContext assemblyStatus(String assemblySn) { this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(); this.assemblySn = assemblySn; diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java index 6142caf..d557845 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionAssemblySortContext.java @@ -155,6 +155,11 @@ public class MesProductionAssemblySortContext extends MesProductionAssemblyConte return this; } + public MesProductionAssemblySortContext foreignKey(Integer foreignKey) { + this.foreignKey = foreignKey; + return this; + } + public MesProductionAssemblySortContext assemblyStatus() { this.assemblyStatus = MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue(); return this; diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java index 76e92cf..a1b4813 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java @@ -44,6 +44,9 @@ public class MesProductionProcessContext implements Serializable { @ApiParam("装配件跳过码") private String assemblySkipCode; + @ApiParam("装配件整体跳过码") + private String assemblyAllSkipCode; + @ApiParam("生产线信息([Json]MesWorkCenter)") private String workCenterJson; @@ -133,6 +136,12 @@ public class MesProductionProcessContext implements Serializable { return this.isNeedCache(); } + //上下文赋值装配件整体跳过码 + public MesProductionProcessContext assemblyAllSkipCode(String assemblyAllSkipCode) { + this.assemblyAllSkipCode = assemblyAllSkipCode; + return this.isNeedCache(); + } + //---------------------- 生产线对象 --------------------------------------- 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 61ae7e2..1cab626 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 @@ -233,6 +233,8 @@ public class MesPcnExtConstWords { public static final String CRAFT_JUMP_CODE = "CRAFT_JUMP_CODE"; // 装配件跳过码 public static final String ASSEMBLY_SKIP_CODE = "ASSEMBLY_SKIP_CODE"; + // 装配件整体跳过码 + public static final String ASSEMBLY_ALL_SKIP_CODE = "ASSEMBLY_ALL_SKIP_CODE"; // 设备代码[工步参数] public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE"; // 模具号读一模多腔配置[工步参数]