关于python,通过webapi生成工序转移单原创
金蝶云社区-犯大吴疆土者
犯大吴疆土者
62人赞赏了该文章 710次浏览 未经作者许可,禁止转载编辑于2023年07月18日 11:37:40

二开案例.WEBAPI.使用WEBAPI生成工序转移单 (kingdee.com)

二开案例.WEBAPI.使用WEBAPI工序计划下推生成工序汇报 (kingdee.com)

C#代码链接





Python代码,这是工序转移单的,工序汇报单的同理。

ret = client.Execute[str]("Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser"my_array,None,10)
特殊点在这里,C# 中Execute 这个函数是有重载的但是 分别是前两个参数  和 四个参数,但是四个参数的里面后面两个参数是有默认值的。这样可能就导致了IronPython中如果不写后面两个参数就会导致不知道调用哪个重载的问题。所以这里直接指定4个参数的,并且填写上默认值。(备注:Python本身是不支持函数重载的。另类的重载方式为使用*args和**kwargs来实现)。



import clr

clr.AddReference('System')
clr.AddReference('System.Data')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.DataEntity')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.App')
clr.AddReference('Kingdee.BOS.App.Core')
clr.AddReference('Kingdee.BOS.ServiceHelper')
clr.AddReference('Kingdee.BOS.WebApi.Client')
clr.AddReference('Newtonsoft.Json')

from System import *
from System.Data import *
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DependencyRules import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.DynamicForm.PlugIn import *
from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata.FieldElement import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.WebApi.Client import *
from Newtonsoft.Json.Linq import *

def EndOperationTransaction(e):
    url = 'http://127.0.0.1//k3cloud/'  # 由于是通过插件调用,所以写的本机IP,如有自定义端口号,自行修改
    DBId = this.Context.DBId
    user = "xxxxxx"  # 默认管理员登录,分配后的基础资料显示的创建人会是administrator
    psw = "xxxxxxxx"
    client = ApiClient(url)
    my_array = Array[object]([DBId,user,psw,2052])
    ret = client.Execute[str]("Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser", my_array,None,10)
    LoginResultType = JObject.Parse(ret)["LoginResultType"]
    if LoginResultType == 1:
        # 这里获取单据数据包方式和前面一样
        for billObj in e.DataEntitys:
            billId = billObj["Id"]  # 单据ID
            billNo = billObj["BillNo"]  # 单据编号
            sql = str.format(""" Select * from PNOU_t_Cust_Entry100002 where FID = {0} """, billId)
            obj = DBUtils.ExecuteDynamicObject(this.Context, sql)
            if obj is not None and len(obj) > 0:
                for rowObj in obj:
                    insert_str = """{

                    "IsAutoAudit": "true",

                    "Datas": [

                        {

                        "TransOutDetailId": 101023,

                        "TransInDetailId": 101024,

                        "ConvertRules": 0,

                        "TransDetailInfo": [

                            {

                            "InEmpId": 0,

                            "OutEmpId": 0,

                            "InSupplierId": 0,

                            "PriceListId": 0,

                            "IsDefaultPriceValue": 0,

                            "SendQualifiedTaxPrice": 0,

                            "SendProFailTaxPrice": 0,

                            "SendMatFailTaxPrice": 0,

                            "SendTaxRate": 0,

                            "OperTransferQty": 1,

                            "OperQualifiedQty": 1,

                            "OperProFailQty": 0,

                            "OperMatFailQty": 0,

                            "OperPreReworkQty": 0

                            }

                        ]

                        }

                    ]

                    }"""
                    insertJson = JObject.Parse(insert_str)
                    insertJson["Datas"][0]["TransOutDetailId"] = rowObj["FPREVIOUSDETAILID"]
                    insertJson["Datas"][0]["TransInDetailId"] = rowObj["FDETAILID"]
                    if rowObj["FPREVIOUSDETAILID"] == 0:
                        insertJson["Datas"][0]["ConvertRules"] = 1
                    else:
                        insertJson["Datas"][0]["ConvertRules"] = 0
                    ret = client.Execute[str]("Kingdee.K3.MFG.WebApi.ServicesStub.OptPlanOptTransApiService.OptPlanningPushTrans,Kingdee.K3.MFG.WebApi.ServicesStub", Array[object]([insertJson]), None, 10)
                    retObj = JObject.Parse(ret)
                    if not str(retObj["IsSuccess"]) == "true":
                            result=OperateResult()
                            result.SuccessStatus=False
                            result.PKValue = str(billId)
                            result.Number = str(billNo)
                            result.RowIndex = rowObj["FSeq"]
                            result.Message = str(retObj["Message"])
                            this.OperationResult.OperateResult.Add(result);
                    else:
                        FBillNo = retObj["Message"][0]["FBillNo"].ToString()
                        updateSql = """ update PNOU_t_Cust_Entry100002 set F_B_BILLNO = '{0}' where FENTRYID = {1} """.format(FBillNo, rowObj["FENTRYID"])
                        DBUtils.Execute(this.Context, updateSql)
    else:
        raise Exception("登录失败")


赞 62