Java调用U8标准API的那些事儿
业务背景
甲方提出需求,在MES系统中,回写数据到ERP系统中,并且,要实现ERP中的出库单要
能参照领料单生成,即不同单据之间,要有关联性
U8API?
虽然但是,U8API完全没听过,连概念都没听过,怎么搞?于是在网上查阅了大量的资料,整理了下面的内容。
难点分析
- U8API是什么?如何操作U8API? 有哪几种方式操作U8API? 各自对应的业务场景又是什么?
- U8API能保证单据之间的关联性吗?
- java如何调用U8API? http请求的方式?
下面逐一分析上面提到的难点
U8API的介绍
首先介绍下U8,U8API当然是基于U8这个平台的
U8是用友公司的一款ERP管理软件,一般部署在公司的内网中
那U8API其实就是一种操作U8的方式,具体来说就是,U8提供了一种方式(接口)来把数据写入U8平台的数据库。将数据写入U8的方式有多种,如下:
官方接口
1、OPENAPI
第三方系统部署在外网(互联网)与 U8 对接的场景。 限制:做不了上下游关联生单,比如采购入库单无法关联采购到货单;不支持事务。 优势:安全、接口定义面向消费者,使用相对最简单。数据标准:json,协议:https 安全性:接口调用需授权,企业对接口访问有完全控制权。
2、API
在API资源管理器中12.5后需要授权,第三方系统部署在内网,与 U8 服务器可以直接连接。 限制:开发的应用需要部署在装有 U8 的电脑上。 优势:可做上下游关联生单,性能最好,支持事务。 数据标准:开放语言中的对象类型 协议:无,直接 dll 引入调用 安全性:内网系统间对接安全性要求通常比较低
3、EAI
第三方系统部署在内网,与 U8 服务器可以直接连接。 限制:做不了上下游关联生单,比如采购入库单无法关联采购到货单;不支持事务。 优势:使用复杂度在 openapi 与 api 之间。数据标准:xml。协议:http。安全性:内网系统间对接安全性要求通常比较低
sql语句
可以通过直接更新U8的数据库实现,但是ERP是一个庞大的系统,对于业务表直接去做更新新增动作,如果不是对于所有数据表以及ERP的运行逻辑非常熟悉,可能会导致数据不一致等等一系列问题。
通过以上内容,可以看出,U8API是可以实现单据关联的,所以接下来就是java如何调用U8API的问题了
Java如何调用U8API
首先,明确一点,java是不能直接调用U8API的,当然这和U8部署在内网没关系,U8API是基于C#开发的,需要引用特定的DLL依赖而这些DLL依赖并没有对应的jar包依赖,所以java是没办法直接调用U8API的(我在前期不知道这一点,浪费了一天时间)。那业务怎么开展呢?很简单,找一个C#开发的人,把U8API封装下,对外保暴露服务接口,给第三方的系统调用。
总体思路
- C#二开U8API,对外暴露接口,给第三方系统调用(http请求)
- java调用C#提供的接口,传递业务是数据
于是,业务正式开展了…
C#二开U8API环境的搭建
1 框架选择:使用.NET Framework
- 切记不要使用.NET CORE 6、5这种新框架,因为项目需要调用用友提供的DLL文件,文件里面很多代码都是.NET Framework特有的,使用.NET CORE会跑不起来。
- 比如构造APIBroker,底层代码会执行:System.Activator.GetObject(),这个方法是.NET Framework特有
2 项目平台选择:X86
- 默认是Any CPU,切记不要使用Any CPU
- 不使用X86,即使有些DLL已经在项目中引用,也会报错找不到某些DLL
3 需要引用的DLL
-
注意:所有的DLL必须引用U8安装文件夹内的(D:U8SOFT),不能复制出来再引用,这种也会报错!
-
注意观察图片中所有DLL的路径!
4 Interop.MSXML2的嵌入互操作改成False
5 参考U8内部API文档
注意,U8API的文档不完全正确,遇到的问题会有很多,这里简单说明,下面的内容会总结我的同事遇到的问题
C#调用U8API遇到的错误
1 文档中login的dll文件替换
如果是非门户的独立进程,请将U8SOFT\ufcomsql目录中的U8Login.dll替换为Debug版的Login。
对于这个问题,我们通过甲方,向U8的客服提问了,他们给出的回复是
高版本的U8不需要替换dll文件了,我们的版本是U816+,只需要修改注册表,就可以了
2 关于示例代码中获取U8 login对象参数的问题
没有注释,所以我们也不知道这个字段的含义,踩了许多坑…
//第一步:构造u8login对象并登陆(引用U8API类库中的Interop.U8Login.dll)
//如果当前环境中有login对象则可以省去第一步
U8Login.clsLogin u8Login = new U8Login.clsLogin();
String sSubId = "AS"; //根据U8API文档来,是什么,就是什么,不要改
String sAccID = "(default)@888"; //这个是账套号,注意888是示例,具体的账套号,要根据实际情况,但是要带上前面的内容,(default)@ 或者 default@
String sYear = "2008";//年份
String sUserID = "demo";//登录U8平台的账号密码,注意不是账套号里面的账号密码
String sPassword = ""; //登录U8平台的账号密码,注意不是账套号里面的账号密码
String sDate = "2008-11-11";//日期
String sServer = "localhost"; //这里应该是U8API保存数据的数据库的地址,而不是U8服务的地址,当然如果U8API的数据库地址和U8在同一台电脑,就是本地地址。这里很容易被误导,认为是U8的服务器地址
String sSerial = "";//给空
3 U8登录对象的问题
每次调用U8PAI,就需要获取一个新的U8登录对象,不能把这个登录对象作为全局变量使用
4 关于U8API文档中必填字段的说明
不准确,有些U8API的接口必填字段,不一定是必填;非必填的,可能是必填的字段,需要结合具体的接口来。反正如果在只是按照文档传必填参数的话,多半会报错
ERP验证上下游单据的关联性
需要到ERP系统中,具体操作,例如在出库单的界面,点击新增,看是否能显示我们使用U8API插入的领料单
总结
写这个业务,浪费了很多时间,其实总体的难度并不大,只是官方关于二开的资料太少,导致在写代码的时候,报各种错误。最好的方式,找一个U8的客服,问清楚U8API二开的具体步骤,以及注意事项。遇到实在是解决不了的问题,就直接向U8的客服提问,让他们来回答(找甲方要一个账号,去官网论坛提问)
参考链接
- 简书 https://www.jianshu.com/p/26a16e515e00
- CSDN https://blog.csdn.net/wyqihsj/article/details/109137339