/* 
 * 核心用户体系 
 * 存储系统用户基础身份信息
 */
CREATE TABLE `sys_user` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID（自增主键）',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名（唯一标识，必须小写字母开头）',
  `email` VARCHAR(100) NOT NULL COMMENT '邮箱（唯一标识，格式校验由程序控制）',
  `phone` VARCHAR(20) COMMENT '手机号（国际区号+号码，例如+8613912345678）',
  `is_locked` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '账户锁定状态（0-正常 1-锁定）',
  `last_login_at` DATETIME COMMENT '最后登录时间（UTC时区）',
  `avatar_url` VARCHAR(255) COMMENT '头像URL（CDN地址，格式：https://域名/路径）',
  `user_type` VARCHAR(20) NOT NULL DEFAULT 'SYSTEM' COMMENT '用户类型（SYSTEM:系统用户/EXTERNAL:外部用户）',
  `parent_id` BIGINT COMMENT '父用户ID（构建用户树形结构，NULL表示根节点）',
  `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`) COMMENT '主键约束',
  UNIQUE INDEX `idx_username` (`username`) COMMENT '用户名唯一索引（加速登录验证）',
  UNIQUE INDEX `idx_email` (`email`) COMMENT '邮箱唯一索引（保证账号唯一性）',
  FOREIGN KEY (`parent_id`) REFERENCES `sys_user` (`id`) ON DELETE SET NULL COMMENT '外键约束（父用户删除时置空，防止数据不一致）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户主表（存储核心身份信息）';

-- 用户认证体系相关表（密码分离存储）
CREATE TABLE `sys_user_auth` (
  `user_id` BIGINT NOT NULL COMMENT '用户ID（与sys_user.id一对一绑定）',
  `password_hash` VARCHAR(128) NOT NULL COMMENT 'BCrypt加密哈希值（固定60字符长度）',
  `password_modified` DATETIME NOT NULL COMMENT '密码最后修改时间（UTC时区）',
  `password_expire` DATETIME COMMENT '密码过期时间（NULL表示永不过期）',
  PRIMARY KEY (`user_id`) COMMENT '主键约束',
  FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除（用户删除时自动删除认证信息）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户认证表（存储敏感凭证信息）';

-- 密码历史记录表（防止重复使用旧密码）
CREATE TABLE `sys_password_history` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '记录ID（自增主键）',
  `user_id` BIGINT NOT NULL COMMENT '用户ID（与sys_user.id关联）',
  `old_password` VARCHAR(128) NOT NULL COMMENT '历史密码哈希值',
  `modified_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间（UTC时区）',
  PRIMARY KEY (`id`) COMMENT '主键约束',
  INDEX `idx_user_pwd` (`user_id`, `modified_at`) COMMENT '复合索引（加速历史密码查询）',
  FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除（用户删除时自动清理历史记录）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密码历史表（保存最近N次历史密码）';

-- 组织架构体系相关表（支持树形结构）
CREATE TABLE `sys_organization` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '组织ID（自增主键）',
  `org_name` VARCHAR(100) NOT NULL COMMENT '组织名称（显示用中文名）',
  `org_code` VARCHAR(50) NOT NULL COMMENT '组织编码（唯一业务标识，如DEP001）',
  `parent_id` BIGINT COMMENT '父组织ID（构建树形结构，NULL表示根节点）',
  `manager_id` BIGINT COMMENT '负责人ID（关联sys_user.id）',
  `tags` JSON COMMENT '组织标签（JSON数组，如["子公司","研发中心"]）',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（UTC时区）',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间（UTC时区）',
  PRIMARY KEY (`id`) COMMENT '主键约束',
  UNIQUE INDEX `idx_org_code` (`org_code`) COMMENT '组织编码唯一索引',
  FOREIGN KEY (`parent_id`) REFERENCES `sys_organization` (`id`) COMMENT '外键约束（维护树形结构完整性）',
  FOREIGN KEY (`manager_id`) REFERENCES `sys_user` (`id`) ON DELETE SET NULL COMMENT '外键约束（负责人删除时置空）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='组织架构表（支持多层级结构）';


/*
 * RBAC核心表（基于角色的访问控制）
 * 包含角色、权限及其关联关系
 */
CREATE TABLE `sys_role` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '角色ID（自增主键）',
  `role_name` VARCHAR(50) NOT NULL COMMENT '角色名称（显示用中文名）',
  `role_key` VARCHAR(50) NOT NULL COMMENT '角色标识符（唯一英文键，如admin）',
  `description` VARCHAR(255) COMMENT '角色描述（功能说明）',
  `parent_id` BIGINT COMMENT '父角色ID（构建角色继承树）',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `idx_role_key` (`role_key`) COMMENT '角色标识符唯一索引',
  FOREIGN KEY (`parent_id`) REFERENCES `sys_role` (`id`) COMMENT '外键约束（维护角色继承关系）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表（定义系统角色）';

CREATE TABLE `sys_permission` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '权限ID（自增主键）',
  `perm_name` VARCHAR(50) NOT NULL COMMENT '权限名称（显示用中文名）',
  `perm_key` VARCHAR(100) NOT NULL COMMENT '权限标识符（唯一业务键，如user:delete）',
  `description` VARCHAR(255) COMMENT '权限描述（功能说明）',
  `parent_id` BIGINT COMMENT '父权限ID（构建权限树形结构）',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `idx_perm_key` (`perm_key`) COMMENT '权限标识符唯一索引',
  FOREIGN KEY (`parent_id`) REFERENCES `sys_permission` (`id`) COMMENT '外键约束（维护权限继承关系）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表（定义细粒度权限）';

-- 用户-角色关联表（多对多关系）
CREATE TABLE `sys_user_role` (
  `user_id` BIGINT NOT NULL COMMENT '用户ID（关联sys_user.id）',
  `role_id` BIGINT NOT NULL COMMENT '角色ID（关联sys_role.id）',
  PRIMARY KEY (`user_id`, `role_id`) COMMENT '复合主键',
  FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除（用户删除时自动解除关联）',
  FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE COMMENT '级联删除（角色删除时自动解除关联）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表（建立用户与角色的多对多关系）';

-- 角色-权限关联表（多对多关系）
CREATE TABLE `sys_role_permission` (
  `role_id` BIGINT NOT NULL COMMENT '角色ID（关联sys_role.id）',
  `perm_id` BIGINT NOT NULL COMMENT '权限ID（关联sys_permission.id）',
  PRIMARY KEY (`role_id`, `perm_id`) COMMENT '复合主键',
  FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`) ON DELETE CASCADE COMMENT '级联删除（角色删除时自动解除关联）',
  FOREIGN KEY (`perm_id`) REFERENCES `sys_permission` (`id`) ON DELETE CASCADE COMMENT '级联删除（权限删除时自动解除关联）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限关联表（建立角色与权限的多对多关系）';

