API保存凭证偶发凭证号重复的解决办法原创
24人赞赏了该文章
304次浏览
编辑于2024年03月08日 11:21:09
API保存凭证常用的方式有:
1. 单线程保存单个凭证;
2. 单线程批量保存凭证且BatchCount参数值为1;
3. 单线程批量保存凭证且BatchCount参数值大于1;
4. 多线程保存单个凭证;
5. 多线程批量保存凭证。
这些方法出现凭证号重复的可能性依次增大,究其原因是:系统在处理凭证号的并发请求时,尤其是高并发的请求时,无法有效应对。
要解决这一问题,可以从调用端和系统端两边着手。
调用端解决办法:
根据上面罗列的常用方式发生凭证号重复的机率,可以采取以下三种方式:
1) 改多线程为单线程
2) 减小批量保存中的BatchCount参数值
3) 改批量保存为单个保存
不过,这样调整,会在一定程序上降低API保存凭证的效率,在效率不敏感的场景可以选用。如果API保存凭证数量大,API调用频繁的场景,还可以考虑系统端的解决方法。
系统端解决办法:
系统已考虑到了凭证号请求高并发的场景,并准备了一个针对该场景的插件,如下图所示:
系统出厂默认使用第5行的凭证号处理插件,如果在高并发场景下,出现凭证号重复的情况,可以切换到第6行的“高并发场景下凭证号维护插件”,即取消“避免凭证号重复处理插件”,勾选“高并发场景下凭证号维护插件”。保存后生效。
Python插件解决办法
此外,还可以通过注删除一个Python插件来加强凭证号处理逻辑,防止凭证号重复,具体脚本如下。
#此脚本需要VchNoTaskLine类为public类型。 #官方组件24年上半年之前的组件默认为private类型,需要重新编译为public才可使用 import clr clr.AddReference('Kingdee.K3.FIN.GL.App.ServicePlugIn') from Kingdee.K3.FIN.GL.App.ServicePlugIn.GLVoucher import * def BeginOperationTransaction(e): VchNoTaskLine().UpdateMultiVchGroupNo(this.Context, e.DataEntitys)
PS:以上三种方法可以同时使用。
赞 24
24人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读