用友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中可以找到,或者外部添加等。

image.png

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

image.png

5.代码发布

右击项目选择发布或者点击菜单栏顶部生成-发布

image.png

将发布后的文件,使用IIS进行部署。

qrcode