用友和畅捷通软件U8、T6《企业应用集成(EAI)》基础档案和凭证导出导入之开发

[文章] 浏览(66)  | 2018年11月17日  | 支持服务 | 
[标签]软件使用,软件开发,U8,T3T6

用友和畅捷通软件与用友其他产品、外部第三方软件产品之间的数据交换问题,采用XML数据交换格式,为用户提供《企业应用集成(EAI)》工具。

根据我们为客户开发应用第三方软件实现数据交换的经验,本文主要介绍“Web Interface (ASP)”实现方法。

EAI实现数据交换主要步骤

一、定义“注册编码”与账套关联。

1、EAI接口设置
1.1 EAI基本设置

U8服务器:指向提供EAI服务的服务器,通常是U8系统服务器

EAI登录身份验证:在EAI服务器上操作EAI时的身份,操作导入、导出、交换等功能

EAI数据源:指定EAI元数据存放在哪一账套中。注意:通常不改变!

【EAI接口设置】

必须绑定“EAI数据源”(即,套账)

1.2 外部系统注册 EAI注册号关联账套号

系统编码(也称之为“注册编码”,本文统一称为EAI注册号)与账套关联。换言之,需要对多个账套操作,就设置多个EAI注册号

在外部,直接使用EAI注册号对账套导入、导出、查询。

风险提示,得EAI注册号就可操作对应的账套!

1.3测验

浏览器地址栏输入并回车

http://EAI服务器名或IP/u8eai/import.asp

返回信息:正常

 

二、企业应用集成EAI

1、系统注册

与“外部系统注册”是一致的。【企业应用集成】

如果使用外部系统执行导入、导出、查询,至此设置完毕。

2、数据交换
2.1 数据映射

建立部编码和名称与部编码和名称对应关系,一对一,也可以多对一,即内部必须唯一。

导入导出设置:设置每个具体项目的导入、导出文件的存放路径及导出数据的过滤条件,在以后的数据交换时系统按照预设的条件进行操作。

2.2 数据交换

按“导入导出设置”导入导出。数据导入和导出工作的执行由数据交换功能完成,可以一次导入或导出多种数据类型。

比如,“执行”后,将2018-10-31凭证50号导出为xml文件,存放在“E:\EAI测试”文件夹

3、数据交换计划

可以设置数据交换的计划,以便实现在无人值守的情况下,系统按您预先设置的计划自动进行数据交换。

在使用EAI数据交换计划时必须先配置EAI接口设置。

3.1 数据交换计划设置

用户可以设置数据交换的计划,以便实现在无人值守的情况下,系统按您预先设置的计划自动进行数据交换。一个注册系统的一个数据类型可以设置多个计划。

您可根据按年、按月、按星期、按日等方式设置各计划的数据交换执行规则,且可设定数据交换时是否按照数据映射关系执行。

3.2 数据交换计划执行

数据交换计划执行功能用于执行用户已设置的数据交换计划,以便实现在无人值守的情况下,系统按您预先设置的计划自动进行数据交换。

三、EAI二次开发

1、EAI二次开发模式

1.1 【通过EAI工具】

在开始菜单中选择 用友U8企业应用集成(EAI)à企业应用集成,登录企业应用集成主界面。在这里可以将U8数据以标准XML文件的形式导出或将标准XML数据文件导入U8系统。二次开发程序员只需编写一个工具将标准XML数据文件进行适当转换写入外部系统或取出外部系统数据写成标准XML数据文件。(参考EAI安装目录\xml\Samples\下的例子)。

处理流程如下:

1.2 【本地调用EAI接口】

处理流程如下:

这种方式可根据开发者的需要批量处理或者实时处理。接口调用非常简单,简化了编程。开发者只需将标准数据传入接口。

类库:U8Distribute.DLL

ProgID:U8Distribute.iDistribute

VB代码示例:
Dim obj as Object
Dim strRet as string
Set Obj=CreateObject(U8Distribute.iDistribute)
strRet =obj. Process(sXml)   

可以根据回执内容strRet对操作结果进行相应的处理。

传入参数sXml和返回结果strRet为标准XML数据串,具体格式后面会说明。

