一.前言
今天我們來分析金蝶系列的第二個產品---K3wise,財務版本為15.0.不過好像14.3以上的K3wise就有專門的開放API接口了,這對於我們這些做對接開發的也是一種福利了。
曾經對接過14.2版本的k3wise,當時走的是WebService,過程也是夠心塞。最近聽說14.2的客戶准備轉金蝶K3Cloud了。但是我們的重點是15.0開放API接口的處理了。那么,對接開發API接口的第一步就是開發文檔了,當時也是在金蝶社區看到不少小伙伴問為啥不見K3wise的開發文檔,開發文檔在財務系統的EBDI-->API平台-->API說明
如下圖所示:
二.K3wise財務環境API接口補丁
2.1.接口API補丁
確保對接的客戶所使用的財務環境的API接口已經打過補丁,且補丁已打全。當時就是因為客戶的財務環境沒有打補丁,導致財務對接憑證時科目、憑證各種問題不斷,為了保證開發過程財務環境不會有大問題,請確保補丁打全。
憑證引出如果出現如下圖所示的返回參數,說明補丁已經是最新的,如果不是,請在金蝶社區的補丁下載專區下載補丁https://club.kingdee.com/club/newclub/patch/list?productType=%E9%87%91%E8%9D%B6K/3
2.2所需補丁列表
請確保下載的補丁版本為自己所使用的k3wise的財務版本
補丁號:PT122970 ---增加缺少的API單據接口,包括:投料單,生產任務單,BOM單,工序計划單,生產任務匯報,工序匯報單,工藝路線,工序派工單,工序轉移單,發貨通知單,憑證,調撥單,其他出庫單,其他入庫單,退貨通知單,收料通知/請檢單,料通知單,盤盈入庫,盤虧毀損單,客戶上級組、物料上級組、部門上級組等等。
我們主要用到憑證接口--來進行憑證引入引出的操作。
補丁號 : PT125666 ---完善科目API接口,處理科目核算項目
該補丁用來解決科目API查詢時,正確返回科目的輔助核算項。
補丁號 : PT127053 ---API科目GetList接口沒有按照過濾條件返回數據
該補丁用來解決科目API列表查詢時,過濾條件Filter不起作用。
補丁號 : PT134851---科目、部門、計量單位、倉位、自定義核算項目等基礎資料API接口完善
三.K3wise對接所需參數以及接口列表
3.1Token的獲取
在調用業務接口之前,我們需要先調用Token接口正確獲取到Token,接着使用該Token去調用其他的業務接口,正確操作數據。
Token獲取的請求示例:
http://127.0.0.1/K3API/Token/Create?authorityCode=635e8cd049f1407d0668651d54c90e8696e0ef1e98094961
其中authorityCode 授權碼如何獲取呢?
代碼示例:
private static long? timestamp;
private const long MILLISECONDS_EXPIRED = 3300000; //1000 * 60 * 60 - 1000 * 60 * 5 (55分鍾);
private static string token = String.Empty;
public string GetToken()
{
long nowTimestamp = (long)DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds;
if ((timestamp == null)
|| (nowTimestamp - timestamp > MILLISECONDS_EXPIRED))
{
var result = APIClient.CreateAPIOperation<GetToken>(_Config.URL)
.SetAuthorityCode(_Config.AuthorityCode)
.ToAPIRequest().GetToken<GetTokenResult>();
if (result != null && result.StatusCode == 200)
{
timestamp = (long)DateTime.Now.Subtract(DateTime.Parse("1970-1-1")).TotalMilliseconds;
token = result.Data.Token;
}
}
return token;
得到授權碼后我們就可以正確調用該Token接口了,看一下正確返回的Token
{
"StatusCode": 200,
"Message": "Token申請成功!",
"Data": {
"AcctID": 2,
"UserID": 16394,
"Token": "4CB9FA43B24FFE35DEB4AC14FC2903421182845FC6F634B9B0661FF924E154EB346C18446F7A514D",
"Code": "001",
"Validity": 3600.0,
"IPAddress": "1.196.178.5",
"Language": "CHS",
"Create": "2020-05-14 11:00:21"
}
}
3.2調用業務接口
得到上面的Token后,我們就可以來調用業務接口返回數據了,我們以科目為例,來看一下如何獲取科目列表
請求參數:
{
"Data": {
"Top": "100",
"PageSize": "10",
"PageIndex": "1",
"Filter": "FNumber like '%003%' ",
"OrderBy": "FNumber asc",
"Fields": "FNumber,FName"
}
}
返回參數:
{
"StatusCode": 200,
"Message": "Success",
"Data": {
"ROWCOUNT": 0,
"PAGESIZE": 10,
"PAGEINDEX": 1,
"DATA": null
}
}
我們要獲取的字段為科目名稱,科目編碼,是否末級科目,科目全稱等信息。如下代碼所示
public List<AccountListModel> GetAccountList()
{
var tokenStr = GetToken();
var result = APIClient.CreateAPIOperation<GetList>(_Config.URL)
.SetObjectTypeId(OrderTypeIDConsts.科目)
.SetToken(tokenStr)
.AddFieldKey("FName")
.AddFieldKey("FNumber")
.AddFieldKey("FDetail")
.AddFieldKey("FFullName")
.ToAPIRequest().Excute<GetListResult>();
var list = new List<AccountListModel>();
if (result.StatusCode == 200)
{
list = JsonConvert.DeserializeObject<List<AccountListModel>>(result.Data.DATA.ToString());
list.ForEach(t =>
{
t.FItemDetailName = t.FAccountItem == null ? "" : string.Join(",", t.FAccountItem.Select(x => x.FItemClassName).Distinct().ToList());
});
}
return list;
}
3.3 憑證接口
憑證引入
請求示例:
請求參數:
{
"Replace": "false",
"VoucherData": {
"Entries": [
{
"FAccountName": "管經理現金",
"FAccountNumber": "1001.01",
"FAmount": 500,
"FAmountFor": 500,
"FCurrencyName": "人民幣",
"FCurrencyNumber": "RMB",
"FDC": 1,
"FEntryID": 1,
"FExchangeRate": 1,
"FExplanation": "test_s1",
"FMeasureUnit": null,
"FMeasureUnitUUID": 621,
"FQuantity": 50,
"FSettleNo": null,
"FSettleTypeName": "",
"FTransNo": "",
"FUnitPrice": 10
},
{
"FAccountName": "應收股利",
"FAccountNumber": "1131",
"FAmount": 500,
"FAmountFor": 500,
"FCurrencyName": "人民幣",
"FCurrencyNumber": "RMB",
"FDC": 0,
"FEntryID": 0,
"FExchangeRate": 1,
"FExplanation": "test97_s1",
"FMeasureUnit": null,
"FMeasureUnitUUID": 279,
"FQuantity": 50,
"FSettleNo": null,
"FSettleTypeName": "",
"FTransNo": "",
"FUnitPrice": 10
}
],
"FAttachments": 0,
"FCashier": "NONE",
"FDate": "2018-01-31",
"FExplanation": "66666",
"FGroup": "記",
"FHandler": "",
"FNumber": 19,
"FPeriod": 1,
"FPoster": "NONE",
"FPreparer": "Administrator",
"FReference": "",
"FSerialNum": 2,
"FTransDate": "2018-01-31",
"FYear": 2018
}
}
Replace為true表示修改,此時FVoucherID必傳,為要修改的憑證ID;false表示新增
public SaveVoucherResult UpdateVoucher(object model, string IsReplace)
{
var tokenStr = GetToken();
var result = APIClient.CreateAPIOperation<UpdateVoucher>(_Config.URL)
.SetObjectTypeId<UpdateVoucher>(OrderTypeIDConsts.憑證)
.SetToken(tokenStr)
.SetModel(model)
.SetReplace(IsReplace)
.ToAPIRequest().Excute<SaveVoucherResult>();
return result;
}
四.源碼下載
此部分的代碼封裝邏輯思路和K3Cloud的處理大致一致,通過APIClient的調用來處理各個接口的邏輯。
源碼下載:k3wise15.0源碼下載
微信搜索【程序猿貝塔】回復“金蝶” 即可獲取金蝶系列文章中的源代碼