业务场景
1. 与WMS集成,其他出库单保存后 下发WMS,在nc.bs.ic.m4i.insert.InsertBP 中添加addAfterRule。问题:因为其他出库,调拨出库等都是共用的基础类。在InsertBP 中添加的规则 还会走预置代码 添加其他的规则类,导致先执行下发WMS的rule,后面执行预置的rule 其中有现存量校验,如果超现存量就会抛异常单据回滚,但已经下发WMS的是无法回滚的。
2. 解决方法:
- 通过数据库脚本添加预置类,该方法可行 但是需要注意一些配置参数 区分VMODULENAME 大小写,详细看NC审批后操作 扩展开发
VMODULENAME 为大写,如果是销售则为小写so
INSERT INTO PUB_PLUGINITEM
(DR,
INDUSTRYTYPE,
IORDER,
LOCALTYPE,
PK_PLUGINITEM,
TS,
VCOMPONENTNAME,
VDESCRIPTION,
VEVENTTYPE,
VEXTENDMODULE,
VEXTENDPOINTNAME,
VEXTENDTYPE,
VMODULENAME,
VRULECLASS,
VTARGETCLASS)
VALUES
(0,
'~',
1,
'~',
'1001Z81000000000PMS9',
'2021-07-21 12:19:19',
'm4331',
'其他出库单保存同步至WMS',
'after',
'ic',
'nc.bs.ic.m4i.insert.InsertBP',
'addAfter',
'IC',
'nc.pubimpl.nc2wms.syn.rule.m4i.M4I_SaveRule',
NULL);
- 代码添加
public void addAfterRule(GeneralOutVO[] vos, AroundProcesser<GeneralOutVO> processor) {
processor.addAfterRule(new AfterInsertRuleForRewrite4K());
processor.addAfterRule(new AfterInsertRuleForRewriteSpecial());
processor.addAfterRule(new InsertRewriteRM());
processor.addAfterRule(new RewriteQCInsertRule());
processor.addAfterRule(new InsReWriteSapplyBillRule());
processor.addAfterRule(new InsReWriteBuyingReqRule());
processor.addAfterRule(new InsReWriteMatterAppRule());
/*
* add by xuchong 2021-7-21
* 下发WMS
* */
//默认添加方法
//processor.addAfterRule(new M4I_SaveRule());
//默认添加在预置基础规则的首个
//((ICAroundProcesser) processor).addAfterRule(new M4I_SaveRule());
//添加在规则的最初处
//((ICAroundProcesser) processor).setBeforeRuleAtHead(new M4I_SaveRule());
//添加在规则的最尾处
((ICAroundProcesser) processor).setAfterRuleAtTail(new M4I_SaveRule());
}
((ICAroundProcesser) processor).setAfterRuleAtTail(new M4I_SaveRule());
该代码是添加到所有规则的最尾处。