From e0e80b925fb0df49a6a38862d3a4e2a922cdf815 Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 22 Dec 2025 16:48:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=87=E6=96=99=E8=AE=A1=E5=88=92=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=AB=98=E5=8E=8BMES=E4=BC=98=E5=8C=96-=E6=9D=90?= =?UTF-8?q?=E6=96=99=E5=87=BA=E5=BA=93=E5=9B=9E=E5=86=99=E5=A4=87=E6=96=99?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bp/rewrite/PickmRewriteNNum4DBP.java | 430 ++++++++++-------- .../pickm/service/SyncGyMesPickmUtil.java | 135 +++++- 2 files changed, 359 insertions(+), 206 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rewrite/PickmRewriteNNum4DBP.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rewrite/PickmRewriteNNum4DBP.java index 8d331756..171b5bf8 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rewrite/PickmRewriteNNum4DBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rewrite/PickmRewriteNNum4DBP.java @@ -1,28 +1,9 @@ -// -// Source code recreated from a .class file by IntelliJ IDEA -// (powered by FernFlower decompiler) -// - package nc.bs.mmpac.pickm.bp.rewrite; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; import nc.bs.mmpac.pickm.adapter.IC4DServiceAdapter; import nc.bs.mmpac.pickm.adapter.ReserveServiceAdapter; import nc.bs.mmpac.pickm.rule.batch.PickmAutoBatchBindRule; -import nc.bs.mmpac.pickm.rule.ic.PickmAutoChangeStateRule; -import nc.bs.mmpac.pickm.rule.ic.PickmCheckBillStatusForRewritePickmRule; -import nc.bs.mmpac.pickm.rule.ic.PickmCheckMoStateForDeliveryRule; -import nc.bs.mmpac.pickm.rule.ic.PickmCheckUnClose4455When4DRewriteRule; -import nc.bs.mmpac.pickm.rule.ic.PickmFillVacancyWhenRewriteRule; -import nc.bs.mmpac.pickm.rule.ic.PickmRewriteNumFor4DRule; -import nc.bs.mmpac.pickm.rule.ic.PickmRewriteOtherNumRule; +import nc.bs.mmpac.pickm.rule.ic.*; import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; import nc.bs.uif2.validation.ValidationException; import nc.bs.uif2.validation.ValidationFailure; @@ -45,8 +26,7 @@ import nc.vo.mmpac.pickm.enumeration.FbillstatusEnum; import nc.vo.mmpac.pickm.param.PickmTransParamFor4D; import nc.vo.mmpac.pickm.util.base.PickmCloneUtil; import nc.vo.pub.BusinessException; -import nc.vo.pub.ISuperVO; -import nc.vo.pub.SuperVO; +import nc.vo.pub.VOStatus; import nc.vo.pub.lang.UFDouble; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.pubapp.pattern.pub.MapList; @@ -54,27 +34,42 @@ import nc.vo.util.BDPKLockUtil; import nc.vo.util.BDVersionValidationUtil; import nccloud.web.mmpac.pickm.service.SyncGyMesPickmUtil; +import java.util.*; + +/** + * 材料出库单回写备料计划BP + * + * @author liddf + * @version 2011-12-22 下午06:05:15 + * @since 6.1 + */ public class PickmRewriteNNum4DBP { + + /** + * 回写参数 + */ private MapList paraCache; - public PickmRewriteNNum4DBP() { - } + /** + * 回写处理 + * + * @param paraMap + * @param aggVOs + */ + public void rewriteNPlanNumAndNAccountNum4D(MapList paraMap, AggPickmVO[] aggVOs) + throws BusinessException { - public void rewriteNPlanNumAndNAccountNum4D(MapList paraMap, AggPickmVO[] aggVOs) throws BusinessException { this.paraCache = paraMap; - List paramList = new ArrayList(); - List itemList = new ArrayList(); - AggPickmVO[] var5 = aggVOs; - int var6 = aggVOs.length; - for(int var7 = 0; var7 < var6; ++var7) { - AggPickmVO agg = var5[var7]; - PickmItemVO[] items = (PickmItemVO[])agg.getChildrenVO(); - PickmItemVO[] var10 = items; - int var11 = items.length; - - for(int var12 = 0; var12 < var11; ++var12) { - PickmItemVO item = var10[var12]; + List paramList = new ArrayList(); + // // PK加锁 + // BDPKLockUtil.lockAggVO(aggVOs); + // // TS校验 + // BDVersionValidationUtil.validateObject((Object[]) aggVOs); + List itemList = new ArrayList(); + for (AggPickmVO agg : aggVOs) { + PickmItemVO[] items = (PickmItemVO[]) agg.getChildrenVO(); + for (PickmItemVO item : items) { itemList.add(item); if (paraMap.containsKey(item.getCpickm_bid()) && MMValueCheck.isTrue(item.getBunibatch())) { PickmQueryParamFor4D param = new PickmQueryParamFor4D(); @@ -83,201 +78,241 @@ public class PickmRewriteNNum4DBP { } } } - - Map> bunibatchMap = IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode((PickmQueryParamFor4D[])paramList.toArray(new PickmQueryParamFor4D[0])); + // 混批验证Map + Map> bunibatchMap = + IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode( + paramList.toArray(new PickmQueryParamFor4D[0])); if (null != bunibatchMap) { + // 混批校验 this.validateBuniBatch(aggVOs, bunibatchMap); } + // 加锁 + BDPKLockUtil.lockSuperVO(itemList.toArray(new PickmItemVO[0])); + // 较验TS + BDVersionValidationUtil.validateSuperVO(itemList.toArray(new PickmItemVO[0])); - BDPKLockUtil.lockSuperVO((SuperVO[])itemList.toArray(new PickmItemVO[0])); - BDVersionValidationUtil.validateSuperVO((SuperVO[])itemList.toArray(new PickmItemVO[0])); + // 处理前规则 this.processBeforeRule(aggVOs); + // 埋补偿 + // 埋回写补偿 PickmSagasUtil.addSagaAndCompensate4DRewrite(aggVOs, this.paraCache); - List headVOs = new ArrayList(); - List itemVOs = new ArrayList(); - AggPickmVO[] var21 = aggVOs; - int var24 = aggVOs.length; - for(int var27 = 0; var27 < var24; ++var27) { - AggPickmVO aggVO = var21[var27]; + List headVOs = new ArrayList(); + List itemVOs = new ArrayList(); + for (AggPickmVO aggVO : aggVOs) { PickmHeadVO headVO = aggVO.getParentVO(); if (null != headVO) { headVOs.add(headVO); Object[] items = aggVO.getChildren(PickmItemVO.class); if (MMArrayUtil.isNotEmpty(items)) { - ISuperVO[] var33 = (ISuperVO[]) items; - int var15 = items.length; - - for(int var16 = 0; var16 < var15; ++var16) { - Object obj = var33[var16]; - itemVOs.add((PickmItemVO)obj); + for (Object obj : items) { + itemVOs.add((PickmItemVO) obj); } } } } + // 更新备料计划表头信息 if (MMCollectionUtil.isNotEmpty(headVOs)) { - BDPKLockUtil.lockSuperVO((SuperVO[])headVOs.toArray(new PickmHeadVO[0])); - BDVersionValidationUtil.validateSuperVO((SuperVO[])headVOs.toArray(new PickmHeadVO[0])); - List heads = new ArrayList(); - Iterator var25 = headVOs.iterator(); - - while(var25.hasNext()) { - PickmHeadVO head = (PickmHeadVO)var25.next(); - if (head.getStatus() == 1) { + // 加锁 + BDPKLockUtil.lockSuperVO(headVOs.toArray(new PickmHeadVO[0])); + // 较验TS + BDVersionValidationUtil.validateSuperVO(headVOs.toArray(new PickmHeadVO[0])); + List heads = new ArrayList(); + for (PickmHeadVO head : headVOs) { + if (head.getStatus() == VOStatus.UPDATED) { heads.add(head); } - + // 更新备料计划表头信息 if (MMCollectionUtil.isNotEmpty(heads)) { - VOUpdate update = new VOUpdate(); - update.update((PickmHeadVO[])heads.toArray(new PickmHeadVO[0])); + VOUpdate update = new VOUpdate(); + update.update(heads.toArray(new PickmHeadVO[0])); } } } + // 更新表体 if (MMCollectionUtil.isNotEmpty(itemVOs)) { + // 要更新的表体信息 PickmItemVO[] updateItems = PickmRewriteUtil.getUpdateItemVOs(paraMap.keySet(), itemVOs); - this.releaseReserve((PickmHeadVO[])headVOs.toArray(new PickmHeadVO[0]), updateItems); - VOUpdate update = new VOUpdate(); - PickmItemVO[] pickmItemVOS = update.update(updateItems); - - //备料计划点击备料重算后调高压MES修改 - SyncGyMesPickmUtil pickmUtil = new SyncGyMesPickmUtil(); - pickmUtil.process(aggVOs); + // 完成态的备料计划进行释放预留 + this.releaseReserve(headVOs.toArray(new PickmHeadVO[0]), updateItems); + // 更新备料计划子行信息 + VOUpdate update = new VOUpdate(); + PickmItemVO[] resItemVOS = update.update(updateItems); + // 备料计划子表修改后同步调用高压MES接口 + SyncGyMesPickmUtil pickmUtil = new SyncGyMesPickmUtil(); + pickmUtil.processMaterialOut(resItemVOS); } } + /** + * 完成态的备料计划进行释放预留 + * + * @param headVOs 备料计划表头信息 + * @param updateItems 要更新的备料计划表体信息 + * @throws BusinessException + */ private void releaseReserve(PickmHeadVO[] headVOs, PickmItemVO[] updateItems) throws BusinessException { - if (!MMValueCheck.isEmpty(headVOs)) { - Set hidSet = new HashSet(); - PickmHeadVO[] var4 = headVOs; - int var5 = headVOs.length; - - for(int var6 = 0; var6 < var5; ++var6) { - PickmHeadVO hvo = var4[var6]; - if (MMValueCheck.isNotEmpty(hvo.getFbillstatus()) && FbillstatusEnum.FINISH_STATE.toIntValue() == hvo.getFbillstatus()) { - hidSet.add(hvo.getCpickmid()); - } - } - - if (!MMValueCheck.isEmpty(hidSet)) { - MMSqlBuilder sql = new MMSqlBuilder(); - sql.append(" and "); - sql.append("cpickmid", (String[])hidSet.toArray(new String[0])); - VOQuery voQuery = new VOQuery(PickmItemVO.class); - PickmItemVO[] ivos = (PickmItemVO[])voQuery.query(sql.toString(), (String)null); - Set bidSet = new HashSet(); - PickmItemVO[] var8 = ivos; - int var9 = ivos.length; - - for(int var10 = 0; var10 < var9; ++var10) { - PickmItemVO ivo = var8[var10]; - bidSet.add(ivo.getCpickm_bid()); - } - - this.releaseIDs((String[])bidSet.toArray(new String[0]), updateItems); + // 判断要释放预留的备料计划表头信息是否为空 + if (MMValueCheck.isEmpty(headVOs)) { + return; + } + // 表头IDSet + Set hidSet = new HashSet(); + for (PickmHeadVO hvo : headVOs) { + if (MMValueCheck.isNotEmpty(hvo.getFbillstatus()) + && FbillstatusEnum.FINISH_STATE.toIntValue() == hvo.getFbillstatus().intValue()) { + hidSet.add(hvo.getCpickmid()); } } + // 判断要释放预留的完成态备料计划表头IDSet是否为空 + if (MMValueCheck.isEmpty(hidSet)) { + return; + } + // 组装sql + MMSqlBuilder sql = new MMSqlBuilder(); + sql.append(" and "); + sql.append(PickmItemVO.CPICKMID, hidSet.toArray(new String[0])); + // 查询出所有完成态的备料计划子表信息 + VOQuery voQuery = new VOQuery(PickmItemVO.class); + // 备料计划子表VOs + PickmItemVO[] ivos = voQuery.query(sql.toString(), null); + // 表体IDSet + Set bidSet = new HashSet(); + for (PickmItemVO ivo : ivos) { + bidSet.add(ivo.getCpickm_bid()); + } + // 释放预留 + this.releaseIDs(bidSet.toArray(new String[0]), updateItems); } + /** + * 根据子表IDs解除预留 + * + * @param releasePickmbids 要释放预留子信息的备料计划子表BIDs + * @param updateItems 备料计划表体VOs + * @throws BusinessException + */ private void releaseIDs(String[] releasePickmbids, PickmItemVO[] updateItems) throws BusinessException { + // 按备料计划子表IDs查询出预留 ReserveVO[] rvos = ReserveServiceAdapter.queryReserver(releasePickmbids); - if (!MMValueCheck.isEmpty(rvos)) { - Map ivoMap = new HashMap(); - PickmItemVO[] var5 = updateItems; - int var6 = updateItems.length; - - int var7; - for(var7 = 0; var7 < var6; ++var7) { - PickmItemVO ivo = var5[var7]; - ivoMap.put(ivo.getCpickm_bid(), ivo); - } - - Set releaseidSet = new HashSet(); - ReserveVO[] var12 = rvos; - var7 = rvos.length; - - for(int var13 = 0; var13 < var7; ++var13) { - ReserveVO rvo = var12[var13]; - if (ivoMap.containsKey(rvo.getCreqbillbid())) { - PickmItemVO ivo = (PickmItemVO)ivoMap.get(rvo.getCreqbillbid()); - ivo.setNatpastnum(UFDouble.ZERO_DBL); - ivo.setNatpnum(UFDouble.ZERO_DBL); - } - - releaseidSet.add(rvo.getCreqbillbid()); - } - - ReserveServiceAdapter.batchAdjustReserveWhenDeliver((String[])releaseidSet.toArray(new String[0])); + // 判断预留信息是否为空 + if (MMValueCheck.isEmpty(rvos)) { + return; } + // 备料计划子行VOMap + Map ivoMap = new HashMap(); + for (PickmItemVO ivo : updateItems) { + ivoMap.put(ivo.getCpickm_bid(), ivo); + } + // 释放预留的idSet + Set releaseidSet = new HashSet(); + for (ReserveVO rvo : rvos) { + if (ivoMap.containsKey(rvo.getCreqbillbid())) { + PickmItemVO ivo = ivoMap.get(rvo.getCreqbillbid()); + ivo.setNatpastnum(UFDouble.ZERO_DBL); + ivo.setNatpnum(UFDouble.ZERO_DBL); + } + releaseidSet.add(rvo.getCreqbillbid()); + } + // 释放预留 + ReserveServiceAdapter.batchAdjustReserveWhenDeliver(releaseidSet.toArray(new String[0])); } + /** + * 混批校验 + * + * @param aggs + * @param bunibatchMap + */ private void validateBuniBatch(AggPickmVO[] aggs, Map> bunibatchMap) { - List failures = new ArrayList(); + List failures = new ArrayList(); + // 回写备料计划子表行存在混批错误: failures.add(new ValidationFailure(PickmLangConsts.getErr_RewriteError())); - AggPickmVO[] var4 = aggs; - int var5 = aggs.length; - - for(int var6 = 0; var6 < var5; ++var6) { - AggPickmVO agg = var4[var6]; - PickmItemVO[] items = (PickmItemVO[])agg.getChildrenVO(); - PickmItemVO[] var9 = items; - int var10 = items.length; - - for(int var11 = 0; var11 < var10; ++var11) { - PickmItemVO item = var9[var11]; - if (bunibatchMap.containsKey(item.getCpickm_bid()) && MMValueCheck.isNotEmpty((Collection)bunibatchMap.get(item.getCpickm_bid())) && MMValueCheck.isTrue(((PickmQueryOutParamFor4D)((List)bunibatchMap.get(item.getCpickm_bid())).get(0)).getIsMixBatch())) { - failures.add(new ValidationFailure(PickmLangConsts.getErr_PickmBidCannotBuniBantch(new String[]{agg.getParentVO().getVbillcode(), item.getVrowno()}))); + for (AggPickmVO agg : aggs) { + PickmItemVO[] items = (PickmItemVO[]) agg.getChildrenVO(); + for (PickmItemVO item : items) { + // 判断备料计划是否允许混批 + if (bunibatchMap.containsKey(item.getCpickm_bid()) + && MMValueCheck.isNotEmpty(bunibatchMap.get(item.getCpickm_bid())) + && MMValueCheck.isTrue(bunibatchMap.get(item.getCpickm_bid()).get(0).getIsMixBatch())) { + // 备料计划单据号{0}第{0}行,领料或退料时不允许混批! + failures.add(new ValidationFailure(PickmLangConsts.getErr_PickmBidCannotBuniBantch(new String[]{ + agg.getParentVO().getVbillcode(), item.getVrowno() + }))); } } } - if (failures.size() > 1) { ExceptionUtils.wrappException(new ValidationException(failures)); } - } + /** + * 添加前规则 + * + * @param processer + */ private void processBeforeRule(AggPickmVO[] aggVOs) { - if (!MMArrayUtil.isEmpty(aggVOs)) { - AggPickmVO[] originAggVOs = PickmCloneUtil.clonePickmVOs(aggVOs); - IRule sagasCheckrule = new MMVOSagaFrozenValidateRule(true); - sagasCheckrule.process(aggVOs); - PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule = new PickmCheckBillStatusForRewritePickmRule(); - pickmCheckBillStatusForRewritePickmRule.process(aggVOs); - IRule chkmostsRule = new PickmCheckMoStateForDeliveryRule(); - chkmostsRule.process(aggVOs); - PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule(); - unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs); - PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache); - rewriteRule.process(aggVOs); - PickmFillVacancyWhenRewriteRule fillVacancyRule = new PickmFillVacancyWhenRewriteRule(); - fillVacancyRule.process(aggVOs); - PickmAutoBatchBindRule batchBindRule = new PickmAutoBatchBindRule(this.paraCache); - batchBindRule.process(aggVOs); - PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule(); - setPartsRule.process(aggVOs); - PickmAutoChangeStateRule autoChangeStateRule = new PickmAutoChangeStateRule(); - autoChangeStateRule.process(aggVOs, originAggVOs); + + if (MMArrayUtil.isEmpty(aggVOs)) { + return; } + + // 先保存一份原始VO + AggPickmVO[] originAggVOs = PickmCloneUtil.clonePickmVOs(aggVOs); + // sagas 冻结校验 + IRule sagasCheckrule = new MMVOSagaFrozenValidateRule(true); + sagasCheckrule.process(aggVOs); + // 备料计划不能是自由态 + PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule = + new PickmCheckBillStatusForRewritePickmRule(); + pickmCheckBillStatusForRewritePickmRule.process(aggVOs); + // 校验生产订单状态规则 + IRule chkmostsRule = new PickmCheckMoStateForDeliveryRule(); + chkmostsRule.process(aggVOs); + // 检查,材料出库单回写时,判断是否有未关闭的出库申请单 + PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule(); + unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs); + + // 处理数量回写 + PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache); + rewriteRule.process(aggVOs); + + // 倒挤处理 + PickmFillVacancyWhenRewriteRule fillVacancyRule = new PickmFillVacancyWhenRewriteRule(); + fillVacancyRule.process(aggVOs); + + // 调用批次关联处理的rule + PickmAutoBatchBindRule batchBindRule = new PickmAutoBatchBindRule(this.paraCache); + batchBindRule.process(aggVOs); + + // 进行成套数量、累计超额数量等联动值的重算 + PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule(); + setPartsRule.process(aggVOs); + + // 调用更新状态rule:自动完成 or 自动取消完成 + PickmAutoChangeStateRule autoChangeStateRule = new PickmAutoChangeStateRule(); + autoChangeStateRule.process(aggVOs, originAggVOs); } - public void rewriteNPlanNumAndNAccountNum4DSagasCheck(MapList paraMap, AggPickmVO[] aggVOs) throws BusinessException { + /** + * 前置校验 回写处理 + * + * @param paraMap + * @param aggVOs + * @throws BusinessException + */ + public void rewriteNPlanNumAndNAccountNum4DSagasCheck(MapList paraMap, + AggPickmVO[] aggVOs) throws BusinessException { this.paraCache = paraMap; - List paramList = new ArrayList(); - List itemList = new ArrayList(); - AggPickmVO[] var5 = aggVOs; - int var6 = aggVOs.length; - - for(int var7 = 0; var7 < var6; ++var7) { - AggPickmVO agg = var5[var7]; - PickmItemVO[] items = (PickmItemVO[])agg.getChildrenVO(); - PickmItemVO[] var10 = items; - int var11 = items.length; - - for(int var12 = 0; var12 < var11; ++var12) { - PickmItemVO item = var10[var12]; + List paramList = new ArrayList(); + List itemList = new ArrayList(); + for (AggPickmVO agg : aggVOs) { + PickmItemVO[] items = (PickmItemVO[]) agg.getChildrenVO(); + for (PickmItemVO item : items) { itemList.add(item); if (paraMap.containsKey(item.getCpickm_bid()) && MMValueCheck.isTrue(item.getBunibatch())) { PickmQueryParamFor4D param = new PickmQueryParamFor4D(); @@ -286,23 +321,38 @@ public class PickmRewriteNNum4DBP { } } } - - Map> bunibatchMap = IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode((PickmQueryParamFor4D[])paramList.toArray(new PickmQueryParamFor4D[0])); + // 混批验证Map + Map> bunibatchMap = + IC4DServiceAdapter.getMaterialOuterviceFor55A3().queryMaterialOutBatchCode( + paramList.toArray(new PickmQueryParamFor4D[0])); if (null != bunibatchMap) { + // 混批校验 this.validateBuniBatch(aggVOs, bunibatchMap); } - - if (!MMArrayUtil.isEmpty(aggVOs)) { - IRule sagasCheckrule = new MMVOSagaFrozenValidateRule(true); - sagasCheckrule.process(aggVOs); - PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule = new PickmCheckBillStatusForRewritePickmRule(); - pickmCheckBillStatusForRewritePickmRule.process(aggVOs); - IRule chkmostsRule = new PickmCheckMoStateForDeliveryRule(); - chkmostsRule.process(aggVOs); - PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule(); - unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs); - PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache); - rewriteRule.process(aggVOs); + // 处理前规则 + if (MMArrayUtil.isEmpty(aggVOs)) { + return; } + + // 先保存一份原始VO + // AggPickmVO[] originAggVOs = PickmCloneUtil.clonePickmVOs(aggVOs); + // sagas 冻结校验 + IRule sagasCheckrule = new MMVOSagaFrozenValidateRule(true); + sagasCheckrule.process(aggVOs); + // 备料计划不能是自由态 + PickmCheckBillStatusForRewritePickmRule pickmCheckBillStatusForRewritePickmRule = + new PickmCheckBillStatusForRewritePickmRule(); + pickmCheckBillStatusForRewritePickmRule.process(aggVOs); + // 校验生产订单状态规则 + IRule chkmostsRule = new PickmCheckMoStateForDeliveryRule(); + chkmostsRule.process(aggVOs); + // 检查,材料出库单回写时,判断是否有未关闭的出库申请单 + PickmCheckUnClose4455When4DRewriteRule unClose4455CheckRule = new PickmCheckUnClose4455When4DRewriteRule(); + unClose4455CheckRule.CheckUnClose4455When4DEdit(this.paraCache, aggVOs); + + // 处理数量回写 + PickmRewriteNumFor4DRule rewriteRule = new PickmRewriteNumFor4DRule(this.paraCache); + rewriteRule.process(aggVOs); } + } diff --git a/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java b/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java index 74384f72..93677a12 100644 --- a/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java +++ b/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java @@ -24,12 +24,10 @@ import nc.vo.mmpac.pickm.entity.PickmItemVO; import nc.vo.org.OrgVO; import nc.vo.pmpub.project.ProjectHeadVO; import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.scmpub.util.ArrayUtil; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -41,8 +39,6 @@ import java.util.stream.Stream; public class SyncGyMesPickmUtil { private static final String LOG_INFO_NAME = "gymeslog"; private static final Log logger = Log.getInstance(LOG_INFO_NAME); - // 异步调用线程池 - private static final ExecutorService asyncExecutor = Executors.newFixedThreadPool(1); private Map configParams; public void process(AggPickmVO[] aggPickmVOS) { @@ -54,7 +50,20 @@ public class SyncGyMesPickmUtil { buildSyncData(aggPickmVOS); } catch (Exception e) { logger.error("同步备料计划到高压MES系统失败: " + e.getMessage(), e); - // ExceptionUtils.wrappException(e); + ExceptionUtils.wrappException(e); + } + } + + public void processMaterialOut(PickmItemVO[] updateItems) { + if (ArrayUtil.isEmpty(updateItems)) { + return; + } + configParams = MyHelper.getConfigParams("gy-config", null); + try { + buildSyncData1(updateItems); + } catch (Exception e) { + logger.error("同步备料计划到高压MES系统失败: " + e.getMessage(), e); + ExceptionUtils.wrappException(e); } } @@ -109,7 +118,6 @@ public class SyncGyMesPickmUtil { singleObj.put("productName", mrl.get("name")); // 产品名称 singleObj.put("processCode", "(物料的自定义字段)"); // 产品编码的工序(物料的自定义字段) -// singleObj.put("requiredDate", pickmHeadVO.getDmakedate().toString()); // 需用日期 String sql1 = " select user_name from sm_user where cuserid = '" + pickmHeadVO.getModifier() + "' "; String bipCreateBy = (String) baseDAO.executeQuery(sql1, new ColumnProcessor()); @@ -133,8 +141,7 @@ public class SyncGyMesPickmUtil { itemObj.put("storageArea", stockMap.get("def16")); // 立库库区 itemObj.put("cwarehouseid", stockMap.get("pk_stordoc")); // 仓库编码 itemObj.put("requiredDate", item.getDrequiredate().toString()); // 需用日期 -// itemObj.put("bchkitemforwr", "Y"); // 完工齐套检查 - itemObj.put("bchkitemforwr",item.getBchkitemforwr().booleanValue()?"Y":"N"); // 完工齐套检查 + itemObj.put("bchkitemforwr", item.getBchkitemforwr().booleanValue() ? "Y" : "N"); // 完工齐套检查 itemObj.put("quantityPerSet", item.getNunituseastnum() != null ? item.getNunituseastnum().doubleValue() : null); // 单套数量(单位用量) itemObj.put("reservedQuantity", item.getNatpastnum() != null ? item.getNatpastnum().doubleValue() : null); // 预留数量 itemObj.put("cumulativePendingQuantity", item.getNshouldastnum() != null ? item.getNshouldastnum().doubleValue() : null); // 累计待发数量 @@ -171,9 +178,80 @@ public class SyncGyMesPickmUtil { list.put("list", jsonArray); } if (!list.isEmpty()) { - // 异步推送数据,不阻塞主线程 pushData(list); - logger.error("gyMes-Pickm-异步任务已提交,主线程继续执行"); + } + } + + /** + * 构建同步数据-材料出库修改备料计划的情况 + */ + private void buildSyncData1(PickmItemVO[] updateItems) throws BusinessException { + HYPubBO hybo = new HYPubBO(); + JSONObject list = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + Set hids = new HashSet<>(); + for (PickmItemVO updateItem : updateItems) { + hids.add(updateItem.getCpickmid()); + } + List useVOs = new ArrayList<>(); + // 按 cpickmid 分组子表行,确保 childrenVO 填充完整 + Map> itemGroupByHead = new HashMap<>(); + for (PickmItemVO item : updateItems) { + itemGroupByHead.computeIfAbsent(item.getCpickmid(), k -> new ArrayList<>()).add(item); + } + for (String hid : hids) { + AggPickmVO vo = new AggPickmVO(); + PickmHeadVO pickmHeadVO = (PickmHeadVO) hybo.queryByPrimaryKey(PickmHeadVO.class, hid); + vo.setParentVO(pickmHeadVO); + // 将 updateItems 中相同 cpickmid 的数据设置到 childrenVO 中 + List items = itemGroupByHead.getOrDefault(hid, Collections.emptyList()); + if (!items.isEmpty()) { + vo.setChildrenVO(items.toArray(new PickmItemVO[0])); + useVOs.add(vo); + } + } + if (useVOs.isEmpty()) { + return; + } + for (AggPickmVO vo : useVOs) { + PickmHeadVO pickmHeadVO = vo.getParentVO(); + PickmItemVO[] itemVOS = (PickmItemVO[]) vo.getChildrenVO(); + // 判断备料计划的业务单元是否是高压公司,不是则跳过 + String pkOrg = pickmHeadVO.getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + if (checkIfOrg(orgCode, configParams)) { + continue; + } + // 期初、整单委外的单据不推MES,其余类型推MES + String billType = pickmHeadVO.getVbusitype(); + if (checkBillType(billType, configParams)) { + continue; + } + JSONObject singleObj = new JSONObject(); + // 创建子项数组 + JSONArray contentArray = new JSONArray(); + + singleObj.put("materialPreparationPlanNumber", pickmHeadVO.getVbillcode());// 备料计划单号 + singleObj.put("bipId", pickmHeadVO.getCpickmid());// 主键ID + // 创建子项数组 + for (PickmItemVO item : itemVOS) { + JSONObject itemObj = new JSONObject(); + itemObj.put("bipChildId", item.getCpickm_bid()); // 子项主键ID + itemObj.put("bchkitemforwr", item.getBchkitemforwr().booleanValue() ? "Y" : "N"); // 完工齐套检查 + itemObj.put("quantityPerSet", item.getNunituseastnum() != null ? item.getNunituseastnum().doubleValue() : null); // 单套数量(单位用量) + itemObj.put("reservedQuantity", item.getNatpastnum() != null ? item.getNatpastnum().doubleValue() : null); // 预留数量 + itemObj.put("cumulativePendingQuantity", item.getNshouldastnum() != null ? item.getNshouldastnum().doubleValue() : null); // 累计待发数量 + itemObj.put("cumulativeIssuedQuantity", item.getNaccoutastnum() != null ? item.getNaccoutastnum().doubleValue() : null); // 累计出库数量 + itemObj.put("totalQuantity", item.getNplanoutnum() != null ? item.getNplanoutnum().doubleValue() : null); // 总数量(计划出库主数量) + contentArray.add(itemObj); // 将子项添加到数组 + } + singleObj.put("itemList", contentArray); // 将子项数组添加到主对象 + jsonArray.add(singleObj); + list.put("list", jsonArray); + } + if (!list.isEmpty()) { + logger.error("gyMes-Pickm-领料修改备料计划开始同步高压MES"); + pushData(list); } } @@ -196,12 +274,38 @@ public class SyncGyMesPickmUtil { } + /** + * 推送同步数据 + */ + private void pushData(JSONObject param) throws BusinessException { + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("gyMes-Pickm-param = " + jsonStr); + String baseUrl = configParams.get("mesBaseUrl"); + String requestUrl = baseUrl + configParams.get("materialRequirementsUpdate"); + logger.error("gyMes-Pickm-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logger.error("gyMes-Pickm-res = " + result); + + if (!"200".equals(resultObj.getString("code"))) { + logger.error("gyMes-Pickm-error,result[" + resultObj.toJSONString() + "]"); + throw new BusinessException("备料计划推送高压MES错误:" + resultObj.getString("msg")); + } + } + + /** * 异步推送同步数据 * 注意:此方法立即返回,不会阻塞调用线程 * 实际的HTTP请求在独立线程中执行,即使接口响应很慢也不会影响主任务 */ - private void pushData(JSONObject param) { + private void pushDataAsync(JSONObject param) { + // 异步调用线程池 + final ExecutorService asyncExecutor = Executors.newFixedThreadPool(1); // 复制配置参数,避免异步任务执行时configParams被修改 final Map configParamsCopy = new HashMap<>(configParams); @@ -226,7 +330,6 @@ public class SyncGyMesPickmUtil { if (!"200".equals(resultObj.getString("code"))) { logger.error("gyMes-Pickm-error,result[" + resultObj.toJSONString() + "]"); - logger.error("备料计划推送高压MES失败:" + resultObj.getString("msg")); } else { logger.error("gyMes-Pickm-推送成功"); } @@ -253,8 +356,8 @@ public class SyncGyMesPickmUtil { return true; } - public static Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, - String[] fields) { + public Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, + String[] fields) { Map map = null; try { List vids = Stream.of(pks).filter(Objects::nonNull).distinct().toList();