diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateBP.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateBP.java new file mode 100644 index 0000000..dddb0e2 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateBP.java @@ -0,0 +1,325 @@ +package nc.bs.mmpac.pickm.bp; + +import java.util.ArrayList; +import java.util.List; + +import nc.bs.mmpac.pickm.plugin.PickmPluginPoint; +import nc.bs.mmpac.pickm.rule.PSCPickmRewriteMoPickmUpdateRule; +import nc.bs.mmpac.pickm.rule.PickmAutoApproveAfterSaveRule; +import nc.bs.mmpac.pickm.rule.PickmBillStatusToFreeRule; +import nc.bs.mmpac.pickm.rule.PickmCheckItemMaterialPermissionRule; +import nc.bs.mmpac.pickm.rule.PickmCheckMaterialPermissionRule; +import nc.bs.mmpac.pickm.rule.PickmCheckRowNOChangedRule; +import nc.bs.mmpac.pickm.rule.PickmCheckSameStockRule; +import nc.bs.mmpac.pickm.rule.PickmCreateSubMoRule; +import nc.bs.mmpac.pickm.rule.PickmFbackflustimeCheckRule; +import nc.bs.mmpac.pickm.rule.PickmItemVOFilterRule; +import nc.bs.mmpac.pickm.rule.PickmNeedDeliverBackCheckRule; +import nc.bs.mmpac.pickm.rule.PickmRowNoRule; +import nc.bs.mmpac.pickm.rule.PickmSaveRule; +import nc.bs.mmpac.pickm.rule.PickmSubMoAdjustSuggestRule; +import nc.bs.mmpac.pickm.rule.SNMaterialNotBackFlushRule; +import nc.bs.mmpac.pickm.rule.ic.PickmATPCheckRule; +import nc.bs.mmpac.pickm.rule.ic.PickmAdjustReserveWhenEditRule; +import nc.bs.mmpac.pickm.rule.ic.PickmAutoChangeStateRule; +import nc.bs.mmpac.pickm.rule.ic.PickmAutoReserveRule; +import nc.bs.mmpac.pickm.rule.ic.PickmRewriteOtherNumRule; +import nc.bs.mmpac.pickm.rule.realsub.PickmRewritePLOWhenUpdateRule; +import nc.bs.mmpub.rule.MMATOMaterialCheckRule; +import nc.bs.mmpub.rule.MMAutoMaterialAssignRule; +import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; +import nc.bs.pubapp.pub.rule.BillCodeCheckRule; +import nc.bs.pubapp.pub.rule.FieldLengthCheckRule; +import nc.bs.pubapp.pub.rule.FillUpdateDataRule; +import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule; +import nc.bs.pubapp.pub.rule.UpdateBillCodeRule; +import nc.bs.uif2.validation.ValidationFailure; +import nc.bsutil.mmpac.pickm.PickmSagasUtil; +import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule; +import nc.impl.pubapp.bd.userdef.UserDefSaveRule; +import nc.impl.pubapp.pattern.data.bill.template.UpdateBPTemplate; +import nc.impl.pubapp.pattern.data.bill.tool.BillTransferTool; +import nc.impl.pubapp.pattern.rule.ICompareRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.itf.org.IOrgConst; +import nc.util.mmf.busi.consts.BillTypeConst; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.mmpac.pickm.consts.PickmConsts; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmHeadVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; +import nc.vo.pub.VOStatus; + +/** + * 备料计划修改 BP + */ +public class PickmUpdateBP { + + private AggPickmVO[] aggPickmVOArray; + + private UpdateBPTemplate bp; + + private boolean isCreateSub; + + private boolean isForYL; + private boolean isForNcc = false; + ; + + + // 挪退料建议 + private ValidationFailure checkInfo = new ValidationFailure(); + + public PickmUpdateBP() { + this.bp = new UpdateBPTemplate(PickmPluginPoint.UPDATE); + } + + public PickmUpdateBP(boolean isForNcc) { + this.bp = new UpdateBPTemplate(PickmPluginPoint.UPDATE); + this.isForNcc = isForNcc; + } + + public CompareAroundProcesser getAroundProcesser() { + return this.bp.getAroundProcesser(); + } + + public AggPickmVO[] update(AggPickmVO[] vos, boolean isYL, boolean isForCereateSub) { + + if (MMValueCheck.isEmpty(vos)) { + return null; + } + for (AggPickmVO vo : vos) { + vo.getParentVO().setStatus(VOStatus.UPDATED); + PickmItemVO[] bvos = (PickmItemVO[]) vo.getChildrenVO(); + for (PickmItemVO bvo : bvos) { + if (MMValueCheck.isNotEmpty(bvo.getCpickm_bid()) && bvo.getStatus() != VOStatus.NEW + && bvo.getStatus() != VOStatus.DELETED) { + bvo.setStatus(VOStatus.UPDATED); + } + // 解决修改备料计划,新增行时,平台NCLocator功能在2004版本赋值外键丢失了对应的赋值关系,特在此次补值; + if (bvo.getStatus() == VOStatus.NEW) { + bvo.setCpickmid(vo.getParentVO().getCpickmid()); + } + } + } + + this.isForYL = isYL; + this.isCreateSub = isForCereateSub; + + // 加锁 + 检查ts + BillTransferTool transTool = new BillTransferTool(vos); + + // 补全前台VO + AggPickmVO[] fullBills = transTool.getClientFullInfoBill(); + + // 缓存保存前全VO + this.aggPickmVOArray = fullBills.clone(); + + // 获得修改前vo + AggPickmVO[] originBills = transTool.getOriginBills(); + // 添加保存前规则 + this.addBeforeRule(this.bp.getAroundProcesser()); + + // 添加保存后规则 + this.addAfterRule(this.bp.getAroundProcesser()); + // 冻结 补偿 + PickmSagasUtil.addSagaAndCompensate4Update(fullBills, originBills); + + // 执行保存操作 + AggPickmVO[] retBills = this.bp.update(fullBills, originBills); + // 构造返回数据 + AggPickmVO[] rstbills = this.getReturnvo(retBills); + // if (!this.isCreateSub) { + // + // rstbills = transTool.getBillForToClient(retBills); + // } + rstbills[0].getParentVO().setCheckInfo(this.checkInfo.getMessage()); + return rstbills; + } + + private AggPickmVO[] getReturnvo(AggPickmVO[] retBills) { + if (MMValueCheck.isEmpty(retBills)) { + return null; + } + for (AggPickmVO agg : retBills) { + if (MMValueCheck.isEmpty(agg.getChildrenVO())) { + continue; + } + List items = new ArrayList(); + for (PickmItemVO item : (PickmItemVO[]) agg.getChildrenVO()) { + if (item.getStatus() != VOStatus.DELETED) { + items.add(item); + } + } + if (MMValueCheck.isNotEmpty(items)) { + agg.setChildrenVO(items.toArray(new PickmItemVO[0])); + } + + } + return retBills; + } + + /** + * 修改后规则 + * + * @param processor + */ + @SuppressWarnings({ + "unchecked" + }) + private void addAfterRule(CompareAroundProcesser processer) { + + // 保存单据号唯一性校验规则 + IRule billCodeCheckRule = + new BillCodeCheckRule(BillTypeConst.PICKM, PickmConsts.VBILL_CODE_NAME, IOrgConst.PK_GROUP, + IOrgConst.PK_ORG); + processer.addAfterRule(billCodeCheckRule); + + // 备料计划ATP检查规则 + IRule pickmATPCheckRule = new PickmATPCheckRule(false, this.aggPickmVOArray); + processer.addAfterRule(pickmATPCheckRule); + + // 自动预留规则 + IRule pickmAutoReserveRule = new PickmAutoReserveRule(); + processer.addAfterRule(pickmAutoReserveRule); + + // 回写实际替代表规则 + ICompareRule pickmRewritePLOWhenUpdateRule = new PickmRewritePLOWhenUpdateRule(); + processer.addAfterRule(pickmRewritePLOWhenUpdateRule); + if (this.isForNcc) { + // ncc2012 sagas修改 + IRule pickmAutoApproveRule = new PickmAutoApproveAfterSaveRule(this.isForNcc); + processer.addAfterRule(pickmAutoApproveRule); + } + // 母订单备料计划保存时生成子订单 + IRule pickmCreateSubMoRule = new PickmCreateSubMoRule(); + processer.addAfterRule(pickmCreateSubMoRule); + // 回写来源备料计划(工序委外备料计划) + ICompareRule psPickmRewriteRule = new PSCPickmRewriteMoPickmUpdateRule(); + processer.addBeforeRule(psPickmRewriteRule); + // 挪料/判断规则 + IRule deliverBackInfoRule = new PickmNeedDeliverBackCheckRule(this.checkInfo); + processer.addAfterRule(deliverBackInfoRule); + // 配套变更建议 + ICompareRule subMoAdjustSuggestRule = new PickmSubMoAdjustSuggestRule(this.checkInfo); + processer.addAfterRule(subMoAdjustSuggestRule); + } + + /** + * 修改前规则 + * + * @param processor + */ + + @SuppressWarnings("unchecked") + private void addBeforeRule(CompareAroundProcesser processer) { + + // 清除空的表体行 + IRule filterRule = new PickmItemVOFilterRule(); + processer.addBeforeRule(filterRule); + // 校验组织是否已停用 + IRule orgRule = new OrgDisabledCheckRule(IOrgConst.PK_ORG, IOrgConst.FACTORYTYPE); + processer.addBeforeRule(orgRule); + // sagas 冻结校验 + IRule sagasCheckrule = new MMVOSagaFrozenValidateRule(true); + processer.addBeforeRule(sagasCheckrule); + // 产品为ATO选配件,验证子项配置码是否为空 + IRule mmatoMaterialCheckRule = new MMATOMaterialCheckRule(PickmHeadVO.CMATERIALVID, null, PickmHeadVO.CFFILEID); + processer.addBeforeRule(mmatoMaterialCheckRule); + // 校验是否存在相同行号 + IRule checkSameRow = new PickmRowNoRule(); + processer.addBeforeRule(checkSameRow); + // 进行序列号管理的物料不能设置为倒冲和交互式倒冲 + IRule snMaterialCheckRule = new SNMaterialNotBackFlushRule(); + processer.addBeforeRule(snMaterialCheckRule); + // 校验备料计划倒冲时机 + IRule checkFbackFlusTime = new PickmFbackflustimeCheckRule(); + processer.addBeforeRule(checkFbackFlusTime); + + // 修改保存时的数据补充规则 + IRule fillDataRule = new FillUpdateDataRule(); + processer.addBeforeRule(fillDataRule); + + // 校验供应仓库和发料仓库不能相同 + IRule sameRule = new PickmCheckSameStockRule(); + processer.addBeforeRule(sameRule); + + // 表头物料自动分配 + IRule autoHMaterialAssignRule = new MMAutoMaterialAssignRule(PickmHeadVO.CMATERIALVID, + null, new String[]{PickmHeadVO.PK_ORG}, null); + processer.addBeforeFinalRule(autoHMaterialAssignRule); + // 表体物料自动分配 + IRule autobMaterialAssignRule = new MMAutoMaterialAssignRule(null, + PickmItemVO.CBMATERIALVID, new String[]{PickmHeadVO.PK_ORG}, + new String[]{PickmItemVO.CDELIVERORGID, PickmItemVO.CSUPPLYORGID}); + processer.addBeforeFinalRule(autobMaterialAssignRule); + + // 物料合法性校验规则 + IRule marperRule = new PickmCheckMaterialPermissionRule(); + processer.addBeforeRule(marperRule); + + // 子项物料发料组织合法性校验规则 + IRule bmarperRule = new PickmCheckItemMaterialPermissionRule(); + processer.addBeforeRule(bmarperRule); + + // 单据字段长度检查规则 + IRule lengthCheckRule = new FieldLengthCheckRule(); + processer.addBeforeRule(lengthCheckRule); + + // 自由辅助属性检查的规则 + MarAssistantSaveRule marRule = new MarAssistantSaveRule(); + // marRule.setNotNullValidate(PickmConsts.CMATERIAL_VID_NAME); + marRule.setPos(0); + processer.addBeforeRule(marRule); + // 自由辅助属性检查的规则 + MarAssistantSaveRule bmarRule = new MarAssistantSaveRule(); + // bmarRule.setNotNullValidate(PickmItemVO.CBMATERIALVID); + bmarRule.setPos(1); + processer.addBeforeRule(bmarRule); + // 自定义项检查的规则 + UserDefSaveRule defRule = new UserDefSaveRule(new Class[]{ + PickmHeadVO.class, PickmItemVO.class + }); + processer.addBeforeRule(defRule); + + // 备料计划保存规则 + IRule pickmSaveRule = new PickmSaveRule(); + processer.addBeforeRule(pickmSaveRule); + // 将状态由审批不通过修改为自由 + IRule billstatusRule = new PickmBillStatusToFreeRule(); + processer.addBeforeRule(billstatusRule); + // 存在下游子订单的,备料计划不允许修改单据号和行号 + ICompareRule checkRowRule = new PickmCheckRowNOChangedRule(); + processer.addBeforeRule(checkRowRule); + // 更新单据号的规则 + ICompareRule updateBillCodeRule = + new UpdateBillCodeRule(BillTypeConst.PICKM, PickmConsts.VBILL_CODE_NAME, IOrgConst.PK_GROUP, + IOrgConst.PK_ORG); + processer.addBeforeRule(updateBillCodeRule); + + // 备料计划ATP检查规则 + IRule pickmATPCheckRule = new PickmATPCheckRule(true, null); + processer.addBeforeRule(pickmATPCheckRule); + + if (this.isForYL) { + // 修改保存前解除预留规则 + ICompareRule pickmUnPSForEditRule = new PickmAdjustReserveWhenEditRule(); + processer.addBeforeRule(pickmUnPSForEditRule); + } + + // 检查自定义项数据数据类型和自定义项类型是否一致规则 + IRule userDefSaveRule = new UserDefSaveRule(new String[]{ + "vdef", "vbdef" + }, new Class[]{ + PickmHeadVO.class, PickmItemVO.class + }); + processer.addBeforeRule(userDefSaveRule); + // 进行成套数量、累计超额数量等联动值的重算 + PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule(); + processer.addBeforeRule(setPartsRule); + // 调用更新状态rule:自动完成 or 自动取消完成 + ICompareRule autoChangeStateRule = new PickmAutoChangeStateRule(); + processer.addBeforeRule(autoChangeStateRule); + + } +} diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java new file mode 100644 index 0000000..9141a29 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java @@ -0,0 +1,227 @@ +package nc.bs.mmpac.pickm.bp; + +import java.util.Map; + +import nc.bs.mmpac.pickm.plugin.PickmPluginPoint; +import nc.bs.mmpac.pickm.rule.PickmCheckItemMaterialPermissionRule; +import nc.bs.mmpac.pickm.rule.PickmCheckMaterialPermissionRule; +import nc.bs.mmpac.pickm.rule.PickmCreateSubMoRule; +import nc.bs.mmpac.pickm.rule.PickmHeadEditRule; +import nc.bs.mmpac.pickm.rule.PickmItemAdjustRule; +import nc.bs.mmpac.pickm.rule.PickmItemReCreateRule; +import nc.bs.mmpac.pickm.rule.PickmNeedDeliverBackCheckRule; +import nc.bs.mmpac.pickm.rule.PickmReserveCheckForMoUpdateRule; +import nc.bs.mmpac.pickm.rule.PickmSubMoAdjustSuggestRule; +import nc.bs.mmpac.pickm.rule.PickmSynBrepairFlagRule; +import nc.bs.mmpac.pickm.rule.SNMaterialNotBackFlushRule; +import nc.bs.mmpac.pickm.rule.ic.PickmATPCheckRule; +import nc.bs.mmpac.pickm.rule.ic.PickmAutoChangeStateRule; +import nc.bs.mmpac.pickm.rule.ic.PickmAutoReserveRule; +import nc.bs.mmpac.pickm.rule.ic.PickmRewriteOtherNumRule; +import nc.bs.mmpac.pickm.rule.realsub.PickmRewritePLOWhenUpdateRule; +import nc.bs.mmpub.rule.MMAutoMaterialAssignRule; +import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; +import nc.bs.pubapp.pub.rule.BillCodeCheckRule; +import nc.bs.pubapp.pub.rule.FieldLengthCheckRule; +import nc.bs.pubapp.pub.rule.FillUpdateDataRule; +import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule; +import nc.bs.pubapp.pub.rule.UpdateBillCodeRule; +import nc.bs.uif2.validation.ValidationFailure; +import nc.bsutil.mmpac.pickm.PickmSagasUtil; +import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule; +import nc.impl.pubapp.bd.userdef.UserDefSaveRule; +import nc.impl.pubapp.pattern.data.bill.template.UpdateBPTemplate; +import nc.impl.pubapp.pattern.rule.ICompareRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.itf.org.IOrgConst; +import nc.util.mmf.busi.consts.BillTypeConst; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.mmpac.pickm.consts.PickmConsts; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmHeadVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; +import nc.vo.mmpac.pickm.param.MoChangeParam; + +/** + * 生产订单修改后同步变更备料计划操作 + * + * @author liddf + * @version 2013-8-1 上午09:48:15 + * @since 6.31 + */ +public class PickmUpdateForMOBP { + // 挪退料建议 + private ValidationFailure checkInfo = new ValidationFailure(); + + private AggPickmVO[] aggPickmVOArray; + + /** + * 同步、变更、重算备料计划操作 + * + * @param vos + * @param paramMap + */ + public String PickmUpdateForMO(AggPickmVO[] vos, Map paramMap) { + // 判空 + if (MMValueCheck.isEmpty(vos)) { + return null; + } + // 获得修改前vo + AggPickmVO[] originBills = new AggPickmVO[vos.length]; + for (int i = 0; i < vos.length; i++) { + originBills[i] = (AggPickmVO) vos[i].clone(); + } + // 缓存保存前全VO + this.aggPickmVOArray = originBills.clone(); + // 创建数据模板BP + UpdateBPTemplate bp = new UpdateBPTemplate(PickmPluginPoint.UPDATEFORMO); + // 注入同步前规则 + this.addBeforeRule(bp.getAroundProcesser(), paramMap); + // 注入同步后规则 + this.addAfterRule(bp.getAroundProcesser()); + // sagas 1 冻结并启用sagas,补偿 + PickmSagasUtil.addSagaAndCompensate4Update(vos, originBills); + // MMSagasUtil.frozenAndAddSaga(vos, + // MMPacBillTypeConstant.PICKM,MMSagasCompensateConst.COMPENSABLE, + // null,PickmHeadVO.VBUSITYPE); + + // 执行新增操作 + bp.update(vos, originBills); + // 挪料退料建议+配套子项建议 + return this.checkInfo.getMessage(); + } + + /** + * 添加修改前规则 + * + * @param aroundProcesser + * @param paramMap + */ + private void addBeforeRule(CompareAroundProcesser aroundProcesser, + Map paramMap) { + // sagas 冻结校验 + IRule sagasCheckrule = new MMVOSagaFrozenValidateRule(true); + aroundProcesser.addBeforeRule(sagasCheckrule); + // 备料计划表头同步rule + IRule pickmHeadEditRule = new PickmHeadEditRule(paramMap); + aroundProcesser.addBeforeRule(pickmHeadEditRule); + // 备料计划表体重算rule + IRule pickmItemReCreateRule = new PickmItemReCreateRule(paramMap, true); + aroundProcesser.addBeforeRule(pickmItemReCreateRule); + // 备料计划变更rule + IRule pickmItemAdjustRule = new PickmItemAdjustRule(paramMap); + aroundProcesser.addBeforeRule(pickmItemAdjustRule); + // 校验是否有预留数量(变更后计划出库数量小于预留数量+累计实收数量报错,重算后维度变化则清除预留) + IRule pickmCheckReservetRule = new PickmReserveCheckForMoUpdateRule(paramMap); + aroundProcesser.addBeforeRule(pickmCheckReservetRule); + // 校验组织是否已停用 + IRule orgRule = new OrgDisabledCheckRule(IOrgConst.PK_ORG, IOrgConst.FACTORYTYPE); + aroundProcesser.addBeforeRule(orgRule); + // 修改保存时的数据补充规则 + IRule fillDataRule = new FillUpdateDataRule(); + aroundProcesser.addBeforeRule(fillDataRule); + + // 表头物料自动分配 + // IRule autoHMaterialAssignRule = new + // MMAutoMaterialAssignRule(PickmHeadVO.CMATERIALVID, + // null, new String[] { PickmHeadVO.PK_ORG }, null); + // aroundProcesser.addBeforeFinalRule(autoHMaterialAssignRule); + // 表体物料自动分配 + IRule autobMaterialAssignRule = new MMAutoMaterialAssignRule(null, + PickmItemVO.CBMATERIALVID, new String[]{PickmHeadVO.PK_ORG}, + new String[]{PickmItemVO.CDELIVERORGID, PickmItemVO.CSUPPLYORGID}); + aroundProcesser.addBeforeFinalRule(autobMaterialAssignRule); + + // 物料合法性校验规则 + IRule marperRule = new PickmCheckMaterialPermissionRule(); + aroundProcesser.addBeforeRule(marperRule); + + // 子项物料发料组织合法性校验规则 + IRule bmarperRule = new PickmCheckItemMaterialPermissionRule(); + aroundProcesser.addBeforeRule(bmarperRule); + // 进行序列号管理的物料不能设置为倒冲和交互式倒冲 + IRule snMaterialCheckRule = new SNMaterialNotBackFlushRule(); + aroundProcesser.addBeforeRule(snMaterialCheckRule); + // 校验备料计划倒冲时机 +// IRule checkFbackFlusTime = new PickmFbackflustimeCheckRule(); +// aroundProcesser.addBeforeRule(checkFbackFlusTime); + // 单据字段长度检查规则 + IRule lengthCheckRule = new FieldLengthCheckRule(); + aroundProcesser.addBeforeRule(lengthCheckRule); + + // 自由辅助属性检查的规则 + MarAssistantSaveRule marRule = new MarAssistantSaveRule(); + // marRule.setNotNullValidate(PickmConsts.CMATERIAL_VID_NAME); + marRule.setPos(0); + aroundProcesser.addBeforeRule(marRule); + // 自由辅助属性检查的规则 + MarAssistantSaveRule bmarRule = new MarAssistantSaveRule(); + // bmarRule.setNotNullValidate(PickmItemVO.CBMATERIALVID); + bmarRule.setPos(1); + aroundProcesser.addBeforeRule(bmarRule); + + // 自定义项检查的规则 + // UserDefSaveRule defRule = new UserDefSaveRule(new + // Class[] { + // PickmHeadVO.class, PickmItemVO.class + // }); + // aroundProcesser.addBeforeRule(defRule); + // 更新单据号的规则 + ICompareRule updateBillCodeRule = new UpdateBillCodeRule(BillTypeConst.PICKM, + PickmConsts.VBILL_CODE_NAME, IOrgConst.PK_GROUP, IOrgConst.PK_ORG); + aroundProcesser.addBeforeRule(updateBillCodeRule); + + // 备料计划ATP检查规则 + IRule pickmATPCheckRule = new PickmATPCheckRule(true, null); + aroundProcesser.addBeforeRule(pickmATPCheckRule); + // 检查自定义项数据数据类型和自定义项类型是否一致规则 + IRule userDefSaveRule = new UserDefSaveRule(new String[]{"vdef", "vbdef"}, + new Class[]{PickmHeadVO.class, PickmItemVO.class}); + aroundProcesser.addBeforeRule(userDefSaveRule); + // 进行成套数量、累计超额数量等联动值的重算 + PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule(); + aroundProcesser.addBeforeRule(setPartsRule); + + // 调用更新状态rule:自动完成 or 自动取消完成 + ICompareRule autoChangeStateRule = new PickmAutoChangeStateRule(); + aroundProcesser.addBeforeRule(autoChangeStateRule); + } + + /** + * 添加修改后规则 + * + * @param aroundProcesser + */ + private void addAfterRule(CompareAroundProcesser aroundProcesser) { + // 保存单据号唯一性校验规则 + IRule billCodeCheckRule = new BillCodeCheckRule(BillTypeConst.PICKM, PickmConsts.VBILL_CODE_NAME, + IOrgConst.PK_GROUP, IOrgConst.PK_ORG); + aroundProcesser.addAfterRule(billCodeCheckRule); + + // 备料计划ATP检查规则 + IRule pickmATPCheckRule = new PickmATPCheckRule(false, this.aggPickmVOArray); + aroundProcesser.addAfterRule(pickmATPCheckRule); + + // 自动预留规则 + IRule pickmAutoReserveRule = new PickmAutoReserveRule(); + aroundProcesser.addAfterRule(pickmAutoReserveRule); + + // 回写实际替代表规则 + ICompareRule pickmRewritePLOWhenUpdateRule = new PickmRewritePLOWhenUpdateRule(); + aroundProcesser.addAfterRule(pickmRewritePLOWhenUpdateRule); + // 同步返修标识规则 + IRule synBrepairRule = new PickmSynBrepairFlagRule(); + aroundProcesser.addAfterRule(synBrepairRule); + // 母订单备料计划保存时生成子订单 + IRule pickmCreateSubMoRule = new PickmCreateSubMoRule(); + aroundProcesser.addAfterRule(pickmCreateSubMoRule); + // 挪料/判断规则 + IRule deliverBackInfoRule = new PickmNeedDeliverBackCheckRule(this.checkInfo); + aroundProcesser.addAfterRule(deliverBackInfoRule); + // 配套变更建议 + ICompareRule subMoAdjustSuggestRule = new PickmSubMoAdjustSuggestRule(this.checkInfo); + aroundProcesser.addAfterRule(subMoAdjustSuggestRule); + } + +}