本文以一套开源工作流引擎源码为样本,讨论运行模式的四种划分,并对照 Flowable 与 Camunda,供选型者参考。
基于
该引擎WorkSpace代码库梳理,版本参考:该引擎 该引擎6 + Vue3 前端(ccflow-fe v3.0.0) 撰写日期:2026-06-13
该平台 BPM 由 该引擎(.NET) 与 该引擎(Java) 双平台构成,是一套流程引擎 + 表单引擎 + 低代码平台的一体化 BPM 产品。与 Flowable/Camunda 这类"纯流程引擎"不同,该平台在引擎之上内置了组织架构、菜单权限、单据(单据模块)、门户、报表等完整企业应用能力。
代码中通过 Platform 枚举区分运行平台:
public enum Platform
{
/// <summary>
/// 该引擎 .net平台.
/// </summary>
该引擎,
/// <summary>
/// 该引擎 java 平台.
/// </summary>
该引擎
}维度 | 配置项 | 含义 |
|---|---|---|
部署/组织模式 | CCBPMRunModel(0/1/2/3) | 单机、集团、SaaS、平台应用 |
产品使用模式 | 门户/Middleware vs BPM | 中间件模式 vs 全功能 BPM 模式 |
门户说明(``):
本文重点分析 四大运行模式(CCBPMRunModel) 的技术实现,并与 Flowable/Camunda 的多租户/组织架构能力对照。
后端枚举定义(BP.Sys.CCBPMRunModel):
public enum CCBPMRunModel
{
/// <summary>
/// 单机版
/// </summary>
Single,
/// <summary>
/// 集团模式
/// </summary>
GroupInc,
/// <summary>
/// 多租户模式
/// </summary>
SAAS,
/// <summary>
/// 平台应用模式
/// </summary>
PASS
}app.config 配置项:
<!-- 0=单组织,1=集团,2=SAAS,3=平台应用(PASS) -->
<add key="CCBPMRunModel" value="0"/>值 | 模式 | 英文标识 | 典型场景 |
|---|---|---|---|
0 | 单机版 | Single | 单一企业、内网 OA、POC 演示 |
1 | 集团版 | GroupInc | 集团总部 + 多家子公司共用一套 BPM |
2 | 多租户 SaaS | SAAS | 云 BPM 平台,租户数据强隔离 |
3 | 平台应用 | PASS | 云平台上的应用托管模式(CCBPMRunModelReal 识别,部分逻辑仍回落到 Single) |
安装时按模式加载不同组织种子数据 SQL:
sqlscript = BP.Difference.SystemConfig.该引擎AppPath + "WF/Data/Install/SQLScript/Port_Inc_CH_RunModel_" + (int)SystemConfig.CCBPMRunModel + ".sql";
DBAccess.RunSQLScript(sqlscript);
if (SystemConfig.CCBPMRunModel == CCBPMRunModel.Single)
{
BP.Port.Emp empAdmin = new Emp("admin");
BP.Web.WebUser.SignInOfGener(empAdmin);
}
if (SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
{
BP.WF.Dev2Interface.Port_Login("admin", "100", null);
}
if (SystemConfig.CCBPMRunModel == CCBPMRunModel.GroupInc)
{
BP.WF.Dev2Interface.Port_Login("admin", "100", null);
}admin 登录,无多组织概念。100 的 admin 登录,需选择/切换组织。核心特征:无 OrgNo 数据隔离,人员编号全局唯一(如 zhangsan)。
后端实现要点:
SystemConfig.CCBPMRunModel == Single 时,SQL 查询不加 OrgNo 条件。WebUser.RootNo 对管理员返回 "0",表示无组织根节点概念。FK_Emp 过滤。 if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
wfSql = " AND A.OrgNo='" + WebUser.OrgNo + "'";(Single 模式下 wfSql 为空,不加 OrgNo 过滤。)
前端实现要点:
SystemConfig.CCBPMRunModel 来自 Cookie/LocalStorage。GloWF.ts 中 *Single 系列 SFTable)。对比 Flowable/Camunda:等价于单租户部署,不启用 tenantId。组织架构需自行对接 IDM 或在应用层维护。
核心特征:一套 BPM 实例服务多个法人/子公司,通过 Port_Org + OrgNo 字段实现逻辑隔离,人员编号在组织内唯一。
数据模型(Port_Inc_CH_RunModel_1.sql 种子数据):
Port_Org:组织主表(如 100 集团平台、ccs 该平台公司、quanyi 泉亿公司)。Port_Dept、Port_Station、Port_Emp 均带 OrgNo 字段。No 在组织内唯一(如 yuwen),跨组织可重复。后端隔离机制:
OrgNo 条件。Port_OrgAdminer 表维护二级管理员;WebUser.IsAdmin 按 OrgNo 判断。GroupStationModel 配置):0:每套组织独立角色体系(默认)。1:全集团共享一套岗责体系。2:每个部门独立角色体系。 /// <summary>
/// 集团模式下的角色体系
/// @0=每套组织都有自己的角色体系@1=所有的组织共享一套岗则体系.@2=每个部门有自己的角色体系.
/// </summary>
public static int GroupStationModelFindWorker.cs):按直属领导找人时,GroupInc 追加 And OrgNo = '@WebUser.OrgNo'。 if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.Single)
sql = "SELECT Leader,FK_Dept FROM Port_Emp WHERE No='" + empNo + "'";
if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.GroupInc)
sql = "SELECT Leader,FK_Dept FROM Port_Emp WHERE No='" + empNo + "' And OrgNo = '" + WebUser.OrgNo + "'";
if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
sql = "SELECT Leader,FK_Dept FROM Port_Emp WHERE No='" + WebUser.OrgNo + "_" + empNo + "'";前端实现要点:
PopMenuUser.ts)。GroupInc 下追加组织过滤(SearchFlow.vue、useSearchBill.ts)。OrgNo 隔离:OrgNo='@WebUser.OrgNo'。对比 Flowable/Camunda:
能力 | 该平台 GroupInc | Flowable | Camunda |
|---|---|---|---|
多组织 | Port_Org + OrgNo 字段贯穿全表 | 需自建或借助 Flowable Platform | Camunda 8 有 Tenant 概念 |
组织切换 | 内置 Port_Login(user, orgNo) | 无内置 | Tenant 切换需自行实现 |
流程定义隔离 | WF_Flow 可按组织复制/共享 | tenantId 隔离部署 | tenantId 隔离 |
岗责体系 | 内置 Port_Station,支持三种集团策略 | 候选组 candidateGroups | candidateGroups / Identity Service |
该平台集团版的优势在于组织、岗责、流程、表单在同一产品内闭环;Flowable/Camunda 需额外集成 Identity/Org 模块。
核心特征:面向云 BPM 平台,租户间强隔离,人员主键采用 {OrgNo}_{UserID} 复合编号。
与集团版的关键差异:
项目 | GroupInc | SAAS |
|---|---|---|
人员编号 | 组织内唯一,如 yuwen | 全局唯一,如 ccs_yuwen |
UserID 字段 | 可选 | 必须,存真实登录名 |
流程实例 | 部分表加 OrgNo | WF_GenerWorkFlow 等强制 OrgNo |
登录 | 选组织后登录 | Port_Login("admin", "100", null) 平台管理员 |
后端实现(Emp.cs):
if (value.StartsWith(BP.Web.WebUser.OrgNo + "_") == true)
{
this.SetValByKey(EmpAttr.UserID, value.Replace(BP.Web.WebUser.OrgNo + "_", ""));
}
else
{
this.SetValByKey(EmpAttr.No, BP.Web.WebUser.OrgNo + "_" + value);
}SAAS 模式下实体 Map 自动注入隐藏条件 OrgNo = @WebUser.OrgNo(Station.cs、Team.cs 等)。
流程统计统一追加 OrgNo:
public static String Check_CCBPMRunModel()
{
String sql = "";
if (BP.Difference.SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS)
{
sql += " AND A.OrgNo = '" + WebUser.OrgNo + "'";
}
return sql;
}前端实现要点:
WebUser.CCBPMRunModel == 2 时,审核组件走云 Handler:BP.Cloud.HttpHandler.App。OrgNo 前缀。*SaaS 后缀版本,按 OrgNo 过滤。对比 Flowable/Camunda:
tenantId 贯穿引擎表);开源版需应用层隔离。该平台 SaaS 的不足:OrgNo 多以 SQL 字符串拼接实现隔离,需严格防范 SQL 注入;Flowable/Camunda 的 tenantId 在引擎层有框架级保障。
核心特征:面向云平台应用商店/托管场景,枚举值为 3,CCBPMRunModelReal 返回 PASS,但 CCBPMRunModel 属性将 0 和 3 均映射为 Single 以兼容旧逻辑。
public static CCBPMRunModel CCBPMRunModelReal
{
get
{
int val = BP.Difference.SystemConfig.GetValByKeyInt("CCBPMRunModel", 0);
if (val == 0 ) return CCBPMRunModel.Single;
if (val == 1) return CCBPMRunModel.GroupInc;
if (val == 2) return CCBPMRunModel.SAAS;
return CCBPMRunModel.PASS;
}
}
public static CCBPMRunModel CCBPMRunModel
{
get
{
int val = BP.Difference.SystemConfig.GetValByKeyInt("CCBPMRunModel", 0);
if (val == 0 || val==3) return CCBPMRunModel.Single;
...
}
}PASS 模式在代码库中落地较少,前端 SystemConfig.ts 甚至未导出 PASS 枚举,属于演进中的模式,与 SaaS 云平台的应用分发场景配套。
对比 Flowable/Camunda:类似 Camunda SaaS 或 Flowable Cloud 的应用市场 + 租户双层模型,但该平台 PASS 尚未形成与 Flowable Platform 同量级的独立产品线文档。
flowchart TB
subgraph Frontend["前端 Vue3"]
Portal["Portal 门户<br/>Middleware / BPM"]
WF["WF 流程模块"]
该平台["该平台 低代码"]
Toolkit["Toolkit SDK"]
HttpHandler_TS["HttpHandler.ts"]
end
subgraph Backend["后端 该引擎 (.NET) / 该引擎 (Java)"]
API["APIController / InnerForVueController"]
HH["HttpHandler WF_*"]
Dev2["Dev2Interface SDK"]
Engine["WorkNode 流程引擎"]
Org["Port 组织架构"]
Form["Sys_MapData 表单引擎"]
Bill["单据模块 单据引擎"]
end
subgraph DB["数据库"]
Def["WF_Flow / WF_Node 流程定义"]
Run["WF_GenerWorkFlow 流程实例"]
Task["WF_GenerWorkerList 待办任务"]
Port["Port_* 组织人员"]
end
Frontend --> HttpHandler_TS
HttpHandler_TS --> API
HttpHandler_TS --> HH
API --> Dev2
HH --> Dev2
Dev2 --> Engine
Dev2 --> Org
Dev2 --> Form
Engine --> Run
Engine --> Task
Org --> Port
Form --> DB
Def --> DBflowchart TB
subgraph FlowableCamunda["Flowable / Camunda"]
REST["REST API"]
Runtime["RuntimeService"]
TaskSvc["TaskService"]
History["HistoryService"]
Repository["RepositoryService"]
BPMN["BPMN 2.0 引擎"]
Identity["IdentityService / 外部 IDM"]
end
subgraph FCDB["引擎表"]
REDEF["ACT_RE_PROCDEF"]
RUEXE["ACT_RU_EXECUTION"]
RUTASK["ACT_RU_TASK"]
HI["ACT_HI_* 历史表"]
end
REST --> Runtime
REST --> TaskSvc
Runtime --> BPMN
BPMN --> RUEXE
TaskSvc --> RUTASK
Repository --> REDEF该平台 BPM | 数据表/类 | Flowable/Camunda | 说明 |
|---|---|---|---|
流程定义 | WF_Flow + WF_Node + WF_Direction | ACT_RE_PROCDEF(BPMN XML) | 该平台用关系表存节点;Flowable 用 BPMN 标准 |
流程实例 | GenerWorkFlow / WF_GenerWorkFlow | ACT_RU_EXECUTION / ACT_HI_PROCINST | 该平台一张宽表承载实例状态 |
待办任务 | GenerWorkerList / WF_GenerWorkerList | ACT_RU_TASK | 该平台 IsPass 标识任务状态 |
流程发送 | WorkNode.NodeSend() | TaskService.complete() | 该平台"发送"=审批驱动流转 |
人员分配 | FindWorker + DeliveryWay 枚举 | Candidate Users/Groups | 该平台内置 20+ 找人策略 |
二次开发 API | Dev2Interface 静态方法 | RuntimeService 等 | 命名规范:Flow_*/Node_*/Port_* |
Web 接口 | HttpHandler(WF_MyFlow 等) | REST Controller | 前后端通过 Handler 类名 + 方法名路由 |
事件扩展 | ExecEvent.DoNode() | ExecutionListener/TaskListener | 支持 Java/C# 反射 + JS 脚本 |
表单 | Sys_MapData 内置表单引擎 | 无(需集成 Form.io 等) | 该平台核心差异化能力 |
租户 | OrgNo + CCBPMRunModel | tenantId | 隔离层级与范围不同 |
该平台流程发送(WorkNode.NodeSend)三阶段:
/// 工作流发送业务处理.
/// ----------------------------------- 说明 -----------------------------
/// 1,方法体分为三大部分: 发送前检查\5*5算法\发送后的业务处理.
/// 2, 详细请参考代码体上的说明.
/// 3, 发送后可以直接获取它的Flowable/Camunda 则基于 BPMN Token 推进模型,由引擎解析 BPMN 图自动流转,扩展点主要为 Listener、Delegate、External Task。
该平台原生建模使用自研流程设计器(节点表驱动),同时提供 BPMN 2.0 导入能力:
/// 导入bpmn2.0
public string Imp_DoneBPMN()
...
Flow flow = BP.WF.Template.TemplateGlo.NewFlowByBPMN(FK_FlowSort, filePath);BPMN 导入后转换为 WF_Node 关系数据,不是以 BPMN XML 作为运行时定义。Flowable/Camunda 则以 BPMN XML 为唯一真相源(SSOT)。
HttpHandler 类封装后端 Handler 调用目录 | 职责 | 与运行模式关系 |
|---|---|---|
`` | 登录、门户;Middleware(中间件)与 Standard 两套入口 | 中间件模式精简菜单 |
`` | 流程发起、待办、设计器、报表 | 核心流程 UI |
`` | 低代码:GPM 菜单权限、单据模块 单据、门户窗口 | BPM 模式主战场 |
`` | 可嵌入第三方系统的流程 SDK(WorkOpt、WorkCheck) | 中间件集成场景 |
`` | 前端 ORM 层(Entity、EnMap),镜像后端 BP.En30 | 按模式切换 SQL 数据源 |
`` | 行业/客户定制应用(LIMS、Star 等) | 客户项目层 |
//
const handler = new HttpHandler('BP.WF.HttpHandler.WF_MyFlow');
handler.AddPara('WorkID', workID);
const data = await handler.DoMethod('MyFlow_Init');请求路由至后端 WF_Comm 或 APIController,通过反射调用 BP.WF.HttpHandler.* 类方法。这与 Flowable 的 /runtime/process-instances RESTful 风格截然不同,更接近 RPC over HTTP。
前端通过 SystemConfig.CCBPMRunModel / WebUser.CCBPMRunModel 在以下场景分支:
GloWF.ts 中 *Single vs 带 OrgNo 的查询。StationMenu.ts 非 Single 时隐藏 OrgNo 条件。PopMenuUser.ts 注入组织管理入口。项目 | 路径 | 职责 |
|---|---|---|
该引擎 | 该引擎/该引擎/ | ASP.NET Core 宿主、API Controller、配置 |
BP.WF | 该引擎/Components/BP.WF/ | 流程引擎核心(WorkNode、Dev2Interface、HttpHandler) |
BP.En30 | 该引擎/Components/BP.En30/ | 实体框架、组织架构(Port)、SystemConfig |
BP.App / BP.Trade 等 | 该引擎/Components/ | 行业扩展 |
HttpHandler (WF_MyFlow, WF_WorkOpt, WF_Comm...)
↓
Dev2Interface (对外 SDK:Flow_*, Node_*, Port_*, DB_*)
↓
WorkNode.NodeSend() / WorkUnSend / FindWorker
↓
GenerWorkFlow / GenerWorkerList (持久化)
↓
WF_GenerWorkFlow / WF_GenerWorkerList (数据库)四大模式的差异不集中在一个类,而是散落在:
BP.En30.Port.*:Emp/Dept/Station/Team 的 Map 隐藏条件。BP.WF.Template.FindWorker:找人 SQL 按模式切换。BP.WF.Dev2Interface:待办/在途统计 SQL 追加 OrgNo。BP.WF.Data.DA.SQLPort / SQLFrm:报表 SQL 模板分支。BP.WF.Install:安装脚本与初始登录。该引擎/DataUser/API/Controllers/APIController.cs(WF/APIController/{Action})InnerForVueController.csDev2Interface 静态类(代码集成首选)Flowable/Camunda 提供标准 REST + Java Client;该平台额外提供 HttpHandler 协议 与 Dev2Interface 两套集成面。
维度 | 说明 |
|---|---|
产品完整性 | 流程 + 表单 + 组织 + 权限 + 单据 + 门户 + 报表,一套交付 |
四大模式开箱即用 | 单机→集团→SaaS 升级路径清晰,无需自研多租户 |
中国式流程特性 | 分流/合流/会签/加签/子线程/退回策略等原生支持 |
找人规则丰富 | DeliveryWay 20+ 策略(直属领导、部门负责人、WebAPI 等) |
低代码能力 | 表单设计器、单据(单据模块)、EnMap 实体、GPM 菜单权限 |
双语言栈 | 该引擎(.NET) / 该引擎(Java) 同源架构,适配不同技术栈甲方 |
中间件 + BPM 双模式 | 可嵌入 ERP,也可独立建站 |
BPMN 导入 | 支持从 Flowable 等工具导入 BPMN(单向) |
维度 | 说明 |
|---|---|
非 BPMN 原生运行时 | 流程定义存关系表,与 BPMN 生态互操作性弱 |
标准开放度 | 无 DMN/CMMN 标准实现;API 非 RESTful 标准 |
引擎与业务耦合 | OrgNo 隔离散落各处,升级引擎需全量回归 |
PASS 模式不成熟 | 枚举存在但前后端支持不完整 |
云原生架构 | 单体 + DB 为主,无内置 K8s Operator / 水平扩展方案 |
社区与生态 | 相比 Flowable/Camunda 国际社区,插件、咨询、人才池较小 |
SaaS 安全 | 部分 OrgNo 过滤为字符串拼接,需审计 |
维度 | 说明 |
|---|---|
BPMN 2.0 标准 | 模型可交换、工具链成熟(Camunda Modeler 等) |
引擎纯粹 | 专注流程执行,易嵌入微服务 |
扩展机制标准 | Listener、Delegate、Connector、External Task |
云原生 | Camunda 8 + Zeebe 支持分布式、高吞吐 |
社区活跃 | 文档、案例、Spring Boot Starter 丰富 |
多租户 | Flowable Platform / Camunda Tenant 引擎级支持 |
维度 | 说明 |
|---|---|
无内置表单引擎 | 需集成自研或第三方表单 |
无内置组织权限 | Identity 简陋,企业级需 Keycloak 等 |
中国式 OA 特性 | 会签、加签、退回等需大量自定义 |
交付周期长 | 从引擎到可用 OA 需拼装多个系统 |
许可成本 | 企业版多租户、高级特性需商业许可 |
是否需要完整 BPM/OA 产品(表单+组织+权限)?
├── 是 → 该平台 BPM 优先考虑
│ ├── 仅嵌入现有系统 → 中间件模式 + Dev2Interface/Toolkit SDK
│ └── 独立业务系统 → BPM 模式 + 四大运行模式选型
└── 否 → 仅需流程引擎
├── 强依赖 BPMN 标准 / 微服务编排 → Flowable 或 Camunda
├── 超高吞吐、云原生 → Camunda 8 (Zeebe)
└── Spring 生态、国内案例多 → Flowable场景 | 推荐模式 | 理由 |
|---|---|---|
单一企业 OA | Single | 配置简单,无 OrgNo 开销 |
集团多法人 | GroupInc | 内置组织切换、岗责策略 |
云 BPM 平台 | SAAS | 人员编号隔离、全链路 OrgNo |
应用商店托管 | PASS(待成熟) | 关注后续版本支持 |
场景 | 推荐 | 关键原因 |
|---|---|---|
政府/国企 OA 全系统 | 该平台 BPM | 表单+流程+组织一体,国产化 .NET/Java |
电商订单履约编排 | Camunda 8 | 高并发、事件驱动、微服务 |
银行核心流程(强审计) | Flowable + 自研表单 | BPMN 标准、成熟案例 |
ERP 内嵌审批流 | 该平台中间件模式 或 Flowable | 前者中国式特性强;后者 BPMN 标准 |
多租户 SaaS OA | 该平台 SAAS 或 Flowable Platform | 前者开箱即用;后者引擎级租户 |
流程即代码、GitOps | Camunda | BPMN XML 版本化管理 |
快速 POC / 低预算 | 该平台 Single | 安装即用,Demo 数据齐全 |
主题 | 文件路径 |
|---|---|
运行模式枚举 | 该引擎/Components/BP.En30/Sys/EnumLab.cs |
运行模式配置 | 该引擎/Components/BP.En30/Difference/SystemConfig.cs |
安装初始化 | 该引擎/Components/BP.WF/Install.cs |
集团种子数据 | 该引擎/该引擎/WF/Data/Install/SQLScript/Port_Inc_CH_RunModel_1.sql |
SaaS 种子数据 | 该引擎/该引擎/WF/Data/Install/SQLScript/Port_Inc_CH_RunModel_2.sql |
流程实例 | 该引擎/Components/BP.WF/WF/GenerWorkFlow.cs |
待办任务 | 该引擎/Components/BP.WF/WF/GenerWorkerList.cs |
流程发送引擎 | 该引擎/Components/BP.WF/WF/WorkNode.cs |
对外 SDK | 该引擎/Components/BP.WF/Dev2Interface.cs |
找人算法 | 该引擎/Components/BP.WF/Template/FindWorker.cs |
事件机制 | 该引擎/Components/BP.WF/WF/ExecEvent.cs |
REST API | 该引擎/该引擎/DataUser/API/Controllers/APIController.cs |
前端模式枚举 | `` |
前端通信 | `` |
门户模式说明 | `` |
中间件菜单 | `` |
本文基于 该引擎WorkSpace 仓库源码静态分析生成,PASS 模式及 该引擎 侧实现以 该引擎 为准,生产部署请以官方文档与版本发布说明为准。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。