一、需求背景
1、需要将我司的OA审批系统与ERP打通,对于某个业务单据,在OA审批通过后,自动执行U8 API接口完成自动创建业务单据创建,而非人工再去创建。
二、技术实现
1、可以通过直接更新U8的数据库实现,但是ERP是一个庞大的系统,对于业务表直接去做更新新增动作,如果不是对于所有数据表以及ERP的运行逻辑非常熟悉,可能会导致数据不一致等等一系列问题。
2、通过OpenAPI的形式去实现,直接各种后端语言包括JAVA,去官网申请开发者账号。
3、通过调用U8内部API接口实现,仅支持C#后端语言,不支持JAVA
4、本文中仅演示第三种实现方式,因为笔者只会C#...
5、据我查看OpenAPI文档和U8 内部API文档发现,后者支持的API是少于前者的。可以根据实际情况自行选择实现方法。
比如新增存货档案,U8内部API文档内是没有提供的,OPEN API有提供。
三、调用U8内部API,项目配置细节
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文档
这块儿可以使用U8官方提供的软件:安装完U8后开始菜单有一个用友文件夹,下面有一个API资源管理器,打开后就和登陆U8一样。
打开资源管理器,随便选一个模块,下面有服务接口,随便选一个就能看到官方提供的代码样例。
这个样例的API接口是什么可以在官方提供的代码样例里面找到
如果你填入的API,是官方文档里面没有的,那么就会报错。
网上你能找到的所有教程都是基于官网API文档的。很多老屌都是卖课,不会告诉你这里可以看到文档。
四、代码实现
1、调用不同的API步骤会有略微差异,但是关键步骤都是一样的。
差异部分主要是传入的参数、是GET还是POST。
不同API具体怎么实现,可以查看官方文档,官方文档代码样例非常清除。
2、下面以查询物料清单为例
//需要添加以下命名空间using UFIDA.U8.MomServiceCommon;using UFIDA.U8.U8MOMAPIFramework;using UFIDA.U8.U8APIFramework;using UFIDA.U8.U8APIFramework.Meta;using UFIDA.U8.U8APIFramework.Parameter;using MSXML2;using System;namespace Test{ internal class Program { static void Main(string[] args) { //第一步:登陆 U8Login.clsLogin u8Login = new U8Login.clsLogin(); String sSubId = "AS"; String sAccID = "001"; //账套编码 String sYear = "2023"; //当前年 String sUserID = "26"; //工号 String sPassword = "202305"; //密码 String sDate = "2023-06-06"; //当前日期 String sServer = "10.100.100.99"; //IP地址 String sSerial = ""; //一般不填 var res = u8Login.Login(sSubId, sAccID, sYear, sUserID, sPassword, sDate, sServer, sSerial); //登陆,返回值是bool,true代表成功 //第二步:构造环境上下文对象,传入login,并按需设置其它上下文参数 U8EnvContext envContext = new U8EnvContext(); envContext.U8Login = u8Login; //第三步:设置API地址标识(Url) U8ApiAddress myApiAddress = new U8ApiAddress("U8API/BOM/BomLoad"); //第四步:构造APIBroker U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext); //第五步:API参数赋值 broker.AssignNormalValue("partid", 1000130763); //物料ID broker.AssignNormalValue("bomtype", 1); //BOM类型(1主/2替代) broker.AssignNormalValue("versionoridencode", "10"); //主版本或替代标识 //第六步:异常处理 if (!broker.Invoke()) { //错误处理 Exception apiEx = broker.GetException(); if (apiEx != null) { if (apiEx is MomSysException) { MomSysException sysEx = apiEx as MomSysException; Console.WriteLine("系统异常:" + sysEx.Message); //todo:异常处理 } else if (apiEx is MomBizException) { MomBizException bizEx = apiEx as MomBizException; Console.WriteLine("API异常:" + bizEx.Message); //todo:异常处理 } //异常原因 String exReason = broker.GetExceptionString(); if (exReason.Length != 0) { Console.WriteLine("异常原因:" + exReason); } } //结束本次调用,释放API资源 broker.Release(); return; } //第七步:获取返回结果 System.Boolean result = Convert.ToBoolean(broker.GetReturnValue()); System.String returnValueRet = broker.GetResult("returnValue") as System.String; broker.Release(); //释放API资源 //第八步:处理返回的结果数据 ,参考官方文档代码。 } }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。