C#代码示例:

方法:String Process(String RequestXml)

参数:RequestXml?数据交换请求消息,详见数据交换格式定义。

            返回值?数据交换Response消息,详见数据交换格式定义。

1.3 【远程调用EAI接口】

处理流程如下:

EAI远程数据交换采用XmlHttp POST的方式。接口为:

POST上传:数据交换请求消息与本地调用一样,详见数据交换格式定义。

Response接收:数据交换响应消息与本地调用一样,详见数据交换格式定义。

2、EAI数据交换格式】          
2.1 数据交换消息总体格式

EAI数据交换消息格式分为框架和内容两部分:

<ufinterface sender="002" receiver="u8" roottag="epartment" proc="dd">
      <department></department >
 </ufinterface>
2.2 框架部分

如:

<ufinterface sender="002" receiver="u8" roottag="epartment" proc="add">
    ......
</ufinterface>

包含数据交换的控制信息,其中:

sender:  发送方,填外部系统注册码,简称EAI注册码

receiver: 接收方,填u8即可

roottag:数据类型,根据EAI\XML\Template目录中的数据交换模板文件填写

proc:数据交换的操作,分为add/edit/delete/query

2.3 内容部分

如: <department></department >

指消息中携带的档案或单据等业务数据。U8EAI提供了一整套完整的基本档案和单据的数据交换模版(在EAI\XML\Template目录下),模板中定义了消息内容部分的格式和字段。

Requset消息格式(执行导入导出操作后,返回的xml)

Request消息格式的框架部分同上所述,内容部分根据不同的操作有所不同:

对于add/edit操作,Request消息的内容就是档案和单据内容,具体格式详见数据模板。

对于delete/query操作, Request消息的内容包含过滤条件,条件格式如下:

<ufinterface sender="002" receiver="u8" roottag="department" proc="Query">
     <department>  
           <field display="部门编码" name="cDepCode"operation="=" value=3" logic="" />
     </department >
 </ufinterface>
2.4 Response消息格式

Response消息是EAI接口执行Request消息之后的返回结果,不同的操作有所不同:

对于query操作, 返回的结果就是查询的数据,格式详见EAI数据模板。

对于add/edit/delete操作,返回的结果包括单据体每一行数据的详细执行结果(由Item节点描述),如下:

<ufinterface roottag="return" docid="823482692" proc="add">
    <!--    key:单据表体行数据的编号,比如:销售订单表体的存货编码
                 succeed:成功或失败号,0为成功,其他值为失败
                dsc:成功或失败的文字描述  
    -->
    <item key="001" succeed="0" dsc=""/>
    <item key="002" succeed="0" dsc=""/>
</ufinterface>
2.5 凭证的add操作的Response格式比较特殊:
<ufinterface roottag="voucheraddreturn" docid="" proc="add">
   <item accounting_period="10" voucher_type="记" voucher_id="888" u8voucher_id="1138" entry_id="" succeed="0" dsc="凭证已成功保存" u8accounting_period="10" ></item>
</ufinterface>

voucher_id:外部系统原始凭证号;

u8voucher_id:U8生成的凭证号;

succeed:是否成功,0为成功,非零为失败;

accounting_period:会计期间;

voucher_type:凭证类别

3、开发代码参考

3.1 本地COM调用
VB代码:
Dim eaiBroker As Object
Set eaiBroker = CreateObject("U8Distribute.iDistribute")  '创建EAI服务代理接口对象
Dim responseXml As String
responseXml = eaiBroker.Process(requestXml) '调用EAI服务代理的数据交换方法Process,传入Request交换消息, 并获取EAI返回的Response消息。
...'处理返回结果
Set eaiBroker =Nothing '释放EAI服务代理接口对象
 .Net代码:

  引用U8SOFT\EAI\U8Distribute.dll

U8Distribute.iDistributeClass eaiBroker = new U8Distribute.iDistributeClass(); //创建EAI服务代理接口对象
String responseXml = eaiBroker.Process(requestXml); //调用EAI服务代理的数据交换方法Process,传入Request交换消息 , 并获取EAI返回的Response消息。
......  //处理返回结果
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(eaiBroker); //释放EAI服务代理接口对象
JAVA代码:

