-- Flyway migration V1 — initial schema for 小羚羊
-- Generated: 2026-05-14T01:37:50Z
-- Source: 由 A4 db-init 从 docs/03-数据库设计文档.md 翻译生成（schema SSoT 是 docs/03）
-- This is the FIRST migration; subsequent schema changes must be written as new files sql/migrations/V2__<desc>.sql, V3__... etc.
-- Apply: Flyway runs this automatically at Spring Boot startup.
-- Do not hand-edit this file after it is committed; write a new migration instead.

-- ===========================================================================
-- t_user — 系统用户主表，承载登录认证与基础属性
-- ===========================================================================
CREATE TABLE `t_user` (
  `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID（标准列）',
  `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（标准列）',
  `sUserNo` VARCHAR(50) NOT NULL COMMENT '用户号；关联职员后自动同步员工号；系统内唯一',
  `sUserName` VARCHAR(50) NOT NULL COMMENT '登录用户名；系统内唯一；3-50 位',
  `iEmployeeId` INT NULL DEFAULT NULL COMMENT '关联职员 t_employee.iIncrement；可空（非员工账号如系统管理员）',
  `sPasswordHash` VARCHAR(255) NOT NULL COMMENT '密码哈希（BCrypt / Argon2）；禁止明文；初始密码 666666 哈希后存入',
  `sUserType` VARCHAR(20) NOT NULL DEFAULT 'NORMAL' COMMENT '用户类型枚举：NORMAL（普通用户）/ SUPER_ADMIN（超级管理员）',
  `sLanguage` VARCHAR(10) NOT NULL DEFAULT 'zh-CN' COMMENT '语言枚举：zh-CN（中文）/ en-US（英文）/ zh-TW（繁体）',
  `bModifyDoc` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '单据修改权限：0 否 / 1 是',
  `bVoid` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '作废标记（软删除）：0 启用 / 1 已作废',
  `iLoginFailCount` INT NOT NULL DEFAULT 0 COMMENT '连续登录失败次数；达到阈值触发临时锁定；登录成功后清零',
  `tLockUntil` DATETIME NULL DEFAULT NULL COMMENT '锁定截止时间；NULL 表示未锁定',
  `tLastLoginDate` DATETIME NULL DEFAULT NULL COMMENT '最近一次登录时间',
  `sCreator` VARCHAR(100) NULL DEFAULT NULL COMMENT '制单人（创建该账号的操作员用户名）',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_user_username` (`sUserName`),
  UNIQUE KEY `uk_user_userno` (`sUserNo`),
  KEY `idx_user_employee` (`iEmployeeId`),
  KEY `idx_user_tenant` (`sBrandsId`, `sSubsidiaryId`),
  KEY `idx_user_void` (`bVoid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统用户主表，承载登录认证与基础属性';

-- ===========================================================================
-- t_employee — 公司职员主档
-- ===========================================================================
CREATE TABLE `t_employee` (
  `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID（标准列）',
  `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（标准列）',
  `sEmployeeNo` VARCHAR(50) NOT NULL COMMENT '员工号；系统内唯一',
  `sName` VARCHAR(100) NOT NULL COMMENT '姓名',
  `iDepartmentId` INT NULL DEFAULT NULL COMMENT '部门 ID，关联 t_department.iIncrement',
  `sPhone` VARCHAR(20) NULL DEFAULT NULL COMMENT '手机号',
  `sEmail` VARCHAR(100) NULL DEFAULT NULL COMMENT '邮箱',
  `bDisabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否离职：0 在职 / 1 离职',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_employee_no` (`sEmployeeNo`),
  KEY `idx_employee_dept` (`iDepartmentId`),
  KEY `idx_employee_name` (`sName`),
  KEY `idx_employee_tenant` (`sBrandsId`, `sSubsidiaryId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司职员主档';

-- ===========================================================================
-- t_department — 部门组织树
-- ===========================================================================
CREATE TABLE `t_department` (
  `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID（标准列）',
  `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（标准列）',
  `sName` VARCHAR(100) NOT NULL COMMENT '部门名称',
  `sCode` VARCHAR(50) NOT NULL COMMENT '部门编码；系统内唯一',
  `iParentId` INT NULL DEFAULT NULL COMMENT '上级部门 ID，NULL 表示根部门',
  `iSortOrder` INT NOT NULL DEFAULT 0 COMMENT '排序值，小者靠前',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_department_code` (`sCode`),
  KEY `idx_department_parent` (`iParentId`),
  KEY `idx_department_tenant` (`sBrandsId`, `sSubsidiaryId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门组织树';

-- ===========================================================================
-- t_permission — 权限分类字典
-- ===========================================================================
CREATE TABLE `t_permission` (
  `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID（标准列）',
  `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（标准列）',
  `sCode` VARCHAR(50) NOT NULL COMMENT '权限码，例如 USR:ADD / USR:EDIT；系统内唯一',
  `sName` VARCHAR(100) NOT NULL COMMENT '权限分类名称（展示用）',
  `iSortOrder` INT NOT NULL DEFAULT 0 COMMENT '同分类内排序',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_permission_code` (`sCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限分类字典';

-- ===========================================================================
-- t_user_permission — 用户-权限分类关联表
-- ===========================================================================
CREATE TABLE `t_user_permission` (
  `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID（标准列）',
  `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（标准列）',
  `iUserId` INT NOT NULL COMMENT '用户 ID，关联 t_user.iIncrement',
  `iPermissionId` INT NOT NULL COMMENT '权限分类 ID，关联 t_permission.iIncrement',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_user_perm` (`iUserId`, `iPermissionId`),
  KEY `idx_user_perm_perm` (`iPermissionId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户-权限分类关联表';

-- ===========================================================================
-- t_company — 公司 / 版本字典
-- ===========================================================================
CREATE TABLE `t_company` (
  `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID（标准列）',
  `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间（标准列）',
  `sCode` VARCHAR(50) NOT NULL COMMENT '公司 / 版本编码；系统内唯一',
  `sName` VARCHAR(100) NOT NULL COMMENT '显示名称',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_company_code` (`sCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司 / 版本字典';

-- ===========================================================================
-- 外键约束（统一在最后追加，避免建表顺序依赖）
-- ===========================================================================
ALTER TABLE `t_user`
  ADD CONSTRAINT `fk_user_employee` FOREIGN KEY (`iEmployeeId`) REFERENCES `t_employee` (`iIncrement`) ON DELETE SET NULL ON UPDATE RESTRICT;

ALTER TABLE `t_employee`
  ADD CONSTRAINT `fk_employee_department` FOREIGN KEY (`iDepartmentId`) REFERENCES `t_department` (`iIncrement`) ON DELETE SET NULL ON UPDATE RESTRICT;

ALTER TABLE `t_department`
  ADD CONSTRAINT `fk_department_parent` FOREIGN KEY (`iParentId`) REFERENCES `t_department` (`iIncrement`) ON DELETE RESTRICT ON UPDATE RESTRICT;

ALTER TABLE `t_user_permission`
  ADD CONSTRAINT `fk_userperm_user` FOREIGN KEY (`iUserId`) REFERENCES `t_user` (`iIncrement`) ON DELETE CASCADE ON UPDATE RESTRICT;

ALTER TABLE `t_user_permission`
  ADD CONSTRAINT `fk_userperm_perm` FOREIGN KEY (`iPermissionId`) REFERENCES `t_permission` (`iIncrement`) ON DELETE RESTRICT ON UPDATE RESTRICT;
