CREATE DATABASE IF NOT EXISTS baiyue_audit DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; USE baiyue_audit; CREATE TABLE IF NOT EXISTS sys_audit_log ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '审计日志自增ID', event_id VARCHAR(64) DEFAULT NULL COMMENT '审计事件全局唯一ID', event_type VARCHAR(64) NOT NULL COMMENT '审计事件编码', resource_type VARCHAR(64) NOT NULL COMMENT '被操作资源类型', resource_id VARCHAR(128) DEFAULT NULL COMMENT '被操作资源ID', description VARCHAR(255) DEFAULT NULL COMMENT '操作说明', request_id VARCHAR(128) DEFAULT NULL COMMENT '请求ID,用于单次请求追踪', trace_id VARCHAR(128) DEFAULT NULL COMMENT '分布式链路追踪ID', tenant_id BIGINT DEFAULT NULL COMMENT '客户ID和数据隔离键;平台级审计可为空或为0', operator_tenant_id BIGINT DEFAULT NULL COMMENT '操作主体所属客户ID;平台操作可为空或为0', user_id BIGINT DEFAULT NULL COMMENT '操作用户ID', username VARCHAR(128) DEFAULT NULL COMMENT '操作用户名快照', app_code VARCHAR(64) DEFAULT NULL COMMENT '操作来源应用端', client_type VARCHAR(32) DEFAULT NULL COMMENT '客户端类型', http_method VARCHAR(16) DEFAULT NULL COMMENT 'HTTP请求方法', request_uri VARCHAR(512) DEFAULT NULL COMMENT '请求URI', client_ip VARCHAR(64) DEFAULT NULL COMMENT '客户端IP', duration_ms BIGINT NOT NULL DEFAULT 0 COMMENT '请求耗时(毫秒)', success TINYINT NOT NULL DEFAULT 0 COMMENT '操作是否成功', error_code VARCHAR(64) DEFAULT NULL COMMENT '失败时的错误码', error_message VARCHAR(512) DEFAULT NULL COMMENT '脱敏后的失败信息', before_data JSON DEFAULT NULL COMMENT '变更前数据快照(已脱敏)', after_data JSON DEFAULT NULL COMMENT '变更后数据快照(已脱敏)', service_name VARCHAR(64) DEFAULT NULL COMMENT '产生日志的服务名', occurred_at DATETIME(3) NOT NULL COMMENT '业务操作发生时间', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '审计服务落库时间', PRIMARY KEY (id), UNIQUE KEY uk_audit_event_id (event_id), KEY idx_audit_tenant_time (tenant_id, occurred_at), KEY idx_audit_event_time (event_type, occurred_at), KEY idx_audit_user_time (user_id, occurred_at), KEY idx_audit_request (request_id) ) ENGINE=InnoDB COMMENT='统一业务审计日志表:追加记录敏感操作的主体、租户、资源、结果及前后快照;不同于消息Outbox和消费幂等表'; CREATE TABLE IF NOT EXISTS sys_audit_dead_letter ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT '死信记录自增ID', event_id VARCHAR(64) NOT NULL COMMENT '审计事件全局唯一ID', payload_text LONGTEXT NOT NULL COMMENT 'RocketMQ死信原始载荷', status VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '状态:PENDING待补偿、PROCESSING处理中、PROCESSED已处理、DEAD永久失败', retry_count INT NOT NULL DEFAULT 0 COMMENT '死信重试次数', next_retry_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '下次允许补偿时间', lease_owner VARCHAR(128) NULL COMMENT '当前补偿租约持有实例', lease_until DATETIME(3) NULL COMMENT '当前补偿租约截止时间', last_error VARCHAR(1000) NULL COMMENT '最近一次补偿错误', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '死信记录创建时间', processed_at DATETIME(3) NULL COMMENT '补偿处理完成时间', PRIMARY KEY (id), UNIQUE KEY uk_audit_dead_event (event_id), KEY idx_audit_dead_retry (status, next_retry_at, lease_until) ) ENGINE=InnoDB COMMENT='审计消息死信补偿表';