正在阅读:
- 首页 » 开发运维 » 后端 » 用友U8API接口webService开发(二)
用友U8API接口webService开发(二)
新建生产品入库接口类【Productapi】,该类的主要代码即第一部分获取的示例代码,然后根据实际开发情况,对其部分逻辑进行修改,类似如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Runtime.InteropServices; //需要添加以下命名空间 using UFIDA.U8.MomServiceCommon; using UFIDA.U8.U8MOMAPIFramework; using UFIDA.U8.U8APIFramework; using UFIDA.U8.U8APIFramework.Meta; using UFIDA.U8.U8APIFramework.Parameter; using MSXML2; namespace WebApplication1 { public class Productapi { public string[] apisendinfo(List<Headlist> headlist) { string[] returnmessage = new string[2]; returnmessage[0] = "success"; returnmessage[1] = ""; U8Login.clsLogin u8Login = new U8Login.clsLogin(); String sSubId = "AS"; String sAccID = "667"; String sYear = "2019"; String sUserID = "00269"; String sPassword = "123"; String sDate = "2019-11-03"; String sServer = "10.10.10.146"; String sSerial = ""; if (!u8Login.Login(ref sSubId, ref sAccID, ref sYear, ref sUserID, ref sPassword, ref sDate, ref sServer, ref sSerial)) { Marshal.FinalReleaseComObject(u8Login); returnmessage[0] = "errror"; returnmessage[1] = "登陆失败,原因:" + u8Login.ShareString; } else { U8EnvContext envContext = new U8EnvContext(); envContext.U8Login = u8Login; U8ApiAddress myApiAddress = new U8ApiAddress("U8API/ProductIn/Add"); U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext); broker.AssignNormalValue("sVouchType", "10"); BusinessObject DomHead = broker.GetBoParam("DomHead"); DomHead.RowCount = 1; //设置BO对象(表头)行数,只能为一行 //给BO对象(表头)的字段赋值,值可以是真实类型,也可以是无类型字符串 //以下代码示例只设置第一行值。各字段定义详见API服务接口定义 // returnmessage = headlist[0].ddate+headlist[0].iproorderid+headlist[0].cmpocode+headlist[0].cprobatch+headlist[0].cbustype; DomHead[0]["bWireless"] = "1"; DomHead[0]["ccode"] = headlist[0].ccode; //入库单号,string类型,单号不允许为空,当单据号重复时,导入U8,U8自动生成新单号 DomHead[0]["ddate"] = headlist[0].ddate; //入库日期,DateTime类型,AGV // DomHead[0]["cwhname"] = "自制成品仓-新"; //仓库,string类型,AGV // DomHead[0]["csysbarcode"] = "||st10|0000000016"; //单据条码,string类型,||ST10|入库单据号 //非必输项 DomHead[0]["iproorderid"] = headlist[0].iproorderid; //生产订单ID,string类型,AGV DomHead[0]["cmpocode"] = headlist[0].cmpocode; //生产订单号,string类型,AGV DomHead[0]["cprobatch"] = headlist[0].cprobatch; //生产批号,string类型,AGV DomHead[0]["cbustype"] = headlist[0].cbustype; //业务类型,int类型,默认固定 DomHead[0]["cvouchtype"] = headlist[0].cvouchtype; //单据类型,string类型,默认固定 DomHead[0]["cwhcode"] = headlist[0].cwhcode; //仓库编码,string类型,AGV DomHead[0]["crdcode"] = headlist[0].crdcode; //入库类别编码,string类型,默认固定 DomHead[0]["cdepcode"] = headlist[0].cdepcode; //部门编码,string类型,暂时默认(生产订单-部门) DomHead[0]["cmaker"] = headlist[0].cmaker; //制单人,string类型,暂时默认AGV登陆人, DomHead[0]["csource"] = headlist[0].csource; //单据来源,int类型(库存:1,值等于1时,U8前台界面不允许删除) DomHead[0]["vt_id"] = headlist[0].vt_id; //模版号,int类型 ,默认固定 BusinessObject domBody = broker.GetBoParam("domBody"); domBody.RowCount = headlist[0].bodylist.Length; //设置BO对象行数 for (int i = 0; i < headlist[0].bodylist.Length; i++) { domBody[i]["cinvcode"] = headlist[0].bodylist[i].cinvcode; //产品编码,string类型,AGV domBody[i]["editprop"] = headlist[0].bodylist[i].editprop; //编辑属性:A表新增,M表修改,D表删除,string类型,默认固定 // domBody[0]["cinvouchtype"] = "101"; //对应产成品入库单类型,string类型 domBody[i]["cbsysbarcode"] = headlist[0].bodylist[i].cbsysbarcode; //单据行条码,string类型,||st10|入库单号|行号 domBody[i]["cbmemo"] = headlist[0].bodylist[i].cbmemo; //备注,string类型,AGV,预留字段 domBody[i]["irowno"] = i; //行号,string类型,循环时默认 //非必输项 domBody[i]["cposition"] = headlist[0].bodylist[i].cposition; //货位编码,string类型,AGV domBody[i]["cbatch"] = headlist[0].bodylist[i].cbatch; //批号,string类型,AGV domBody[i]["iquantity"] = headlist[0].bodylist[i].iquantity; //数量,double类型,AGV domBody[i]["cdefine22"] = headlist[0].bodylist[i].cdefine22; //表体自定义项1,string类型,AGV domBody[i]["cmolotcode"] = headlist[0].bodylist[i].cmolotcode; //生产批号,string类型,AGV domBody[i]["impoids"] = headlist[0].bodylist[i].impoids; //生产订单子表ID,int类型,AGV domBody[i]["cmocode"] = headlist[0].bodylist[i].cmocode; //生产订单号,string类型,AGV domBody[i]["imoseq"] = headlist[0].bodylist[i].imoseq; //生产订单行号,string类型,string类型,AGV // tr2 = headlist[0].bodylist[i].cinvcode; } //给普通参数domPosition赋值。此参数的数据类型为System.Object,此参数按引用传递,表示货位:传空 // broker.AssignNormalValue("domPosition", new System.Object()); broker.AssignNormalValue("domPosition", String.Empty); //该参数errMsg为OUT型参数,由于其数据类型为System.String,为一般值类型,因此不必传入一个参数变量。在API调用返回时,可以通过GetResult("errMsg")获取其值 //给普通参数cnnFrom赋值。此参数的数据类型为ADODB.Connection,此参数按引用传递,表示连接对象,如果由调用方控制事务,则需要设置此连接对象,否则传空 // broker.AssignNormalValue("cnnFrom", new ADODB.Connection()); // broker.AssignNormalValue("cnnFrom", String.Empty); //该参数VouchId为INOUT型普通参数。此参数的数据类型为System.String,此参数按值传递。在API调用返回时,可以通过GetResult("VouchId")获取其值1000003068 // broker.AssignNormalValue("VouchId", new System.String()); broker.AssignNormalValue("VouchId", String.Empty); //该参数domMsg为OUT型参数,由于其数据类型为MSXML2.IXMLDOMDocument2,非一般值类型,因此必须传入一个参数变量。在API调用返回时,可以直接使用该参数 // MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.IXMLDOMDocument2(); MSXML2.IXMLDOMDocument2 domMsg = new MSXML2.DOMDocument(); broker.AssignNormalValue("domMsg", domMsg); //给普通参数bCheck赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否控制可用量。 //broker.AssignNormalValue("bCheck", new System.Boolean()); broker.AssignNormalValue("bCheck", false); //给普通参数bBeforCheckStock赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示检查可用量 // broker.AssignNormalValue("bBeforCheckStock", new System.Boolean()); broker.AssignNormalValue("bBeforCheckStock", false); //给普通参数bIsRedVouch赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否红字单据 //broker.AssignNormalValue("bIsRedVouch", new System.Boolean()); broker.AssignNormalValue("bIsRedVouch", false); //给普通参数sAddedState赋值。此参数的数据类型为System.String,此参数按值传递,表示传空字符串 // broker.AssignNormalValue("sAddedState", new System.String()); broker.AssignNormalValue("sAddedState", String.Empty); //给普通参数bReMote赋值。此参数的数据类型为System.Boolean,此参数按值传递,表示是否远程:转入false broker.AssignNormalValue("bReMote", false); //第六步:调用API //try{ if (!broker.Invoke()) { //错误处理 Exception apiEx = broker.GetException(); if (apiEx != null) { if (apiEx is MomSysException) { MomSysException sysEx = apiEx as MomSysException; Console.WriteLine("系统异常:" + sysEx.Message); returnmessage[0] = "errror"; returnmessage[1] = ("系统异常:" + sysEx.Message); //todo:异常处理 } else if (apiEx is MomBizException) { MomBizException bizEx = apiEx as MomBizException; Console.WriteLine("API异常:" + bizEx.Message); returnmessage[0] = "errror"; returnmessage[1] = ("API异常:" + bizEx.Message); //todo:异常处理 } //异常原因 String exReason = broker.GetExceptionString(); if (exReason.Length != 0) { Console.WriteLine("异常原因:" + exReason); returnmessage[0] = "errror"; returnmessage[1] = ("异常原因:" + exReason); } } //结束本次调用,释放API资源 broker.Release(); //return "error"; } //第七步:获取返回结果 //获取返回值 //获取普通返回值。此返回值数据类型为System.Boolean,此参数按值传递,表示返回值:true:成功,false:失败 System.Boolean result = Convert.ToBoolean(broker.GetReturnValue()); //获取out/inout参数值 //获取普通OUT参数errMsg。此返回值数据类型为System.String,在使用该参数之前,请判断是否为空 System.String errMsgRet = broker.GetResult("errMsg") as System.String; //获取普通INOUT参数VouchId。此返回值数据类型为System.String,在使用该参数之前,请判断是否为空 System.String VouchIdRet = broker.GetResult("VouchId") as System.String; //获取普通OUT参数domMsg。此返回值数据类型为MSXML2.IXMLDOMDocument2,在使用该参数之前,请判断是否为空 // MSXML2.IXMLDOMDocument2 domMsgRet = Convert.ToObject(broker.GetResult("domMsg")); IXMLDOMDocument2 domMsgRet = (MSXML2.IXMLDOMDocument2)broker.GetResult("domMsg"); if (result) { returnmessage[1] = ("推送成功!"); } else { returnmessage[0] = "error"; returnmessage[1] = ("errMsgRet" + errMsgRet); } // returnmessage = ("VouchIdRet" + VouchIdRet); //结束本次调用,释放API资源 broker.Release(); } // MessageBox.Show(returnmessage); return returnmessage; } } }
至此,一个接口基本开发完成,具体调试,需要根据实际开发环境调试,这里只做部分演示。
4.注意事项
1) 项目工具引用
在整个开发过程中,用到了部分项目引用,如 webService接口文件中,用到了【Newtonsoft.Json.Linq】【System.Runtime.Serialization】【System.ServiceModel】等,这些引用需要手动添加
右击应用,点击【添加引用】,需要的基本都在.NET中可以找到,或者外部添加等。
2)U8api必要引用
在API类中,使用到的U8类库,需要根据示例代码中,顶部的提示,将这些类库文件,引用到本项目中
以下作为参考。
//添加对Interop.U8Login.dll引用(在U8SOFT\Interop目录)
//添加对Interop.MSXML2.dll引用(在U8SOFT\Interop目录)
//添加对U8API框架三个类库引用(在U8SOFT\UFMOM\U8APIFramework目录):
//UFIDA.U8.U8APIFramework.dll
//UFIDA.U8.MomServiceCommon.dll
//UFIDA.U8.U8MOMAPIFramework.dll
将对应版本的免登陆dll 替换
如当前 U8版本为 12.5,那么 替换相关登陆DLL文件
UFSoft.U8.Framework.Login.UI.dll需要替换到u8soft\framework文件夹下
//如果是非门户的独立进程,请将U8SOFT\ufcomsql目录中的U8Login.dll替换为Debug版的Login
5.代码发布
右击项目选择发布或者点击菜单栏顶部生成-发布
将发布后的文件,使用IIS进行部署。
该日志由 bemender 于 2022年12月01日 发表
转载请注明文本地址:https://www.bemhome.com/post/173.html