Python服务插件借助WebAPI实现基础资料审核后自动分配原创
金蝶云社区-CQ周玉立
CQ周玉立
35人赞赏了该文章 6028次浏览 未经作者许可,禁止转载编辑于2021年11月23日 14:17:51

在多组织环境中,我们可能会遇到客户要求根据一定的规则实现基础资料自动分配,标准功能可以配置自动分配方案(标准产品设置的是定时执行,个人认为不是很实用,出现问题不好跟踪)。

这里分享一下通过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());进行查看。

        #调试成后请去掉抛异常这行代码!!!!

####代码部分结束==================================

最后总结一下:        

  1. 通过此案例可以学习通过Python插件如何调用WEBAPI接口。

  2. 这个脚本里面可以学习到如何通在Python插件如何构建Sql语句,查询数据库。

  3. 对于Python插件,如何去调试,如果是表单类的插件,可以通过this.View.ShowMessage进行调试,本案例为服务插件,于是采用了抛出异常信息raise Exception(msg)的方法进行调试

  4. 由于本案例JSON参数比较简单 ,于是采用了字符串关键字替换的方法进行构建,如果涉及复杂JSON对象,可以引用C#中的JObject进行构建,需要添加引用如下:

    clr.AddReference('Newtonsoft.Json')

    from Newtonsoft.Json.Linq import *

赞 35