From c0966141a22b9bde2e5c0115ebb5122882d25d8d Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Tue, 29 Apr 2025 08:41:22 +0800 Subject: [PATCH] =?UTF-8?q?=2046648=20=E7=83=AD=E6=9D=BF=E7=84=8A=E6=8E=A5?= =?UTF-8?q?3=E6=89=AB=E6=8F=8F=E9=80=9F=E5=BA=A6=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../step/MesProductSnGenerateStepService.java | 113 ++++++++++++++------- .../step/MesProductSnSaveStepService.java | 3 +- 2 files changed, 76 insertions(+), 40 deletions(-) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java index d17edbd..b4d319c 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnGenerateStepService.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepSer import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesPartDataMapSaveStepService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.MesWorkOrderCheckCompleteQtyStepService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.DeepCloneUtil; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; @@ -13,6 +14,7 @@ import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.util.StringUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesPart; @@ -28,12 +30,15 @@ import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.MapDifference; +import com.google.common.collect.Maps; 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 javax.persistence.EntityManager; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -78,6 +83,12 @@ public class MesProductSnGenerateStepService extends BaseStepService { @Autowired private MesWorkOrderCheckCompleteQtyStepService workOrderCheckCompleteQtyStepService; + @Autowired + private SnowflakeIdMaker snowflakeIdMaker; + + @Autowired + private EntityManager entityManager; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -162,77 +173,101 @@ public class MesProductSnGenerateStepService extends BaseStepService { //验证是否计数 Boolean isCalcCompleteQty = workOrderCheckCompleteQtyStepService.isCalcCompleteQty(isSamePart, productionPsInContext, productionPartContext); - MesProduceSn produceSn; + MesProduceSn produceSn = null; + MesProduceSn produceSnClone = null; //进出一致, 不累计工单完成数量 在显示装配件工步中已经验证了 进出一致 进出存在工单则必须一致 if (isSamePart) produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getId()); //未知条码 else if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getRelateId())) produceSn = produceSnExtService.getProduceSn(reqBean.getOrganizeCode(), productionPsInContext.getRelateId()); //生成新条码 - else produceSn = new MesProduceSn(); + else produceSnClone = new MesProduceSn(); + if (null != produceSn) { + produceSnClone = DeepCloneUtil.deepCloneObject(produceSn); + if (null == produceSnClone) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "修改条码未知状态时[克隆条码]出现异常!"); + entityManager.detach(produceSnClone); + } - if (StringUtils.isEmpty(produceSn.getProductSn())) { - if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())) produceSn.setProductSn(productionPsInContext.getProductSn()); - else produceSn.setProductSn(doGererateSerialNo(reqBean, resultBean, + if (StringUtils.isEmpty(produceSnClone.getProductSn())) { + if (null != productionPsInContext && !StringUtils.isEmpty(productionPsInContext.getProductSn())) produceSnClone.setProductSn(productionPsInContext.getProductSn()); + else produceSnClone.setProductSn(doGererateSerialNo(reqBean, resultBean, generateGenSerialNoModel(reqBean, resultBean, getProduceSnNumberRule(reqBean, resultBean, part), part).shiftCode(prodShiftContext.getShiftCode()).foreignKey(prodRuleContext.getForeignKey()))); - produceSn.setCustSn(produceSn.getProductSn()); + produceSnClone.setCustSn(produceSnClone.getProductSn()); } - if (StringUtils.isEmpty(produceSn.getSerialNumber())) { - produceSn.setSerialNumber(doGererateSerialNo(reqBean, resultBean, generateGenSerialNoModel(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part))); + if (StringUtils.isEmpty(produceSnClone.getSerialNumber())) { + produceSnClone.setSerialNumber(snowflakeIdMaker.nextId() + MesPcnExtConstWords.EMPTY); } - produceSn.setQty(new Double(1)); + produceSnClone.setQty(new Double(1)); - if (!StringUtils.isEmpty(prodRuleContext.getWorkOrderNo())) produceSn.setWorkOrderNo(prodRuleContext.getWorkOrderNo()); + if (!StringUtils.isEmpty(prodRuleContext.getWorkOrderNo())) produceSnClone.setWorkOrderNo(prodRuleContext.getWorkOrderNo()); if (null != productionPartContext && !StringUtils.isEmpty(productionPartContext.getWorkOrderNo())) { - produceSn.setCustCode(productionPartContext.getCustCode()); - produceSn.setCustPartNo(productionPartContext.getCustPartNo()); + produceSnClone.setCustCode(productionPartContext.getCustCode()); + produceSnClone.setCustPartNo(productionPartContext.getCustPartNo()); } - produceSn.setAreaCode(reqBean.getAreaCode()); - produceSn.setWorkCenterCode(reqBean.getWorkCenterCode()); - produceSn.setWorkCellCode(reqBean.getWorkCellCode()); + produceSnClone.setAreaCode(reqBean.getAreaCode()); + produceSnClone.setWorkCenterCode(reqBean.getWorkCenterCode()); + produceSnClone.setWorkCellCode(reqBean.getWorkCellCode()); - produceSn.setPartNo(part.getPartNo()); - produceSn.setPartName(part.getPartName()); - produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate()); - produceSn.setProdLabelTemplate(part.getProductLabelTemplate()); - produceSn.setCustLabelTemplate(part.getCustLabelTemplate()); + produceSnClone.setPartNo(part.getPartNo()); + produceSnClone.setPartName(part.getPartName()); + produceSnClone.setProcessLabelTemplate(part.getProcessLabelTemplate()); + produceSnClone.setProdLabelTemplate(part.getProductLabelTemplate()); + produceSnClone.setCustLabelTemplate(part.getCustLabelTemplate()); - produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue()); - produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue()); - produceSn.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + produceSnClone.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue()); + produceSnClone.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue()); + produceSnClone.setQcStatus(!StringUtils.isEmpty(productResult) ? Integer.valueOf(productResult) : MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); - produceSn.setShiftCode(prodShiftContext.getShiftCode()); - produceSn.setShiftGroup(prodShiftContext.getShiftGroup()); + produceSnClone.setShiftCode(prodShiftContext.getShiftCode()); + produceSnClone.setShiftGroup(prodShiftContext.getShiftGroup()); - if (StringUtils.isEmpty(produceSn.getPrintCount())) produceSn.setPrintCount(MesPcnExtConstWords.ZERO); - if (StringUtils.isEmpty(produceSn.getPrintStatus())) produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + if (StringUtils.isEmpty(produceSnClone.getPrintCount())) produceSnClone.setPrintCount(MesPcnExtConstWords.ZERO); + if (StringUtils.isEmpty(produceSnClone.getPrintStatus())) produceSnClone.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); - produceSn.setOrganizeCode(reqBean.getOrganizeCode()); + produceSnClone.setOrganizeCode(reqBean.getOrganizeCode()); - if (StringUtils.isEmpty(produceSn.getId())) ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo()); - else ConvertBean.serviceModelUpdate(produceSn, reqBean.getUserInfo()); + if (StringUtils.isEmpty(produceSnClone.getId())) ConvertBean.serviceModelInitialize(produceSnClone, reqBean.getUserInfo()); + else ConvertBean.serviceModelUpdate(produceSnClone, reqBean.getUserInfo()); - if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime()); - produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10)); + if (StringUtils.isEmpty(produceSnClone.getInWorkCenterTime())) produceSnClone.setInWorkCenterTime(produceSnClone.getModifyDatetime()); + produceSnClone.setLotNo(produceSnClone.getModifyDatetime().substring(0, 10)); //未知不同步 - produceSn.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + produceSnClone.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); - if (StringUtils.isEmpty(produceSn.getId())) { - produceSn.setFid(UUID.randomUUID().toString()); - produceSn = produceSnExtService.insert(produceSn); - } else produceSnExtService.updateNoSync(produceSn); + if (StringUtils.isEmpty(produceSnClone.getId())) { + produceSnClone.setFid(UUID.randomUUID().toString()); + produceSnClone = produceSnExtService.insert(produceSnClone); + } else { + Map beforeMap = JSONObject.parseObject(JSONObject.toJSONString(produceSn), Map.class) ; + Map afterMap = JSONObject.parseObject(JSONObject.toJSONString(produceSnClone), Map.class) ; + Map> mapDiff = Maps.difference(beforeMap, afterMap).entriesDiffering(); + + String[] propertyName = new String[mapDiff.size()]; + Object[] propertyValue = new Object[mapDiff.size()]; + + Integer index = 0; + for (Map.Entry> entry : mapDiff.entrySet()) { + if (null == entry) continue; + propertyName[index] = entry.getKey(); + propertyValue[index] = entry.getValue().rightValue(); + index ++; + } + + produceSnRepository.updateByPropertiesNoSync(new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{produceSn.getId(), reqBean.getOrganizeCode()}, propertyName, propertyValue); + + } //isCalcCompleteQty=true的情况下【工位是否不累计工单完成数noCalcOrderQty=true最终不会实际累加到工单上】【noCalcOrderQty=false代表生产线维度的统计,才会实际累加到工单上】 MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext() - .copy(produceSn, prodRuleContext.getForeignKey()).isCalcCompleteQty(isCalcCompleteQty, isSamePart, workCell.getNoCalcOrderQty()); + .copy(produceSnClone, prodRuleContext.getForeignKey()).isCalcCompleteQty(isCalcCompleteQty, isSamePart, workCell.getNoCalcOrderQty()); log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), - StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext)); + StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSnClone), JSONObject.toJSONString(productionPsOutContext)); return productionPsOutContext; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnSaveStepService.java index cc3f78e..2694438 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnSaveStepService.java @@ -184,7 +184,8 @@ public class MesProductSnSaveStepService extends BaseStepService { propertyMap.put(MesPcnExtConstWords.OUT_WC_TIME, productionPsOutContext.getOutWorkCenterTime()); } else { //排序非末道 - if (productionPsOutContext.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue()) != 0) { + if (productionPsOutContext.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue()) != 0 && + productionPsOutContext.getSnStatus().compareTo(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()) != 0) { productionPsOutContext.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue()); propertyMap.put(MesPcnExtConstWords.SN_STATUS, productionPsOutContext.getSnStatus()); }