基于 Java 调用泛微 OA WebService 创建表单流程

基于 Java 调用泛微 OA WebService 创建流程并打包 Maven 项目

1. 背景说明

在企业信息化系统中,常常需要通过外部系统(如 ERP、MES、WMS 等)向泛微 OA 提交流程。

泛微 OA 提供了 WebService 接口(WorkflowService),我们可以基于 WSDL 生成客户端代码,通过 Java 程序完成流程的自动创建与提交。

泛微在线文档:https://e-cloudstore.com/doc.html

为了方便后续复用与集成,这里将整个功能封装为 Maven 项目,并打包成可执行 JAR 包。


2. 准备工作

  • 泛微 OA 系统地址:

    复制代码
    http://your_api/services/WorkflowService
  • 已知流程 ID(workflowId)示例:200001

  • 流程表单:

    • 主表:formtable_main_1
    • 明细表:formtable_main_1_dt1
  • 提交流程的用户 ID:

    • creatorId = 实际ID

3. 项目结构

使用 Maven 进行管理,整体结构如下:

复制代码
e9-oa-integration/
├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── text
│   │   │           ├── App.java
│   │   │           ├── OAWorkflowClient.java
│   │   │           └── ws   ← WebService 生成的客户端代码
│   │   └── resources
│   │       └── application.properties
└── target

4. 使用 CXF 生成客户端代码

在 pom.xml 中加入插件:

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.5.5</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <sourceRoot>${project.basedir}/src/main/java</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>http://your_api/services/WorkflowService?wsdl</wsdl>
                                <extraargs>
                                    <extraarg>-p</extraarg>
                                    <extraarg>com.text.e9OA.ws</extraarg>
                                    <extraarg>-frontend</extraarg>
                                    <extraarg>jaxws21</extraarg>
                                    <extraarg>-xjc-XautoNameResolution</extraarg>
                                </extraargs>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

执行:

bash 复制代码
mvn clean compile

会在 com.text.e9OA.ws 包下生成 WorkflowService 客户端代码。


5. 编写调用工具类

在 com.text.OAWorkflowClient.java 中:

java 复制代码
package com.text;

import com.text.e9OA.ws.*;
import javax.xml.ws.BindingProvider;
import java.util.HashMap;
import java.util.Map;

public class OAWorkflowClient {

    private static final String SERVICE_URL = "http://your_api/services/WorkflowService";

    public static int createWorkflow(int creatorId, int workflowId, String requestTitle) throws Exception {
        WorkflowService service = new WorkflowService();
        WorkflowServicePortType port = service.getWorkflowServiceHttpPort();

        Map<String, Object> ctx = ((BindingProvider) port).getRequestContext();
        ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, SERVICE_URL);

        WorkflowRequestInfo info = new WorkflowRequestInfo();
        info.setCreatorId(String.valueOf(creatorId));
        info.setWorkflowBaseInfo(new WorkflowBaseInfo());
        info.getWorkflowBaseInfo().setWorkflowId(String.valueOf(workflowId));
        info.setRequestLevel("0");
        info.setRequestName(requestTitle);

        // 设置主表数据
        WorkflowMainTableInfo mainTable = new WorkflowMainTableInfo();
        WorkflowRequestTableRecord[] records = new WorkflowRequestTableRecord[1];
        WorkflowRequestTableField[] fields = new WorkflowRequestTableField[1];

        WorkflowRequestTableField f1 = new WorkflowRequestTableField();
        f1.setFieldName("orderNo");
        f1.setFieldValue("PO20250820001");
        f1.setView(true);
        f1.setEdit(true);
        fields[0] = f1;

        WorkflowRequestTableRecord record = new WorkflowRequestTableRecord();
        record.setWorkflowRequestTableFields(fields);
        records[0] = record;

        mainTable.setRequestRecords(records);
        info.setWorkflowMainTableInfo(mainTable);

        int requestId = port.doCreateWorkflowRequest(info, Integer.parseInt(info.getCreatorId()));
        return requestId;
    }
}

6. 编写入口类

在 com.text.App.java:

java 复制代码
package com.text;

public class App {
    public static void main(String[] args) throws Exception {
        int requestId = OAWorkflowClient.createWorkflow(
                11291,
                215021,
                "测试流程-2025-08-20"
        );
        System.out.println("流程创建成功,RequestId = " + requestId);
    }
}

7. 打包运行

执行:

bash 复制代码
mvn clean package

会在 target/ 下生成 e9-oa-integration-1.0-SNAPSHOT.jar。

运行:

bash 复制代码
java -jar target/e9-oa-integration-1.0-SNAPSHOT.jar

输出示例:

复制代码
流程创建成功,RequestId = 50321

8. 总结

本文通过以下步骤实现了 Java 调用泛微 OA WebService 创建流程:

  1. 配置 Maven 项目并引入 CXF 插件
  2. 基于 WSDL 生成客户端代码
  3. 封装流程提交工具类 OAWorkflowClient
  4. 编写入口类 App 测试提交
  5. 打包成可运行 JAR,便于外部系统集成

这样即可通过命令行或集成在其他系统中,自动提交 OA 流程。