本文摘要
这篇文章介绍在泛微 Ecology10 多租户场景下,如何借助 ESB 动作流配合开放平台连接器的 doCreateRequest 接口实现跨组织创建流程。内容涵盖连接器与接口配置、字段映射表维护、自定义函数组装传参,以及 fieldId、附件权限和文件上传等关键参数处理,适合做 E10 二开的开发人员参考,作者也说明这只是个人思路而非官方最佳实践。
⚠️ 写在前面
本方案仅出于丸子当时自己的即时想法,并非官方最佳实践方案。仅供技术交流参考,如你有更优雅的实现方式,欢迎随时交流!
E10 多租户互通方案中,通过 E10 开放平台连接器,可以实现当前组织与 E10 其他组织的数据互通。本文将重点介绍如何使用 ESB 动作流配合 doCreateRequest 接口实现跨组织的流程创建。
1. 准备阶段
在开始配置前,请确保已查阅官方开发文档。
接口基础信息
- 接口地址:
http://url:port/papi/openapi/api/workflow/core/paService/v1/doCreateRequesthttp://url:port/papi/openapi/api/workflow/core/paService/v2/doCreateRequest
- 前置要求: 参照 “后台管理中心” -> “开放平台” -> “接口示例”,完成应用的创建与鉴权配置。
ESB 连接器配置
- 进入 “ESB 中心” -> “内置” -> “E10 开放平台” 。
- 新建“连接”以及“接口”(注:系统默认并未内置新建流程接口,需要自行创建)。
创建字段映射表
准备好源流程(触发源)与目标流程(被写入目标)
为了保证后续代码的通用性与可维护性,强烈建议维护一张映射表。

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

核心自定义函数
在此处使用 解析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) |

接口报文结构参考
点击查看 JSON 结构模板
JSON
{ "access_token": "", "workflowId": "", "isnextflow": "", "dataDetails": [ { "fieldId": "", "dataKey": "", "dataIndex": "", "content": "", "subFormId": "", "matchByName": "", "dataOptions": [ { "optionId": "", "fileByte": "", "content": "", "uploadParam": { "uploadType": "", "base64Url": "", "loadUrl": "" } } ], "needCopy": "" } ], "formData": {}, "userid": ""}如果有更好的方案,欢迎评论区留言