IMS系统工作流引擎设计与实现
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)建模;审批记录要完整保留,用于审计;考虑引入消息队列处理异步任务,提高并发能力。