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 index d2b1ef2c..a72e42ed 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOAdjustBP.java @@ -1,57 +1,15 @@ package nc.bs.mmpac.pmo.pac0002.bp; -import java.util.ArrayList; -import java.util.List; - -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApproveSyncEpicMesRule; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApprovingSynchronizeRuleRZ; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterPmoSyncJmQMSRule; +import nc.bs.mmpac.pmo.pac0002.bp.rule.*; 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.*; +import nc.bs.mmpac.pmo.pac0002.rule.check.*; 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.mmpac.pmo.pac0002.rule.rewrite.*; import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; import nc.bs.pubapp.pub.rule.BillCodeCheckRule; import nc.impl.pubapp.pattern.rule.ICompareRule; @@ -65,205 +23,213 @@ import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; import nc.vo.mmpac.pmo.pac0002.util.PmoSagaUtil; import nc.vo.pub.VOStatus; +import java.util.ArrayList; +import java.util.List; + /** * 订单变更业务处理
- * - * @since 6.31 - * @version 2013-6-18 上午11:33:58 + * * @author wanghjd + * @version 2013-6-18 上午11:33:58 + * @since 6.31 */ public class PMOAdjustBP { - public PMOAggVO[] adjust(PMOAggVO[] fullBills, PMOAggVO[] originBills) { - if (MMArrayUtil.isEmpty(fullBills)) { - return null; - } + 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; - } + 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); + 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); + // (变更和修改共用)最后一条返工工序的工序转移方式不能为‘不转移’; + 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 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); + // 调用库存接口,注册预留供给单据行数据 + 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); + // 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); + processer.addBeforeRule(new CheckPmoPlanNumJMRule()); - } + } - 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); + 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); - // 变更后推送流程生产订单到艾普MES - processer.addAfterRule(new AfterApproveSyncEpicMesRule()); - // 变更后推送流程生产订单到启源(精密铸造) - processer.addAfterRule(new AfterPmoSyncJmQMSRule()); - } + // 变更推送生产订单至锐制MES + IRule pushRZRule = new AfterApprovingSynchronizeRuleRZ(Boolean.FALSE); + processer.addAfterFinalRule(pushRZRule); + // 变更后推送流程生产订单到艾普MES + processer.addAfterRule(new AfterApproveSyncEpicMesRule()); - // 挪退料建议 - private List checkInfoList = new ArrayList(); + ICompareRule planStartTimeChangeRule = new AfterPlanStartTimeChangeRule();// sunfj2025.09.26 + processer.addAfterRule(planStartTimeChangeRule); - public List getCheckInfoList() { - return this.checkInfoList; - } + // 变更后推送流程生产订单到启源(精密铸造) + processer.addAfterRule(new AfterPmoSyncJmQMSRule()); + } + + // 挪退料建议 + private List checkInfoList = new ArrayList(); + + public List getCheckInfoList() { + return this.checkInfoList; + } } diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/CheckPmoPlanNumJMRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/CheckPmoPlanNumJMRule.java new file mode 100644 index 00000000..41beeddd --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/CheckPmoPlanNumJMRule.java @@ -0,0 +1,112 @@ +package nc.bs.mmpac.pmo.pac0002.bp.rule; + +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.uapbd.util.MyHelper; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.pubitf.mmpac.pickm.mo.IPickmQueryServiceForMO; +import nc.pubitf.para.SysInitQuery; +import nc.vo.am.common.util.StringUtils; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; +import nc.vo.mmpac.pickm.param.PickmTransParam; +import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; +import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; +import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; +import nc.vo.org.FactoryVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.pub.MathTool; + +import java.util.Map; + +/** + * 精密铸造-流程生产订单变更校验计划投入数量 + * + * @author mzr + * @date 2025/10/20 + */ +public class CheckPmoPlanNumJMRule implements IRule { + private static final String LOG_INFO_NAME = "qyMesLog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + + @Override + public void process(PMOAggVO[] vos) { + try { + Map configParams = MyHelper.getConfigParams("jm-config", null); + if (configParams.isEmpty()) { + return; + } + for (PMOAggVO vo : vos) { + PMOHeadVO headVO = vo.getParentVO(); + String pkOrg = headVO.getPk_org(); + + String orgCode = MyHelper.getStrValByCondition(FactoryVO.getDefaultTableName(), FactoryVO.CODE, + FactoryVO.PK_FACTORY + " = '" + pkOrg + "'"); + // 获取组织参数,判断是否开启校验 + String isCheck = SysInitQuery.getParaString(pkOrg, "MM_Biangeng001"); + if (!"Y".equals(isCheck)) { + continue; + } + // 只有精密公司才校验 + if (checkIfOrg(orgCode, configParams)) { + continue; + } + PMOItemVO[] pmoItemVOS = vo.getChildrenVO(); + if (pmoItemVOS != null) { + // 如果流程生产订单明细存在下游的备料计划,判断变更的计划投入数量是否小于流程备料计划的子表的领料套数(如果有多行用最大值比较) + for (PMOItemVO pmoItemVO : pmoItemVOS) { + String cmoid = pmoItemVO.getCmoid(); + // 计划投入主数量 + UFDouble nplanputnum = pmoItemVO.getNplanputnum(); + if (nplanputnum == null) { + continue; + } + // 根据流程生产订单明细id查询备料计划 + PickmTransParam param = new PickmTransParam(); + param.setSourceBillRowID(cmoid); + IPickmQueryServiceForMO pickmQueryServiceForMO = NCLocator.getInstance().lookup(IPickmQueryServiceForMO.class); + AggPickmVO[] pickmVOS = pickmQueryServiceForMO.queryPickmByMO(new PickmTransParam[]{param}); + if (pickmVOS != null) { + // 获取最大的成套套数 + UFDouble maxNum = UFDouble.ZERO_DBL; + for (AggPickmVO pickmVO : pickmVOS) { + PickmItemVO[] pickmItemVOS = (PickmItemVO[]) pickmVO.getChildren(PickmItemVO.class); + for (PickmItemVO pickmItemVO : pickmItemVOS) { + // 成套套数 + UFDouble nbsetpartsnum = pickmItemVO.getNbsetpartsnum(); + if (nbsetpartsnum != null && (MathTool.compareTo(nbsetpartsnum, maxNum) > 0)) { + maxNum = nbsetpartsnum; + } + } + } + if (MathTool.compareTo(nplanputnum, maxNum) < 0) { + ExceptionUtils.wrappBusinessException("变更后计划投入数量不能小于备料计划上的累计领料套数"); + } + } + + } + } + } + } catch (BusinessException e) { + logger.error("CheckPmoPlanNumJMRule-exp:" + e.getMessage(), e); + ExceptionUtils.wrappException(e); + } + } + + private boolean checkIfOrg(String code, Map configParams) throws BusinessException { + String targetCode = configParams.get("jmOrg"); + if (targetCode == null || StringUtils.isEmpty(targetCode)) { + throw new BusinessException("未配置组织参数"); + } + String[] orgItem = targetCode.split(","); + for (String orgCode : orgItem) { + if (!orgCode.isEmpty() && orgCode.equals(code)) { + return false; + } + } + return true; + } + +}