一. 前言

由于前段时间项目比较集中,所以停更了好久,终于来到我们用友的系列产品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为会计方案.可以看到是采用分页形式来访问的,所以如果我们要一次性获取到所有的会计科目,可以采用以下方法。

  1. public AccountQueryResponse QueryAccount(string pk_subjscheme, string pageIndex, string glorgBookCode)
  2. {
  3. var request = new AccountQueryRequest();
  4. var pms = new Dictionary<string, object>();
  5. pms.Add("pk_subjscheme", pk_subjscheme);
  6. pms.Add("glorgbookcode", glorgBookCode);
  7. pms.Add("page_now", pageIndex);
  8. pms.Add("page_size", "100");
  9. request.SetPostParameters(pms);
  10. return _Client.Excute(request);
  11. }
  12. public List<U8AccountResult> GetAccountQueryResult(string pk_subjscheme, string pageIndex, string glorgBookCode)
  13. {
  14. var list = new List<U8AccountResult>();
  15. var response = QueryAccount(pk_subjscheme, pageIndex, glorgBookCode);
  16. if (response != null && response.status == "success" && response.data != null)
  17. {
  18. var result = JsonConvert.DeserializeObject<AccountQueryResult>(response.data);
  19. list = result.datas == null ? new List<U8AccountResult>() : result.datas.ToList().Select(x => new U8AccountResult
  20. {
  21. balanorient = x.accsubjParentVO.balanorient,
  22. subjcode = x.accsubjParentVO.subjcode,
  23. subjname = x.accsubjParentVO.subjname,
  24. dispname = x.accsubjParentVO.dispname,
  25. remcode = x.accsubjParentVO.remcode,
  26. subjId = x.accsubjParentVO.pk_accsubj,
  27. endflag = x.accsubjParentVO.endflag,
  28. subjectAssInfos = x.subjass == null ? new List<AccSubjectAssInfo>() : x.subjass.ToList().Select(t => new AccSubjectAssInfo
  29. {
  30. bdcode = t.bdcode,
  31. bddispname = t.bddispname,
  32. bdname = t.bdname
  33. }).ToList()
  34. }).ToList();
  35. }
  36. return list;
  37. }
  38. ///获取所有的会计科目
  39. public List<U8AccountResult> GetAllAccount(string pk_subjescheme, string glorgBookCode)
  40. {
  41. var pageNo = "1";
  42. var list = new List<U8AccountResult>();
  43. var response = QueryAccount(pk_subjescheme, pageNo, glorgBookCode);
  44. if (response != null && response.status == "success" && response.data != null)
  45. {
  46. var result = JsonConvert.DeserializeObject<AccountQueryResult>(response.data);
  47. var allCount = Math.Ceiling(Convert.ToDouble(result.allcount) / result.retcount);
  48. if (allCount >= 1)
  49. {
  50. for (int i = 1; i <= allCount; i++)
  51. {
  52. var resultList = GetAccountQueryResult(pk_subjescheme, i.ToString(), glorgBookCode);
  53. list.AddRange(resultList);
  54. }
  55. }
  56. }
  57. return list;
  58. }

allCount为总条数,retCount为当次请求的分页条数,默认最大值为100,即接口每次只能返回100条数据,超过100条的数据量,我们就要采用分页的形式来获取了。

这里,有两个隐藏的坑需要注意一下

1.如果没有打过类似“patch_会计科目查询api查询条件增加会计主体账簿编码”这样的补丁,我们无法传入会计主体账簿编码,就默认返回该集团下所有公司的会计科目,这样显然达不到我们的目的。

2.返回的会计科目中没有辅助核算明细,这对于我们传输凭证也是有影响的。所以这两个补丁,如果我们在对接的过程中发现有接口有问题,那么就要联系总部的老师帮忙打相应的补丁了.

2.7补丁下载

2.4 总账

总账模块,主要是我们的凭证传输了.