/*
 * 扩展字段体系（支持动态字段管理）
 * 包含字段定义和用户扩展数据存储
 */
CREATE TABLE `sys_field_definition` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '字段ID（自增主键）',
  `field_key` VARCHAR(50) NOT NULL COMMENT '字段标识符（英文唯一键，如birthday）',
  `field_name` VARCHAR(50) NOT NULL COMMENT '字段显示名称（如"出生日期"）',
  `field_type` ENUM('STRING','NUMBER','DATE','BOOLEAN','TEXT') NOT NULL DEFAULT 'STRING' COMMENT '字段类型（控制数据格式）',
  `is_required` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否必填（0-否 1-是）',
  `is_unique` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否唯一（0-否 1-是）',
  `user_types` JSON NOT NULL COMMENT '适用的用户类型（JSON数组，如["SYSTEM","EXTERNAL"]）',
  `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态（0-停用 1-启用）',
  `created_by` BIGINT NOT NULL COMMENT '创建人ID（关联sys_user.id）',
  `updated_by` BIGINT NOT NULL COMMENT '最后修改人ID（关联sys_user.id）',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（UTC时区）',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间（UTC时区）',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `idx_field_key` (`field_key`) COMMENT '字段标识符唯一索引',
  FOREIGN KEY (`created_by`) REFERENCES `sys_user` (`id`) COMMENT '外键约束（创建人必须存在）',
  FOREIGN KEY (`updated_by`) REFERENCES `sys_user` (`id`) COMMENT '外键约束（修改人必须存在）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='字段定义表（管理员维护动态字段）';

CREATE TABLE `sys_user_profile` (
  `user_id` BIGINT NOT NULL COMMENT '用户ID（关联sys_user.id）',
  `field_id` BIGINT NOT NULL COMMENT '字段ID（关联sys_field_definition.id）',
  `field_value` TEXT NOT NULL COMMENT '字段值（根据字段类型校验格式）',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（UTC时区）',
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间（UTC时区）',
  PRIMARY KEY (`user_id`, `field_id`) COMMENT '复合主键',
  FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`id`) ON DELETE CASCADE COMMENT '级联删除（用户删除时自动清理扩展数据）',
  FOREIGN KEY (`field_id`) REFERENCES `sys_field_definition` (`id`) COMMENT '外键约束（确保字段定义有效）'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户扩展表（存储动态字段数据）';