金蝶云 python脚本调用接口(内部接口,外部接口)
金蝶云python脚本无法加载python第三方模块,通过引入dll方式实现接口调用。
【注意】其中包含了如何序列化、反序列化JSON
1.内部接口
1.引入库
import clr
clr.AddReference("Kingdee.BOS.WebApi.Client")
from Kingdee.BOS.WebApi.Client import *
2.调用修改接口(其他接口同理)
data='{"NeedUpDateFields": ["FPURMRBENTRY","FTAXPRICE"],"IsDeleteEntry": "false","Model": {"FID":'+str(_id)+',"FPURMRBENTRY": [{"FEntryId":'+str(_eid)+',"FTAXPRICE": "'+str(dt.Rows[0]["PRICE"])+'"}]}}'
acctid='5e1459fd1ab6e3'#数据中心ID
url="http://laptop-ui1021f4/K3Cloud/"#域名
username="demo"#用户名
password="zk888888."#用户密码
client =K3CloudApiClient(url);
loginResult = client.ValidateLogin(acctid,username,password,2052);
resultType = long(JObject.Parse(loginResult)["LoginResultType"]);
if (resultType == 1):
result =client.Save("PUR_MRB",data);
2.外部接口
1.引入库
import clr
clr.AddReference("System")
clr.AddReference("System.Data")
clr.AddReference("System.XML")
clr.AddReference("System.Web.Extensions")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.ServiceHelper")
clr.AddReference("Newtonsoft.Json")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("System.Web")
clr.AddReference("Kingdee.BOS.WebApi.Client")
import sys
from System import *
from System.IO import *
from System.Net import *
from System.Web import *
from System.Text import *
from System.Threading import *
from System.Globalization import *
from System.Security.Cryptography import *
from System.Web.Script.Serialization import *
from System.Collections.Generic import Dictionary
from Kingdee.BOS.WebApi.Client import *
from Newtonsoft.Json.Linq import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.Core.List import *
from Kingdee.BOS.Core.CommonFilter import *
from Kingdee.BOS.Contracts.Report import *
from Kingdee.BOS.Core.Report import ISysReportView
from Kingdee.BOS.Core.Report import ReportTitles
from Kingdee.BOS.App import ServiceHelper as ServiceHelperAPP
from Kingdee.BOS import *
from Kingdee.BOS.Core.List.PlugIn import *
from Kingdee.BOS.Core.Log import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.Orm import OperateOption
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.DynamicForm import *
from Kingdee.BOS.DataEntity import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Core.Bill import *
from Kingdee.BOS.Core.Bill.PlugIn import *
from Kingdee.BOS.ServiceHelper import *
from Kingdee.BOS.Core.Interaction import KDInteractionException
from Kingdee.BOS import KDBusinessException
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Metadata import SelectorItemInfo ##字段选择实体类
from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter ##查询参数实体类
#修改默认编码为utf8
reload(sys)
sys.setdefaultencoding('utf-8')
2.金蝶云操作插件上调用K3WISE保存接口
【注意】如何序列化、反序列化JSON
引用
from System.Collections.Generic import Dictionary
定义
Dictionary[str, object]()
序列化、反序列化JSON
def ObjectToJSON(obj):
try:
jss =JavaScriptSerializer();
b = Encoding.UTF8.GetBytes(jss.Serialize(obj));
return Encoding.UTF8.GetString(b);
except Exception as e:
raise Exception("ObjectToJSON:"+e.ToString());
def JSONToObject(jsonText):
try:
jss = JavaScriptSerializer();
return jss.Deserialize[object](jsonText);
except Exception as e:
raise Exception("JSONToObjectERROR:"+e.ToString());
完整代码(不包含引用)
def _Zstr(a):
return ("" if a==None else (a if isinstance(a,str) else str(a)));
def GetMD5(str):
b =Encoding.Default.GetBytes(str);
b =MD5CryptoServiceProvider().ComputeHash(b);
ret = "";
for i in range(b.Length):
ret += b[i].ToString("x").PadLeft(2, '0');
return ret;
def HttpGet(url,timeout):
HttpWebResponseString = "";
result= False;
DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
try:
httpWebRequest = WebRequest.Create(url);
httpWebRequest.Method = "GET";
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.UserAgent =DefaultUserAgent;
httpWebRequest.Timeout = timeout;
httpWebResponse = httpWebRequest.GetResponse()
HttpWebResponseString =ReadHttpWebResponse(httpWebResponse);
result = True;
except Exception as ex:
HttpWebResponseString = ex.ToString();
result = False;
return result,HttpWebResponseString
def HttpPost(url,Data,timeout):
DefaultUserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
requestEncoding = Encoding.UTF8;
if url:
HttpWebResponseString = ""
try:
httpWebRequest = WebRequest.Create(url)
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json";
httpWebRequest.UserAgent =DefaultUserAgent;
httpWebRequest.Timeout = timeout;
del DefaultUserAgent
if Data != None:
requestEncoding.GetString(Data);
stream = httpWebRequest.GetRequestStream();
stream.Write(Data, 0, Data.Length);
del requestEncoding
httpWebResponse = httpWebRequest.GetResponse();
HttpWebResponseString =ReadHttpWebResponse(httpWebResponse);
result =True;
except Exception as e:
HttpWebResponseString = e.ToString();
result = False;
raise Exception("HttpPost:"+e.ToString());
else:
if stream != None:
stream.Close();
return result,HttpWebResponseString
def ReadHttpWebResponse(HttpWebResponse):
try:
stream = HttpWebResponse.GetResponseStream();
streamReader =StreamReader(stream, Encoding.GetEncoding("utf-8"));
result = streamReader.ReadToEnd();
except Exception as e:
raise Exception("ReadHttpWebResponse:"+e.ToString());
else:
if streamReader !=None:
streamReader.Close();
if stream != None:
stream.Close();
if HttpWebResponse != None:
HttpWebResponse.Close();
return result;
def ObjectToJSON(obj):
try:
jss =JavaScriptSerializer();
b = Encoding.UTF8.GetBytes(jss.Serialize(obj));
return Encoding.UTF8.GetString(b);
except Exception as e:
raise Exception("ObjectToJSON:"+e.ToString());
def JSONToObject(jsonText):
try:
jss = JavaScriptSerializer();
return jss.Deserialize[object](jsonText);
except Exception as e:
raise Exception("JSONToObjectERROR:"+e.ToString());
def GetDJ(_Number,url,dbId,userName,appId,appSecret):
data = "{\"Number\": \"" + _Number + "\"}";
result=""
client = K3CloudApiClient(url);
loginResult = client.LoginByAppSecret(dbId,userName,appId,appSecret,2052);
resultType =long(JObject.Parse(loginResult)["LoginResultType"]);
if (resultType == 1):
result = client.View("STK_InStock", data);
return result
def SaveDetail(postJson,apiUrl,token):
httpResponse =""
url =apiUrl + "/" +"Purchase_Receipt"+ "/Save?Token=" +token;
data =Encoding.UTF8.GetBytes(postJson);
flag,httpResponse =HttpPost(url, data, 60000);
#raise Exception(url+httpResponse);
if (flag == True):
status =JSONToObject(httpResponse);
if (_Zstr(status["StatusCode"]) == "200"):
return "成功";
else:
return status["Message"]+(status["Data"] if '"Data":' in httpResponse else '')
else:
return status["Message"]
def CheckBill(FBillNo,tableName,authCode,source,frurl):
seecion = tableName + authCode + FBillNo;
seecion =GetMD5(seecion).lower();
postJson = "tableName="+tableName+"&a="+source + "&FBillNo=" + FBillNo + "&seecion=" + seecion+"&type=Purchase_Receipt";
httpResponse = ""
url =frurl + "CheckBill.aspx?"+ postJson;
#raise Exception(url);
flag,httpResponse =HttpGet(url, 60000);
if (flag == True):
status =JSONToObject(httpResponse);
if (status["StatusCode"] == "200"):
return True,httpResponse;
else:
return False,httpResponse;
else:
return False,httpResponse;
def get_token(apiUrl,authCode):
httpResponse =""
token=""
#无加密
url = apiUrl + "/Token/Create?authorityCode=" + authCode;
#raise Exception(url);
flag,httpResponse=HttpGet(url, 60000);
if (flag == True):
tok = JObject.Parse(httpResponse);
StatusCode = tok["StatusCode"].ToString();
if (StatusCode == "200"):
httpResponse = tok["Data"]["Token"].ToString();
token= httpResponse;
return token;
def run(BillNo,url,dbId,userName,appId,appSecret,forgnum,FSManagerIDFNumber,FSManagerIDFName,apiUrl,token,authCode,source,frurl):
global _RootKD_CGRKD
_RootKD_CGRKD=JSONToObject(GetDJ(BillNo,url,dbId,userName,appId,appSecret))
_RootPurchase_Receipt =Dictionary[str, object]()
_DataPurchase_Receipt =Dictionary[str, object]()
_Page1Items=[]
_Page1Item=Dictionary[str, object]()
#单据编号
_Page1Item["FBillNo"] = _RootKD_CGRKD["Result"]["Result"]["BillNo"]
_FBillerID=Dictionary[str, object]()
_FBillerID["FNumber"] =""
_FBillerID["FName"] ="Administrator"
_Page1Item["FBillerID"] =_FBillerID
#日期
_Page1Item["Fdate"] = _Zstr(_RootKD_CGRKD["Result"]["Result"]["Date"])[0:10]
#供应商
_FSupplyID =Dictionary[str, object]()
_FSupplyID["FNumber"] = _RootKD_CGRKD["Result"]["Result"]["SupplierId"]["Number"]
_FSupplyID["FName"] = ""
_Page1Item["FSupplyID"] = _FSupplyID
#仓库
_FDCStockID =Dictionary[str, object]()
_FDCStockID["FNumber"] = _RootKD_CGRKD["Result"]["Result"]["InStockEntry"][0]["StockId"]["Number"]
_FDCStockID["FName"] = "";
_Page1Item["FDCStockID"] = _FDCStockID;
_FSManagerID =Dictionary[str, object]()
_FSManagerID["FNumber"] =FSManagerIDFNumber;
_FSManagerID["FName"] = FSManagerIDFName;
_Page1Item["FSManagerID"] = _FSManagerID;
_FPOStyle =Dictionary[str, object]()
_FPOStyle["FNumber"] = "P002";
_FPOStyle["FName"] = "赊购";
_Page1Item["FPOStyle"] = _FPOStyle;
_FFManagerID =Dictionary[str, object]()
_FFManagerID["FNumber"] =FSManagerIDFNumber;
_FFManagerID["FName"] =FSManagerIDFName;
_Page1Item["FFManagerID"] = _FFManagerID;
_Page1Item["FROB"] = "1";
_Page1Items.Add(_Page1Item);
#表体
_Page2Items =[]
for item in _RootKD_CGRKD["Result"]["Result"]["InStockEntry"]:
_Page2Item=Dictionary[str, object]()
#物料
_FItemID=Dictionary[str, object]()
_FItemID["FNumber"] = item["MaterialId"]["Number"]
_FItemID["FName"]= "";
_Page2Item["FItemID"]= _FItemID;
#单位
_FUnitID =Dictionary[str, object]()
_FUnitID["FNumber"] ="";
_NameItem=Dictionary[str, object]()
_NameItem = item["UnitID"]["MultiLanguageText"]
_ItemValue=filter(lambda x: x["LocaleId"]==2052, _NameItem)
_ItemValue2=Dictionary[str, object]()
_ItemValue2 = _ItemValue[0]
_FUnitID["FName"] = _ItemValue2["Name"]
_Page2Item["FUnitID"] = _FUnitID;
#数量
_Page2Item["FAuxQty"] = item["RealQty"]
_Page2Item["FQtyMust"] = item["RealQty"]
_Page2Item["FQty"] = item["RealQty"]
# 仓库
_FDCStockID1=Dictionary[str, object]()
_FDCStockID1["FNumber"] = item["StockId"]["Number"]
_FDCStockID1["FName"] = "";
_Page2Item["FDCStockID1"]= _FDCStockID1
# 单价
_Page2Item["FPurchasePrice"] = item["Price"]
# 金额
_Page2Item["Famount"] = item["Amount"]
# 单据内码
_Page2Item["FSourceInterId"] = item["F_LYP_Text"]
# 单据分录内码
_Page2Item["FSourceEntryID"] = item["F_LYP_Text1"]
# 单据类型内码
_Page2Item["FSourceTranType"] = item["F_LYP_Text2"]
_Page2Item["FSourceBillNo"] = _Zstr(item["F_ora_Text"])[3:]
if forgnum=='03':
_Page2Item["FEntrySelfA0172"] = _Zstr(item["ProduceDate"])[0:10]
elif forgnum=='01' or forgnum=='02':
_Page2Item["FEntrySelfA0171"] = _Zstr(item["ProduceDate"])[0:10]
_Page2Items.append(_Page2Item);
_DataPurchase_Receipt["Page1"] = _Page1Items;
_DataPurchase_Receipt["Page2"] = _Page2Items;
_RootPurchase_Receipt["Data"] = _DataPurchase_Receipt;
postjson =ObjectToJSON(_RootPurchase_Receipt);
#raise Exception(postjson);
SaveDetail(postjson,apiUrl,token);
CheckBill(BillNo, "ICStockBill",authCode,source,frurl);
def OnPreparePropertys(e):
e.FieldKeys.Add("FBillNo");
e.FieldKeys.Add("FStockOrgId");
def BeforeExecuteOperationTransaction(e):
try:
oResult = this.OperationResult.OperateResult;
for i in range(len(e.SelectedRows)):
item= e.SelectedRows[i].DataEntity
BillNo = Convert.ToString(item["BillNo"]);
forgid_obj=item["StockOrgId"] #组织
forgnum=forgid_obj["Number"]
url=""
dbId=""
userName=""
appId=""
appSecret=""
FSManagerIDFNumber=""
FSManagerIDFName=""
apiUrl=""
authCode=""
source=""
frurl=""
objs = DBServiceHelper.ExecuteDataSet(this.Context, "select top 1 * from JKPZ where FID<>1 and ZZ='"+forgnum+"'").Tables[0];
if (objs.Rows.Count > 0):
url=objs.Rows[0]["kd_url"].ToString();
dbId=objs.Rows[0]["kd_id"].ToString();
userName="Administrator";
appId="207606_5f1B6yHv0qA+"
appSecret="bcddc079ca594fc1"
FSManagerIDFNumber=objs.Rows[0]["FSManagerIDFNumber"].ToString();
FSManagerIDFName=objs.Rows[0]["FSManagerIDFName"].ToString();
apiUrl=objs.Rows[0]["apiUrl"].ToString();
authCode=objs.Rows[0]["authCode"].ToString();
source=objs.Rows[0]["source"].ToString();
frurl=objs.Rows[0]["frurl"].ToString();
token=get_token(apiUrl,authCode)
run(BillNo,url,dbId,userName,appId,appSecret,forgnum,FSManagerIDFNumber,FSManagerIDFName,apiUrl,token,authCode,source,frurl)
except Exception as e:
raise Exception("BeforeExecuteOperationTransaction:"+e.ToString());
1.获取token,方法get_token。
2.保存接口,方法SaveDetail。
3.自行封装的多级审核接口,方法CheckBill。