我们先来看凭证的保存,凭证保存要传入相应的凭证json串.

  1. public GL_VoucherInsertResponse InsertVoucher(List<object> models)
  2. {
  3. var request = new GL_VoucherInsertRequest();
  4. var pms = new Dictionary<string, object>();
  5. pms.Add("voucher", models);
  6. request.SetPostParameters(pms);
  7. return _Client.Excute(request);
  8. }
  9. ///凭证新增结果
  10. public List<U8GLVoucherResult> GetVoucherInsertResult(List<object> models)
  11. {
  12. var list = new List<U8GLVoucherResult>();
  13. var response = InsertVoucher(models);
  14. if (response != null && response.status == "success")
  15. {
  16. if (response.data != null && !response.data.IsNullOrEmpty())
  17. {
  18. var result = JsonConvert.DeserializeObject<List<VoucherResult>>(response.data);
  19. list = result.Select(x => new U8GLVoucherResult
  20. {
  21. explanation = x.explanation,
  22. glorgbook_code = x.glorgbook_code,
  23. glorgbook_name = x.glorgbook_name,
  24. no = x.no,
  25. pk_glorgbook = x.pk_glorgbook,
  26. pk_voucher = x.pk_voucher,
  27. totalcredit = x.totalcredit,
  28. totaldebit = x.totaldebit,
  29. pk_vouchertype = x.pk_vouchertype,
  30. vouchertype_code = x.vouchertype_code,
  31. vouchertype_name = x.vouchertype_name,
  32. prepareddate = Convert.ToDateTime(x.prepareddate),
  33. errorMsg = ""
  34. }).ToList();
  35. }
  36. }
  37. else
  38. {
  39. list.Add(new U8GLVoucherResult { errorMsg = response.errormsg });
  40. }
  41. return list;
  42. }

借贷方,凭证字主要用于我们新增后回执进行凭证记录的.

接着我们来看凭证保存的实体类.

  1. public class U8VoucherModel
  2. {
  3. /// <summary>
  4. /// 是否差异凭证
  5. /// </summary>
  6. public bool ISDIFFLAG { get; set; }
  7. /// <summary>
  8. /// 附单据数
  9. /// </summary>
  10. public string attachment { get; set; }
  11. public Detail[] details { get; set; }
  12. /// <summary>
  13. /// 凭证摘要
  14. /// </summary>
  15. public string explanation { get; set; }
  16. /// <summary>
  17. /// 凭证号
  18. /// </summary>
  19. public string no { get; set; }
  20. /// <summary>
  21. /// 公司
  22. /// </summary>
  23. public string pk_corp { get; set; }
  24. /// <summary>
  25. /// 账簿
  26. /// </summary>
  27. public string pk_glorgbook { get; set; }
  28. /// <summary>
  29. /// 制单人编码
  30. /// </summary>
  31. public string pk_prepared { get; set; }
  32. /// <summary>
  33. /// 凭证类别简称
  34. /// </summary>
  35. public string pk_vouchertype { get; set; }
  36. /// <summary>
  37. /// 制单日期
  38. /// </summary>
  39. public string prepareddate { get; set; }
  40. /// <summary>
  41. /// 凭证类型
  42. /// </summary>
  43. public int voucherkind { get; set; }
  44. }
  45. public class Detail
  46. {
  47. /// <summary>
  48. /// 原币贷方金额
  49. /// </summary>
  50. public string creditamount { get; set; }
  51. /// <summary>
  52. /// 贷方数量
  53. /// </summary>
  54. public string creditquantity { get; set; }
  55. /// <summary>
  56. /// 原币借方金额
  57. /// </summary>
  58. public string debitamount { get; set; }
  59. /// <summary>
  60. /// 借方数量
  61. /// </summary>
  62. public string debitquantity { get; set; }
  63. /// <summary>
  64. /// 分录号
  65. /// </summary>
  66. public string detailindex { get; set; }
  67. /// <summary>
  68. /// 汇率
  69. /// </summary>
  70. public string excrate1 { get; set; }
  71. /// <summary>
  72. /// 摘要
  73. /// </summary>
  74. public string explanation { get; set; }
  75. /// <summary>
  76. /// 本币贷方金额
  77. /// </summary>
  78. public string localcreditamount { get; set; }
  79. /// <summary>
  80. /// 本币借方金额
  81. /// </summary>
  82. public string localdebitamount { get; set; }
  83. /// <summary>
  84. /// 科目
  85. /// </summary>
  86. public string pk_accsubj { get; set; }
  87. /// <summary>
  88. /// 币别编码
  89. /// </summary>
  90. public string pk_currtype { get; set; }
  91. /// <summary>
  92. /// 单价
  93. /// </summary>
  94. public string price { get; set; }
  95. public Ass[] ass { get; set; }
  96. public Cashflow[] cashflow { get; set; }
  97. }
  98. public class Ass
  99. {
  100. /// <summary>
  101. /// 辅助核算类型编码
  102. /// </summary>
  103. public string checktypecode { get; set; }
  104. /// <summary>
  105. /// 辅助核算值编码
  106. /// </summary>
  107. public string checkvaluecode { get; set; }
  108. }
  109. public class Cashflow
  110. {
  111. public string cashflow_code { get; set; }
  112. public string currtype_code { get; set; }
  113. public int money { get; set; }
  114. }

