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调用频繁的场景,还可以考虑系统端的解决方法。

  • 系统端解决办法:

系统已考虑到了凭证号请求高并发的场景,并准备了一个针对该场景的插件,如下图所示:

image.png

系统出厂默认使用第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人打赏
还没有人打赏,快来当第一个打赏的人吧!