本文摘要
这篇文章介绍在泛微 Ecology10 多租户场景下,如何借助 ESB 动作流配合开放平台连接器的 doCreateRequest 接口实现跨组织创建流程。内容涵盖连接器与接口配置、字段映射表维护、自定义函数组装传参,以及 fieldId、附件权限和文件上传等关键参数处理,适合做 E10 二开的开发人员参考,作者也说明这只是个人思路而非官方最佳实践。

⚠️ 写在前面

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

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.png

2. ESB 动作流构建

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

流程逻辑图

2026-06-18T02:27.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": ""
}

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