2.7版本以上的api其实和2.5的差别不太大,除了请求头的参数不一样以外,各个接口的请求体参数都大致相同,且返回值的类型也一样,所以我在处理2.7版本以上的程序集封装处理时就显得没那么困难了。

上线前才发现客户的财务版本是2.7,本来不太想处理的,但是咨询了用友总部的开发老师,最后还是建议要处理,因为毕竟版本不一样,有些隐藏的东西我们可能无法预知。

所以还是建议大家,在做API开发的时候,要看清楚要对接的财务版本,可能差一个版本,就会差很多。

三.结束语

好了,u8Cloud2.7以上的api处理过程就这样愉快结束了,如果你看过上个系列的文章,会发现很多相似的地方,其实也是,毕竟都是同一个产品,只是差了2个版本一样。希望文章对你的开发过程有帮助。也希望同样做API对接的小伙伴,我们可以多多交流。祝你在开发的道路上勇往直前。

我是程序猿贝塔,一个分享自己对接过财务系统API经历和生活感悟的程序员。

.NetCore对接各大财务软件凭证API——用友系列(3)的更多相关文章

  1. .NetCore对接各大财务软件凭证API——用友系列(1)

    一.前言 今天,我们转战用友系列的第一个产品---T+/Tplus.前两篇文章讲解分享的都是金蝶的产品,因为本身公司牵涉的业务有限,后续有金蝶其他产品的API对接业务时,会继续来分享经验. T+的AP ...

  2. .NetCore对接各大财务软件凭证API——用友系列(2)

    一. 前言 今天我们继续来分析用友系列的第二个产品--U8Cloud2.5 ,apilink方式的API.官网的API文档地址如下:U8API文档 因为我们主要是凭证对接,所以使用到的模块有总账.基础 ...

  3. .NetCore对接各大财务软件凭证API——金蝶系列(1)

    哈喽,又和大家见面了,虽然看文章的小伙伴不多,但是我相信总有一天,自己写的这些文章或多或少会对其他人有些帮助,让他们在相关的业务开发下能少走些弯路,那我的目的就达到了,好了,今天就正式开始我们的系列了 ...

  4. winform怎么实现财务上凭证录入和打印

    序言 现如今存在的财务软件层出不穷,怎么样让自己的业务系统与财务系统相结合,往往是很多公司头痛的问题.大多数公司也没有这个能力都去开发一套属于自己的财务软件,所以只有对接像金蝶用友这类的财务软件,花费 ...

  5. 常用财务软件:用友,金蝶,新中大,速达,管家婆,金算盘,远方,远光,金钥匙,润衡,浪潮,上海博科,易商,任我行,千方百剂,智管,小蜜蜂,SAP,ORACLE,SSA,QAD,MAPICS,JDE。

    常用财务软件:用友,金蝶,新中大,速达,管家婆,金算盘,远方,远光,金钥匙,润衡,浪潮,上海博科,易商,任我行,千方百剂,智管,小蜜蜂,SAP,ORACLE,SSA,QAD,MAPICS,JDE. 申 ...

  6. CentOS6安装各种大数据软件 第九章:Hue大数据可视化工具安装和配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

  7. Qt加载网页(加载浏览器插件)和制作托盘后台运行(南信大财务报账看号)

    程序模块要添加QNetWork和QWebKit模块: nuistfinancevideo.h文件: #ifndef NUISTFINANCEVIDEO_H #define NUISTFINANCEVI ...

  8. 为大数据软件准备JAVA、Python环境

    环境:SUSE 11 64位 安装JAVA JDK 1.确定版本.一般都是安装最新的JDK(Java SE Development Kit).个别软件和系统需要特定版本的JDK,根据实际需要下载. 2 ...

  9. CentOS6安装各种大数据软件 第四章:Hadoop分布式集群配置

    相关文章链接 CentOS6安装各种大数据软件 第一章:各个软件版本介绍 CentOS6安装各种大数据软件 第二章:Linux各个软件启动命令 CentOS6安装各种大数据软件 第三章:Linux基础 ...

