diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java index abda7ed..5aa3700 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogInputRawMixWeightService.java @@ -1,17 +1,35 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; 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.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionAssemblyContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.util.MesPcnConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel; 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.repository.*; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; 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.*; /** * @Description : 原料调配输入重量弹框接口实现【输入原料调配弹框重量弹框】 @@ -31,15 +49,226 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im @Autowired private IShippingDispatchService shippingDispatchService; + @Autowired + private MesRawMixCfgDetailRepository rawMixCfgDetailRDao; + + @Autowired + private MesRawSnWeightRecordRepository rawSnWeightRecordRDao; + @Autowired + private MesRawWeightCfgRepository rawWeightCfgRDao; + @Autowired + private IMesPartService partService; + @Override public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + //页面渲染数据集 + final String organizeCode = reqBean.getOrganizeCode(); + StepResult stepResult = StepResult.getSuccessComplete(); this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), - String.format("生产线[%s]工位[%s]原料调配弹框提交成功,请等待验证!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()), + String.format("生产线[%s]工位[%s]调配原料数量弹框提交成功,请等待验证!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + final double inputQty = new Double(buttonDynamicModel.getFunctionValue()); + if (inputQty <= 0) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + String.format("输入数量[%s]不能小于等于0", inputQty), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + //获取工位当前设备信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + productionProcessContext.getMessage(), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + "当前不存在产品加工规则信息,请重置工序解决!", + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + MesProductionAssemblyContext assemblyContext = getProductionAssemblyContext(organizeCode, workCenter, prodRuleContextList, buttonDynamicModel.getFunctionValue(), stepResult); + if (assemblyContext == null) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + String.format("生产线[%s]工位[%s]裁片工单打印弹框提交信息有误!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); + + if (isAllAssemblyMatchRawMix(workCenter, prodRuleContextList)) { + if (!checkRawMixWeight(organizeCode, workCenter, prodRuleContextList, reqBean.getUserInfo())) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + "输入数量超出了容差范围", + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + } + + reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode()); + reqBean.setButtonCode(buttonDynamicModel.getButtonCode()); + reqBean.setStepDialogStatus(true); + shippingDispatchService.sendScanQueueNextExec(reqBean); + return true; + } + + private MesProductionAssemblyContext getProductionAssemblyContext(String organizeCode, MesWorkCenter workCenter, List prodRuleContextList, String qty, StepResult stepResult) { + final double rawWeight = new Double(qty); + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + + MesProductionAssemblyContext findAssemblyContext = null; + List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + if (StringUtils.isEmpty(productionAssemblyContext.getIsCheckedRawMix()) && Objects.equals(productionAssemblyContext.getAssemblyStatus(), MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_10.getValue())) { + double remainQty = getRemainQty(organizeCode, productionAssemblyContext.getAssemblyPartNo()); + if (rawWeight > remainQty) { + stepResult.setCompleted(false); + stepResult.setMsg(String.format("剩余数量[%s]不足!", remainQty)); + return null; + } + productionAssemblyContext.setQty(rawWeight); + productionAssemblyContext.setIsCheckedRawMix("1"); + findAssemblyContext = productionAssemblyContext; + break; + } + } + + //存在匹配成功的数据 + if (findAssemblyContext != null) { + prodRuleContext.assemblyDataJson(productionAssemblyContextList); + return findAssemblyContext; + } + } + return null; + } + + private boolean isAllAssemblyMatchRawMix(MesWorkCenter workCenter, List prodRuleContextList) { + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + + List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + if (StringUtils.isEmpty(productionAssemblyContext.getIsCheckedRawMix())) { + return false; + } + } + } return true; + } + + private boolean checkRawMixWeight(String organizeCode, MesWorkCenter workCenter, List prodRuleContextList, String userName) { + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + + List rawMixCfgDetailList = rawMixCfgDetailRDao.findByProperty( + new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), prodRuleContext.getOutPartNo()}); + if (CollectionUtils.isEmpty(rawMixCfgDetailList)) { + continue; + } + Map partCfgDetails = new HashMap<>(); + Map> partWeightPercent = new HashMap<>(); + for (MesRawMixCfgDetail rawMixCfgDetail : rawMixCfgDetailList) { + if (StringUtils.isEmpty(rawMixCfgDetail.getPartNo()) || rawMixCfgDetail.getPercent() == null) { + continue; + } + double percent = rawMixCfgDetail.getPercent(); + double rangeRate = rawMixCfgDetail.getRangeRate() != null ? rawMixCfgDetail.getRangeRate() : 0.0; + partWeightPercent.put(rawMixCfgDetail.getPartNo(), new AbstractMap.SimpleEntry<>(percent - rangeRate, percent + rangeRate)); + partCfgDetails.put(rawMixCfgDetail.getPartNo(), rawMixCfgDetail); + } + + List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); + double totalQty = productionAssemblyContextList.stream().mapToDouble(MesProductionAssemblyContext::getQty).sum(); + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + Map.Entry rangeRate = partWeightPercent.get(productionAssemblyContext.getAssemblyPartNo()); + if (null == rangeRate) { + continue; + } + double curPercent = productionAssemblyContext.getQty() / totalQty; + curPercent = curPercent * 100; + if (curPercent < rangeRate.getKey() || curPercent > rangeRate.getValue()) { + return false; + } + } + + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + MesRawMixCfgDetail detail = partCfgDetails.get(productionAssemblyContext.getAssemblyPartNo()); + if (detail == null) { + continue; + } + + MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), productionAssemblyContext.getAssemblyPartNo()}); + if (weightCfg == null) { + continue; + } + double remainQty = getRemainQty(organizeCode, productionAssemblyContext.getAssemblyPartNo()); + + MesRawSnWeightRecord record = new MesRawSnWeightRecord(); + record.setBarCode(productionAssemblyContext.getAssemblySn()); + record.setPartNo(productionAssemblyContext.getAssemblyPartNo()); + record.setPartName(productionAssemblyContext.getAssemblyPartName()); + record.setNetWeight(remainQty - productionAssemblyContext.getQty()); + record.setNetUnit(weightCfg.getNetUnit()); + record.setRawType(detail.getRawType()); + ConvertBean.serviceModelInitialize(record, userName); + rawSnWeightRecordRDao.insert(record); + } + + MesPart mesPart = partService.getMesPartByPartNo(prodRuleContext.getOutPartNo(), organizeCode); + if (mesPart != null) { + MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), mesPart.getPartNo()}); + if (weightCfg != null) { + MesRawSnWeightRecord record = new MesRawSnWeightRecord(); + record.setBarCode(prodRuleContext.getProductSn()); + record.setPartNo(mesPart.getPartNo()); + record.setPartName(mesPart.getPartName()); + record.setNetWeight(weightCfg.getNetWeight()); + record.setNetUnit(weightCfg.getNetUnit()); + record.setRawType(MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_10.getValue()); + ConvertBean.serviceModelInitialize(record, userName); + rawSnWeightRecordRDao.insert(record); + } + } + } + return true; } + private double getRemainQty(String organizeCode, String partNo) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); + MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(ddlPackBean); + if (record != null) { + return record.getNetWeight(); + } + + MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), partNo}); + if (weightCfg == null) { + return 0.0; + } + return weightCfg.getNetWeight(); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java new file mode 100644 index 0000000..e94e20e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java @@ -0,0 +1,162 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesNumberRuleMatchDispatchService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.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.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.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.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; + +/** + * @Description : 匹配调配原料条码工步 + * @Author : jason.niu + **/ +@Slf4j +@Service("mesAssemblyMatchRawMixStepService") +public class MesAssemblyMatchRawMixStepService extends BaseStepService { + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + @Autowired + private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; + @Autowired + private MesAssemblyShowNosortStepService assemblyShowNosortStepService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + final String organizeCode = reqBean.getOrganizeCode(); + + //获取工位当前设备信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + } + + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + if (CollectionUtils.isEmpty(prodRuleContextList)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产品加工规则信息,请重置工序解决!"); + } + + //验证是否存在装配件容器匹配 + Optional optional = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsMatchRawMix()))).findFirst(); + if (!optional.isPresent()) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, true, + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "验证每腔不存在装配件原料调配的装配件,默认跳过调配原料装配件!"); + } + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + if (isAllAssemblyMatchRawMix(workCenter, prodRuleContextList)) { + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "调配原料装配成功!"); + } + + //扫描信息置空 + String barcode = reqBean.resetScanInfo(reqBean.getScanInfo()); + if (StringUtils.isEmpty(barcode)) { + stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描调配原料条码!"); + } + + //处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成] + boolean result = doHandleMatchAssembly(reqBean, resultBean, stepResult, prodRuleContextList, barcode); + if (result) { + productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); + assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), prodRuleContextList); + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "请输入原料重量!"); + } + + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), "当前不存在装配件条码!"); + } + + private boolean isAllAssemblyMatchRawMix(MesWorkCenter workCenter, List prodRuleContextList) { + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { + continue; + } + + List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + if (StringUtils.isEmpty(productionAssemblyContext.getIsCheckedRawMix())) { + return false; + } + } + } + return true; + } + + //处理待验证的装配件条码 [扫描模式匹配成功返回true, 否则返回flase, 非扫描模式需要验证是否全部匹配完成] + private Boolean doHandleMatchAssembly(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List prodRuleContextList, String barcode) { + + //遍历产品加工规则 + 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; + + if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedCustomStepMatch(productionAssemblyNosortContext.getMatchType())) + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("当前工序模版不支持匹配[%s]确认方式的装配件信息!", MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.valueOfDescription(productionAssemblyNosortContext.getMatchType()))); + + //匹配规则 + Map result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), barcode, 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; + } + + //验证返回result里面是否存在assemblySn,存在特殊的规则会转换成新的条码 + String assemblySn = !result.containsKey(MesPcnExtConstWords.ASSEMBLY_SN) ? barcode : (String) result.get(MesPcnExtConstWords.ASSEMBLY_SN); + MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA); + //装配件清单该数据标记已装配 (如果是自制件赋值productSnId) + productionAssemblyNosortContext.assemblyStatus(assemblySn).productSnId(filter.getProductSnId()); + flag = true; + break; + } + + //存在匹配成功的数据 + if (flag) { + prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList); + return true; + } + } + + return false; + + } +}