From 864481a3163743cd49edb3b8a61d1e5e7e872ea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AD=A3=40=E7=94=A8=E5=8F=8B?= Date: Mon, 26 May 2025 18:03:57 +0800 Subject: [PATCH] =?UTF-8?q?5=E5=8D=95=E6=8D=AE=E6=8E=A8=E9=80=81=E9=94=90?= =?UTF-8?q?=E5=88=B6=E4=BC=98=E5=8C=96=5F=E7=94=9F=E4=BA=A7=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=8F=98=E6=9B=B4=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java | 263 ++++++++++++++++++ .../bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java | 2 +- .../rule/AfterApprovingSynchronizeRuleRZ.java | 38 ++- 3 files changed, 300 insertions(+), 3 deletions(-) create mode 100644 mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java new file mode 100644 index 0000000..6c1e7a6 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java @@ -0,0 +1,263 @@ +package nc.bs.mmpac.pmo.pac0002.bp; + +import java.util.ArrayList; +import java.util.List; + +import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApprovingSynchronizeRuleRZ; +import nc.bs.mmpac.pmo.pac0002.pluginpoint.PMOPluginPoint; +import nc.bs.mmpac.pmo.pac0002.rule.PMOATPUpdateRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOAdjustReserveRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOBatchCodeEditRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOBatchCodeEditSynPickmRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOCffileidInserAndUpdatetRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOCreateVersionRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOMarkWrSNWhenUpdateRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOProcedureSortRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOSyncSNWhenItemDeleteRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOSyncSNWhenUpdateRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOUpdatePickmRule; +import nc.bs.mmpac.pmo.pac0002.rule.PMOUpdateSaveApproveRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckApproveOperTypeRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckDateLogicRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckDispatchNumRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckOutputNumRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckPlanDateTimeRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckPlanPutNumRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckPlanPutNumberRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedureDateLogicRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedureDupRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedureNotNullRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProdurepointRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckPutNumRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckSNNumAndUnitRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckSaveNotNullRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckSnBindRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOProcedureChkPntRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMOProcedurePutCheckRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMORwkProcCheckRule; +import nc.bs.mmpac.pmo.pac0002.rule.check.PMORwkProcOperTypeRule; +import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillBatchCodeRule; +import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillInsertPlanTimeByProcedureRule; +import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillSNPkAndCodeRule; +import nc.bs.mmpac.pmo.pac0002.rule.grand.PMOIsCreatPlanOutputRule; +import nc.bs.mmpac.pmo.pac0002.rule.grand.PMORecalProcedureRule; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4INVP; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4MPS; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4PMO; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4PSCRecive; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4PSM; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4Renovate; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4SFC; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4SO; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteUpdateNum4TO; +import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; +import nc.bs.pubapp.pub.rule.BillCodeCheckRule; +import nc.impl.pubapp.pattern.rule.ICompareRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.util.mmf.framework.base.MMArrayUtil; +import nc.util.mmf.framework.gc.GCUpdateBPTemplate; +import nc.vo.mmpac.pmo.pac0002.constant.PMOConst; +import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; +import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; +import nc.vo.mmpac.pmo.pac0002.util.PmoSagaUtil; +import nc.vo.pub.VOStatus; + +/** + * 订单变更业务处理
+ * + * @since 6.31 + * @version 2013-6-18 上午11:33:58 + * @author wanghjd + */ +public class PMOAdjustBP { + + public PMOAggVO[] adjust(PMOAggVO[] fullBills, PMOAggVO[] originBills) { + if (MMArrayUtil.isEmpty(fullBills)) { + return null; + } + + for (PMOAggVO vo : fullBills) { + if (vo.getParent().getStatus() != VOStatus.UPDATED) { + vo.getParent().setStatus(VOStatus.UPDATED); + } + } + // sagas冻结并开启saga + PmoSagaUtil.frozenAndAddSaga(fullBills); + // 调用修改模板 + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(PMOPluginPoint.ADJUST); + // 执行前规则 + this.addBeforeRule(bp.getAroundProcesser()); + // 执行后规则 + this.addAfterRule(bp.getAroundProcesser()); + PMOAggVO[] rets = bp.update(fullBills, originBills); + // 修改保存补偿 + PmoSagaUtil.compensate4Update(rets.clone(), originBills); + return rets; + } + + private void addBeforeRule(CompareAroundProcesser processer) { + // 校验冻结状态 added by fengjinga + IRule checkFrozenRule = new MMVOSagaFrozenValidateRule(false); + processer.addBeforeRule(checkFrozenRule); + // 校验单据号唯一性 + IRule checkUniqueRule = new BillCodeCheckRule(PMOConst.PMO_BILLTYPE, PMOHeadVO.VBILLCODE, + PMOHeadVO.PK_GROUP, PMOHeadVO.PK_ORG); + // 把工序按工序号排序 + processer.addBeforeRule(new PMOProcedureSortRule()); + // 表头的交易类型,表体的物料、数量、计划投入数量不能为空 + IRule checNullRule = new PMOCheckSaveNotNullRule(false); + processer.addBeforeRule(checNullRule); + // (变更专用)计划开工时间和计划完工时间可空,但是不能同时为空 + IRule daterule = new PMOCheckPlanDateTimeRule(); + processer.addBeforeRule(daterule); + // (变更专用)工序计划联动规则; + ICompareRule recalproc = new PMORecalProcedureRule(); + processer.addBeforeRule(recalproc); + // (变更专用)验证修改计划投入数量后,需满足大于等于已完工数量 + IRule checkPutNumRule = new PMOCheckPutNumRule(); + processer.addBeforeRule(checkPutNumRule); + // (变更专用)计划产出数量不可小于订单的被预留数量 + IRule checkOutputNumRule = new PMOCheckOutputNumRule(); + processer.addBeforeRule(checkOutputNumRule); + // (变更专用)校验订单的计划投入数量不能小于该订单对应的所有投放计划的计划投放数量之和 + IRule checkPlanPutNumRule = new PMOCheckPlanPutNumRule(); + processer.addBeforeRule(checkPlanPutNumRule); + // (变更专用)当计划投入数量改小时,需保证不能小于max(订单各‘正常’类型工序的累计派工数量) + IRule checkDispatchNumRule = new PMOCheckDispatchNumRule(); + processer.addBeforeRule(checkDispatchNumRule); + // (变更和修改共用)返工工序不可修改,并且最后一道返工工序必须是报告点; + ICompareRule procCheck = new PMORwkProcCheckRule(); + processer.addBeforeRule(procCheck); + // 工序计划编辑性校验(有工序完工报告的工序及其之前的工序不可修改删除,也不可在其中插入工序) + ICompareRule putCheckRule = new PMOProcedurePutCheckRule(); + processer.addBeforeRule(putCheckRule); + // 根据工序计划更新产品行计划完工时间 + IRule filltimeprocedurerule = new PMOFillInsertPlanTimeByProcedureRule(); + processer.addBeforeRule(filltimeprocedurerule); + // 日期是否符合自然逻辑顺序 + IRule timeRule = new PMOCheckDateLogicRule(); + processer.addBeforeRule(timeRule); + // 工序计划时间先后校验 + IRule procdatelogicrule = new PMOCheckProcedureDateLogicRule(false); + processer.addBeforeRule(procdatelogicrule); + // 工序计划工序号重复校验 + IRule proccoderule = new PMOCheckProcedureDupRule(); + processer.addBeforeRule(proccoderule); + // 当计划投入数量改小时,需保证不能小于Max(生产订单工序计划中返工工序为‘否’的所有工序的累计完工数量【累计完工数量:工序对应的所有完工报告中该工序的完工数量】) + IRule planputNumberRule = new PMOCheckPlanPutNumberRule(); + processer.addBeforeRule(planputNumberRule); + + // (变更和修改共用)最后一条返工工序的工序转移方式不能为‘不转移’; + IRule rwkProcOperType = new PMORwkProcOperTypeRule(); + processer.addBeforeRule(rwkProcOperType); + // 校验检测点必须是报告点,且转移方式不能为‘自动转移’ + IRule chkPntRule = new PMOProcedureChkPntRule(); + processer.addBeforeRule(chkPntRule); + // 增加工序计划必须有一个报告点 add lijjl + processer.addBeforeRule(new PMOCheckProdurepointRule()); + // 非工序返工补单的保存校验,最后报告点的工序的工序转移方式必须为非转移 + IRule operTypeRule = new PMOCheckApproveOperTypeRule(); + processer.addBeforeRule(operTypeRule); + // 校验工序管理物料,工序计划不能为空 + IRule approvecheckrule = new PMOCheckProcedureNotNullRule(); + processer.addBeforeRule(approvecheckrule); + // 预计产出规则; + ICompareRule createOutput = new PMOIsCreatPlanOutputRule(); + processer.addBeforeRule(createOutput); + + // 批次号修改同步备料计划规则 + ICompareRule batchcodeRule = new PMOBatchCodeEditSynPickmRule(); + processer.addBeforeRule(batchcodeRule); + // 批次号修改同步批次档案规则 + ICompareRule batchcodedocRule = new PMOBatchCodeEditRule(); + processer.addBeforeRule(batchcodedocRule); + // 生成生产批次号 + IRule fillbatchcodeRule = new PMOFillBatchCodeRule(); + processer.addBeforeRule(fillbatchcodeRule); + // v636 序列号批次关联的不允许进行删除 + IRule snBindRule = new PMOCheckSnBindRule(); + processer.addBeforeRule(snBindRule); + // 更新前库存可用量规则 + IRule checkATPUpdateRule = new PMOATPUpdateRule(true, PMOConst.PMO_BILLTYPE); + processer.addBeforeRule(checkATPUpdateRule); + // 回写生产报告数量 + ICompareRule rewritewr = new RewriteUpdateNum4Renovate(); + processer.addBeforeRule(rewritewr); + // 回写销售订单的累计补货数量 + ICompareRule rewriteso = new RewriteUpdateNum4SO(); + processer.addBeforeRule(rewriteso); + // 回写计划订单的排产数量 + ICompareRule rewritepsm = new RewriteUpdateNum4PSM(); + processer.addBeforeRule(rewritepsm); + // 回写主生产计划订单的已排产数量(根据订单类型) + ICompareRule rewritepo = new RewriteUpdateNum4MPS(); + processer.addBeforeRule(rewritepo); + // 回写库存计划订单的已排产数量(根据订单类型) + ICompareRule rewriteinvp = new RewriteUpdateNum4INVP(); + processer.addBeforeRule(rewriteinvp); + // 回写调拨订单的已排产数量(根据订单类型) + ICompareRule rewriteto = new RewriteUpdateNum4TO(); + processer.addBeforeRule(rewriteto); + // 车间管理的工序完工会写返工数量 + ICompareRule rewritesfc = new RewriteUpdateNum4SFC(); + processer.addBeforeRule(rewritesfc); + // (变更专用)变更操作,生成新版本 + ICompareRule verAutoUpRule = new PMOCreateVersionRule(); + processer.addBeforeRule(verAutoUpRule); + + // 调用库存接口,注册预留供给单据行数据 + ICompareRule adjustReserveRule = new PMOAdjustReserveRule(); + processer.addBeforeRule(adjustReserveRule); + + // V65 回写收货单返工处理数量 + ICompareRule rewritePSCrecive = new RewriteUpdateNum4PSCRecive(); + processer.addBeforeRule(rewritePSCrecive); + // V65回写Wr返工订单的序列号使用标志 + IRule wrMarkRule = new PMOMarkWrSNWhenUpdateRule(); + processer.addBeforeRule(wrMarkRule); + // 65 特征码新增修改保存 + PMOCffileidInserAndUpdatetRule cffileidRule = new PMOCffileidInserAndUpdatetRule(); + processer.addBeforeRule(cffileidRule); + // V65 检查数量与单位 + IRule snCheckRule = new PMOCheckSNNumAndUnitRule(); + processer.addBeforeRule(snCheckRule); + // 65 补充pk + IRule snRule = new PMOFillSNPkAndCodeRule(); + processer.addBeforeRule(snRule); + // V65 + IRule itemDeletesnRule = new PMOSyncSNWhenItemDeleteRule(); + processer.addBeforeRule(itemDeletesnRule); + // V65 + ICompareRule snSyncRule = new PMOSyncSNWhenUpdateRule(); + processer.addBeforeRule(snSyncRule); + + } + + private void addAfterRule(CompareAroundProcesser processer) { + // 回写返工的原始生产订单(根据来源订单表体id) + ICompareRule pmoBills = new RewriteUpdateNum4PMO(); + processer.addAfterRule(pmoBills); + // (变更和修改通用)更新备料计划规则 + ICompareRule pickmUpdateRule = new PMOUpdatePickmRule(this.checkInfoList); + processer.addAfterRule(pickmUpdateRule); + // 更新后库存可用量规则 + IRule atpUpdateRule = new PMOATPUpdateRule(false, PMOConst.PMO_BILLTYPE); + processer.addAfterRule(atpUpdateRule); + // 修改保存即审核 added by fengjinga + IRule saveapproverule = new PMOUpdateSaveApproveRule(); + processer.addAfterRule(saveapproverule); + + //变更推送生产订单至锐制MES + IRule pushRZRule = new AfterApprovingSynchronizeRuleRZ(Boolean.FALSE); + processer.addAfterFinalRule(pushRZRule); + } + + // 挪退料建议 + private List checkInfoList = new ArrayList(); + + public List getCheckInfoList() { + return this.checkInfoList; + } + +} diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java index e8de6d8..97eb00a 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java @@ -52,7 +52,7 @@ public class PMOApproveBP { ICompareRule auditSupplyRule = new PMOApproveAuditSupplyRule(); processer.addAfterRule(auditSupplyRule); // 审批后推送到RZ系统 - processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ()); + processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ(true)); // 审批后推送流程生产订单到MES processer.addAfterRule(new AfterApproveRuleSyncMes()); diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java index 900a5de..88142f2 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java @@ -5,10 +5,13 @@ import com.alibaba.fastjson.JSONObject; import com.yonyou.iuap.bd.defdoc.dto.DefDoc; import nc.bs.dao.BaseDAO; import nc.bs.logging.Log; +import nc.bs.mmpac.pmo.pac0002.bp.service.PMOBPService; import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; import nc.impl.pubapp.pattern.rule.IRule; import nc.jdbc.framework.processor.ColumnProcessor; import nc.pubitf.para.SysInitQuery; +import nc.util.mmf.framework.base.MMMapUtil; +import nc.util.mmf.framework.base.MMValueCheck; import nc.vo.bd.defdoc.DefdocVO; import nc.vo.bd.material.MaterialVO; import nc.vo.bd.stordoc.StordocVO; @@ -19,13 +22,16 @@ import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; import nc.vo.org.DeptVO; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFBoolean; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.vo.rum.stocks.StocksVO; import nc.vo.scmpub.util.ArrayUtil; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 流程生产订单审批后推送RZ @@ -34,6 +40,12 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule { private static final Log log = Log.getInstance("rzmomlog"); private static final BaseDAO dao = new BaseDAO(); + private Boolean flag; + + public AfterApprovingSynchronizeRuleRZ(Boolean flag) { + this.flag = flag; + } + @Override public void process(PMOAggVO[] pmoAggVOS) { if (ArrayUtil.isEmpty(pmoAggVOS)) { @@ -59,13 +71,35 @@ public class AfterApprovingSynchronizeRuleRZ implements IRule { */ private List checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException { List aggvoList = new ArrayList<>(); + List tranidList = new ArrayList(); + for (PMOAggVO aggvo : pmoAggVOS) { + PMOHeadVO headvo = aggvo.getParentVO(); + String tranid = headvo.getCtrantypeid(); + if (!MMValueCheck.isEmpty(tranid)) { + tranidList.add(tranid); + } + } + Map bSaveApproveMap =new HashMap<>(); + if (tranidList.size() > 0) { + bSaveApproveMap = PMOBPService.getIPMOTransTypeQueryService() + .getBSaveApproveByTranTypeIDs(tranidList.toArray(new String[0])); + + } for (PMOAggVO aggvo : pmoAggVOS) { String pkOrg = aggvo.getParentVO().getPk_org(); Integer fbillstatus = aggvo.getParentVO().getFbillstatus(); + String tranid = aggvo.getParentVO().getCtrantypeid(); String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); - if ("C022".equals(orgCode) && 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length>0) { - aggvoList.add(aggvo); + if(this.flag){ + if ("C022".equals(orgCode) && 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length>0) { + aggvoList.add(aggvo); + } + }else{ + if ("C022".equals(orgCode)&& 1 == fbillstatus&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0 && !bSaveApproveMap.isEmpty()&&!bSaveApproveMap.getOrDefault(tranid, UFBoolean.FALSE).booleanValue()) { + aggvoList.add(aggvo); + } } + } return aggvoList; }