Python服务插件借助WebAPI实现基础资料审核后自动分配
在多组织环境中,我们可能会遇到客户要求根据一定的规则实现基础资料自动分配,标准功能可以配置自动分配方案(标准产品设置的是定时执行,个人认为不是很实用,出现问题不好跟踪)。
这里分享一下通过Python编写服务插件借助WEBAPI实现审核后自动分配。
实现方法:
1. 在BOS中打开需要设置自动分配的基础资料,例如物料。
2. 在【操作列表】中找到【审核】,点击右边的【编辑】按钮。
3. 在【其他控制】页签,点开【服务插件】。
4. 点击【注册Python脚本】按钮,将Python脚本复制粘贴进去。
5. 参考代码如下(网页复制会有缩进格式问题,请下载附件,进行复制粘贴,然后对着帖子中代码说明进行调整):
#引入clr运行库
import clr
#添加对cloud插件开发的常用组件的引用
clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.ServiceHelper')
clr.AddReference('Kingdee.BOS.ServiceHelper')
clr.AddReference('Kingdee.BOS.WebApi.Client')
clr.AddReference('Newtonsoft.Json')
#导入cloud基础库中的常用实体对象(分命名空间导入,不会递归导入)
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from System import *
from System.Data import *
from Kingdee.BOS.App.Data import *
from System.Collections.Generic import List
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.WebApi.Client import *
from Newtonsoft.Json.Linq import *
#重载cloud插件模型的主菜单按钮点击事件
def OnPreparePropertys(e):
e.FieldKeys.Add("FCreateOrgId");
e.FieldKeys.Add("FUseOrgId");
def EndOperationTransaction(e):
appId="PiaoZoneHelper";#应用ID,请用管理员登录系统,在第三方系统登录授权中获取
appSecret="e76aac8c754247a89bc453a06fb460f9";#应用秘钥
url='http://127.0.0.1/k3cloud/';#由于是通过插件调用,所以写的本机IP,如有自定义端口号,自行修改
DBId=this.Context.DBId;
user="Administrator";#默认管理员登录,分配后的基础资料显示的创建人会是administrator
loginFlag=0;
for billObj in e.DataEntitys:
billNo = str(billObj["Number"]);
billId=str(billObj["Id"]);
createOrgId=str(billObj["CreateOrgId_Id"]);
userOrgId=str(billObj["UseOrgId_Id"]);
if(createOrgId<>userOrgId):
continue;#重要!!!由于审核后触发自动审核,所以控制创建组织和使用组织一致的时候才执行,否则会死循环
if(loginFlag==0):
loginFlag=1;#控制WebAPI登录次数,每一次审核只登录一次,即使是列表批量审核
client=K3CloudApiClient(url);
loginResult=client.LoginByAppSecret(DBId,user,appId,appSecret,2052);
loginResultObj=JObject.Parse(loginResult);
iResult=("{0}").format(loginResultObj["LoginResultType"]);
if(iResult<>"1" and iResult<>"-5"):
raise Exception("接口登录失败!");
formId=this.BusinessInfo.GetForm().Id;
#IsAutoSubmitAndAudit:分配后是否自动审核,true表示自动审核,false:不自动审核
obj="{'PkIds':'IDSTR','TOrgIds':'ORGID_STR','IsAutoSubmitAndAudit':'true'}";
#通过这里可以学习到在Python脚本中如何实现多行文本拼接,C#的string.format写法转换成Python可参考此处
#注意SQL字符串首尾的【"""】,3个双引号!!!!!
#通过SQL查询出需要分配到哪些目标组织的ID,根据实际情况自行修改SQL即可!!!
sql = ("""select org.FORGID
from T_ORG_ORGANIZATIONS org
left join T_BD_CUSTOMER m on org.FORGID=m.FUSEORGID and m.FNUMBER='{0}'
where m.FNUMBER is null and org.FNUMBER in ('1','101','102','103')""").format(billNo);
ds = DBServiceHelper.ExecuteDataSet(this.Context,sql);
AllRows=ds.Tables[0].Rows;
if(AllRows.Count<=0):
continue;
orgList=List[str]();
for r in AllRows:
orgId=str(r["FORGID"]);
orgList.Add(orgId);
orgIds=",".join(orgList.ToArray());
data=obj.Replace("IDSTR",billId).Replace("ORGID_STR",orgIds);#替换Json构建参数中关键字value
allocateR=client.Allocate(formId,data);
#raise Exception(data);#通过抛出异常的方式进行调试查看报错信息,
#allocateR:表示分配执行结果,可以通过raise Exception(allocateR.ToString());进行查看。
#调试成后请去掉抛异常这行代码!!!!
####代码部分结束==================================
最后总结一下:
通过此案例可以学习通过Python插件如何调用WEBAPI接口。
这个脚本里面可以学习到如何通在Python插件如何构建Sql语句,查询数据库。
对于Python插件,如何去调试,如果是表单类的插件,可以通过this.View.ShowMessage进行调试,本案例为服务插件,于是采用了抛出异常信息raise Exception(msg)的方法进行调试
由于本案例JSON参数比较简单 ,于是采用了字符串关键字替换的方法进行构建,如果涉及复杂JSON对象,可以引用C#中的JObject进行构建,需要添加引用如下:
clr.AddReference('Newtonsoft.Json')
from Newtonsoft.Json.Linq import *
提示:name 'e' is not defined
分配时间 经常超时怎么解 T T
执行后 iResult =-1,找了半天不知道是哪里错了。能给个提示吗?
有python的字典转json嘛
很好,发票云的场景很适合我,思路巧妙
{
"PkIds": 246284,
"TOrgIds": "100001",
'IsAutoSubmitAndAudit':'true'
}
不如在webapi语句中,加上第三行自动分配的命令,完全不需要开发python。测试可行。
WebApiServiceCall.Allocate(),这个是不是就可以绕过登陆了。
收藏了,未来得花不少时间好好消化一下周老师贡献的知识,谢谢老师。
Python服务插件借助WebAPI实现基础资料审核后自动分配
本文2024-09-16 17:20:03发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-15027.html