.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---用户.即可正常登录到财务系统的用户名
- 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经历和生活感悟的程序员。

.NetCore对接各大财务软件凭证API——用友系列(3)的更多相关文章
- .NetCore对接各大财务软件凭证API——用友系列(1)
		一.前言 今天,我们转战用友系列的第一个产品---T+/Tplus.前两篇文章讲解分享的都是金蝶的产品,因为本身公司牵涉的业务有限,后续有金蝶其他产品的API对接业务时,会继续来分享经验. T+的AP ... 
- .NetCore对接各大财务软件凭证API——用友系列(2)
		一. 前言 今天我们继续来分析用友系列的第二个产品--U8Cloud2.5 ,apilink方式的API.官网的API文档地址如下:U8API文档 因为我们主要是凭证对接,所以使用到的模块有总账.基础 ... 
- .NetCore对接各大财务软件凭证API——金蝶系列(1)
		哈喽,又和大家见面了,虽然看文章的小伙伴不多,但是我相信总有一天,自己写的这些文章或多或少会对其他人有些帮助,让他们在相关的业务开发下能少走些弯路,那我的目的就达到了,好了,今天就正式开始我们的系列了 ... 
- winform怎么实现财务上凭证录入和打印
		序言 现如今存在的财务软件层出不穷,怎么样让自己的业务系统与财务系统相结合,往往是很多公司头痛的问题.大多数公司也没有这个能力都去开发一套属于自己的财务软件,所以只有对接像金蝶用友这类的财务软件,花费 ... 
- 常用财务软件:用友,金蝶,新中大,速达,管家婆,金算盘,远方,远光,金钥匙,润衡,浪潮,上海博科,易商,任我行,千方百剂,智管,小蜜蜂,SAP,ORACLE,SSA,QAD,MAPICS,JDE。
		常用财务软件:用友,金蝶,新中大,速达,管家婆,金算盘,远方,远光,金钥匙,润衡,浪潮,上海博科,易商,任我行,千方百剂,智管,小蜜蜂,SAP,ORACLE,SSA,QAD,MAPICS,JDE. 申 ... 
- CentOS6安装各种大数据软件 第九章:Hue大数据可视化工具安装和配置
		相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ... 
- Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)
		程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVI ... 
- 为大数据软件准备JAVA、Python环境
		环境:SUSE 11 64位 安装JAVA JDK 1.确定版本.一般都是安装最新的JDK(Java SE Development Kit).个别软件和系统需要特定版本的JDK,根据实际需要下载. 2 ... 
- CentOS6安装各种大数据软件 第四章:Hadoop分布式集群配置
		相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ... 
随机推荐
- 零起点PYTHON机器学习快速入门 PDF |网盘链接下载|
			点击此处进入下载地址 提取码:2wg3 资料简介: 本书采用独创的黑箱模式,MBA案例教学机制,结合一线实战案例,介绍Sklearn人工智能模块库和常用的机器学习算法.书中配备大量图表说明,没有枯 ... 
- 下载数据到csv中(乱码),使用numpy , pandas读取失败 解决方案
			读取数据,下载数据到 csv 文件中 allUniv 列表类型[[...],[...]] 字符集编码使用 utf-8-sig with open('文件名.csv','w',newline='',en ... 
- 使用AOP获取自定义注解的内容
			目录结构: 一:自定义注解 package org.example.annotation; import java.lang.annotation.ElementType; import java.l ... 
- Python os.chflags() 方法
			概述 os.chflags() 方法用于设置路径的标记为数字标记.多个标记可以使用 OR 来组合起来.高佣联盟 www.cgewang.com 只支持在 Unix 下使用. 语法 chflags()方 ... 
- PHP date_date_set() 函数
			------------恢复内容开始------------ 实例 返回一个新的 DateTime 对象,设置一个新的日期,然后格式化日期: <?php$date=date_create();d ... 
- 4.19 ABC F  path pass i 容斥 树形dp
			LINK:path pass i 原本想了一个点分治 yy了半天 发现重复的部分还是很难减掉 况且统计答案的时候有点ex. (点了别人的提交记录 发现dfs就过了 于是yy了一个容斥 发现可以直接减掉 ... 
- 「MoreThanJava」Day 4:面向对象基础
			「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ... 
- ORACLE常用语句:
			ORACLE常用语句: 1.首先,创建(新)用户: create user username identified by password; username:新用户名的用户名 password: 新 ... 
- Linux快速搭建C/C++开发环境
			导读:越来越多的程序员在Linux下进行C/C++的开发.本文以CentOS 7为例,教你快速搭建一个vi + gcc/g++ + Make + valgrind的开发环境. 本文字数:1500,阅读 ... 
- eclipse中启动tomcat出现错误的解决方法
			前段时间跟着老师做课设,各方面调试都没有问题.近段时间想起来,看看之前写过的代码,翻着翻着就发现启动tomcat出现了错误 错误如下: 错误原因:tomcat路径配置有问题,之前可能配置好了然后由于种 ... 
