文本介绍了因第三方调用凭证API接口得到的凭证编码始终为默认值,导致无法设置编码规则的问题。文中提出通过BOS设计器临时发布到操作台指定编码规则的方法,但存在编码不一致的风险。解决方案是扩展凭证API接口对象,添加Python插件自动获取普通凭证的编码规则生成编码,确保API接口与普通凭证采用同一套编码规则,避免编码重复或不同。
第三方调用凭证API接口(GL_VOUCHERAPI),得到的凭证编码值始终为默认值“-1”,这是由于未正式对外发布,因此不支持用户在前端为其设置编码规则。可以通过BOS设计器,先临时发布到操作台,然后在编码规则中为其指定一个编码规则,然后再取消发布。不过,这样做有一个弊端,那就是为它指定的编码规则和凭证(GL_VOUCHER)上的编码规则不是同一个,两者无法协调生成编码。因此,可能造成通过凭证API接口生成的凭证和普通凭证上的编码重复或者是不同的两套规则。
本文重点解决这个问题。基本思路就是两者采用同一套编码规则,即采用普通凭证(GL_VOUCHER)现成的编码规则,无需为凭证API接口专门指定。
具体做法是:在BOS设计器中,扩展官方凭证API接口对象,为扩展后的凭证API接口(GL_VOUCHERAPI)对象的【保存】操作添加一个Python插件,该插件在凭证API接口保存凭证时自动获取凭证的编码规则生成的编码。如下图所示:
Python插件的脚本如下
#引入clr运行库 #添加对cloud插件开发的常用组件的引用 clr.AddReference("mscorlib") clr.AddReference("System") clr.AddReference("System.Data") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Contracts") clr.AddReference("Kingdee.BOS.Core") clr.AddReference("Kingdee.BOS.App") clr.AddReference("Kingdee.BOS.ServiceHelper") from Kingdee.BOS import * from Kingdee.BOS.Contracts import * from Kingdee.BOS.Core import * from System import * from System.Data import * from Kingdee.BOS.App import * from Kingdee.BOS.ServiceHelper import * from System.Collections.Generic import List from Kingdee.BOS.App.Data import * def BeginOperationTransaction(e): vch1 = e.DataEntitys[0] if (vch1.DataEntityState.FromDatabase == False): #需要先循环清空 for vch in e.DataEntitys: vch['BillNO']=' ' vch['BUSDATE']=vch['Date'] #再调用参数去获取 businessInfo = MetaDataServiceHelper.Load(this.Context, "GL_VOUCHER").BusinessInfo; option = {'CodeTime' : '1' , 'UpdateMaxNum' : '1' }; BusinessDataServiceHelper.GetBillNo(this.Context, businessInfo, e.DataEntitys, option);
注意:保存时系统会提示错误,无需理会,点“确定”继续保存即可。这个报错是因为我们本地缺少必要的组件引起的,但实现上脚本保存到服务器上后,不会缺少相关组件,因此,不会影响代码功能。
Python插件注册好后,点工具栏上的保存,即可生效。
实现的效果:
第三方调用凭证API接口(GL_VOUCHERAPI)可以共享普通凭证的编码规则,生成一致的凭证编码。
推荐阅读