zoukankan      html  css  js  c++  java
  • .NetCore对接各大财务软件凭证API——用友系列(3)

    一. 前言

    由于前段时间项目比较集中,所以停更了好久,终于来到我们用友的系列产品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---用户.即可正常登录到财务系统的用户名

    1. password ---密码。此处为MD5加密后

    2. system --系统参数

    具体的请求参数获取方式可见附件

    api请求头参数详情

    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.7补丁下载

    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经历和生活感悟的程序员。

  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/wnxyz8023/p/13572012.html
Copyright © 2011-2022 走看看