模块: 2.1.11 流程管理
日期: 2026-05-13
状态: 待审核
决策记录:
backend/app/)models/models.py ← 新增6个wf_* SQLAlchemy模型
schemas/workflow.py ← Pydantic schemas(请求/响应模型)
crud/workflow.py ← 数据库CRUD操作
services/
workflow_engine.py ← 核心引擎:节点分发、条件评估、审批人解析
workflow_callback.py ← 回调服务:通知业务模块状态变更
api/workflow.py ← API路由(注册到admin前缀)
web-admin/src/)api/workflow.ts ← API调用
types/api.d.ts ← 新增Workflow相关TS类型
views/system/workflow/
process/index.vue ← 流程配置管理(列表+设计器弹窗)
designer/
FlowDesigner.vue ← AntV X6流程设计器组件
nodes/ ← 自定义节点组件(Start/End/Approval/Condition)
config/ ← 节点属性配置面板
task-pending/index.vue ← 待办中心
task-completed/index.vue ← 已办中心
components/
ApprovalDialog.vue ← 审批操作弹窗(通过/驳回+意见)
ProcessStatusTag.vue ← 流程状态标签
router/modules/sqxp.ts ← 新增3个路由
graph_json + 同步写 wf_node/wf_transitionPOST /api/admin/workflow/instances 发起流程 → 引擎锁定当前版本 → 创建 start 任务wf_transition 遍历节点 → 审批节点创建 wf_task → 待办人收到待办已有 6 张表 DDL 见全库导出 docs/sql/zkxw.sql(搜索 wf_process_def 等表名);基线表结构以当前导出为准。
| 表名 | 用途 | 关键字段 |
|---|---|---|
wf_process_def |
流程定义 | process_code, process_name, status |
wf_process_version |
流程版本 | process_def_id, version_no, graph_json, is_latest |
wf_node |
流程节点 | process_version_id, node_key, node_type, config_json |
wf_transition |
流程连线 | process_version_id, from_node_key, to_node_key, condition_expr |
wf_process_instance |
流程实例 | process_version_id, business_type, business_id, variables_json, status |
wf_task |
流程任务 | instance_id, node_key, assignee_user_id, status, comment_text |
node_type 枚举值: start, end, approval, condition
instance.status 枚举值: running, completed, rejected, cancelled
task.status 枚举值: pending, approved, rejected, withdrawn
所有表均遵循公共字段规范:id(VARCHAR 64 UUID) → 业务字段 → tenant_no → order_num → remark → create_by → create_dept_id → create_time → update_by → update_time → del_flag
wf_process_instance 需新增 callback_url 字段(VARCHAR 512, 可空),用于业务回调地址。DDL 变更将在实施阶段维护到 docs/sql/(全量基线为 docs/sql/zkxw.sql,或附加增量脚本)。
工作流存在两套数据,各有用途:
graph_json(wf_process_version): 前端设计器画布快照,用于设计器加载/编辑/渲染。仅供前端使用,后端引擎不解析此字段。wf_node + wf_transition(关系表): 后端引擎运行时使用的规范化数据。引擎只读这些表来执行节点分发和条件评估。每种节点类型对应一个 handler,引擎根据 node_type 调度:
WorkflowEngine
├── StartNodeHandler → 自动推进到下一个节点
├── EndNodeHandler → 标记实例完成,触发回调
├── ApprovalNodeHandler → 解析审批人,创建wf_task记录
└── ConditionNodeHandler → 评估条件表达式,选择分支
引擎入口方法:advance(instance_id, from_node_key) — 从指定节点开始,执行当前节点逻辑,然后沿出边推进到下一个节点。
wf_transition.condition_expr 字段存储的是 JSON 规则格式(VARCHAR 512),不是任意文本表达式。安全可控,不支持任意代码执行:
{
"rules": [
{"field": "amount", "op": "<=", "value": 100},
{"field": "amount", "op": ">", "value": 100, "and": [{"field": "amount", "op": "<", "value": 300}]},
{"field": "amount", "op": ">=", "value": 300}
]
}
支持的操作符: ==, !=, >, <, >=, <=, in, not_in, contains
字段取值: 从 wf_process_instance.variables_json 中读取。支持嵌套路径用 . 分隔(如 applicant.dept_id)。
条件评估逻辑: ConditionNodeHandler 遍历所有出边(wf_transition),依次评估每条边的 condition_expr。第一条匹配的边即为执行路径。最后一条边可省略条件作为"其他情况"默认分支。
config_json 中的 approver 字段定义解析策略:
{
"strategy": "users",
"pass_type": "any",
"user_ids": ["uuid1", "uuid2"]
}
strategy 枚举:
| 策略 | 配置字段 | 说明 |
|---|---|---|
users |
user_ids: string[] |
指定具体用户 |
roles |
role_ids: string[] |
指定角色,运行时解析角色下的所有用户 |
sql |
sql: string |
SQL查询,返回user_id列表 |
pass_type 枚举:
any — 任一审批人通过即推进all — 所有审批人都必须通过才推进SQL策略安全约束:
:var_name 占位符)wf_process_instance.process_version_id 锁定当前 is_latest=1 的版本is_latest 置为 0,创建新版本记录 is_latest=1发起 → running → completed(到达end节点)
→ rejected(审批驳回,无其他分支时)
→ cancelled(业务主动取消)
创建 → pending → approved(审批通过)
→ rejected(审批驳回)
→ withdrawn(发起人撤回)
共13个路由,全部走 /api/admin/workflow/ 前缀,带JWT认证和租户隔离。
| 路由 | 方法 | 说明 |
|---|---|---|
/api/admin/workflow/defs |
GET | 流程定义列表(分页+搜索,支持按名称/编码/状态筛选) |
/api/admin/workflow/defs |
POST | 新建流程定义 |
/api/admin/workflow/defs/{id} |
PUT | 更新流程定义基本信息 |
/api/admin/workflow/defs/{id} |
DELETE | 软删除流程定义(del_flag=1) |
/api/admin/workflow/defs/{id}/publish |
POST | 发布新版本(接收graph_json+nodes+transitions,创建新版本) |
/api/admin/workflow/defs/{id}/versions |
GET | 版本历史列表 |
| 路由 | 方法 | 说明 |
|---|---|---|
/api/admin/workflow/instances |
POST | 发起流程(业务模块调用,传入process_code+business_type+business_id+variables) |
/api/admin/workflow/instances/{id} |
GET | 流程实例详情(含任务列表和流程图高亮当前节点) |
| 路由 | 方法 | 说明 |
|---|---|---|
/api/admin/workflow/tasks/pending |
GET | 我的待办列表(按assignee_user_id=当前用户+status=pending过滤) |
/api/admin/workflow/tasks/completed |
GET | 我的已办列表(按assignee_user_id=当前用户+status in [approved,rejected]过滤) |
/api/admin/workflow/tasks/{id}/approve |
POST | 审批通过(传comment_text) |
/api/admin/workflow/tasks/{id}/reject |
POST | 审批驳回(传comment_text) |
发起流程请求:
POST /api/admin/workflow/instances
{
"process_code": "agreement_payment",
"business_type": "agreement",
"business_id": "agr_uuid_123",
"variables": {
"amount": 5000,
"dept_id": "dept_001",
"applicant_id": "user_001"
},
"callback_url": "/api/admin/agreements/workflow-callback"
}
审批操作请求:
POST /api/admin/workflow/tasks/{id}/approve
{
"comment_text": "同意,费用已核实"
}
process/index.vue)模式: 标准列表页(参考 unit/index.vue 模板)
列表字段: 流程编码、流程名称、状态(启用/停用)、最新版本号、创建时间、操作
操作按钮: 新增、编辑、流程设计(打开X6设计器弹窗)、发布新版本、停用/启用、删除
设计器入口: 点击"流程设计"→ 全屏弹窗打开 AntV X6 设计器
designer/FlowDesigner.vue)三栏布局:
顶部工具栏: 保存草稿、发布新版本、撤销/重做、放大/缩小/适应画布
保存逻辑: 保存时序列化为 {graph_json, nodes: [{node_key, node_type, config_json, ...}], transitions: [{from_node_key, to_node_key, condition_expr, ...}]} 提交到后端
自定义节点样式: 每种节点类型使用不同的形状和颜色
task-pending/index.vue)模式: 复杂列表页(参考 order/index.vue)
筛选: 流程名称、业务类型、发起时间范围
列表字段: 流程名称、业务类型、业务单号、发起人、发起时间、到达时间、操作
操作: 审批(打开审批弹窗)、查看详情
审批弹窗(ApprovalDialog.vue): 通过/驳回选择 + 审批意见输入框 + 查看流程图(只读模式,高亮当前节点)
task-completed/index.vue)模式: 标准列表页
筛选: 同待办中心 + 审批结果筛选(通过/驳回)
列表字段: 流程名称、业务类型、业务单号、发起人、审批结果、审批意见、审批时间
操作: 查看详情
引擎在以下事件触发 HTTP POST 回调到 callback_url:
实例完成:
{
"event": "completed",
"instance_id": "inst_uuid",
"process_code": "agreement_payment",
"business_type": "agreement",
"business_id": "agr_uuid_123"
}
实例驳回:
{
"event": "rejected",
"instance_id": "inst_uuid",
"process_code": "agreement_payment",
"business_type": "agreement",
"business_id": "agr_uuid_123",
"reject_comment": "费用异常,请核实"
}
POST /api/admin/workflow/instances