From ca33e99050e1de659937d44cabe6376ffc57c39b Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 2 Jul 2025 17:13:07 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8A=E6=96=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step/context/MesProductionProcessContextStepService.java | 3 ++- .../ext/mes/pcn/pojo/context/MesProductionProcessContext.java | 9 +++++++++ .../estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) 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 5bf6026..84d9bc3 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 @@ -164,7 +164,8 @@ public class MesProductionProcessContextStepService extends BaseStepService impl .craftJumpCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.CRAFT_JUMP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.CRAFT_JUMP_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.CRAFT_JUMP_CODE) .assemblySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_SKIP_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.ASSEMBLY_SKIP_CODE) .assemblyCavitySkipCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.ASSEMBLY_CAVITY_SKIP_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.ASSEMBLY_CAVITY_SKIP_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.ASSEMBLY_CAVITY_SKIP_CODE) - .sortSuspiciousCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.SORT_SUSPICIOUS_CODE); + .sortSuspiciousCode((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE)) ? cfgKeyMap.get(MesPcnExtConstWords.SORT_SUSPICIOUS_CODE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.SORT_SUSPICIOUS_CODE) + .containerBindClosePackage((!CollectionUtils.isEmpty(cfgKeyMap) && cfgKeyMap.containsKey(MesPcnExtConstWords.MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE)) ? cfgKeyMap.get(MesPcnExtConstWords.MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE).get(0).getCfgValue().toUpperCase() : MesPcnExtConstWords.MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE); } //验证组织模型有效性 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 99e8d91..94f1ee2 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 @@ -57,6 +57,9 @@ public class MesProductionProcessContext implements Serializable { @ApiParam("排序线可疑码") private String sortSuspiciousCode; + @ApiParam("工步上料关箱码") + private String containerBindClosePackage; + @ApiParam("生产线信息([Json]MesWorkCenter)") private String workCenterJson; @@ -162,6 +165,12 @@ public class MesProductionProcessContext implements Serializable { return this.isNeedCache(); } + //工步上料关箱码 + public MesProductionProcessContext containerBindClosePackage(String containerBindClosePackage) { + this.containerBindClosePackage = containerBindClosePackage; + 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 19b9136..ffe29ac 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 @@ -463,6 +463,8 @@ public class MesPcnExtConstWords { public static final String ASSEMBLY_CAVITY_SKIP_CODE = "ASSEMBLY_CAVITY_SKIP_CODE"; // 排序线可疑码 public static final String SORT_SUSPICIOUS_CODE = "SORT_SUSPICIOUS_CODE"; + // 工步上料关箱码 + public static final String MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE = "MATCH_STEP_CONTAINER_BIND_CLOSE_PACKAGE"; // 设备代码[工步参数] public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE"; // 模具号读一模多腔配置[工步参数] @@ -751,8 +753,6 @@ public class MesPcnExtConstWords { public static final String MATCH_STATION_FEED_SCAN_SN_CONTEXT = "MATCH_STATION_FEED_SCAN_SN_CONTEXT"; // 用于缺料时进行上料扫描上料绑定的容器条码 public static final String MATCH_STATION_FEED_CONTAINER_SN_CONTEXT = "MATCH_STATION_FEED_CONTAINER_SN_CONTEXT"; - // 工步上料关箱码 - public static final String MATCH_STATION_FEED_CLOSE_PACKAGE = "MATCH_STATION_FEED_CLOSE_PACKAGE"; //OPC_API_PARAM From afdae0a8d20b8f7a5bc95bf4c097b810bc821087 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 7 Jul 2025 09:20:44 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E5=B7=A5=E6=AD=A5=E8=B0=83=E9=85=8D?= =?UTF-8?q?=E5=8E=9F=E6=96=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MesFunctionDialogInputRawMixWeightService.java | 231 ++++++++++++++++++++- .../step/MesAssemblyMatchRawMixStepService.java | 162 +++++++++++++++ 2 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java 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; + + } +} From 3a1a45777cabbac9bc341da07c5026740ca5d41d Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 7 Jul 2025 14:41:11 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=B7=A5=E6=AD=A5=E8=B0=83=E9=85=8D?= =?UTF-8?q?=E5=8E=9F=E6=96=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcn/api/busi/IMesRawSnWeightRecordService.java | 12 +++ .../busi/MesContainerSnBindServiceImpl.java | 5 - .../busi/MesRawSnWeightRecordServiceImpl.java | 105 +++++++++++++++++++++ .../MesFunctionDialogInputRawMixWeightService.java | 69 ++++---------- .../step/MesAssemblyMatchRawMixStepService.java | 62 +++++++++--- .../step/MesAssemblySaveStepService.java | 17 +++- 6 files changed, 203 insertions(+), 67 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java new file mode 100644 index 0000000..492b7d8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java @@ -0,0 +1,12 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +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.MesProductionAssemblyNosortContext; + +import java.util.List; + +public interface IMesRawSnWeightRecordService { + void insertRawRemainWeightRecord(MesProductionAssemblyContext context, String organizeCode, String username); + void insertOutPartNoWeightRecord(MesProdRuleContext prodRuleContext, List productionAssemblyNosortContextList, String organizeCode, String username); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java index 881c836..5a388cc 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java @@ -531,11 +531,6 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService containerPackageRDao.save(containerPackage); } if (!CollectionUtils.isEmpty(model.getPackageDetails())) { -// if (containerPackage != null) { -// for (MesContainerPackageDetail packageDetail : model.getPackageDetails()) { -// packageDetail.setPid(containerPackage.getId()); -// } -// } containerPackageDetailRDao.saveAll(model.getPackageDetails()); } if (!CollectionUtils.isEmpty(model.getBindingList())) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java new file mode 100644 index 0000000..e3defa0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java @@ -0,0 +1,105 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesRawSnWeightRecordService; +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.MesProductionAssemblyNosortContext; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.bean.MesRawMixCfgDetail; +import cn.estsh.i3plus.pojo.mes.bean.MesRawSnWeightRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesRawWeightCfg; +import cn.estsh.i3plus.pojo.mes.repository.MesRawMixCfgDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesRawWeightCfgRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordService { + @Autowired + private MesRawSnWeightRecordRepository rawSnWeightRecordRDao; + @Autowired + private MesRawWeightCfgRepository rawWeightCfgRDao; + @Autowired + private MesRawMixCfgDetailRepository rawMixCfgDetailRDao; + @Autowired + private IMesPartService partService; + + @Override + public void insertRawRemainWeightRecord(MesProductionAssemblyContext context, String organizeCode, String username) { + MesRawMixCfgDetail detail = rawMixCfgDetailRDao.getByProperty( + new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo", "partNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), context.getPartNo(), context.getAssemblyPartNo()}); + if (detail == null) { + return; + } + + MesRawWeightCfg weightCfg = rawWeightCfgRDao.getByProperty(new String[]{"organizeCode", "isValid", "isDeleted", "partNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), context.getAssemblyPartNo()}); + if (weightCfg == null) { + return; + } + double remainQty = getRemainQty(organizeCode, context.getAssemblyPartNo()); + + MesRawSnWeightRecord record = new MesRawSnWeightRecord(); + record.setOrganizeCode(organizeCode); + record.setBarCode(context.getAssemblySn()); + record.setPartNo(context.getAssemblyPartNo()); + record.setPartName(context.getAssemblyPartName()); + record.setNetWeight(remainQty - context.getQty()); + record.setNetUnit(weightCfg.getNetUnit()); + record.setRawType(detail.getRawType()); + ConvertBean.serviceModelInitialize(record, username); + rawSnWeightRecordRDao.insert(record); + } + + @Override + public void insertOutPartNoWeightRecord(MesProdRuleContext prodRuleContext, List productionAssemblyNosortContextList, String organizeCode, String username) { + MesPart mesPart = partService.getMesPartByPartNo(prodRuleContext.getOutPartNo(), organizeCode); + if (mesPart == null) { + return; + } + double totalWeight = 0.0; + for (MesProductionAssemblyNosortContext context : productionAssemblyNosortContextList) { + if (Objects.equals(context.getMatchType(), MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_90.getValue())) { + totalWeight += context.getQty(); + } + } + + MesRawSnWeightRecord record = new MesRawSnWeightRecord(); + record.setOrganizeCode(organizeCode); + record.setBarCode(prodRuleContext.getProductSn()); + record.setPartNo(mesPart.getPartNo()); + record.setPartName(mesPart.getPartName()); + record.setNetWeight(totalWeight); + record.setRawType(MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_10.getValue()); + ConvertBean.serviceModelInitialize(record, username); + rawSnWeightRecordRDao.insert(record); + } + + 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/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 5aa3700..24f06e9 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 @@ -3,6 +3,7 @@ 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.MesAssemblyShowNosortStepService; 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; @@ -44,9 +45,6 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired - private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService; - - @Autowired private IShippingDispatchService shippingDispatchService; @Autowired @@ -57,7 +55,7 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im @Autowired private MesRawWeightCfgRepository rawWeightCfgRDao; @Autowired - private IMesPartService partService; + private MesAssemblyShowNosortStepService assemblyShowNosortStepService; @Override public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { @@ -103,24 +101,29 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); return false; } - productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); + boolean bOverCapacity = false; 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; + bOverCapacity = true; } } + productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); + if (bOverCapacity) { + assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), prodRuleContextList); + } + 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; + return !bOverCapacity; } private MesProductionAssemblyContext getProductionAssemblyContext(String organizeCode, MesWorkCenter workCenter, List prodRuleContextList, String qty, StepResult stepResult) { @@ -184,7 +187,6 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im 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) { @@ -193,9 +195,9 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im 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); } + boolean flag = true; List productionAssemblyContextList = prodRuleContext.getAssemblyDataContext(workCenter); double totalQty = productionAssemblyContextList.stream().mapToDouble(MesProductionAssemblyContext::getQty).sum(); for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { @@ -207,49 +209,18 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im 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; + flag = false; + break; } - 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); + if (!flag) { + for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { + productionAssemblyContext.setIsCheckedRawMix(null); + productionAssemblyContext.setQty(0.0); + productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()); } + prodRuleContext.assemblyDataJson(productionAssemblyContextList); + return false; } } return true; 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 index e94e20e..08708e6 100644 --- 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 @@ -3,15 +3,18 @@ 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.apiservice.util.MesPcnException; 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.MesProduceSn; 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.repository.MesProduceSnRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -19,9 +22,7 @@ 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.*; /** * @Description : 匹配调配原料条码工步 @@ -38,6 +39,8 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { private IMesNumberRuleMatchDispatchService numberRuleMatchDispatchService; @Autowired private MesAssemblyShowNosortStepService assemblyShowNosortStepService; + @Autowired + private MesProduceSnRepository produceSnRDao; @Override public StepResult execute(StationRequestBean reqBean) { @@ -84,10 +87,10 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { if (result) { productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), prodRuleContextList); - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "请输入原料重量!"); + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "请输入原料重量!"); } - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), "当前不存在装配件条码!"); + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_ASSEMBLY), StringUtils.isEmpty(stepResult.getMsg()) ? "当前不存在装配件条码!" : stepResult.getMsg()); } private boolean isAllAssemblyMatchRawMix(MesWorkCenter workCenter, List prodRuleContextList) { @@ -118,7 +121,7 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { //获取非排序装配件清单 List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); - Boolean flag = false; + boolean flag = false; //遍历装配件清单 LOOP: @@ -130,13 +133,18 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { 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); - + Map result; + // 未维护匹配规则,则按自制件进行校验。 + if (StringUtils.isEmpty(productionAssemblyNosortContext.getMatchRule())) { + result = checkProductSnRule(reqBean.getOrganizeCode(), barcode); + } else { + //匹配规则 + result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), barcode, productionAssemblyNosortContext); + } //匹配失败 - if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { + if (!Objects.equals(result.get(MesPcnExtConstWords.RESULT), true)) { 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)); + stepResult.setMsg(msg); continue; } @@ -144,7 +152,10 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { 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()); + productionAssemblyNosortContext.assemblyStatus(assemblySn); + if (filter != null) { + productionAssemblyNosortContext.productSnId(filter.getProductSnId()); + } flag = true; break; } @@ -157,6 +168,33 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { } return false; + } + + private Map checkProductSnRule(String organizeCode, String barcode) { + Map result = new HashMap<>(); + result.put(MesPcnExtConstWords.RESULT, false); + + MesProduceSn produceSn = produceSnRDao.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "productSn"}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), barcode}); + if (produceSn == null) { + result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描条码【%s】在条码表不存在, 请检查数据!", barcode)); + return result; + } + + if (!Objects.equals(produceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()) && + !Objects.equals(produceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue())) { + result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描条码【%s】的条码状态必须为“创建”或“已完成”, 请检查数据!", barcode)); + return result; + } + + if (!Objects.equals(produceSn.getQcStatus(), MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) && + !Objects.equals(produceSn.getQcStatus(), MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS_TO_QUALIFIED.getValue())) { + result.put(MesPcnExtConstWords.MESSAGE, String.format("扫描条码【%s】的质量状态必须为“合格”或“可疑转正常”, 请检查数据!", barcode)); + return result; + } + result.put(MesPcnExtConstWords.RESULT, true); + return result; } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java index 07f1061..5b0a855 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java @@ -56,6 +56,9 @@ public class MesAssemblySaveStepService extends BaseStepService { @Autowired private IMesStationContainerSnExtService stationContainerSnExtService; + @Autowired + private IMesRawSnWeightRecordService rawSnWeightRecordService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -129,12 +132,15 @@ public class MesAssemblySaveStepService extends BaseStepService { //容器匹配, 一个装配件信息可能对应多条原料条码 if (productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_80.getValue()) == 0) { insertMesProductionAssembly80(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); + } else if (productionAssemblyNosortContext.getMatchType().compareTo(MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.MATCH_TYPE_90.getValue()) == 0) { + insertMesProductionAssembly90(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); } else { //一对一 insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); } } - + //写入调配产出物重量记录 + rawSnWeightRecordService.insertOutPartNoWeightRecord(prodRuleContext, productionAssemblyNosortContextList, reqBean.getOrganizeCode(), reqBean.getUserInfo()); } //保存装配件绑定记录 @@ -216,4 +222,13 @@ public class MesAssemblySaveStepService extends BaseStepService { } + //调配原料, 记录原料的剩余数量及胶水总重量。 + private void insertMesProductionAssembly90(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, + MesProdRuleContext prodRuleContext, MesProductionPsOutContext productionPsOutContext, + MesProductionAssemblyNosortContext productionAssemblyNosortContext, MesScanMonitorContext scanMonitorContext, List productSnIdList) { + //保存装配件绑定记录 + insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); + //写入调配原料剩余数量 + rawSnWeightRecordService.insertRawRemainWeightRecord(productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo()); + } } From 1b22d0a8bcfed23588d4442f64a43aafd4b8ce21 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 7 Jul 2025 18:28:54 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=B7=A5=E6=AD=A5=E8=B0=83=E9=85=8D?= =?UTF-8?q?=E5=8E=9F=E6=96=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcn/api/busi/IMesRawSnWeightRecordService.java | 4 +- .../busi/MesRawSnWeightRecordServiceImpl.java | 8 ++-- .../MesFunctionDialogInputRawMixWeightService.java | 51 ++++++++++++---------- .../step/MesAssemblySaveStepService.java | 2 +- 4 files changed, 37 insertions(+), 28 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java index 492b7d8..3cd742a 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java @@ -1,12 +1,12 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; -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.MesProductionAssemblyNosortContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; import java.util.List; public interface IMesRawSnWeightRecordService { void insertRawRemainWeightRecord(MesProductionAssemblyContext context, String organizeCode, String username); - void insertOutPartNoWeightRecord(MesProdRuleContext prodRuleContext, List productionAssemblyNosortContextList, String organizeCode, String username); + void insertOutPartNoWeightRecord(MesProductionPsOutContext productionPsOutContext, List productionAssemblyNosortContextList, String organizeCode, String username); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java index e3defa0..22aa6d6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java @@ -5,6 +5,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesRawSnWeightRecordService; 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.MesProductionAssemblyNosortContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; @@ -63,8 +64,8 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer } @Override - public void insertOutPartNoWeightRecord(MesProdRuleContext prodRuleContext, List productionAssemblyNosortContextList, String organizeCode, String username) { - MesPart mesPart = partService.getMesPartByPartNo(prodRuleContext.getOutPartNo(), organizeCode); + public void insertOutPartNoWeightRecord(MesProductionPsOutContext productionPsOutContext, List productionAssemblyNosortContextList, String organizeCode, String username) { + MesPart mesPart = partService.getMesPartByPartNo(productionPsOutContext.getPartNo(), organizeCode); if (mesPart == null) { return; } @@ -77,10 +78,11 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer MesRawSnWeightRecord record = new MesRawSnWeightRecord(); record.setOrganizeCode(organizeCode); - record.setBarCode(prodRuleContext.getProductSn()); + record.setBarCode(productionPsOutContext.getProductSn()); record.setPartNo(mesPart.getPartNo()); record.setPartName(mesPart.getPartName()); record.setNetWeight(totalWeight); + record.setNetUnit(mesPart.getWeightUom()); record.setRawType(MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_10.getValue()); ConvertBean.serviceModelInitialize(record, username); rawSnWeightRecordRDao.insert(record); 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 24f06e9..0b59df8 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 @@ -93,25 +93,23 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im return false; } + boolean bOverCapacity = false; MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - MesProductionAssemblyContext assemblyContext = getProductionAssemblyContext(organizeCode, workCenter, prodRuleContextList, buttonDynamicModel.getFunctionValue(), stepResult); - if (assemblyContext == null) { + if (doHandleProductionAssemblyContext(organizeCode, workCenter, prodRuleContextList, buttonDynamicModel.getFunctionValue(), stepResult)) { + 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); + bOverCapacity = true; + } + } + } else { + bOverCapacity = true; 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()), + stepResult.getMsg(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); - return false; } - - boolean bOverCapacity = false; - 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); - bOverCapacity = true; - } - } - productionDispatchContextStepService.dispatchProdRuleDataContext(reqBean, prodRuleContextList); if (bOverCapacity) { assemblyShowNosortStepService.showProductionAssembly(reqBean, resultBean, productionProcessContext.getWorkCenter(), prodRuleContextList); @@ -126,8 +124,9 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im return !bOverCapacity; } - private MesProductionAssemblyContext getProductionAssemblyContext(String organizeCode, MesWorkCenter workCenter, List prodRuleContextList, String qty, StepResult stepResult) { + private boolean doHandleProductionAssemblyContext(String organizeCode, MesWorkCenter workCenter, List prodRuleContextList, String qty, StepResult stepResult) { final double rawWeight = new Double(qty); + stepResult.setCompleted(true); for (MesProdRuleContext prodRuleContext : prodRuleContextList) { if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getIsMatchRawMix())) { continue; @@ -139,12 +138,16 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im 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) { + productionAssemblyContext.setIsCheckedRawMix(null); + productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()); + productionAssemblyContext.setAssemblySn(null); + stepResult.setCompleted(false); - stepResult.setMsg(String.format("剩余数量[%s]不足!", remainQty)); - return null; + stepResult.setMsg(String.format("零件号[%s], 输入数量[%s], 剩余数量[%s]不足!", productionAssemblyContext.getAssemblyPartNo(), rawWeight, remainQty)); + } else { + productionAssemblyContext.setQty(rawWeight); + productionAssemblyContext.setIsCheckedRawMix("1"); } - productionAssemblyContext.setQty(rawWeight); - productionAssemblyContext.setIsCheckedRawMix("1"); findAssemblyContext = productionAssemblyContext; break; } @@ -153,10 +156,13 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im //存在匹配成功的数据 if (findAssemblyContext != null) { prodRuleContext.assemblyDataJson(productionAssemblyContextList); - return findAssemblyContext; + return stepResult.isCompleted(); } } - return null; + + stepResult.setCompleted(false); + stepResult.setMsg("未匹配到装配原料,请重新扫描装配件原料!"); + return false; } private boolean isAllAssemblyMatchRawMix(MesWorkCenter workCenter, List prodRuleContextList) { @@ -217,6 +223,7 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im for (MesProductionAssemblyContext productionAssemblyContext : productionAssemblyContextList) { productionAssemblyContext.setIsCheckedRawMix(null); productionAssemblyContext.setQty(0.0); + productionAssemblyContext.setAssemblySn(null); productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()); } prodRuleContext.assemblyDataJson(productionAssemblyContextList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java index 5b0a855..853e318 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java @@ -140,7 +140,7 @@ public class MesAssemblySaveStepService extends BaseStepService { } } //写入调配产出物重量记录 - rawSnWeightRecordService.insertOutPartNoWeightRecord(prodRuleContext, productionAssemblyNosortContextList, reqBean.getOrganizeCode(), reqBean.getUserInfo()); + rawSnWeightRecordService.insertOutPartNoWeightRecord(productionPsOutContext, productionAssemblyNosortContextList, reqBean.getOrganizeCode(), reqBean.getUserInfo()); } //保存装配件绑定记录 From 56e9bc09e268d8b0922e09b10a1773c66d1a98e9 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 8 Jul 2025 16:06:27 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E5=B7=A5=E6=AD=A5=E8=B0=83=E9=85=8D?= =?UTF-8?q?=E5=8E=9F=E6=96=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../station/function/MesFunctionDialogInputRawMixWeightService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 0b59df8..76672ce 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 @@ -136,7 +136,7 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im 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()); + double remainQty = getRemainQty(organizeCode, productionAssemblyContext.getAssemblyPartNo(), productionAssemblyContext.getAssemblySn()); if (rawWeight > remainQty) { productionAssemblyContext.setIsCheckedRawMix(null); productionAssemblyContext.setAssemblyStatus(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()); @@ -233,9 +233,10 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im return true; } - private double getRemainQty(String organizeCode, String partNo) { + private double getRemainQty(String organizeCode, String partNo, String barcode) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(barcode, "barCode", ddlPackBean); DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(ddlPackBean); if (record != null) { From e382826800890b419c57f4735a3c6c91f2847df8 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 8 Jul 2025 19:53:59 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E5=B7=A5=E6=AD=A5=E8=B0=83=E9=85=8D?= =?UTF-8?q?=E5=8E=9F=E6=96=99=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java | 5 +++-- .../station/function/MesFunctionDialogInputRawMixWeightService.java | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java index 22aa6d6..0e4ec52 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java @@ -49,7 +49,7 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer if (weightCfg == null) { return; } - double remainQty = getRemainQty(organizeCode, context.getAssemblyPartNo()); + double remainQty = getRemainQty(organizeCode, context.getAssemblyPartNo(), context.getAssemblySn()); MesRawSnWeightRecord record = new MesRawSnWeightRecord(); record.setOrganizeCode(organizeCode); @@ -88,9 +88,10 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer rawSnWeightRecordRDao.insert(record); } - private double getRemainQty(String organizeCode, String partNo) { + private double getRemainQty(String organizeCode, String partNo, String barcode) { DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(barcode, "barCode", ddlPackBean); DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(ddlPackBean); if (record != null) { 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 76672ce..bf8a992 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 @@ -229,6 +229,8 @@ public class MesFunctionDialogInputRawMixWeightService extends BaseSwsService im prodRuleContext.assemblyDataJson(productionAssemblyContextList); return false; } + + prodRuleContext.setEachCavityQty(totalQty); } return true; } From c77004ef62a5027a6eee33d89891fa4baf8b597c Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 11 Jul 2025 10:18:23 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E6=AF=8F=E6=A8=A1=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=96=B7=E8=83=B6=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MesContainerBindProductSnService.java | 2 + .../step/MesGlueSprayedAmountStepService.java | 151 +++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java index 273ab31..5ea49e6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java @@ -59,6 +59,8 @@ public class MesContainerBindProductSnService extends MesAbstractContainerBindDi if (Objects.equals(model.getContainerType(), MesExtEnumUtil.CONTAINER_TYPE.CONTAINER_TYPE_50.getValue())) { Double netWeight = getRawSnWeightQty(organizeCode, barcode); result.put(MesPcnExtConstWords.QTY, netWeight); + } else { + result.put(MesPcnExtConstWords.QTY, produceSn.getQty()); } result.put(MesPcnExtConstWords.RESULT, true); return result; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java new file mode 100644 index 0000000..23d95d0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java @@ -0,0 +1,151 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; +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.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableParam; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableParamLog; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.bean.MesRawMixCfgDetail; +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.MesEquipmentVariableParamLogRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableParamRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesRawMixCfgDetailRepository; +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.*; + +/** + * @Description : 统计每摸模自动喷胶量 + * @Author : jason.niu + **/ +@Slf4j +@Service("mesGlueSprayedAmountStepService") +public class MesGlueSprayedAmountStepService extends BaseStepService { + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + @Autowired + private IMesEquipmentLogExtService equipmentLogExtService; + @Autowired + private MesEquipmentVariableParamRepository equipVarParamRDao; + @Autowired + private MesRawMixCfgDetailRepository rawMixCfgDetailRDao; + @Autowired + private MesEquipmentVariableParamLogRepository equipVarParamLogRDao; + @Autowired + private MesPartRepository mesPartRDao; + + @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(), "当前不存在产品加工规则信息,请重置工序解决!"); + } + + //当前工位使用的设备 + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + List equipVariableIds = getEquipmentVariable(organizeCode, cellEquipContext.getEquipId()); + List variableContexts = equipmentLogExtService.getEquipmentLogCollectList(organizeCode, cellEquipContext.getEquipId(), MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue(), equipVariableIds); + Map variableMap = new HashMap<>(); + for (MesEquipVariableCollectContext context : variableContexts) { + variableMap.put(context.(), context.getEquipVariableValue()); + } + + //遍历产品加工规则 + for (MesProdRuleContext prodRuleContext : prodRuleContextList) { + + //没有装配件的条件 + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + + //获取非排序装配件清单 + List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); + + boolean flag = false; + + MesEquipmentVariableParamLog paramLog = new MesEquipmentVariableParamLog(); + paramLog.setPartNo(prodRuleContext.getOutPartNo()); + MesPart mesPart = mesPartRDao.getByProperty(new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), prodRuleContext.getOutPartNo()}); + if (mesPart != null) { + paramLog.setPartName(mesPart.getPartName()); + } + paramLog.setProductSn(prodRuleContext.getProductSn()); + paramLog.setWorkCellCode(reqBean.getWorkCellCode()); + paramLog.setWorkCenterCode(reqBean.getWorkCenterCode()); + paramLog.setEquipId(cellEquipContext.getEquipId()); + paramLog.setEquipmentCode(cellEquipContext.getEquipmentCode()); + paramLog.setEquipmentName(cellEquipContext.getEquipmentName()); + //遍历装配件清单 + for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) { + String assemblyPartNo = productionAssemblyNosortContext.getAssemblyPartNo(); + MesRawMixCfgDetail detail = rawMixCfgDetailRDao.getByProperty( + new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo", "partNo"}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), prodRuleContext.getOutPartNo(), productionAssemblyNosortContext.getAssemblyPartNo()}); + if (detail == null) { + continue; + } + Integer rawType = detail.getRawType(); + if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_10.getValue())) { + paramLog.setGluePartNo(assemblyPartNo); + } else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_20.getValue())) { + paramLog.setCuringPartNo(assemblyPartNo); + } else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_30.getValue())) { + paramLog.setAdhesivePartNo(assemblyPartNo); + } else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_40.getValue())) { + paramLog.setInkPartNo(assemblyPartNo); + } else if (Objects.equals(rawType, MesExtEnumUtil.RAW_MIX_DETAIL_TYPE.RAW_MIX_DETAIL_TYPE_50.getValue())) { + paramLog.setDiluentPartNo(assemblyPartNo); + } + } + + equipVarParamLogRDao.insert(paramLog); + } + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "统计每摸模自动喷胶量!"); + } + + private List getEquipmentVariable(String organizeCode, Integer equipId) { + List result = new ArrayList<>(); + if (equipId == null) { + return result; + } + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(equipId, "equipId", packBean); + List variableParams = equipVarParamRDao.findByHqlWhere(packBean); + for (MesEquipmentVariableParam param : variableParams) { + result.add(param.getEquipVariableId().longValue()); + } + return null; + } +} From a9cd69ee8656cc13c44ae02cfa5d121b8ebc944b Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 11 Jul 2025 15:52:44 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E8=B0=83=E9=85=8D=E5=8E=9F=E6=96=99?= =?UTF-8?q?=E6=BC=94=E7=A4=BA=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcn/api/busi/IMesRawSnWeightRecordService.java | 2 +- .../busi/MesContainerSnBindServiceImpl.java | 14 ++++++-- .../busi/MesRawSnWeightRecordServiceImpl.java | 20 ++++++++--- .../step/MesAssemblyMatchRawMixStepService.java | 42 +++++++++++++++++++++- .../step/MesAssemblySaveStepService.java | 2 +- .../step/MesGlueSprayedAmountStepService.java | 35 +++++++++--------- 6 files changed, 89 insertions(+), 26 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java index 3cd742a..0de3b24 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java @@ -7,6 +7,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; import java.util.List; public interface IMesRawSnWeightRecordService { - void insertRawRemainWeightRecord(MesProductionAssemblyContext context, String organizeCode, String username); + void insertRawRemainWeightRecord(String productSn, MesProductionAssemblyContext context, String organizeCode, String username); void insertOutPartNoWeightRecord(MesProductionPsOutContext productionPsOutContext, List productionAssemblyNosortContextList, String organizeCode, String username); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java index 5a388cc..8752bc1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java @@ -58,6 +58,8 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService private SnowflakeIdMaker snowflakeIdMaker; @Autowired protected MesContainerPackageDetailFeedingRepository packageDetailFeedingRDao; + @Autowired + private MesRawSnWeightRecordRepository rawSnWeightRecordRDao; private MesContainerPackage getContainerPackage(MesContainerSnBindModel model, String containerSn) { MesContainerPackage containerPackage = containerPackageRDao.getByProperty( @@ -467,7 +469,7 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService containerPart.setContainerType(containerType.getContainerType()); containerPart.setContainerPackage(containerPackage); - MesContainerPackageDetail packageDetail = createContainerPackageDetail(model, containerPackage, containerPart, matchResult); + MesContainerPackageDetail packageDetail = createContainerPackageDetail(containerType, model, containerPackage, containerPart, matchResult); List combPackageDetails = new ArrayList<>(oldPackageDetails); if (CollectionUtils.isEmpty(bottomPackageDetails)) { combPackageDetails.add(packageDetail); @@ -692,7 +694,7 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService return containerPackage; } - private MesContainerPackageDetail createContainerPackageDetail(MesContainerSnBindModel model, MesContainerPackage containerPackage, MesContainerPartsModel containerPart, Map matchResult) { + private MesContainerPackageDetail createContainerPackageDetail(MesContainerType containerType, MesContainerSnBindModel model, MesContainerPackage containerPackage, MesContainerPartsModel containerPart, Map matchResult) { Object qty = matchResult.get(MesPcnExtConstWords.QTY); Object dataType = matchResult.get(MesPcnExtConstWords.DATA_TYPE); MesContainerPackageDetail detail = new MesContainerPackageDetail(); @@ -710,6 +712,14 @@ public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService detail.setSnStatus(MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_10.getValue()); ConvertBean.serviceModelInitialize(detail, model.getUserName()); + + if (Objects.equals(containerType.getContainerType(), MesExtEnumUtil.CONTAINER_TYPE.CONTAINER_TYPE_50.getValue())) { + MesRawSnWeightRecord rawSnWeightRecord = rawSnWeightRecordRDao.getByProperty(new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "barCode"}, + new Object[]{containerPackage.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), model.getBarCode()}); + if (rawSnWeightRecord != null) { + detail.setCreateDatetime(rawSnWeightRecord.getCreateDatetime()); + } + } return detail; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java index 0e4ec52..662b2bb 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java @@ -10,11 +10,9 @@ import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesRawMixCfgDetail; -import cn.estsh.i3plus.pojo.mes.bean.MesRawSnWeightRecord; -import cn.estsh.i3plus.pojo.mes.bean.MesRawWeightCfg; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.repository.MesRawMixCfgDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordLogRepository; import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordRepository; import cn.estsh.i3plus.pojo.mes.repository.MesRawWeightCfgRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; @@ -34,9 +32,11 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer private MesRawMixCfgDetailRepository rawMixCfgDetailRDao; @Autowired private IMesPartService partService; + @Autowired + private MesRawSnWeightRecordLogRepository rawSnWeightRecordLogRDao; @Override - public void insertRawRemainWeightRecord(MesProductionAssemblyContext context, String organizeCode, String username) { + public void insertRawRemainWeightRecord(String productSn, MesProductionAssemblyContext context, String organizeCode, String username) { MesRawMixCfgDetail detail = rawMixCfgDetailRDao.getByProperty( new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo", "partNo"}, new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), context.getPartNo(), context.getAssemblyPartNo()}); @@ -61,6 +61,16 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer record.setRawType(detail.getRawType()); ConvertBean.serviceModelInitialize(record, username); rawSnWeightRecordRDao.insert(record); + + MesRawSnWeightRecordLog recordLog = new MesRawSnWeightRecordLog(); + recordLog.setOrganizeCode(organizeCode); + recordLog.setProductSn(productSn); + recordLog.setAssemblySn(context.getAssemblySn()); + recordLog.setOriginWeight(remainQty); + recordLog.setDeductionWeight(context.getQty()); + recordLog.setRemainWeight(record.getNetWeight()); + ConvertBean.serviceModelInitialize(recordLog, username); + rawSnWeightRecordLogRDao.insert(recordLog); } @Override 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 index 08708e6..d4f0763 100644 --- 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 @@ -3,18 +3,25 @@ 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.api.busi.IMesTimeEfficientCfgMatchService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; 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.platform.common.tool.TimeTool; +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.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesRawSnWeightRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; 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.repository.MesProduceSnRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesRawSnWeightRecordRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +32,7 @@ import org.springframework.util.StringUtils; import java.util.*; /** - * @Description : 匹配调配原料条码工步 + * @Description : 原料调配原料条码工步 * @Author : jason.niu **/ @Slf4j @@ -41,6 +48,10 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { private MesAssemblyShowNosortStepService assemblyShowNosortStepService; @Autowired private MesProduceSnRepository produceSnRDao; + @Autowired + private IMesTimeEfficientCfgMatchService timeEfficientCfgMatchService; + @Autowired + private MesRawSnWeightRecordRepository rawSnWeightRecordRDao; @Override public StepResult execute(StationRequestBean reqBean) { @@ -72,6 +83,7 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { } MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + // 是否所有装配件均已扫描过 if (isAllAssemblyMatchRawMix(workCenter, prodRuleContextList)) { return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "调配原料装配成功!"); } @@ -148,6 +160,20 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { continue; } + MesContainerPackageDetailContext containerPackageDetailContext = new MesContainerPackageDetailContext(); + containerPackageDetailContext.setPartNo(productionAssemblyNosortContext.getAssemblyPartNo()); + containerPackageDetailContext.setBarCode(barcode); + String firstOpenTime = getRawSnWeightRecordFirstOpenTime(reqBean.getOrganizeCode(), barcode); + containerPackageDetailContext.setCreateDatetime(firstOpenTime); + + //验证时效性 + Map timeEfficientResult = timeEfficientCfgMatchService.checkSnTimelinessContainerMatch(reqBean.getOrganizeCode(), containerPackageDetailContext, productionAssemblyNosortContext.getSourceId()); + if (!(Boolean)timeEfficientResult.get(MesPcnExtConstWords.RESULT)) { + String msg = (String) timeEfficientResult.get(MesPcnExtConstWords.MESSAGE); + stepResult.setMsg(msg); + return false; + } + //验证返回result里面是否存在assemblySn,存在特殊的规则会转换成新的条码 String assemblySn = !result.containsKey(MesPcnExtConstWords.ASSEMBLY_SN) ? barcode : (String) result.get(MesPcnExtConstWords.ASSEMBLY_SN); MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA); @@ -170,6 +196,20 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { return false; } + /** + * 获取调配原料首次开罐时间,即首次被装配的时间。 + * @param organizeCode + * @param barCode + * @return + */ + private String getRawSnWeightRecordFirstOpenTime(String organizeCode, String barCode) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(barCode, "barCode", packBean); + DdlPreparedPack.getOrderBy("createDatetime", CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), packBean); + MesRawSnWeightRecord record = rawSnWeightRecordRDao.getByProperty(packBean); + return record != null ? record.getCreateDatetime() : TimeTool.getNowTime(true); + } + private Map checkProductSnRule(String organizeCode, String barcode) { Map result = new HashMap<>(); result.put(MesPcnExtConstWords.RESULT, false); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java index 853e318..b33ce01 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java @@ -229,6 +229,6 @@ public class MesAssemblySaveStepService extends BaseStepService { //保存装配件绑定记录 insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); //写入调配原料剩余数量 - rawSnWeightRecordService.insertRawRemainWeightRecord(productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo()); + rawSnWeightRecordService.insertRawRemainWeightRecord(productionPsOutContext.getProductSn(), productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo()); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java index 23d95d0..661af8d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java @@ -21,6 +21,7 @@ import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableParamRepository; import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; import cn.estsh.i3plus.pojo.mes.repository.MesRawMixCfgDetailRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -74,11 +75,14 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); - List equipVariableIds = getEquipmentVariable(organizeCode, cellEquipContext.getEquipId()); - List variableContexts = equipmentLogExtService.getEquipmentLogCollectList(organizeCode, cellEquipContext.getEquipId(), MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue(), equipVariableIds); + Map equipVariableIds = getEquipmentVariable(organizeCode, cellEquipContext.getEquipId()); + List variableContexts = equipmentLogExtService.getEquipmentLogCollectList(organizeCode, cellEquipContext.getEquipId(), MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue(), new ArrayList<>(equipVariableIds.keySet())); Map variableMap = new HashMap<>(); for (MesEquipVariableCollectContext context : variableContexts) { - variableMap.put(context.(), context.getEquipVariableValue()); + String variableParamType = equipVariableIds.get(context.getEquipVariableId()); + if (!StringUtils.isEmpty(variableParamType)) { + variableMap.put(variableParamType, context.getEquipVariableValue()); + } } //遍历产品加工规则 @@ -127,25 +131,24 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { paramLog.setDiluentPartNo(assemblyPartNo); } } - + paramLog.setParamValue(JSONUtil.toJsonStr(variableMap)); equipVarParamLogRDao.insert(paramLog); } return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "统计每摸模自动喷胶量!"); } - private List getEquipmentVariable(String organizeCode, Integer equipId) { - List result = new ArrayList<>(); - if (equipId == null) { - return result; - } - - DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getNumEqualPack(equipId, "equipId", packBean); - List variableParams = equipVarParamRDao.findByHqlWhere(packBean); - for (MesEquipmentVariableParam param : variableParams) { - result.add(param.getEquipVariableId().longValue()); + // 获取设备变量ID对应的变量参数类型 + private Map getEquipmentVariable(String organizeCode, Integer equipId) { + Map result = new HashMap<>(); + if (equipId != null) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(equipId, "equipId", packBean); + List variableParams = equipVarParamRDao.findByHqlWhere(packBean); + for (MesEquipmentVariableParam param : variableParams) { + result.put(param.getEquipVariableId().longValue(), param.getParamType()); + } } - return null; + return result; } } From ac46763de15b4a1626a9d7b6dda5051a97e6abf7 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 11 Jul 2025 18:06:25 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E8=B0=83=E9=85=8D=E5=8E=9F=E6=96=99?= =?UTF-8?q?=E6=BC=94=E7=A4=BA=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcn/api/busi/IMesRawSnWeightRecordService.java | 2 +- .../busi/MesRawSnWeightRecordServiceImpl.java | 19 ++++++++++++++++--- .../serviceimpl/step/MesAssemblySaveStepService.java | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java index 0de3b24..96c3c1e 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesRawSnWeightRecordService.java @@ -7,6 +7,6 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; import java.util.List; public interface IMesRawSnWeightRecordService { - void insertRawRemainWeightRecord(String productSn, MesProductionAssemblyContext context, String organizeCode, String username); + void insertRawRemainWeightRecord(MesProductionPsOutContext productionPsOutContext, MesProductionAssemblyContext context, String organizeCode, String username); void insertOutPartNoWeightRecord(MesProductionPsOutContext productionPsOutContext, List productionAssemblyNosortContextList, String organizeCode, String username); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java index 662b2bb..74627e8 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesRawSnWeightRecordServiceImpl.java @@ -19,6 +19,9 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; import java.util.List; import java.util.Objects; @@ -36,7 +39,7 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer private MesRawSnWeightRecordLogRepository rawSnWeightRecordLogRDao; @Override - public void insertRawRemainWeightRecord(String productSn, MesProductionAssemblyContext context, String organizeCode, String username) { + public void insertRawRemainWeightRecord(MesProductionPsOutContext productionPsOutContext, MesProductionAssemblyContext context, String organizeCode, String username) { MesRawMixCfgDetail detail = rawMixCfgDetailRDao.getByProperty( new String[]{"organizeCode", "isValid", "isDeleted", "outPartNo", "partNo"}, new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.IS_DEAL.NO.getValue(), context.getPartNo(), context.getAssemblyPartNo()}); @@ -50,13 +53,19 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer return; } double remainQty = getRemainQty(organizeCode, context.getAssemblyPartNo(), context.getAssemblySn()); + double weightQty = context.getQty() != null ? context.getQty() : 0; + // 保留两位小数,四舍五入 + MathContext mc = new MathContext(8, RoundingMode.HALF_UP); + BigDecimal decimalRemainQty = new BigDecimal(remainQty, mc); + BigDecimal decimalWeight = new BigDecimal(weightQty, mc); MesRawSnWeightRecord record = new MesRawSnWeightRecord(); record.setOrganizeCode(organizeCode); record.setBarCode(context.getAssemblySn()); record.setPartNo(context.getAssemblyPartNo()); record.setPartName(context.getAssemblyPartName()); - record.setNetWeight(remainQty - context.getQty()); +// record.setNetWeight(remainQty - context.getQty()); + record.setNetWeight(decimalRemainQty.subtract(decimalWeight).doubleValue()); record.setNetUnit(weightCfg.getNetUnit()); record.setRawType(detail.getRawType()); ConvertBean.serviceModelInitialize(record, username); @@ -64,8 +73,12 @@ public class MesRawSnWeightRecordServiceImpl implements IMesRawSnWeightRecordSer MesRawSnWeightRecordLog recordLog = new MesRawSnWeightRecordLog(); recordLog.setOrganizeCode(organizeCode); - recordLog.setProductSn(productSn); + recordLog.setProductSn(productionPsOutContext.getProductSn()); + recordLog.setPartNo(productionPsOutContext.getPartNo()); + recordLog.setPartName(productionPsOutContext.getPartName()); recordLog.setAssemblySn(context.getAssemblySn()); + recordLog.setAssemblyPartNo(context.getAssemblyPartNo()); + recordLog.setAssemblyPartName(context.getAssemblyPartName()); recordLog.setOriginWeight(remainQty); recordLog.setDeductionWeight(context.getQty()); recordLog.setRemainWeight(record.getNetWeight()); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java index b33ce01..352d5d8 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblySaveStepService.java @@ -229,6 +229,6 @@ public class MesAssemblySaveStepService extends BaseStepService { //保存装配件绑定记录 insertProductionAssembly(reqBean, productionProcessContext, cellEquipContext, prodRuleContext, productionPsOutContext, productionAssemblyNosortContext, scanMonitorContext, productSnIdList); //写入调配原料剩余数量 - rawSnWeightRecordService.insertRawRemainWeightRecord(productionPsOutContext.getProductSn(), productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo()); + rawSnWeightRecordService.insertRawRemainWeightRecord(productionPsOutContext, productionAssemblyNosortContext, reqBean.getOrganizeCode(), reqBean.getUserInfo()); } } From 7e993be18bb1cccdb0b7e9c24c6aa6cefefd437d Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 14 Jul 2025 14:16:59 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=96=B7=E8=83=B6?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/step/MesGlueSprayedAmountStepService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java index 661af8d..eb2b84b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepServ 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.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; @@ -76,7 +77,13 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); Map equipVariableIds = getEquipmentVariable(organizeCode, cellEquipContext.getEquipId()); + if (CollectionUtils.isEmpty(equipVariableIds)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备ID[%s]未匹配到设备变量参数,请检查数据!", cellEquipContext.getEquipId())); + } List variableContexts = equipmentLogExtService.getEquipmentLogCollectList(organizeCode, cellEquipContext.getEquipId(), MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue(), MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PROCESS_FINISH.getValue(), new ArrayList<>(equipVariableIds.keySet())); + if (CollectionUtils.isEmpty(variableContexts)) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("设备ID[%s]未获取到设备数据,请检查数据!", cellEquipContext.getEquipId())); + } Map variableMap = new HashMap<>(); for (MesEquipVariableCollectContext context : variableContexts) { String variableParamType = equipVariableIds.get(context.getEquipVariableId()); @@ -97,6 +104,7 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { boolean flag = false; MesEquipmentVariableParamLog paramLog = new MesEquipmentVariableParamLog(); + paramLog.setOrganizeCode(reqBean.getOrganizeCode()); paramLog.setPartNo(prodRuleContext.getOutPartNo()); MesPart mesPart = mesPartRDao.getByProperty(new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), prodRuleContext.getOutPartNo()}); @@ -132,6 +140,7 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { } } paramLog.setParamValue(JSONUtil.toJsonStr(variableMap)); + ConvertBean.serviceModelInitialize(paramLog, reqBean.getUserInfo()); equipVarParamLogRDao.insert(paramLog); } @@ -144,6 +153,8 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { if (equipId != null) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getNumEqualPack(equipId, "equipId", packBean); + DdlPreparedPack.getIsNotNull("equipVariableId", packBean); + DdlPreparedPack.getIsNotNull("paramType", packBean); List variableParams = equipVarParamRDao.findByHqlWhere(packBean); for (MesEquipmentVariableParam param : variableParams) { result.put(param.getEquipVariableId().longValue(), param.getParamType()); From 8b7f9d3b00a05a0d43d89307cc0f5fdf44b7d3f6 Mon Sep 17 00:00:00 2001 From: jason Date: Mon, 14 Jul 2025 16:16:49 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=96=B7=E8=83=B6?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step/MesGlueSprayedAmountStepService.java | 41 ++++++++++++---------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java index eb2b84b..83b17f5 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesGlueSprayedAmountStepService.java @@ -10,17 +10,11 @@ import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableParam; -import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableParamLog; -import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesRawMixCfgDetail; +import cn.estsh.i3plus.pojo.mes.bean.*; 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.MesEquipmentVariableParamLogRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableParamRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesRawMixCfgDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; @@ -30,6 +24,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.*; +import java.util.stream.Collectors; /** * @Description : 统计每摸模自动喷胶量 @@ -52,6 +47,8 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { private MesEquipmentVariableParamLogRepository equipVarParamLogRDao; @Autowired private MesPartRepository mesPartRDao; + @Autowired + private MesProductionRecordRepository productionRecordRDao; @Override public StepResult execute(StationRequestBean reqBean) { @@ -73,6 +70,7 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { if (CollectionUtils.isEmpty(prodRuleContextList)) { stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产品加工规则信息,请重置工序解决!"); } + Map> prodRuleContextMap = prodRuleContextList.stream().collect(Collectors.groupingBy(MesProdRuleContext::getForeignKey)); //当前工位使用的设备 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); @@ -92,17 +90,18 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { } } - //遍历产品加工规则 - for (MesProdRuleContext prodRuleContext : prodRuleContextList) { - - //没有装配件的条件 - if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; + //1. 获取上下文中生成的主条码 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + for (MesProductionPsOutContext sn : productionPsOutContextList) { + List mesProdRuleContexts = prodRuleContextMap.get(sn.getForeignKey()); + MesProdRuleContext prodRuleContext = CollectionUtils.isEmpty(mesProdRuleContexts) ? null : mesProdRuleContexts.get(0); + if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) { + stepExpSendMsgAndThrowEx(reqBean, resultBean, String.format("零件号[%s]的加工规则丢失,请配置!", sn.getPartNo())); + } //获取非排序装配件清单 List productionAssemblyNosortContextList = prodRuleContext.getNosortAssemblyDataContext(); - boolean flag = false; - MesEquipmentVariableParamLog paramLog = new MesEquipmentVariableParamLog(); paramLog.setOrganizeCode(reqBean.getOrganizeCode()); paramLog.setPartNo(prodRuleContext.getOutPartNo()); @@ -111,12 +110,19 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { if (mesPart != null) { paramLog.setPartName(mesPart.getPartName()); } - paramLog.setProductSn(prodRuleContext.getProductSn()); + paramLog.setProductSn(sn.getProductSn()); paramLog.setWorkCellCode(reqBean.getWorkCellCode()); paramLog.setWorkCenterCode(reqBean.getWorkCenterCode()); paramLog.setEquipId(cellEquipContext.getEquipId()); paramLog.setEquipmentCode(cellEquipContext.getEquipmentCode()); paramLog.setEquipmentName(cellEquipContext.getEquipmentName()); + if (prodRuleContext.getProductionRecordId() != null) { + MesProductionRecord productionRecord = productionRecordRDao.getById(prodRuleContext.getProductionRecordId()); + if (productionRecord != null) { + paramLog.setStartDateTime(productionRecord.getStartDateTime()); + paramLog.setCompleteDateTime(productionRecord.getCompleteDateTime()); + } + } //遍历装配件清单 for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) { String assemblyPartNo = productionAssemblyNosortContext.getAssemblyPartNo(); @@ -143,8 +149,7 @@ public class MesGlueSprayedAmountStepService extends BaseStepService { ConvertBean.serviceModelInitialize(paramLog, reqBean.getUserInfo()); equipVarParamLogRDao.insert(paramLog); } - - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "统计每摸模自动喷胶量!"); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "统计每模自动喷胶量!"); } // 获取设备变量ID对应的变量参数类型 From 39922d0bd2d22a824ee192bd7a51c9b9eb0da4b7 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 16 Jul 2025 13:35:38 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E7=BA=BF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../busi/IMesEquipmentProductionResultService.java | 7 ++ .../pcn/apiservice/config/WebServiceConfig.java | 8 ++ .../MesEquipmentProductionResultServiceImpl.java | 88 +++++++++++++++++++++ .../MesEquipmentLProductionResultStepService.java | 45 +++++++++++ ...ationFeedContainerPackageDetailStepService.java | 4 +- .../WebServiceServerAutoLineInterface.java | 22 ++++++ .../model/MesAutoLineInterfaceDetailModel.java | 74 ++++++++++++++++++ .../pcn/pojo/model/MesAutoLineInterfaceModel.java | 90 ++++++++++++++++++++++ .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 3 + 9 files changed, 340 insertions(+), 1 deletion(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java new file mode 100644 index 0000000..c00d8e0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesEquipmentProductionResultService.java @@ -0,0 +1,7 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceModel; + +public interface IMesEquipmentProductionResultService { + void doCreateEquipmentProductionResult(MesAutoLineInterfaceModel info); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java index 4f9f813..11e9ed1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/config/WebServiceConfig.java @@ -21,6 +21,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.config; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.DcsForEquipmentServer; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.WebServiceServerAutoLineInterface; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.WebServiceServerSPS; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice.WebServiceServerSPS200; import org.apache.cxf.Bus; @@ -72,4 +73,11 @@ public class WebServiceConfig { endpoint.publish("/mes-service-spsEqu200"); return endpoint; } + + @Bean + public Endpoint endpointAutoLineInterface() { + EndpointImpl endpoint = new EndpointImpl(bus, new WebServiceServerAutoLineInterface()); + endpoint.publish("/mes-service-autoLineInterface"); + return endpoint; + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java new file mode 100644 index 0000000..d63de98 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesEquipmentProductionResultServiceImpl.java @@ -0,0 +1,88 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentProductionResultService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceDetailModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService; +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.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesConfig; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProductionResult; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentProductionResultDetail; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.repository.MesConfigRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentProductionResultDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentProductionResultRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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; + +@Service +public class MesEquipmentProductionResultServiceImpl implements IMesEquipmentProductionResultService { + public static final Logger log = LoggerFactory.getLogger(MesEquipmentProductionResultServiceImpl.class); + + @Autowired + private IShippingDispatchService shippingDispatchService; + @Autowired + private MesConfigRepository configRao; + @Autowired + private MesEquipmentProductionResultRepository resultRDao; + @Autowired + private MesEquipmentProductionResultDetailRepository resultDetailRDao; + + @Override + public void doCreateEquipmentProductionResult(MesAutoLineInterfaceModel info) { + String organizeCode = ""; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getStringEqualPack(MesPcnExtConstWords.CHANG_SHU_AUTO_LINE_INTERFACE,"cfgCode",packBean); + List configList = configRao.findByHqlWhere(packBean); + for (MesConfig mesConfig : configList) { + if (mesConfig.getCfgKey().equals(MesPcnExtConstWords.CHANG_SHU_ORGANIZE_CODE)){ + organizeCode = mesConfig.getCfgValue(); + } + } + if (StringUtils.isEmpty(organizeCode)) { + log.error("没有配置表mes_config,cfg_code为CHANG_SHU_AUTO_LINE_INTERFACE,key为CHANG_SHU_ORGANIZE_CODE没有配置"); + return; + } + StationRequestBean reqBean = new StationRequestBean(organizeCode, info.getWorkCenterCode(), info.getWorkCellCode(), "webservices"); + reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode()); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setScanInfo(info.getProductSn()); + shippingDispatchService.sendScanQueueNextExec(reqBean); + + MesEquipmentProductionResult result = new MesEquipmentProductionResult(); + result.setOrganizeCode(organizeCode); + result.setWorkCenterCode(info.getWorkCenterCode()); + result.setWorkCellCode(info.getWorkCellCode()); + result.setProductSn(info.getProductSn()); + result.setQty(info.getQty()); + result.setResult(info.getResult()); + ConvertBean.serviceModelInitialize(result, "webservices"); + resultRDao.insert(result); + + if (!CollectionUtils.isEmpty(info.getDetails())) { + for (MesAutoLineInterfaceDetailModel detailModel : info.getDetails()) { + MesEquipmentProductionResultDetail detail = new MesEquipmentProductionResultDetail(); + detail.setOrganizeCode(organizeCode); + detail.setResultId(result.getId()); + detail.setBarCode(detailModel.getBarCode()); + detail.setWorkCellCode(detailModel.getWorkCellCode()); + detail.setType(detailModel.getType()); + detail.setParamName(detailModel.getParamName()); + detail.setParamValue(detailModel.getParamValue()); + ConvertBean.serviceModelInitialize(detail, "webservices"); + resultDetailRDao.insert(detail); + } + } + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java new file mode 100644 index 0000000..9ca8c90 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEquipmentLProductionResultStepService.java @@ -0,0 +1,45 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +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.MesProductionProcessContext; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Description : 自动化线接口获取生产数据 + * @Author : jason.niu + **/ +@Slf4j +@Service("mesEquipmentLProductionResultStepService") +public class MesEquipmentLProductionResultStepService extends BaseStepService { + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @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()); + } + + 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/MesStationFeedContainerPackageDetailStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java index c087eb7..0558272 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesStationFeedContainerPackageDetailStepService.java @@ -70,6 +70,8 @@ public class MesStationFeedContainerPackageDetailStepService extends BaseStepSer stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); } + // 扫描内容去除前后空格并且转为大写。 + reqBean.trimScanInfo(); //扫描信息置空 String barcode = reqBean.resetScanInfo(reqBean.getScanInfo()); if (StringUtils.isEmpty(barcode)) stepSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "请扫描原料条码!"); @@ -134,7 +136,7 @@ public class MesStationFeedContainerPackageDetailStepService extends BaseStepSer return false; } String closeSn = config.getCfgValue(); - if (StringUtils.isEmpty(closeSn) || !Objects.equals(closeSn, barcode)) { + if (StringUtils.isEmpty(closeSn) || !Objects.equals(closeSn.toUpperCase(), barcode)) { return false; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java new file mode 100644 index 0000000..ed35bbb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/webservice/WebServiceServerAutoLineInterface.java @@ -0,0 +1,22 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.webservice; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentProductionResultService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesAutoLineInterfaceModel; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebService; + +@WebService(targetNamespace = "http://tempuri.org/services/SyncSPSForEquipmentService") +public class WebServiceServerAutoLineInterface { + public static final Logger log = LoggerFactory.getLogger(WebServiceServerAutoLineInterface.class); + + @WebMethod(action = "sendMessage", operationName = "sendMessage") + public void sendMessage(@WebParam(name = "info") MesAutoLineInterfaceModel info) { + IMesEquipmentProductionResultService service = SpringContextsUtil.getBean(IMesEquipmentProductionResultService.class); + service.doCreateEquipmentProductionResult(info); + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java new file mode 100644 index 0000000..e9ca13b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceDetailModel.java @@ -0,0 +1,74 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model; + +import io.swagger.annotations.ApiParam; + +import javax.xml.bind.annotation.XmlElement; + +/** + * @author jason + */ +//@Getter +//@Setter +//@NoArgsConstructor // 显式生成无参构造函数(关键) +//@AllArgsConstructor // 同时保留带参构造函数 +public class MesAutoLineInterfaceDetailModel { + @ApiParam("类型") + private Integer type; + + @ApiParam(value = "工位代码") + private String workCellCode; + + @ApiParam(value = "条码") + private String barCode; + + @ApiParam(value = "参数值") + private String paramValue; + + @ApiParam(value = "参数名") + private String paramName; + + @XmlElement(name = "Type") + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + @XmlElement(name = "Location") + public String getWorkCellCode() { + return workCellCode; + } + + public void setWorkCellCode(String workCellCode) { + this.workCellCode = workCellCode; + } + + @XmlElement(name = "Barcode") + public String getBarCode() { + return barCode; + } + + public void setBarCode(String barCode) { + this.barCode = barCode; + } + + @XmlElement(name = "ParamValue") + public String getParamValue() { + return paramValue; + } + + public void setParamValue(String paramValue) { + this.paramValue = paramValue; + } + + @XmlElement(name = "ParamName") + public String getParamName() { + return paramName; + } + + public void setParamName(String paramName) { + this.paramName = paramName; + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java new file mode 100644 index 0000000..645b6b5 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesAutoLineInterfaceModel.java @@ -0,0 +1,90 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model; + +import io.swagger.annotations.ApiParam; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.ArrayList; + +// 必须添加 @XmlRootElement,指定 XML 根节点名称 +//@XmlRootElement(name = "info") +public class MesAutoLineInterfaceModel { + + public MesAutoLineInterfaceModel() { + + } + + @ApiParam("生产线代码") + private String workCenterCode; + + @ApiParam(value = "工位代码") + private String workCellCode; + + @ApiParam("零件条码") + private String productSn; + + @ApiParam(value = "数量") + private Double qty; + + @ApiParam("结果") + private Integer result; + + private ArrayList details = new ArrayList<>(); + + + @XmlElement(name = "AssemblyLine") + public String getWorkCenterCode() { + return workCenterCode; + } + + public void setWorkCenterCode(String workCenterCode) { + this.workCenterCode = workCenterCode; + } + + @XmlElement(name = "Location") + public String getWorkCellCode() { + return workCellCode; + } + + public void setWorkCellCode(String workCellCode) { + this.workCellCode = workCellCode; + } + + @XmlElement(name = "Barcode") + public String getProductSn() { + return productSn; + } + + public void setProductSn(String productSn) { + this.productSn = productSn; + } + + @XmlElement(name = "Qty") + public Double getQty() { + return qty; + } + + public void setQty(Double qty) { + this.qty = qty; + } + + @XmlElement(name = "Result") + public Integer getResult() { + return result; + } + + public void setResult(Integer result) { + this.result = result; + } + + @XmlElementWrapper(name = "SubParams") // 包装集合的父节点 + @XmlElement(name = "SubParam") // 集合中每个元素的节点名称 + public ArrayList getDetails() { + return details; + } + + public void setDetails(ArrayList details) { + this.details = details; + } +} 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 ffe29ac..712978a 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 @@ -965,4 +965,7 @@ public class MesPcnExtConstWords { public static final String VOLVO_SEQUENCENUMBER = "sequenceNumber"; public static final String VOLVO_RACKID = "rackId"; public static final String VOLVO_POSITION = "position"; + //常熟自动化线接口工厂代码配置 + public static final String CHANG_SHU_AUTO_LINE_INTERFACE ="CHANG_SHU_AUTO_LINE_INTERFACE"; + public static final String CHANG_SHU_ORGANIZE_CODE ="CHANG_SHU_ORGANIZE_CODE"; } From 5042cd6750acb80548ddd188e4f7ab9e8cf759f6 Mon Sep 17 00:00:00 2001 From: jason Date: Wed, 16 Jul 2025 13:54:08 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E7=BA=BF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apiservice/serviceimpl/step/MesAssemblyMatchRawMixStepService.java | 2 ++ 1 file changed, 2 insertions(+) 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 index d4f0763..005526e 100644 --- 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 @@ -88,6 +88,8 @@ public class MesAssemblyMatchRawMixStepService extends BaseStepService { return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "调配原料装配成功!"); } + // 扫描内容去除前后空格并且转为大写。 + reqBean.trimScanInfo(); //扫描信息置空 String barcode = reqBean.resetScanInfo(reqBean.getScanInfo()); if (StringUtils.isEmpty(barcode)) {