一. 前言
由於前段時間專案比較集中,所以停更了好久,終於來到我們用友的系列產品3---U8Cloud2.7了。
一,2.7和2.5的api方式有什麼區別?
1、2.7版本以後可以直接使用u8c登入地址直接呼叫;
2、2.7版本以前的api只能走apilink上呼叫(客戶必須有公網地址),呼叫路徑如下:呼叫apilink,然後apilink呼叫客戶U8C的公網地址(沒有公網地址調不通);
二、2.7的API文件在哪?
2.7版本以及以上版本的API文件地址:http://apidoc.yyu8c.com
Ps:2.7的財務系統仍然要注意:
如果不是最新補丁的話,要記得打補丁,不然後續的科目介面會有問題。
二. API引數
2.1 遠端訪問財務系統
如果我們對接的財務系統是公有云的U8C的話,你會得到一個遠端的財務系統的地址,接著使用UClient工具進行訪問
2.2 全域性請求頭
2.7版本的請求頭和2.5的不太一樣,取消了apicode的請求方式,改為如下圖所示
如圖,固定的全域性請求頭引數有以下幾個:
1.contentType---請求資料型別 預設是 application/json
2.usercode---使用者.即可正常登入到財務系統的使用者名稱
-
password ---密碼。此處為MD5加密後
-
system --系統引數
具體的請求引數獲取方式可見附件
2.3 基礎檔案
基礎檔案,我們主要使用到的API介面有科目查詢.
會計主體賬簿編碼--我們可以從財務系統裡獲取,具體的獲取方式如下
這些引數和2.5的api介面請求引數基本上都類似。
開啟U8Client,使用正確的使用者名稱和密碼登入財務系統.在企業建模平臺--》基礎檔案--》組織機構--》會計主體 一欄,可以看到我們使用的會計主體賬簿編碼.如我們要使用的就是40001-9999
其中40001為公司編碼,9999為會計方案.可以看到是採用分頁形式來訪問的,所以如果我們要一次性獲取到所有的會計科目,可以採用以下方法。
public AccountQueryResponse QueryAccount(string pk_subjscheme, string pageIndex, string glorgBookCode)
{
var request = new AccountQueryRequest();
var pms = new Dictionary<string, object>();
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<U8AccountResult> GetAccountQueryResult(string pk_subjscheme, string pageIndex, string glorgBookCode)
{
var list = new List<U8AccountResult>();
var response = QueryAccount(pk_subjscheme, pageIndex, glorgBookCode);
if (response != null && response.status == "success" && response.data != null)
{
var result = JsonConvert.DeserializeObject<AccountQueryResult>(response.data);
list = result.datas == null ? new List<U8AccountResult>() : 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<AccSubjectAssInfo>() : x.subjass.ToList().Select(t => new AccSubjectAssInfo
{
bdcode = t.bdcode,
bddispname = t.bddispname,
bdname = t.bdname
}).ToList()
}).ToList();
}
return list;
}
///獲取所有的會計科目
public List<U8AccountResult> GetAllAccount(string pk_subjescheme, string glorgBookCode)
{
var pageNo = "1";
var list = new List<U8AccountResult>();
var response = QueryAccount(pk_subjescheme, pageNo, glorgBookCode);
if (response != null && response.status == "success" && response.data != null)
{
var result = JsonConvert.DeserializeObject<AccountQueryResult>(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串.
public GL_VoucherInsertResponse InsertVoucher(List<object> models)
{
var request = new GL_VoucherInsertRequest();
var pms = new Dictionary<string, object>();
pms.Add("voucher", models);
request.SetPostParameters(pms);
return _Client.Excute(request);
}
///憑證新增結果
public List<U8GLVoucherResult> GetVoucherInsertResult(List<object> models)
{
var list = new List<U8GLVoucherResult>();
var response = InsertVoucher(models);
if (response != null && response.status == "success")
{
if (response.data != null && !response.data.IsNullOrEmpty())
{
var result = JsonConvert.DeserializeObject<List<VoucherResult>>(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;
}
借貸方,憑證字主要用於我們新增後回執進行憑證記錄的.
接著我們來看憑證儲存的實體類.
public class U8VoucherModel
{
/// <summary>
/// 是否差異憑證
/// </summary>
public bool ISDIFFLAG { get; set; }
/// <summary>
/// 附單據數
/// </summary>
public string attachment { get; set; }
public Detail[] details { get; set; }
/// <summary>
/// 憑證摘要
/// </summary>
public string explanation { get; set; }
/// <summary>
/// 憑證號
/// </summary>
public string no { get; set; }
/// <summary>
/// 公司
/// </summary>
public string pk_corp { get; set; }
/// <summary>
/// 賬簿
/// </summary>
public string pk_glorgbook { get; set; }
/// <summary>
/// 制單人編碼
/// </summary>
public string pk_prepared { get; set; }
/// <summary>
/// 憑證類別簡稱
/// </summary>
public string pk_vouchertype { get; set; }
/// <summary>
/// 制單日期
/// </summary>
public string prepareddate { get; set; }
/// <summary>
/// 憑證型別
/// </summary>
public int voucherkind { get; set; }
}
public class Detail
{
/// <summary>
/// 原幣貸方金額
/// </summary>
public string creditamount { get; set; }
/// <summary>
/// 貸方數量
/// </summary>
public string creditquantity { get; set; }
/// <summary>
/// 原幣借方金額
/// </summary>
public string debitamount { get; set; }
/// <summary>
/// 借方數量
/// </summary>
public string debitquantity { get; set; }
/// <summary>
/// 分錄號
/// </summary>
public string detailindex { get; set; }
/// <summary>
/// 匯率
/// </summary>
public string excrate1 { get; set; }
/// <summary>
/// 摘要
/// </summary>
public string explanation { get; set; }
/// <summary>
/// 本幣貸方金額
/// </summary>
public string localcreditamount { get; set; }
/// <summary>
/// 本幣借方金額
/// </summary>
public string localdebitamount { get; set; }
/// <summary>
/// 科目
/// </summary>
public string pk_accsubj { get; set; }
/// <summary>
/// 幣別編碼
/// </summary>
public string pk_currtype { get; set; }
/// <summary>
/// 單價
/// </summary>
public string price { get; set; }
public Ass[] ass { get; set; }
public Cashflow[] cashflow { get; set; }
}
public class Ass
{
/// <summary>
/// 輔助核算型別編碼
/// </summary>
public string checktypecode { get; set; }
/// <summary>
/// 輔助核算值編碼
/// </summary>
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; }
}
2.7版本以上的api其實和2.5的差別不太大,除了請求頭的引數不一樣以外,各個介面的請求體引數都大致相同,且返回值的型別也一樣,所以我在處理2.7版本以上的程式集封裝處理時就顯得沒那麼困難了。
上線前才發現客戶的財務版本是2.7,本來不太想處理的,但是諮詢了用友總部的開發老師,最後還是建議要處理,因為畢竟版本不一樣,有些隱藏的東西我們可能無法預知。
所以還是建議大家,在做API開發的時候,要看清楚要對接的財務版本,可能差一個版本,就會差很多。
三.結束語
好了,u8Cloud2.7以上的api處理過程就這樣愉快結束了,如果你看過上個系列的文章,會發現很多相似的地方,其實也是,畢竟都是同一個產品,只是差了2個版本一樣。希望文章對你的開發過程有幫助。也希望同樣做API對接的小夥伴,我們可以多多交流。祝你在開發的道路上勇往直前。
我是程式猿貝塔,一個分享自己對接過財務系統API經歷和生活感悟的程式設計師。