金蝶云 python脚本调用接口(内部接口,外部接口)如何序列化、反序列化JSON

金蝶云 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值