
自从看到周老的python文章,就有了灵感,可以不断实现新的想法。本次代码是根据周老的[Python服务插件借助WebAPI实现基础资料审核后自动分配 (kingdee.com)](Python服务插件借助WebAPI实现基础资料审核后自动分配 (kingdee.com))改写的。
以下代码可以实现:在客户、供应商、银行自动分配到指定的组织。
方法:
# 1.在BOS里添加基础资料字段F_PAEZ_BASEorg1、F_PAEZ_BASEorg2(关联组织架构)

# 2. 在BOS->批量编辑字段->表单插件 ->注册python

# 3.appId、appSecret信息。需要用administrator 在第三方授权登录 添加
# 4.obj="{'PkIds':'IDSTR','TOrgIds':'ORGID_STR','IsAutoSubmitAndAudit':'true'}"
如果不确定值IDSTR、TOrgIds的值,通过web在线测试
PkIds:sql的表的数据FMASTERID,TOrgIds 需要分配组织ID
{
'PkIds': '127314',
'TOrgIds': '100005',
'IsAutoSubmitAndAudit': 'true'
}
# 5.python代码
#引入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 *
# 全局变量需要修改的参数
appId="text"; #需要修改
appSecret="a7f4558baad542a6b3fa5bb77b7adf33";#需要修改
url='http://127.0.0.1/k3cloud/';#需要修改成域名
user="demo";#需要修改
DBId=this.Context.DBId;
client=K3CloudApiClient(url);
#公共参数必备
billObj=this.View.Model.DataObject;#单据头的数据包,即单据的数据包,DynamicObject类型,可进一步解析
#this.View.ShowMessage(iResult)
#raise Exception(allocateR)
# 初始加载的函数
def init():
if login()==1 and org()==0:#判定有是否可以登录,并且org有数据
org1 = billObj["F_PAEZ_BASEorg1"] #需要分配的组织1
if org1!=None:
allfenpei(org1)
org2 = billObj["F_PAEZ_BASEorg2"] #需要分配的组织2
if org2!=None:
allfenpei(org2)
#附件到进程函数,正式使用的时候,注释掉
def BarItemClick(e):
init()
# API登录
def login():
loginFlag=0;
if(loginFlag==0):
loginFlag=1;
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("第三方登录失败!");
return loginFlag
# 判定创建组织和使用组织是同一个
def org():
result=0 #初始加载值
billId=str(billObj["Id"]);
#userOrgId=this.Context.CurrentOrganizationInfo.ID;#当前组织Id
createOrgId=str(billObj["CreateOrgId_Id"]);
userOrgId=str(billObj["UseOrgId_Id"]);
if(createOrgId!=userOrgId):
result=1
return result
# 分配函数
def allfenpei(orgObj):
formId=this.View.BillBusinessInfo.GetForm().Id;#单据FormId
orgnum(orgObj)
#orgIds=str("100004")
orgIds=str(orgnum(orgObj))
#this.View.ShowMessage(billId)
#raise Exception(data)
billId=str(billObj["Id"]);#单据内码,新建未保存是0
if billId!="0":#如果是0分配会报错,还有0是str形式要添加引号
#this.View.ShowMessage(billId)
obj="{'PkIds':'IDSTR','TOrgIds':'ORGID_STR','IsAutoSubmitAndAudit':'true'}"#需要分配的参数,不能变更,通过data替换变更个
data=obj.Replace("IDSTR",billId).Replace("ORGID_STR",orgIds); #替换操作
#raise Exception(data)#结果弹出
allocateR=client.Allocate(formId,data)#分配
#raise Exception(allocateR)#结果弹出
# 组织编码获取
def orgnum(orgObj):
orgNum=("{0}").format(orgObj["id"])
return orgNum
# 审核后触发
def AfterDoOperation(e):
opCode=e.Operation.Operation.ToUpperInvariant();#触发操作代码大写,例如保存:SAVE
if(opCode=="AUDIT"):
init()
e.Cancel=True;#可以取消触发操作
proapi20220912.zip
厉害
好东西 先点赞收藏 !


学以致用,发挥出Python插件开发优势,复制+简单修改,举一反三!