-- Flyway migration V1 — initial schema for 小羚羊
-- Generated: 2026-05-14T15:46:57Z
-- 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.

-- =============================================================================
-- Table: sys_company — 公司 / 版本字典，登录页下拉选择来源
-- =============================================================================
CREATE TABLE `sys_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 '创建时间（标准列）',
  `sCompanyName`   VARCHAR(100) NOT NULL                     COMMENT '公司 / 版本名称（登录页下拉显示文本）',
  `sCompanyCode`   VARCHAR(50)  NOT NULL                     COMMENT '公司编码（前端唯一识别）',
  `iSortOrder`     INT          NOT NULL DEFAULT 0           COMMENT '下拉列表排序权重，升序',
  `iIsDeleted`     TINYINT(1)   NOT NULL DEFAULT 0           COMMENT '软删除标记，0=正常 1=已删',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_sys_company_code` (`sCompanyCode`),
  KEY `idx_sys_company_is_deleted` (`iIsDeleted`, `iSortOrder`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司 / 版本字典，登录页下拉选择来源';


-- =============================================================================
-- Table: sys_department — 部门字典，职员归属
-- =============================================================================
CREATE TABLE `sys_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 '创建时间（标准列）',
  `sDepartmentName`  VARCHAR(100) NOT NULL                     COMMENT '部门名称',
  `sDepartmentCode`  VARCHAR(50)  NOT NULL                     COMMENT '部门编码',
  `iIsDeleted`       TINYINT(1)   NOT NULL DEFAULT 0           COMMENT '软删除标记',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_sys_department_code` (`sDepartmentCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门字典，职员归属';


-- =============================================================================
-- Table: sys_employee — 职员档案，员工基础信息
-- =============================================================================
CREATE TABLE `sys_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 '创建时间（标准列）',
  `sEmployeeName`   VARCHAR(50)  NOT NULL                     COMMENT '员工姓名（2-50 字符）',
  `sEmployeeCode`   VARCHAR(50)  NOT NULL                     COMMENT '员工工号（系统内唯一）',
  `iDepartmentId`   INT          NOT NULL                     COMMENT '所属部门 ID（FK → sys_department.iIncrement）',
  `sPhone`          VARCHAR(20)  NULL     DEFAULT NULL        COMMENT '手机号',
  `sEmail`          VARCHAR(100) NULL     DEFAULT NULL        COMMENT '邮箱',
  `iIsDeleted`      TINYINT(1)   NOT NULL DEFAULT 0           COMMENT '软删除标记',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_sys_employee_code` (`sEmployeeCode`),
  KEY `idx_sys_employee_department` (`iDepartmentId`),
  KEY `idx_sys_employee_name` (`sEmployeeName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='职员档案，员工基础信息';


-- =============================================================================
-- Table: sys_user — 用户账号（登录认证 + 类型 + 语言 + 状态 + 登录追踪）
-- =============================================================================
CREATE TABLE `sys_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 '创建时间（标准列）',
  `sUsername`           VARCHAR(50)  NOT NULL                     COMMENT '用户名（登录凭据，系统内全局唯一，3-20 位字母数字下划线）',
  `sUserCode`           VARCHAR(50)  NOT NULL                     COMMENT '用户号（业务展示用编码，系统内唯一）',
  `sPasswordHash`       VARCHAR(255) NOT NULL                     COMMENT '密码哈希（BCrypt / Argon2，禁明文）',
  `iEmployeeId`         INT          NULL     DEFAULT NULL        COMMENT '关联职员 ID（可选；FK → sys_employee.iIncrement）',
  `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=繁体',
  `iCanEditDocument`    TINYINT(1)   NOT NULL DEFAULT 0           COMMENT '单据修改权限：0=否 1=是',
  `iIsDeleted`          TINYINT(1)   NOT NULL DEFAULT 0           COMMENT '是否作废：0=启用 1=作废（停用）',
  `iFailedLoginCount`   INT          NOT NULL DEFAULT 0           COMMENT '累计登录失败次数，达阈值锁定，登录成功清零',
  `tLockUntil`          DATETIME     NULL     DEFAULT NULL        COMMENT '锁定截止时间，NULL=未锁定，过期自动解锁',
  `tLastLoginDate`      DATETIME     NULL     DEFAULT NULL        COMMENT '最后一次成功登录时间，REQ-USR-004 登录日期来源',
  `sCreatedBy`          VARCHAR(50)  NULL     DEFAULT NULL        COMMENT '制单人（创建该用户的用户名），REQ-USR-002 制单人',
  `sUpdatedBy`          VARCHAR(50)  NULL     DEFAULT NULL        COMMENT '最后修改人用户名',
  `tUpdatedDate`        DATETIME     NULL     DEFAULT NULL        COMMENT '最后修改时间',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_sys_user_username` (`sUsername`),
  UNIQUE KEY `uk_sys_user_code` (`sUserCode`),
  KEY `idx_sys_user_employee` (`iEmployeeId`),
  KEY `idx_sys_user_type` (`sUserType`),
  KEY `idx_sys_user_is_deleted` (`iIsDeleted`),
  KEY `idx_sys_user_created_by` (`sCreatedBy`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户账号（登录认证 + 类型 + 语言 + 状态 + 登录追踪）';


-- =============================================================================
-- Table: sys_permission_category — 权限分类字典
-- =============================================================================
CREATE TABLE `sys_permission_category` (
  `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 '创建时间（标准列）',
  `sCategoryName`  VARCHAR(100) NOT NULL                     COMMENT '权限分类名称（如 采购管理 / 销售管理）',
  `sCategoryCode`  VARCHAR(50)  NOT NULL                     COMMENT '权限分类编码（系统内唯一，代码层引用）',
  `sCategoryDesc`  VARCHAR(255) NULL     DEFAULT NULL        COMMENT '分类说明',
  `iSortOrder`     INT          NOT NULL DEFAULT 0           COMMENT '列表展示顺序',
  `iIsDeleted`     TINYINT(1)   NOT NULL DEFAULT 0           COMMENT '软删除标记',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_sys_permission_category_code` (`sCategoryCode`),
  KEY `idx_sys_permission_category_sort` (`iIsDeleted`, `iSortOrder`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限分类字典';


-- =============================================================================
-- Table: sys_user_permission_category — 用户 × 权限分类授权关系
-- =============================================================================
CREATE TABLE `sys_user_permission_category` (
  `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（FK → sys_user.iIncrement）',
  `iPermissionCategoryId`  INT          NOT NULL                     COMMENT '权限分类 ID（FK → sys_permission_category.iIncrement）',
  `sGrantedBy`             VARCHAR(50)  NULL     DEFAULT NULL        COMMENT '授予人用户名',
  PRIMARY KEY (`iIncrement`),
  UNIQUE KEY `uk_sys_user_permission_category` (`iUserId`, `iPermissionCategoryId`),
  KEY `idx_sys_user_permission_category_category` (`iPermissionCategoryId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户 × 权限分类授权关系';


-- =============================================================================
-- Foreign keys
-- =============================================================================
ALTER TABLE `sys_employee`
  ADD CONSTRAINT `fk_sys_employee_department`
  FOREIGN KEY (`iDepartmentId`) REFERENCES `sys_department` (`iIncrement`)
  ON DELETE RESTRICT ON UPDATE CASCADE;

ALTER TABLE `sys_user`
  ADD CONSTRAINT `fk_sys_user_employee`
  FOREIGN KEY (`iEmployeeId`) REFERENCES `sys_employee` (`iIncrement`)
  ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE `sys_user_permission_category`
  ADD CONSTRAINT `fk_sys_upc_user`
  FOREIGN KEY (`iUserId`) REFERENCES `sys_user` (`iIncrement`)
  ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `sys_user_permission_category`
  ADD CONSTRAINT `fk_sys_upc_permission_category`
  FOREIGN KEY (`iPermissionCategoryId`) REFERENCES `sys_permission_category` (`iIncrement`)
  ON DELETE CASCADE ON UPDATE CASCADE;
