.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基础 ...
随机推荐
- PHP array_diff_assoc() 函数
实例 比较两个数组的键名和键值,并返回差集: <?php$a1=array("a"=>"red","b"=>"g ...
- Python os.fchmod() 方法
概述 os.fchmod() 方法用于改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限.高佣联盟 www.cgewang.com Unix上可用. 语法 fchmo ...
- 如何让img自动适应div容器大小
IMG样式 (横向拉伸,纵向自动匹配大小) width:100%; height:auto; (纵向拉伸,横向自动匹配大小) width:auto; height:100%; DIV样式(元素居中显示 ...
- Vue笔记(有点乱)
Vue学习笔记(2019.7.31) 目录 Vue学习笔记(2019.7.31) vue 基本指令用法 v-cloak v-text v-html v-bind v-on 跑马灯 v-on v-mod ...
- js数组常用api
数组创建 第一种,使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(10); // 创建一个包含10项的数组 ...
- scala下划线的用法
1.作为“通配符”,类似Java中的*.如import scala.math._2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是 ...
- 老哥,您看我这篇Java集合,还有机会评优吗?
集合在我们日常开发使用的次数数不胜数,ArrayList/LinkedList/HashMap/HashSet······信手拈来,抬手就拿来用,在 IDE 上龙飞凤舞,但是作为一名合格的优雅的程序猿 ...
- spring security 简介+实战
过滤器链: 依赖: security 功能列表: 一.登录验证.权限验证 1.1 httpbasic验证 1.2form验证 建立数据需要遵循RBAC模型 用户表要参考UserDetail创建 实例类 ...
- vue中一些常见的面试题
前言 一位正在学习前端的菜鸟,虽菜,但还未放弃. 内容 1,说一下vue中的指令 答: ①,v-html:主要用来渲染html节点,其作用与原生的innerHtml基本一致 ②,v-text:主要用来 ...
- 【Java】JavaMail 554错误解决方法
一.解决连续发送多次 // 构件MimeMessage 对象,并设置在发送给收信人之前给自己(发送方)抄送一份 MimeMessage msg = mailSender.createMimeMessa ...