IMS系统工作流引擎设计与实现

技术架构 · 2026-05-23 更新

1. 工作流引擎概述

工作流引擎是 IMS 系统的核心组件,负责管理业务流程的定义、发起、审批、流转和归档。一个完整的工作流包括:

2. 流程数据模型

/* 流程定义表 */ CREATE TABLE wf_process ( id BIGINT PRIMARY KEY AUTO_INCREMENT, process_key VARCHAR(64) NOT NULL, /* 流程标识 */ name VARCHAR(128) NOT NULL, /* 流程名称 */ version INT DEFAULT 1, definition JSON NOT NULL, /* 流程定义 JSON */ status TINYINT DEFAULT 1, /* 0:禁用 1:启用 */ created_at DATETIME ); /* 流程实例表 */ CREATE TABLE wf_instance ( id BIGINT PRIMARY KEY AUTO_INCREMENT, process_id BIGINT NOT NULL, business_key VARCHAR(64), /* 业务主键 */ current_node VARCHAR(64), status TINYINT, /* 1:进行中 2:已完成 3:已终止 */ initiator BIGINT NOT NULL, started_at DATETIME, ended_at DATETIME ); /* 任务表 */ CREATE TABLE wf_task ( id BIGINT PRIMARY KEY AUTO_INCREMENT, instance_id BIGINT NOT NULL, node_key VARCHAR(64) NOT NULL, assignee BIGINT, /* 处理人 */ status TINYINT DEFAULT 0, /* 0:待处理 1:已处理 2:已转交 */ comment TEXT, created_at DATETIME, completed_at DATETIME );

3. 节点类型设计

/* 节点类型枚举 */ typedef enum { NODE_START = 1, /* 开始节点 */ NODE_END = 2, /* 结束节点 */ NODE_APPROVAL = 3, /* 审批节点 */ NODE_CONDITION = 4, /* 条件节点 */ NODE_PARALLEL = 5, /* 并行网关 */ NODE_SUBPROCESS = 6 /* 子流程 */ } NodeType; /* 节点配置 */ typedef struct NodeConfig { char node_key[64]; NodeType type; char assignee_type[32]; /* user/department/role/dynamic */ char assignee_expr[256]; /* 动态表达式 */ int timeout_hours; char action[32]; /* approve/reject/transfer */ } NodeConfig;

4. 审批逻辑实现

4.1 审批操作

/* 审批操作核心逻辑 */ int approve_task(Task *task, int user_id, const char *action, const char *comment) { /* 1. 验证权限 */ if (!can_approve(task, user_id)) { return -1; } /* 2. 记录审批结果 */ update_task_status(task->id, STATUS_COMPLETED); add_task_comment(task->id, user_id, comment); /* 3. 根据操作类型处理 */ if (strcmp(action, "approve") == 0) { return move_to_next_node(task->instance); } else if (strcmp(action, "reject") == 0) { return move_to_previous_node(task->instance); } else if (strcmp(action, "transfer") == 0) { /* 转交给其他人 */ return transfer_task(task, user_id); } return 0; }

4.2 会签(多审批人)

会签要求所有审批人都通过才能进入下一节点。

/* 会签任务处理 */ void handle_counter_sign(Instance *inst, int task_id) { int total = get_counter_sign_count(inst); /* 会签总人数 */ int approved = get_counter_sign_approved(inst, inst->current_node); if (approved + 1 == total) { /* 全部通过,进入下一节点 */ move_to_next_node(inst); } else { /* 记录已通过,等待其他人 */ increment_counter_sign_approved(inst, inst->current_node); } }

5. 规则引擎

使用规则引擎处理动态 assignee(指定人)和条件分支。

/* 简单规则引擎 */ typedef struct RuleContext { void *business_data; /* 业务数据 */ Dict *variables; /* 变量映射 */ } RuleContext; char *evaluate_assignee(const char *expr, RuleContext *ctx) { /* 支持表达式如: ${initiator.department.manager} */ if (strncmp(expr, "${", 2) == 0) { return resolve_path(expr + 2, ctx); } return strdup(expr); } /* 条件节点判断 */ int evaluate_condition(const char *condition, RuleContext *ctx) { /* 支持: amount > 10000, dept == '财务部' 等 */ /* 可使用开源规则引擎如 Drools 的轻量实现 */ return simple_eval(condition, ctx->variables); }
实现建议:工作流引擎的核心是状态机设计,建议使用有限状态自动机(FSA)建模;审批记录要完整保留,用于审计;考虑引入消息队列处理异步任务,提高并发能力。