Skip to content
bitzorcas
中EN

Concept

工作流开发说明书

从可视化设计器、定义 DSL、部署绑定、实例与任务,到通知、历史、迁移、嵌入和生产运维的源码校验导航。

Last updated

本说明书解释“当前代码真正做什么、调用者应如何集成、失败时会留下什么事实”。Workflow 适合审批、会签、条件路由、超时升级和业务状态协同;它不是通用长事务编排器,也不能在缺少业务幂等与恢复设计时替代 Saga。

1. 先判断是否该用 Workflow

业务问题建议
需要人工审批、驳回、转办、会签和轨迹使用 Workflow
需要租户/Office 选择不同审批版本使用部署绑定
只需单表状态机且无待办/历史优先领域聚合状态机
需要跨服务补偿与精确一次消息先设计 Saga/Outbox,Workflow 仅承担人工节点
需要完整 BPMN 2.0 XML 互操作当前引擎不适用

2. 阅读地图

架构与边界

定义 JSON DSL

可视化设计、草稿、校验

部署、版本、回滚

实例运行时

任务与候选人

通知 / 历史 / 分析

迁移 / 独立嵌入

API、测试、运维与 GA

目标章节
搞清 Framework、Platform、Host 与 Adapter架构与核心概念
写可执行的节点、边、条件与参与人定义工作流
使用服务端 Schema、AOT 元数据、修订草稿和路径模拟可视化设计器
发布版本并理解“灰度”的真实语义部署与版本
发起、审批、驳回、撤回和控制实例运行实例
待办、已办、候选人、已读和缓存任务管理
轨迹、归档、报表和不精确项历史与分析
旧系统在途导入与指定节点发起迁移与导入
通知接收人、模板、偏好与失败通知 Pipeline
HTTP 路由与错误映射API 参考
在其他产品中嵌入引擎独立嵌入

3. 一条实例的真实生命周期

Start / StartAtNode / ImportSuspend 子状态ResumeComplete / Reject /Transfer / Delegate到达 EndEventCancel 与 WithdrawResubmit 重提TerminateArchiveArchiveArchive

Running

Suspended

Completed

Cancelled

Terminated

Archived

图中状态来自引擎枚举 ProcessInstanceStatus:Running / Completed / Cancelled / Terminated / Suspended——没有 Withdrawn 或 Approved 这样面向业务的枚举值。引擎采用双字段模型:Status 承载上面的机器状态机;撤回映射为 Cancelled,同时 BusinessStatus(字符串)记录业务语义 Draft / InProcess / Active 等;FlowState 用节点前缀加尾字编码完整轨迹(如 ABW 表示 B 节点待审)。业务代码判断”审批是否通过”应看 BusinessStatus == "Active",而不是枚举值。

每次发起把 DefinitionId、DefinitionVersion、TenantId、OfficeId、StarterId 和 BusinessKey 固化到实例。TokenExecutor 执行节点行为;UserTask 创建待办并挂起 Execution;完成任务后恢复 Execution、选择连线、更新 FlowState/BusinessStatus 并追加活动记录。

4. 最小业务集成

业务模块通常不直接解析 IWorkflowEngine,而是依赖聚焦端口。调用前由业务聚合验证“是否允许送审”,工作流成功后再通过可靠事件或可重试协调更新业务状态。

立案送审边界
public async Task<Result<string>> SubmitAsync(
MatterIntake matter,
string userId,
string tenantId,
CancellationToken cancellationToken)
{
// ① 送审前置规则仍由 MatterIntake 聚合拥有:当事人齐备、利冲初筛已通过。
if (!matter.CanSubmitForApproval())
return Result.Failure<string>("Matter.IntakeInvalid");
// ② BusinessKey 用案件编号,保证流程事实与业务事实一一对账。
var started = await transitions.StartAsync(
definitionKey: "matter-intake-approval",
businessKey: matter.MatterNo,
businessType: "MatterIntake",
starterId: userId,
tenantId: tenantId,
officeId: matter.OfficeId,
variables: new Dictionary<string, object?>
{
["disputeAmount"] = matter.DisputeAmount,
["crossBorder"] = matter.IsCrossBorder
},
cancellationToken);
// ③ 当前接口没有客户端 IdempotencyKey;超时后应先按业务键查询对账,再决定重试。
return started.IsSuccess
? Result.Success(started.Value.Id)
: Result.Failure<string>(started.Error.Code);
}

