feat: let the current assignee reassign a pending task

Keep the same task id, move the pending inbox, and record TASK_REASSIGNED without advancing the step.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
0264408
2026-09-16 08:40:25 +08:00
co-authored by Cursor
parent 5795778112
commit 850583f326
15 changed files with 286 additions and 26 deletions
+7 -5
View File
@@ -1,6 +1,6 @@
# Ordo
轻量审批流程引擎。宿主通过 `OrdoEngine` 注册流程定义、发起实例、审批/驳回/撤回,并查询任务、实例与审计历史。引擎不绑定业务表单,也不自带 REST;业务数据放在 `ProcessContext` 里。
轻量审批流程引擎。宿主通过 `OrdoEngine` 注册流程定义、发起实例、审批/驳回/转派/撤回,并查询任务、实例与审计历史。引擎不绑定业务表单、用户体系或设计器 UI,当前也不自带 REST;业务数据放在 `ProcessContext` 里。
要求 **Java 17+**。当前版本 `0.0.1-SNAPSHOT`。
@@ -22,11 +22,12 @@
- 会签/或签:`ApprovalPolicy.ALL` / `ANY`(多候选人)
- ACTION 步骤:事务提交后调用宿主 `ActionHandler`
- 发起人撤回:`WITHDRAWN`,待办任务 `SKIPPED`
- 任务转派:当前办理人 `reassign`,审计 `TASK_REASSIGNED`
- 分页查询:任务 / 实例 / 流程定义
- 审计时间线:`ProcessEvent` + `queryHistory`
- 扩展点:`AssigneeResolver`、`RoutingCondition`、`ActionHandler`、`OrdoEventListener`
开发计划:任务转派、到期升级、`CANCELLED`、定义不可变多版本、MySQL 方言。多租户与官方 REST Starter **暂不在计划中**。见 [docs/roadmap.md](docs/roadmap.md)。
开发计划:到期升级、`CANCELLED`、定义不可变多版本、MySQL 方言、可选 REST + 目录 SPI。设计器为独立产品(不进本仓库),待 REST、目录与多版本定义之后。多租户 **暂不在计划中**。见 [docs/roadmap.md](docs/roadmap.md)。
详细用法(定义 JSON、扩展点、异常、查询、ACTION/审计语义)见 **[docs/usage.md](docs/usage.md)**。对外行为变更时同步更新该文档。
@@ -106,13 +107,14 @@ ordo:
| Bean | 默认 |
|---|---|
| `AssigneeResolver` | 候选人即办理人 |
| `RoutingCondition` | 始终匹配 |
| `RoutingCondition` | 始终匹配(全局单例;宿主可按 key 分发) |
| `ActionHandler` | 空操作 |
| `OrdoEventListener` | 可注册多个,提交后按顺序调用 |
## 运行时约定
**办理人** 必须等于任务 `assignee`,否则 `UnauthorizedTaskOperationException`。
**办理人** 必须等于任务 `assignee`,否则 `UnauthorizedTaskOperationException`(`approve` / `reject` / `reassign`)。
**转派** 只改 PENDING 任务的 `assignee`,不推进步骤。
**撤回** 仅发起人可操作,且实例须为 `RUNNING`。
实例状态:`RUNNING` / `APPROVED` / `REJECTED` / `WITHDRAWN`。
@@ -120,7 +122,7 @@ ordo:
**ACTION** 在审批事务提交之后执行。失败只记 `FAILED`、打日志、发 `ACTION_FAILED`,**不回滚已生效审批、不阻塞后续步骤**。可重试策略留给宿主(listener 或 `queryActionExecutions`)。
**历史** `queryHistory(instanceId, page)` 按时间升序。事件类型包括实例起止、任务创建/审批/跳过、ACTION 成败。
**历史** `queryHistory(instanceId, page)` 按时间升序。事件类型包括实例起止、任务创建/审批/跳过/转派、ACTION 成败。
`OrdoEventListener.onEvent` 在提交后派发;单个 listener 抛错不影响流程和其他 listener。
## 查询