备料计划修改BP源码
This commit is contained in:
parent
b887a8eca1
commit
d715da0077
|
@ -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<AggPickmVO> bp;
|
||||||
|
|
||||||
|
private boolean isCreateSub;
|
||||||
|
|
||||||
|
private boolean isForYL;
|
||||||
|
private boolean isForNcc = false;
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
|
// 挪退料建议
|
||||||
|
private ValidationFailure checkInfo = new ValidationFailure();
|
||||||
|
|
||||||
|
public PickmUpdateBP() {
|
||||||
|
this.bp = new UpdateBPTemplate<AggPickmVO>(PickmPluginPoint.UPDATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PickmUpdateBP(boolean isForNcc) {
|
||||||
|
this.bp = new UpdateBPTemplate<AggPickmVO>(PickmPluginPoint.UPDATE);
|
||||||
|
this.isForNcc = isForNcc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompareAroundProcesser<AggPickmVO> 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<AggPickmVO> transTool = new BillTransferTool<AggPickmVO>(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<PickmItemVO> items = new ArrayList<PickmItemVO>();
|
||||||
|
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<AggPickmVO> processer) {
|
||||||
|
|
||||||
|
// 保存单据号唯一性校验规则
|
||||||
|
IRule<AggPickmVO> billCodeCheckRule =
|
||||||
|
new BillCodeCheckRule(BillTypeConst.PICKM, PickmConsts.VBILL_CODE_NAME, IOrgConst.PK_GROUP,
|
||||||
|
IOrgConst.PK_ORG);
|
||||||
|
processer.addAfterRule(billCodeCheckRule);
|
||||||
|
|
||||||
|
// 备料计划ATP检查规则
|
||||||
|
IRule<AggPickmVO> pickmATPCheckRule = new PickmATPCheckRule(false, this.aggPickmVOArray);
|
||||||
|
processer.addAfterRule(pickmATPCheckRule);
|
||||||
|
|
||||||
|
// 自动预留规则
|
||||||
|
IRule<AggPickmVO> pickmAutoReserveRule = new PickmAutoReserveRule();
|
||||||
|
processer.addAfterRule(pickmAutoReserveRule);
|
||||||
|
|
||||||
|
// 回写实际替代表规则
|
||||||
|
ICompareRule<AggPickmVO> pickmRewritePLOWhenUpdateRule = new PickmRewritePLOWhenUpdateRule();
|
||||||
|
processer.addAfterRule(pickmRewritePLOWhenUpdateRule);
|
||||||
|
if (this.isForNcc) {
|
||||||
|
// ncc2012 sagas修改
|
||||||
|
IRule<AggPickmVO> pickmAutoApproveRule = new PickmAutoApproveAfterSaveRule(this.isForNcc);
|
||||||
|
processer.addAfterRule(pickmAutoApproveRule);
|
||||||
|
}
|
||||||
|
// 母订单备料计划保存时生成子订单
|
||||||
|
IRule<AggPickmVO> pickmCreateSubMoRule = new PickmCreateSubMoRule();
|
||||||
|
processer.addAfterRule(pickmCreateSubMoRule);
|
||||||
|
// 回写来源备料计划(工序委外备料计划)
|
||||||
|
ICompareRule<AggPickmVO> psPickmRewriteRule = new PSCPickmRewriteMoPickmUpdateRule();
|
||||||
|
processer.addBeforeRule(psPickmRewriteRule);
|
||||||
|
// 挪料/判断规则
|
||||||
|
IRule<AggPickmVO> deliverBackInfoRule = new PickmNeedDeliverBackCheckRule(this.checkInfo);
|
||||||
|
processer.addAfterRule(deliverBackInfoRule);
|
||||||
|
// 配套变更建议
|
||||||
|
ICompareRule<AggPickmVO> subMoAdjustSuggestRule = new PickmSubMoAdjustSuggestRule(this.checkInfo);
|
||||||
|
processer.addAfterRule(subMoAdjustSuggestRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改前规则
|
||||||
|
*
|
||||||
|
* @param processor
|
||||||
|
*/
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void addBeforeRule(CompareAroundProcesser<AggPickmVO> processer) {
|
||||||
|
|
||||||
|
// 清除空的表体行
|
||||||
|
IRule<AggPickmVO> filterRule = new PickmItemVOFilterRule();
|
||||||
|
processer.addBeforeRule(filterRule);
|
||||||
|
// 校验组织是否已停用
|
||||||
|
IRule<AggPickmVO> orgRule = new OrgDisabledCheckRule(IOrgConst.PK_ORG, IOrgConst.FACTORYTYPE);
|
||||||
|
processer.addBeforeRule(orgRule);
|
||||||
|
// sagas 冻结校验
|
||||||
|
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule<AggPickmVO>(true);
|
||||||
|
processer.addBeforeRule(sagasCheckrule);
|
||||||
|
// 产品为ATO选配件,验证子项配置码是否为空
|
||||||
|
IRule<AggPickmVO> mmatoMaterialCheckRule = new MMATOMaterialCheckRule(PickmHeadVO.CMATERIALVID, null, PickmHeadVO.CFFILEID);
|
||||||
|
processer.addBeforeRule(mmatoMaterialCheckRule);
|
||||||
|
// 校验是否存在相同行号
|
||||||
|
IRule<AggPickmVO> checkSameRow = new PickmRowNoRule();
|
||||||
|
processer.addBeforeRule(checkSameRow);
|
||||||
|
// 进行序列号管理的物料不能设置为倒冲和交互式倒冲
|
||||||
|
IRule<AggPickmVO> snMaterialCheckRule = new SNMaterialNotBackFlushRule();
|
||||||
|
processer.addBeforeRule(snMaterialCheckRule);
|
||||||
|
// 校验备料计划倒冲时机
|
||||||
|
IRule<AggPickmVO> checkFbackFlusTime = new PickmFbackflustimeCheckRule();
|
||||||
|
processer.addBeforeRule(checkFbackFlusTime);
|
||||||
|
|
||||||
|
// 修改保存时的数据补充规则
|
||||||
|
IRule<AggPickmVO> fillDataRule = new FillUpdateDataRule();
|
||||||
|
processer.addBeforeRule(fillDataRule);
|
||||||
|
|
||||||
|
// 校验供应仓库和发料仓库不能相同
|
||||||
|
IRule<AggPickmVO> sameRule = new PickmCheckSameStockRule();
|
||||||
|
processer.addBeforeRule(sameRule);
|
||||||
|
|
||||||
|
// 表头物料自动分配
|
||||||
|
IRule<AggPickmVO> autoHMaterialAssignRule = new MMAutoMaterialAssignRule<AggPickmVO>(PickmHeadVO.CMATERIALVID,
|
||||||
|
null, new String[]{PickmHeadVO.PK_ORG}, null);
|
||||||
|
processer.addBeforeFinalRule(autoHMaterialAssignRule);
|
||||||
|
// 表体物料自动分配
|
||||||
|
IRule<AggPickmVO> autobMaterialAssignRule = new MMAutoMaterialAssignRule<AggPickmVO>(null,
|
||||||
|
PickmItemVO.CBMATERIALVID, new String[]{PickmHeadVO.PK_ORG},
|
||||||
|
new String[]{PickmItemVO.CDELIVERORGID, PickmItemVO.CSUPPLYORGID});
|
||||||
|
processer.addBeforeFinalRule(autobMaterialAssignRule);
|
||||||
|
|
||||||
|
// 物料合法性校验规则
|
||||||
|
IRule<AggPickmVO> marperRule = new PickmCheckMaterialPermissionRule();
|
||||||
|
processer.addBeforeRule(marperRule);
|
||||||
|
|
||||||
|
// 子项物料发料组织合法性校验规则
|
||||||
|
IRule<AggPickmVO> bmarperRule = new PickmCheckItemMaterialPermissionRule();
|
||||||
|
processer.addBeforeRule(bmarperRule);
|
||||||
|
|
||||||
|
// 单据字段长度检查规则
|
||||||
|
IRule<AggPickmVO> lengthCheckRule = new FieldLengthCheckRule();
|
||||||
|
processer.addBeforeRule(lengthCheckRule);
|
||||||
|
|
||||||
|
// 自由辅助属性检查的规则
|
||||||
|
MarAssistantSaveRule<AggPickmVO> marRule = new MarAssistantSaveRule<AggPickmVO>();
|
||||||
|
// marRule.setNotNullValidate(PickmConsts.CMATERIAL_VID_NAME);
|
||||||
|
marRule.setPos(0);
|
||||||
|
processer.addBeforeRule(marRule);
|
||||||
|
// 自由辅助属性检查的规则
|
||||||
|
MarAssistantSaveRule<AggPickmVO> bmarRule = new MarAssistantSaveRule<AggPickmVO>();
|
||||||
|
// bmarRule.setNotNullValidate(PickmItemVO.CBMATERIALVID);
|
||||||
|
bmarRule.setPos(1);
|
||||||
|
processer.addBeforeRule(bmarRule);
|
||||||
|
// 自定义项检查的规则
|
||||||
|
UserDefSaveRule<AggPickmVO> defRule = new UserDefSaveRule<AggPickmVO>(new Class[]{
|
||||||
|
PickmHeadVO.class, PickmItemVO.class
|
||||||
|
});
|
||||||
|
processer.addBeforeRule(defRule);
|
||||||
|
|
||||||
|
// 备料计划保存规则
|
||||||
|
IRule<AggPickmVO> pickmSaveRule = new PickmSaveRule();
|
||||||
|
processer.addBeforeRule(pickmSaveRule);
|
||||||
|
// 将状态由审批不通过修改为自由
|
||||||
|
IRule<AggPickmVO> billstatusRule = new PickmBillStatusToFreeRule();
|
||||||
|
processer.addBeforeRule(billstatusRule);
|
||||||
|
// 存在下游子订单的,备料计划不允许修改单据号和行号
|
||||||
|
ICompareRule<AggPickmVO> checkRowRule = new PickmCheckRowNOChangedRule();
|
||||||
|
processer.addBeforeRule(checkRowRule);
|
||||||
|
// 更新单据号的规则
|
||||||
|
ICompareRule<AggPickmVO> updateBillCodeRule =
|
||||||
|
new UpdateBillCodeRule(BillTypeConst.PICKM, PickmConsts.VBILL_CODE_NAME, IOrgConst.PK_GROUP,
|
||||||
|
IOrgConst.PK_ORG);
|
||||||
|
processer.addBeforeRule(updateBillCodeRule);
|
||||||
|
|
||||||
|
// 备料计划ATP检查规则
|
||||||
|
IRule<AggPickmVO> pickmATPCheckRule = new PickmATPCheckRule(true, null);
|
||||||
|
processer.addBeforeRule(pickmATPCheckRule);
|
||||||
|
|
||||||
|
if (this.isForYL) {
|
||||||
|
// 修改保存前解除预留规则
|
||||||
|
ICompareRule<AggPickmVO> pickmUnPSForEditRule = new PickmAdjustReserveWhenEditRule();
|
||||||
|
processer.addBeforeRule(pickmUnPSForEditRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查自定义项数据数据类型和自定义项类型是否一致规则
|
||||||
|
IRule<AggPickmVO> userDefSaveRule = new UserDefSaveRule<AggPickmVO>(new String[]{
|
||||||
|
"vdef", "vbdef"
|
||||||
|
}, new Class[]{
|
||||||
|
PickmHeadVO.class, PickmItemVO.class
|
||||||
|
});
|
||||||
|
processer.addBeforeRule(userDefSaveRule);
|
||||||
|
// 进行成套数量、累计超额数量等联动值的重算
|
||||||
|
PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule();
|
||||||
|
processer.addBeforeRule(setPartsRule);
|
||||||
|
// 调用更新状态rule:自动完成 or 自动取消完成
|
||||||
|
ICompareRule<AggPickmVO> autoChangeStateRule = new PickmAutoChangeStateRule();
|
||||||
|
processer.addBeforeRule(autoChangeStateRule);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<String, MoChangeParam> 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<AggPickmVO> bp = new UpdateBPTemplate<AggPickmVO>(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<AggPickmVO> aroundProcesser,
|
||||||
|
Map<String, MoChangeParam> paramMap) {
|
||||||
|
// sagas 冻结校验
|
||||||
|
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule<AggPickmVO>(true);
|
||||||
|
aroundProcesser.addBeforeRule(sagasCheckrule);
|
||||||
|
// 备料计划表头同步rule
|
||||||
|
IRule<AggPickmVO> pickmHeadEditRule = new PickmHeadEditRule(paramMap);
|
||||||
|
aroundProcesser.addBeforeRule(pickmHeadEditRule);
|
||||||
|
// 备料计划表体重算rule
|
||||||
|
IRule<AggPickmVO> pickmItemReCreateRule = new PickmItemReCreateRule(paramMap, true);
|
||||||
|
aroundProcesser.addBeforeRule(pickmItemReCreateRule);
|
||||||
|
// 备料计划变更rule
|
||||||
|
IRule<AggPickmVO> pickmItemAdjustRule = new PickmItemAdjustRule(paramMap);
|
||||||
|
aroundProcesser.addBeforeRule(pickmItemAdjustRule);
|
||||||
|
// 校验是否有预留数量(变更后计划出库数量小于预留数量+累计实收数量报错,重算后维度变化则清除预留)
|
||||||
|
IRule<AggPickmVO> pickmCheckReservetRule = new PickmReserveCheckForMoUpdateRule(paramMap);
|
||||||
|
aroundProcesser.addBeforeRule(pickmCheckReservetRule);
|
||||||
|
// 校验组织是否已停用
|
||||||
|
IRule<AggPickmVO> orgRule = new OrgDisabledCheckRule(IOrgConst.PK_ORG, IOrgConst.FACTORYTYPE);
|
||||||
|
aroundProcesser.addBeforeRule(orgRule);
|
||||||
|
// 修改保存时的数据补充规则
|
||||||
|
IRule<AggPickmVO> fillDataRule = new FillUpdateDataRule();
|
||||||
|
aroundProcesser.addBeforeRule(fillDataRule);
|
||||||
|
|
||||||
|
// 表头物料自动分配
|
||||||
|
// IRule<AggPickmVO> autoHMaterialAssignRule = new
|
||||||
|
// MMAutoMaterialAssignRule<AggPickmVO>(PickmHeadVO.CMATERIALVID,
|
||||||
|
// null, new String[] { PickmHeadVO.PK_ORG }, null);
|
||||||
|
// aroundProcesser.addBeforeFinalRule(autoHMaterialAssignRule);
|
||||||
|
// 表体物料自动分配
|
||||||
|
IRule<AggPickmVO> autobMaterialAssignRule = new MMAutoMaterialAssignRule<AggPickmVO>(null,
|
||||||
|
PickmItemVO.CBMATERIALVID, new String[]{PickmHeadVO.PK_ORG},
|
||||||
|
new String[]{PickmItemVO.CDELIVERORGID, PickmItemVO.CSUPPLYORGID});
|
||||||
|
aroundProcesser.addBeforeFinalRule(autobMaterialAssignRule);
|
||||||
|
|
||||||
|
// 物料合法性校验规则
|
||||||
|
IRule<AggPickmVO> marperRule = new PickmCheckMaterialPermissionRule();
|
||||||
|
aroundProcesser.addBeforeRule(marperRule);
|
||||||
|
|
||||||
|
// 子项物料发料组织合法性校验规则
|
||||||
|
IRule<AggPickmVO> bmarperRule = new PickmCheckItemMaterialPermissionRule();
|
||||||
|
aroundProcesser.addBeforeRule(bmarperRule);
|
||||||
|
// 进行序列号管理的物料不能设置为倒冲和交互式倒冲
|
||||||
|
IRule<AggPickmVO> snMaterialCheckRule = new SNMaterialNotBackFlushRule();
|
||||||
|
aroundProcesser.addBeforeRule(snMaterialCheckRule);
|
||||||
|
// 校验备料计划倒冲时机
|
||||||
|
// IRule<AggPickmVO> checkFbackFlusTime = new PickmFbackflustimeCheckRule();
|
||||||
|
// aroundProcesser.addBeforeRule(checkFbackFlusTime);
|
||||||
|
// 单据字段长度检查规则
|
||||||
|
IRule<AggPickmVO> lengthCheckRule = new FieldLengthCheckRule();
|
||||||
|
aroundProcesser.addBeforeRule(lengthCheckRule);
|
||||||
|
|
||||||
|
// 自由辅助属性检查的规则
|
||||||
|
MarAssistantSaveRule<AggPickmVO> marRule = new MarAssistantSaveRule<AggPickmVO>();
|
||||||
|
// marRule.setNotNullValidate(PickmConsts.CMATERIAL_VID_NAME);
|
||||||
|
marRule.setPos(0);
|
||||||
|
aroundProcesser.addBeforeRule(marRule);
|
||||||
|
// 自由辅助属性检查的规则
|
||||||
|
MarAssistantSaveRule<AggPickmVO> bmarRule = new MarAssistantSaveRule<AggPickmVO>();
|
||||||
|
// bmarRule.setNotNullValidate(PickmItemVO.CBMATERIALVID);
|
||||||
|
bmarRule.setPos(1);
|
||||||
|
aroundProcesser.addBeforeRule(bmarRule);
|
||||||
|
|
||||||
|
// 自定义项检查的规则
|
||||||
|
// UserDefSaveRule<AggPickmVO> defRule = new UserDefSaveRule<AggPickmVO>(new
|
||||||
|
// Class[] {
|
||||||
|
// PickmHeadVO.class, PickmItemVO.class
|
||||||
|
// });
|
||||||
|
// aroundProcesser.addBeforeRule(defRule);
|
||||||
|
// 更新单据号的规则
|
||||||
|
ICompareRule<AggPickmVO> updateBillCodeRule = new UpdateBillCodeRule(BillTypeConst.PICKM,
|
||||||
|
PickmConsts.VBILL_CODE_NAME, IOrgConst.PK_GROUP, IOrgConst.PK_ORG);
|
||||||
|
aroundProcesser.addBeforeRule(updateBillCodeRule);
|
||||||
|
|
||||||
|
// 备料计划ATP检查规则
|
||||||
|
IRule<AggPickmVO> pickmATPCheckRule = new PickmATPCheckRule(true, null);
|
||||||
|
aroundProcesser.addBeforeRule(pickmATPCheckRule);
|
||||||
|
// 检查自定义项数据数据类型和自定义项类型是否一致规则
|
||||||
|
IRule<AggPickmVO> userDefSaveRule = new UserDefSaveRule<AggPickmVO>(new String[]{"vdef", "vbdef"},
|
||||||
|
new Class[]{PickmHeadVO.class, PickmItemVO.class});
|
||||||
|
aroundProcesser.addBeforeRule(userDefSaveRule);
|
||||||
|
// 进行成套数量、累计超额数量等联动值的重算
|
||||||
|
PickmRewriteOtherNumRule setPartsRule = new PickmRewriteOtherNumRule();
|
||||||
|
aroundProcesser.addBeforeRule(setPartsRule);
|
||||||
|
|
||||||
|
// 调用更新状态rule:自动完成 or 自动取消完成
|
||||||
|
ICompareRule<AggPickmVO> autoChangeStateRule = new PickmAutoChangeStateRule();
|
||||||
|
aroundProcesser.addBeforeRule(autoChangeStateRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加修改后规则
|
||||||
|
*
|
||||||
|
* @param aroundProcesser
|
||||||
|
*/
|
||||||
|
private void addAfterRule(CompareAroundProcesser<AggPickmVO> aroundProcesser) {
|
||||||
|
// 保存单据号唯一性校验规则
|
||||||
|
IRule<AggPickmVO> billCodeCheckRule = new BillCodeCheckRule(BillTypeConst.PICKM, PickmConsts.VBILL_CODE_NAME,
|
||||||
|
IOrgConst.PK_GROUP, IOrgConst.PK_ORG);
|
||||||
|
aroundProcesser.addAfterRule(billCodeCheckRule);
|
||||||
|
|
||||||
|
// 备料计划ATP检查规则
|
||||||
|
IRule<AggPickmVO> pickmATPCheckRule = new PickmATPCheckRule(false, this.aggPickmVOArray);
|
||||||
|
aroundProcesser.addAfterRule(pickmATPCheckRule);
|
||||||
|
|
||||||
|
// 自动预留规则
|
||||||
|
IRule<AggPickmVO> pickmAutoReserveRule = new PickmAutoReserveRule();
|
||||||
|
aroundProcesser.addAfterRule(pickmAutoReserveRule);
|
||||||
|
|
||||||
|
// 回写实际替代表规则
|
||||||
|
ICompareRule<AggPickmVO> pickmRewritePLOWhenUpdateRule = new PickmRewritePLOWhenUpdateRule();
|
||||||
|
aroundProcesser.addAfterRule(pickmRewritePLOWhenUpdateRule);
|
||||||
|
// 同步返修标识规则
|
||||||
|
IRule<AggPickmVO> synBrepairRule = new PickmSynBrepairFlagRule();
|
||||||
|
aroundProcesser.addAfterRule(synBrepairRule);
|
||||||
|
// 母订单备料计划保存时生成子订单
|
||||||
|
IRule<AggPickmVO> pickmCreateSubMoRule = new PickmCreateSubMoRule();
|
||||||
|
aroundProcesser.addAfterRule(pickmCreateSubMoRule);
|
||||||
|
// 挪料/判断规则
|
||||||
|
IRule<AggPickmVO> deliverBackInfoRule = new PickmNeedDeliverBackCheckRule(this.checkInfo);
|
||||||
|
aroundProcesser.addAfterRule(deliverBackInfoRule);
|
||||||
|
// 配套变更建议
|
||||||
|
ICompareRule<AggPickmVO> subMoAdjustSuggestRule = new PickmSubMoAdjustSuggestRule(this.checkInfo);
|
||||||
|
aroundProcesser.addAfterRule(subMoAdjustSuggestRule);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue