需求背景:
根据客户业务需求二开一张合同单据,通过合同单据生成财务应付单;后续再财务应付单进行结算时,将结算记录反写到合同单据中。
开发方案:
考虑到财务应付单的结算业务场景有多个:付款单点击付款的时候自动结算,通过结算方案自动结算,手工结算等;同时与财务应付进行结算的辅方单据也会有多种:付款结算、应付冲应收、应付红蓝对冲等。
同时反结算也存在手工反结算、其他业务操作触发反结算。
为了保证每种业务场景都能覆盖到,最保险的方法是在结算记录上处理,生成 结算记录时向合同单据反写增加结算金额,反结算的时候向合同单据反写扣减结算金额。
经过查找验证,结算的时候生成结算记录会调用save操作,反结算的时候删除结算记录会调用remove操作,于是在这两个操作增加操作插件。
到现在为止貌似这个开发需求告一段落。因为涉及到往来的处理,故在测试的时候比较慎重,尽可能模拟各种业务场景:手工结算、手工反结算、确认收付款、取消收付款等业务场景都可以触发插件正常反写。直到…………
坑:
将一张财务应收单的一条 分录分两次下推生成付款单,然后在在付款处理列表勾选这两张付款单点击确认付款。
系统会生成一张结算记录,包含两条分录,分别对应这两张付款单,此时反写依旧正常
接下来,选择一张付款单,点击取消付款,会提示该单据已经完成结算,继续操作会自动反结算。点击是之后,该单据状态回到已审核,再看结算记录也变成了一条分录。按理说取消 的那个结算记录会反写扣减合同反写金额。
但是!
查看合同确发现没有反写,然后将剩余一条收款单取消收款,结算记录被删除,合同反写扣减结算金额了,但第一次取消收款的金额并没有反写上来。
多次试验发现只要结算记录有多条分录不一起处理,就会出现在结算记录被删除前反结算的操作不会触发结算记录上的remove操作。
通过monitor查找分析日志,发现结算记录多行反结算时,是直接删除分录记录然后更新 单据头主方结算金额。
回来再看remove操作,实质上是delete删除操作;这种情况下并没有将结算记录整单删除所有不会走到删除操作,二开代码也就不会被执行。
解决方案:
到目前为止,原因算是找到了;经过咨询总部研发老师,也证实了确实是这个原因。
为了能够覆盖所有业务场景,经过总部老师建议,在项目上改成使用业务扩展点插件实现,使用“应收应付结算后处理”业务场景。经过测试该业务扩展点完美覆盖各种业务场景。
推荐阅读