-- S1 基础治理:审批、审计、幂等、Outbox 与看板汇总 -- MySQL 8.0+ CREATE TABLE IF NOT EXISTS `hg_approval_request` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `approval_no` varchar(32) NOT NULL COMMENT '审批单号', `approval_type` varchar(32) NOT NULL COMMENT '审批类型', `target_type` varchar(32) NOT NULL COMMENT '目标类型', `target_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '目标ID', `action` varchar(64) NOT NULL COMMENT '拟执行动作', `title` varchar(200) NOT NULL COMMENT '审批标题', `payload_json` json NOT NULL COMMENT '待执行数据快照', `diff_json` json DEFAULT NULL COMMENT '前后差异', `risk_level` tinyint NOT NULL DEFAULT 1 COMMENT '风险级别', `required_approvals` int unsigned NOT NULL DEFAULT 1 COMMENT '需要通过数', `approval_status` tinyint NOT NULL DEFAULT 1 COMMENT '审批状态', `applicant_id` bigint unsigned NOT NULL COMMENT '申请人', `submitted_at` datetime(3) DEFAULT NULL COMMENT '提交时间', `decided_at` datetime(3) DEFAULT NULL COMMENT '决定时间', `executed_at` datetime(3) DEFAULT NULL COMMENT '执行时间', `expire_at` datetime(3) DEFAULT NULL COMMENT '超时时间', `version` int unsigned NOT NULL DEFAULT 0 COMMENT '乐观锁', `remark` varchar(500) DEFAULT NULL COMMENT '备注', `created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者', `updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_approval_no` (`approval_no`), KEY `idx_approval_type_status` (`tenant_id`,`approval_type`,`approval_status`,`created_at`,`id`), KEY `idx_approval_target` (`tenant_id`,`target_type`,`target_id`,`created_at`), KEY `idx_approval_applicant` (`tenant_id`,`applicant_id`,`created_at`), KEY `idx_approval_expire` (`approval_status`,`expire_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_审批请求'; CREATE TABLE IF NOT EXISTS `hg_approval_action` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `approval_request_id` bigint unsigned NOT NULL COMMENT '审批请求ID', `step_no` int unsigned NOT NULL COMMENT '节点顺序', `actor_id` bigint unsigned NOT NULL COMMENT '操作人', `action` tinyint NOT NULL COMMENT '审批动作', `reason_code` varchar(64) DEFAULT NULL COMMENT '原因编码', `comment` varchar(1000) DEFAULT NULL COMMENT '审批意见', `snapshot_json` json NOT NULL COMMENT '操作时快照', `actor_ip_cipher` varchar(512) DEFAULT NULL COMMENT '操作IP密文', `mfa_verified` tinyint NOT NULL DEFAULT 0 COMMENT '是否二次认证', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_approval_step_actor` (`approval_request_id`,`step_no`,`actor_id`), KEY `idx_approval_action_request` (`tenant_id`,`approval_request_id`,`created_at`), KEY `idx_approval_action_actor` (`tenant_id`,`actor_id`,`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_审批动作'; CREATE TABLE IF NOT EXISTS `hg_sensitive_access_log` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `access_no` varchar(32) NOT NULL COMMENT '查看流水号', `actor_id` bigint unsigned NOT NULL COMMENT '管理员ID', `target_type` varchar(32) NOT NULL COMMENT '目标类型', `target_id` bigint unsigned NOT NULL COMMENT '目标ID', `field_set` json NOT NULL COMMENT '查看字段集', `purpose_code` varchar(64) NOT NULL COMMENT '用途编码', `purpose_text` varchar(500) NOT NULL COMMENT '用途说明', `authorization_no` varchar(64) DEFAULT NULL COMMENT '授权号', `mfa_verified` tinyint NOT NULL DEFAULT 0 COMMENT '是否二次认证', `result` tinyint NOT NULL COMMENT '查看结果', `trace_id` varchar(64) NOT NULL COMMENT '链路ID', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_sensitive_access_no` (`access_no`), KEY `idx_sensitive_actor` (`tenant_id`,`actor_id`,`created_at`), KEY `idx_sensitive_target` (`tenant_id`,`target_type`,`target_id`,`created_at`), KEY `idx_sensitive_trace` (`trace_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_敏感数据查看日志'; CREATE TABLE IF NOT EXISTS `hg_biz_audit_log` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `audit_no` varchar(32) NOT NULL COMMENT '审计号', `actor_type` tinyint NOT NULL COMMENT '操作人类型', `actor_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '操作人ID', `module` varchar(64) NOT NULL COMMENT '业务模块', `action` varchar(64) NOT NULL COMMENT '操作动作', `target_type` varchar(64) NOT NULL COMMENT '目标类型', `target_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '目标ID', `before_digest` char(64) DEFAULT NULL COMMENT '变更前摘要', `after_digest` char(64) DEFAULT NULL COMMENT '变更后摘要', `change_json` json DEFAULT NULL COMMENT '已脱敏差异', `reason` varchar(500) DEFAULT NULL COMMENT '操作原因', `approval_no` varchar(32) DEFAULT NULL COMMENT '审批单号', `trace_id` varchar(64) NOT NULL COMMENT '链路ID', `prev_hash` char(64) DEFAULT NULL COMMENT '前一条哈希', `row_hash` char(64) NOT NULL COMMENT '当前行哈希', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_biz_audit_no` (`audit_no`), KEY `idx_biz_audit_actor` (`tenant_id`,`actor_id`,`created_at`), KEY `idx_biz_audit_target` (`tenant_id`,`target_type`,`target_id`,`created_at`), KEY `idx_biz_audit_module` (`tenant_id`,`module`,`action`,`created_at`), KEY `idx_biz_audit_trace` (`trace_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_业务审计日志'; CREATE TABLE IF NOT EXISTS `hg_idempotency_record` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `scope` varchar(64) NOT NULL COMMENT '业务作用域', `idempotency_key` varchar(128) NOT NULL COMMENT '幂等键', `request_digest` char(64) NOT NULL COMMENT '请求摘要', `resource_type` varchar(64) DEFAULT NULL COMMENT '资源类型', `resource_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '资源ID', `process_status` tinyint NOT NULL DEFAULT 1 COMMENT '处理状态', `response_code` int DEFAULT NULL COMMENT '响应码', `response_digest` char(64) DEFAULT NULL COMMENT '响应摘要', `expire_at` datetime(3) NOT NULL COMMENT '过期时间', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_idempotency_scope_key` (`tenant_id`,`scope`,`idempotency_key`), KEY `idx_idempotency_expire` (`expire_at`), KEY `idx_idempotency_resource` (`tenant_id`,`resource_type`,`resource_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_幂等记录'; CREATE TABLE IF NOT EXISTS `hg_outbox_event` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `event_no` varchar(32) NOT NULL COMMENT '事件号', `aggregate_type` varchar(64) NOT NULL COMMENT '聚合根类型', `aggregate_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '聚合根ID', `event_type` varchar(128) NOT NULL COMMENT '事件类型', `payload_json` json NOT NULL COMMENT '已脱敏事件数据', `publish_status` tinyint NOT NULL DEFAULT 1 COMMENT '发送状态', `retry_count` int unsigned NOT NULL DEFAULT 0 COMMENT '重试次数', `next_retry_at` datetime(3) DEFAULT NULL COMMENT '下次重试时间', `last_error` varchar(1000) DEFAULT NULL COMMENT '最后错误', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `published_at` datetime(3) DEFAULT NULL COMMENT '发送时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_outbox_event_no` (`event_no`), KEY `idx_outbox_publish` (`publish_status`,`next_retry_at`,`id`), KEY `idx_outbox_aggregate` (`tenant_id`,`aggregate_type`,`aggregate_id`,`created_at`), KEY `idx_outbox_event_type` (`tenant_id`,`event_type`,`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_事件出站箱'; CREATE TABLE IF NOT EXISTS `hg_dashboard_daily_stat` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID', `stat_date` date NOT NULL COMMENT '统计日期', `dimension_type` varchar(32) NOT NULL COMMENT '维度类型', `dimension_value` varchar(64) NOT NULL COMMENT '维度值', `metric_code` varchar(64) NOT NULL COMMENT '指标编码', `metric_count` bigint NOT NULL DEFAULT 0 COMMENT '指标数量', `metric_amount` bigint NOT NULL DEFAULT 0 COMMENT '指标金额(最小货币单位)', `calculated_at` datetime(3) NOT NULL COMMENT '计算时间', `created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `updated_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_dashboard_metric` (`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`), KEY `idx_dashboard_date_metric` (`tenant_id`,`stat_date`,`metric_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='治理_看板日汇总';