系统设计--审核状态
常见的审核状态:
待审核 ,已通过,已拒绝。
要有一个不可变的最终状态
要有一个不可变的最终状态,比如“已拒绝”或"已通过"。
如果最终状态可变,那状态有可能一直在变来变去。
可以设计成支持重新发起,重新生成一条新的审核单,而不是去修改历史“已拒绝”的单子。历史单子的终态保持不变。
状态变化最好有状态记录表
这样才知道状态是什么时候变化,旧状态是什么,新状态是什么,是谁审核的。
数据表设计:
- 审核表:
CREATE TABLE `t_audit` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` BIGINT NOT NULL COMMENT '申请人ID',
`title` VARCHAR(128) NOT NULL COMMENT '标题',
`content` MEDIUMTEXT DEFAULT NULL COMMENT '详细申请数据',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '审核状态: 0-草稿, 1-待审核, 2-已通过, 3-已拒绝',
`audit_remark` VARCHAR(255) DEFAULT NULL COMMENT '审核意见/拒绝原因',
`auditor_id` BIGINT DEFAULT NULL COMMENT '最后审核人ID',
`audit_time` DATETIME DEFAULT NULL COMMENT '最后审核时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_user_status` (`user_id`, `status`),
KEY `idx_status_created` (`status`, `created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审核表';
- 状态记录表:
CREATE TABLE `t_audit_log` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`audit_id` BIGINT NOT NULL COMMENT '申请单ID',
`old_status` TINYINT NOT NULL COMMENT '变更前状态 (1-待审核...)',
`new_status` TINYINT NOT NULL COMMENT '变更后状态 (2-已通过,3已拒绝)',
`operator_id` BIGINT NOT NULL COMMENT '操作人ID (用户或管理员)',
`operator_type` TINYINT NOT NULL DEFAULT 1 COMMENT '操作人类型: 1-用户自操作, 2-后台管理员',
`audit_remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_audit_id` (`audit_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审核状态变更记录表';
浙公网安备 33010602011771号