MENU

[泛微 Ecology10] E10使用ESB动作流&连接器使用doCreateRequest创建流程接口

• 2026 年 06 月 18 日 • 阅读: 20 •

写在前面

本方案仅出于丸子当时自己的即时想法,并非官方最佳实践方案。仅供技术交流参考,如你有更优雅的实现方式,欢迎随时交流!

E10 多租户互通方案中,通过 E10 开放平台连接器,可以实现当前组织与 E10 其他组织的数据互通。本文将重点介绍如何使用 ESB 动作流配合 doCreateRequest 接口实现跨组织的流程创建。

1. 准备阶段

在开始配置前,请确保已查阅官方开发文档。

接口基础信息

  • 接口地址:

    • http://url:port/papi/openapi/api/workflow/core/paService/v1/doCreateRequest
    • http://url:port/papi/openapi/api/workflow/core/paService/v2/doCreateRequest
  • 前置要求: 参照 "后台管理中心" -> "开放平台" -> "接口示例",完成应用的创建与鉴权配置。

ESB 连接器配置

  1. 进入 "ESB 中心" -> "内置" -> "E10 开放平台"
  2. 新建“连接”以及“接口”(注:系统默认并未内置新建流程接口,需要自行创建)。

创建字段映射表

准备好源流程(触发源)与目标流程(被写入目标)

为了保证后续代码的通用性与可维护性,强烈建议维护一张映射表。

2026-06-18T02:26:17.png

2. ESB 动作流构建

整个动作流的核心逻辑主要由“流程触发”与“自定义逻辑计算”组成。

流程逻辑图

2026-06-18T02:27:18.png

核心自定义函数

在此处使用 解析JSON/XML文本 节点,配置自定义函数 buildMappingResult

JavaScript

function buildMappingResult(flowDataStr, mappingStr, sourceKeyCol, targetKeyCol, specialTypeCol) {
    var flowData = JSON.parse(flowDataStr);
    var mapping = JSON.parse(mappingStr);
    var result = [];

    for (var i = 0; i < mapping.length; i++) {
        var mapItem = mapping[i];
        var sourceId = mapItem[sourceKeyCol];
        var targetId = mapItem[targetKeyCol];
        var specialType = mapItem[specialTypeCol];

        if (!sourceId || !targetId) continue;

        // 逻辑处理
        if (flowData[sourceId] !== undefined) {
            var mainRow = { "targetId": targetId, "targetValue": flowData[sourceId] };
            if (specialType !== undefined) mainRow["specialType"] = specialType;
            result.push(mainRow);
        } else {
            // 明细表处理
            for (var key in flowData) {
                if (flowData.hasOwnProperty(key)) {
                    var fieldData = flowData[key];
                    if (Object.prototype.toString.call(fieldData) === '[object Array]') {
                        for (var j = 0; j < fieldData.length; j++) {
                            var detailItem = fieldData[j];
                            if (Object.prototype.toString.call(detailItem) === '[object Object]' && detailItem[sourceId] !== undefined) {
                                var detailRow = { "targetId": targetId, "targetValue": detailItem[sourceId] };
                                if (specialType !== undefined) detailRow["specialType"] = specialType;
                                if (detailItem["dataIndex"] !== undefined) detailRow["dataIndex"] = detailItem["dataIndex"];
                                result.push(detailRow);
                            }
                        }
                    }
                }
            }
        }
    }
    return JSON.stringify(result);
}

3. 创建流程实例:核心参数解析

在“创建流程实例”节点中,传参的配置是重中之重。

关键点提示

  • fieldId 使用原则: 如果是明细字段 ID,仅需传 dataIndex,无需传 subFormId
  • 文件上传: 使用 uploadType: loadUrl,配合 GENERATEFILEDOWNURL 函数转换下载链接。
  • 附件权限: 若涉及附件字段,needCopy 参数务必设置为 true

formData 传参对照表

字段逻辑说明
dataDetails放置【解析 JSON/XML 文本】的数据解析结果
fieldId依据值 (dataDetails):targetId
dataIndex依据值 (dataDetails):dataIndex
content依据值 (dataDetails):targetValue
dataOptions特殊类型字段赋值:IF(NOTEMPTY(specialType), targetValue, null)
optionId多选下拉框:IF((specialType=1), dataOptions依据值本身, null)

image.png

接口报文结构参考

点击查看 JSON 结构模板

JSON

{
  "access_token": "",
  "workflowId": "",
  "isnextflow": "",
  "dataDetails": [
    {
      "fieldId": "",
      "dataKey": "",
      "dataIndex": "",
      "content": "",
      "subFormId": "",
      "matchByName": "",
      "dataOptions": [
        {
          "optionId": "",
          "fileByte": "",
          "content": "",
          "uploadParam": {
            "uploadType": "",
            "base64Url": "",
            "loadUrl": ""
          }
        }
      ],
      "needCopy": ""
    }
  ],
  "formData": {},
  "userid": ""
}

如果有更好的方案,欢迎评论区留言