5. 三层授权不能混为一谈

第一层是 HTTP 认证、限流、超时;第二层是 IAuthorizedRequest 的模块/资源/动作授权;第三层是引擎 IFlowDataPermissionChecker 对具体 task/instance 的 View、Operate、Manage 决策。参与人命中只是任务责任,不自动等价于查看全部业务数据。

WorkflowPermissions 常量不是处理器使用的授权事实(实际授权来自 ResourceDescriptor 与 AuthorizationAction)。但 workflow.runtime Feature 已被强制执行:WorkflowRuntimeLicenseGuard 在每次工作流写入和每次后台作业前通过 ILicenseGate 评估它,失败关闭。

6. 成功响应的含义

  • 事务内实例、Execution、任务和轨迹写入成功,才返回运行时成功。
  • 通知落库已纳入同一事实链:INotificationChannel 实现逐接收人写站内信并进入 CAP Outbox,任一接收人失败会计数并在发送后抛出,分发器记录日志后继续重抛——命令提交成功即可证明通知事实已持久化;跨网络的外部送达仍由 Notifications 模块的消费者异步负责。
  • EventDispatcher 的监听器异常不再被静默隔离:记录日志后向上重抛,整个写操作随之失败回滚。监听器一致性因此成为流程正确性的一部分,自定义 Listener 必须按事务语义设计。
  • Timer 返回 processed 计数包含失败记录;它统计”遍历过”,不是”动作成功”。
  • 批量代批只标记任务完成,不推进流程,这是管理操作而非普通审批。

7. 生产前必做

验证双 ORM 并发、重复完成、并行网关、候选刷新、跨租户拒绝、定义发布竞争、Timer crash window、通知失败、业务回调失败、导入中断、归档孤儿、报表大区间和缓存失效。每项都需要可重现命令、预期错误、数据核对 SQL/Query 和恢复步骤。

8. 当前实现边界

workflow.runtime 已在运行时写入与后台作业前强制校验,不能再把它列为“仅有目录、未执行”的缺口。可视化设计器也已形成 Schema、AOT 业务元数据、乐观并发草稿、校验、模拟和发布闭环。

仍需显式接受的边界包括:旧的直接定义部署入口不会自动执行设计器的完整校验;模拟器只预览一条可达路径;浏览器崩溃快照目前按 tenant + definition key 隔离,不含 user;外部通知投递的送达确认依赖 Notifications 模块的 Outbox 消费,而独立宿主自建 Channel 的持久化强度取决于其自身实现。Timer、导入、归档和复杂并发是否满足具体产品 SLO,应以对应章节和发布候选测试为准,不沿用历史缺口清单。

9. 学习路径

建议先在可视化设计器中用三节点审批定义完成保存、validate、simulate、publish、start、complete 全流程;再增加排他网关;随后测试并行会签、转办与超时;最后做一次通知故障、并发完成和导入中断演练。每一步都同时查看实例、Execution、Task、ActivityRecord 和 TimerJob,而不是只看 HTTP 200。

10. 源码入口

Terminal window
# 引擎内核、平台用例和宿主端点。
rg --files src/Framework/BitzOrcas.Workflow src/Platform/Workflow src/Hosts/BitzOrcas.Api/Endpoints/Workflow
# 单元、架构与独立集成测试。
rg --files tests | rg 'Workflow|workflow'

返回 Workflow 模块总览


本章核心导航

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%