采用JNI、JCOM、JACOB技术调用EAI服务代理COM组件,下面以JACOB为例:

import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

class Test
{
   public static void main(String[] args)
   {
      Dispatch eaiBroker = new Dispatch("U8Distribute.iDistribute"); //创建EAI服务代理接口对象

      String responseXml = Dispatch.call(eaiBroker, "Process", new Variant(requestXml)); //调用EAI服务代理的数据交换方法Process,传入Request交换消息, 并获取EAI返回的Response消息。

      ......  //处理返回结果
   }
}

3.2 HTTP远程调用

 远程调用采用HTTP POST的方式上传Request消息。

VB代码:
Dim xmlhttp As Object
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")  '创建XMLHTTP对象
Call xmlhttp.open("POST", "http://u8appsrv/u8eai/import.asp", False) '使用XMLHTTP对象打开 网络连接,URL中的u8appsrv填U8应用服务器
xmlhttp.send requestXml    '发送Request消息
Dim responseXml As String
responseXml = xmlhttp.responseText   '获取返回Response消息
...处理返回结果
.Net代码:

引用D:\U8SOFT\Interop\Interop.MSXML2.dll

MSXML2.XMLHTTPClass xmlHttp = new MSXML2.XMLHTTPClass();
xmlHttp.open("POST", "http://localhost/u8eai/import.asp", false, null, null);  
xmlHttp.send(dom.OuterXml);
String responseXml = xmlHttp.responseText;
...//处理返回结果
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xmlHttp); //COM释放
JAVA代码:
class Test
{
    public static void main(String[] args)
    {
        URL url = new URL("http://localhost/u8eai/import.asp");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.setConnectTimeout(3000000);
        con.setReadTimeout(3000000);
        con.setDoInput(true);
        con.setDoOutput(true);
        con.setAllowUserInteraction(false);
        con.setUseCaches(false);
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-type","application/x-www-form-urlencoded");
        //发送Request消息
        OutputStream out = con.getOutputStream();
        DataOutputStream dos = new DataOutputStream(this.out);
        dos.write(requestXml.getBytes("UTF-8"));
        //获取Response消息
        InputStream in = con.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        StringBuilder sb = new StringBuilder();
        String s = null;
        while ((s = br.readLine()) != null) {
            sb.append(s);
        }
        String responseXml = sb.toString();
    }    
}

4、EAI通用SQL查询接口

由于EAI接口返回的数据格式是固定的标准格式,很有可能返回的数据中没有用户所需要的字段;另外,对于U8中的业务数据,EAI接口也不是100%覆盖的。

针对以上情况,EAI提供了一个灵活的数据查询通用接口--EAI通用SQL查询接口,该接口支持向EAI数据交换代理传递SQL语句进行查询操作,可以查询当前U8帐套的所有数据,用户不用直接访问U8帐套库。查询返回的结果为.Net中的Dataset的XML格式的数据。调用该接口只需给EAI数据交换服务代理传递特殊的Request消息即可:

4.1 Request消息格式如下:
<ufinterface sender="001" receiver="u8" roottag="SQLEXE"  proc="department"  codeexchanged="n">
    <sql value="select * from inventory"/>
</ufinterface>

其中内容部分<sql value=""/> 节点为SQL查询语句。

框架部分的roottag值必须固定为"SQLEXE" , proc的值用来标识Dataset的行节点,可以是任意字符串。

4.2 Response消息格式如下(Select语句输出表的xml格式):
<ufinterface sender="u8" receiver="002" roottag="SQLEXE" proc="department" request-roottag="SQLEXE">
    <NewDataSet>
        <department>
            <cDepCode>1</cDepCode>
            <bDepEnd>true</bDepEnd>
            <cDepName>采购1部</cDepName>
        </department>
        <department>
            <cDepCode>2</cDepCode>
            <bDepEnd>true</bDepEnd>
            <cDepName>销售1部</cDepName>
        </department>
    </NewDataSet>
</ufinterface>

根节点的proc的值用来标识Dataset的行节点,一般为表名

 

附件说明
附件