1. 程式人生 > >.NetCore對接各大財務軟體憑證API——用友系列(2)

.NetCore對接各大財務軟體憑證API——用友系列(2)

## 一. 前言 今天我們繼續來分析用友系列的第二個產品--U8Cloud2.5 ,apilink方式的API.官網的API文件地址如下:[U8API文件](https://api.yonyoucloud.com/#/api) 因為我們主要是憑證對接,所以使用到的模組有總賬、基礎檔案這兩個模組。 Ps:2.5的財務系統如果不是最新補丁的話,要記得打補丁,不然後續的科目介面會有問題。 ## 二. API引數 ### 2.1 遠端訪問財務系統 如果我們對接的財務系統是公有云的U8C的話,你會得到一個遠端的財務系統的地址,接著使用UClient工具,即 通過整合友戶通,為企業應用提供了統一的單點登陸支援,支援CA登陸、簡訊登陸、使用者名稱/密碼登陸,支援企業使用者系統與友戶通進行繫結,實現統一的使用者登陸服務 的這麼一個工具。 具體的新增應用的步驟為 ![](https://img2020.cnblogs.com/blog/1447233/202006/1447233-20200610165759984-830244137.png) ### 2.2 全域性請求頭 首先,我們必須要在網站內註冊賬號,API集市上有各個介面的詳細說明,我們需要獲取一個apicode引數,每個API模組在點選購買後系統會自動分配該模組的apicode,所以這也就是我們需要兩個不同的apicode. 基本上U8cloud2.5的版本介面,需要涉及到的請求引數就是這個了,接著我們就可以愉快的進行開發工作了。 ![](https://img2020.cnblogs.com/blog/1447233/202006/1447233-20200610165815368-1162218944.png) 如圖,固定的全域性請求頭引數有以下幾個: 1.authoration--驗證方式;預設是apicode 2.apicode---模組的apicode.也就是我們上文中購買模組後得到的引數. 3.system---系統型別. 1---測試. 2---正式. 4.trantype--翻譯型別; 預設為code.即採用編碼模式. ### 2.3 基礎檔案 基礎檔案,我們主要使用到的API介面有科目查詢. ![](https://img2020.cnblogs.com/blog/1447233/202006/1447233-20200610165832343-458582998.png) 會計主體賬簿編碼--我們可以從財務系統裡獲取,具體的獲取方式如下 開啟U8Client,使用正確的使用者名稱和密碼登入財務系統.在企業建模平臺--》基礎檔案--》組織機構--》會計主體 一欄,可以看到我們使用的會計主體賬簿編碼.如我們要使用的就是40001-9999 其中40001為公司編碼,9999為會計方案.可以看到是採用分頁形式來訪問的,所以如果我們要一次性獲取到所有的會計科目,可以採用以下方法。 ```c# public AccountQueryResponse QueryAccount(string pk_subjscheme, string pageIndex, string glorgBookCode) { var request = new AccountQueryRequest(); var pms = new Dictionary(); pms.Add("pk_subjscheme", pk_subjscheme); pms.Add("glorgbookcode", glorgBookCode); pms.Add("page_now", pageIndex); pms.Add("page_size", "100"); request.SetPostParameters(pms); return _Client.Excute(request); } public List GetAccountQueryResult(string pk_subjscheme, string pageIndex, string glorgBookCode) { var list = new List(); var response = QueryAccount(pk_subjscheme, pageIndex, glorgBookCode); if (response != null && response.status == "success" && response.data != null) { var result = JsonConvert.DeserializeObject(response.data); list = result.datas == null ? new List() : result.datas.ToList().Select(x => new U8AccountResult { balanorient = x.accsubjParentVO.balanorient, subjcode = x.accsubjParentVO.subjcode, subjname = x.accsubjParentVO.subjname, dispname = x.accsubjParentVO.dispname, remcode = x.accsubjParentVO.remcode, subjId = x.accsubjParentVO.pk_accsubj, endflag = x.accsubjParentVO.endflag, subjectAssInfos = x.subjass == null ? new List() : x.subjass.ToList().Select(t => new AccSubjectAssInfo { bdcode = t.bdcode, bddispname = t.bddispname, bdname = t.bdname }).ToList() }).ToList(); } return list; } ///獲取所有的會計科目 public List GetAllAccount(string pk_subjescheme, string glorgBookCode) { var pageNo = "1"; var list = new List(); var response = QueryAccount(pk_subjescheme, pageNo, glorgBookCode); if (response != null && response.status == "success" && response.data != null) { var result = JsonConvert.DeserializeObject(response.data); var allCount = Math.Ceiling(Convert.ToDouble(result.allcount) / result.retcount); if (allCount >= 1) { for (int i = 1; i <= allCount; i++) { var resultList = GetAccountQueryResult(pk_subjescheme, i.ToString(), glorgBookCode); list.AddRange(resultList); } } } return list; } ``` allCount為總條數,retCount為當次請求的分頁條數,預設最大值為100,即介面每次只能返回100條資料,超過100條的資料量,我們就要採用分頁的形式來獲取了。 這裡,有兩個隱藏的坑需要注意一下 1.如果沒有打過類似“patch_會計科目查詢api查詢條件增加會計主體賬簿編碼”這樣的補丁,我們無法傳入會計主體賬簿編碼,就預設返回該集團下所有公司的會計科目,這樣顯然達不到我們的目的。 2.返回的會計科目中沒有輔助核算明細,這對於我們傳輸憑證也是有影響的。所以這兩個補丁,如果我們在對接的過程中發現有介面有問題,那麼就要聯絡總部的老師幫忙打相應的補丁了. ### 2.4 總賬 總賬模組,主要是我們的憑證傳輸了. 我們先來看憑證的儲存,憑證儲存要傳入相應的憑證json串. ```c# public GL_VoucherInsertResponse InsertVoucher(List models) { var request = new GL_VoucherInsertRequest(); var pms = new Dictionary(); pms.Add("voucher", models); request.SetPostParameters(pms); return _Client.Excute(request); } ///憑證新增結果 public List GetVoucherInsertResult(List models) { var list = new List(); var response = InsertVoucher(models); if (response != null && response.status == "success") { if (response.data != null && !response.data.IsNullOrEmpty()) { var result = JsonConvert.DeserializeObject>(response.data); list = result.Select(x => new U8GLVoucherResult { explanation = x.explanation, glorgbook_code = x.glorgbook_code, glorgbook_name = x.glorgbook_name, no = x.no, pk_glorgbook = x.pk_glorgbook, pk_voucher = x.pk_voucher, totalcredit = x.totalcredit, totaldebit = x.totaldebit, pk_vouchertype = x.pk_vouchertype, vouchertype_code = x.vouchertype_code, vouchertype_name = x.vouchertype_name, prepareddate = Convert.ToDateTime(x.prepareddate), errorMsg = "" }).ToList(); } } else { list.Add(new U8GLVoucherResult { errorMsg = response.errormsg }); } return list; } ``` 借貸方,憑證字主要用於我們新增後回執進行憑證記錄的. 接著我們來看憑證儲存的實體類. ```c# public class U8VoucherModel { /// /// 是否差異憑證 ///
public bool ISDIFFLAG { get; set; } /// /// 附單據數 /// public string attachment { get; set; } public Detail[] details { get; set; } /// /// 憑證摘要 /// public string explanation { get; set; } /// /// 憑證號 /// public string no { get; set; } /// /// 公司 ///
public string pk_corp { get; set; } /// /// 賬簿 /// public string pk_glorgbook { get; set; } /// /// 制單人編碼 /// public string pk_prepared { get; set; } /// /// 憑證類別簡稱 /// public string pk_vouchertype { get; set; } /// /// 制單日期 ///
public string prepareddate { get; set; } /// /// 憑證型別 /// public int voucherkind { get; set; } } public class Detail { /// /// 原幣貸方金額 /// public string creditamount { get; set; } /// /// 貸方數量 /// public string creditquantity { get; set; } /// /// 原幣借方金額 /// public string debitamount { get; set; } /// /// 借方數量 /// public string debitquantity { get; set; } /// /// 分錄號 /// public string detailindex { get; set; } /// /// 匯率 /// public string excrate1 { get; set; } /// /// 摘要 /// public string explanation { get; set; } /// /// 本幣貸方金額 /// public string localcreditamount { get; set; } /// /// 本幣借方金額 /// public string localdebitamount { get; set; } /// /// 科目 /// public string pk_accsubj { get; set; } /// /// 幣別編碼 /// public string pk_currtype { get; set; } /// /// 單價 /// public string price { get; set; } public Ass[] ass { get; set; } public Cashflow[] cashflow { get; set; } } public class Ass { /// /// 輔助核算型別編碼 /// public string checktypecode { get; set; } /// /// 輔助核算值編碼 /// public string checkvaluecode { get; set; } } public class Cashflow { public string cashflow_code { get; set; } public string currtype_code { get; set; } public int money { get; set; } } ``` 整個憑證對接下來,其實坑不是很多,主要在於前期介面文件的研究,引數的獲取以及測試介面連通性上面. ## 三.結束語 希望文章能在你開發API介面對接的路上一些幫助和解疑,也希望同樣做API對接的小夥伴,我們可以多多交流。祝你在開發的道路上勇往直前。 我是程式猿貝塔,一個分享自己對接過財務系統API經歷和生活感悟的程式設計師。 ![](https://img2020.cnblogs.com/blog/1447233/202006/1447233-20200610165721015-18483736