随机推荐

  1. PHP imagecolorallocatealpha - 为一幅图像分配颜色和透明度

    imagecolorallocatealpha — 为一幅图像分配颜色和透明度.高佣联盟 www.cgewang.com 语法 int imagecolorallocatealpha ( resour ...

  2. PHP exit() 函数

    实例 输出一条消息,并退出当前脚本: <?php$site = "http://www.w3cschool.cc/";fopen($site,"r")or ...

  3. 2019 7 8 HL 模拟赛

    今天 很不爽 昨天晚上没有睡好觉 大约2点才睡着吧 反正翻来覆去睡不着 不知道为什么可能可行流 或者可行费用流并没有深刻理解 .我不会写 让我心情非常的焦躁. 大凶 顺理成章的被3位强者吊着锤(妈呀我 ...

  4. SpringXMl文件不提示的解决方法

    applicationContext.xml没有提示的解决方法 1.配置spring-beans-4.1.xsd文件 (1)找到spring-beans-4.1.xsd的文件的位置,例如: (2)复制 ...

  5. Springboot使用JdbcTemplate的使用

    在spring-boot-starter-jdbc这个依赖包中一共分成四个部分. core,JdbcTemplate等相关核心接口和类 datasource,数据源相关的辅助类 object,将基本的 ...

  6. Flask框架(二):路由与蓝图

    一.路由 使用 route() 装饰器来把函数绑定到 URL: @app.route('/') def index(): return 'Index Page' @app.route("/h ...

  7. PyTorch 学习

    PyTorch torch.autograd模块 深度学习的算法本质上是通过反向传播求导数, PyTorch的autograd模块实现了此功能, 在Tensor上的所有操作, autograd都会为它 ...

  8. Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...

  9. ES6语法学习(一)-let和const

    1.let 和 const 变量提升: 在声明变量或者函数时,被声明的变量和函数会被提升到函数最顶部: 但是如果声明的变量或者函数被初始化了,则会失去变量提升: 示例代码: param2 = &quo ...

  10. vue 公众号H5 使用微信JSAPI 录音 完整齐全

    官方文档必须首当其冲 1.微信jsAPI 录音文档 2.获取微信临时素材文档 首先H5录音功能的话 对于普通H5网上是有很多的方法 插件  但是兼容性很差 特别是对于ios 一开始想的是用H5 做个通 ...