系统设计--审核状态

常见的审核状态:

待审核 ,已通过,已拒绝。

要有一个不可变的最终状态

要有一个不可变的最终状态,比如“已拒绝”或"已通过"。

如果最终状态可变,那状态有可能一直在变来变去。

可以设计成支持重新发起,重新生成一条新的审核单,而不是去修改历史“已拒绝”的单子。历史单子的终态保持不变。

状态变化最好有状态记录表

这样才知道状态是什么时候变化,旧状态是什么,新状态是什么,是谁审核的。

数据表设计:

  • 审核表:
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='审核状态变更记录表';

posted on 2026-08-01 12:19  乐之者v  阅读(17)  评论(0)    收藏  举报

导航