-- Flyway migration V1 — initial schema for 小羚羊
-- Generated: 2026-04-29T01:46:21Z
-- 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.

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ─────────────────────────────────────────────────────────────
-- tUser — 系统用户账户与登录凭据
-- ─────────────────────────────────────────────────────────────
CREATE TABLE `tUser` (
  `iIncrement`     INT          NOT NULL AUTO_INCREMENT                 COMMENT '整数主键 ID（标准列）',
  `sId`            VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '业务 ID（标准列）',
  `sBrandsId`      VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId`  VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate`    DATETIME     NOT NULL                                COMMENT '创建时间（标准列）',
  `sUserNo`        VARCHAR(50)  NOT NULL                                COMMENT '用户号；系统内唯一',
  `sUserName`      VARCHAR(50)  NOT NULL                                COMMENT '用户名（登录账号）；系统内唯一',
  `iStaffId`       INT          NULL     DEFAULT NULL                   COMMENT '关联职员 ID（可选，外键 → tStaff.iIncrement）',
  `sUserType`      VARCHAR(20)  NOT NULL DEFAULT '普通用户'              COMMENT '用户类型；枚举：普通用户 / 超级管理员',
  `sLanguage`      VARCHAR(10)  NOT NULL DEFAULT 'zh'                   COMMENT '语言偏好；枚举：zh / en / zh-TW',
  `bCanModifyDocs` TINYINT(1)   NOT NULL DEFAULT 0                      COMMENT '单据修改权限；0 否 / 1 是',
  `sPasswordHash`  VARCHAR(255) NOT NULL                                COMMENT '密码哈希值（BCrypt 等强哈希），新增默认初始密码 666666 的哈希',
  `tLastLoginDate` DATETIME     NULL     DEFAULT NULL                   COMMENT '最后登录时间',
  `sCreatedBy`     VARCHAR(50)  NULL     DEFAULT NULL                   COMMENT '制单人（创建用户的操作员用户号）',
  `bDeleted`       TINYINT(1)   NOT NULL DEFAULT 0                      COMMENT '软删除标记；0 有效 / 1 已作废',
  `tDeletedDate`   DATETIME     NULL     DEFAULT NULL                   COMMENT '软删除时间',
  `sDeletedBy`     VARCHAR(50)  NULL     DEFAULT NULL                   COMMENT '软删除操作人',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统用户账户与登录凭据';

-- ─────────────────────────────────────────────────────────────
-- tStaff — 职员维度（员工名 / 部门 / 编号）
-- ─────────────────────────────────────────────────────────────
CREATE TABLE `tStaff` (
  `iIncrement`     INT          NOT NULL AUTO_INCREMENT                 COMMENT '整数主键 ID（标准列）',
  `sId`            VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '业务 ID（标准列）',
  `sBrandsId`      VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId`  VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate`    DATETIME     NOT NULL                                COMMENT '创建时间（标准列）',
  `sStaffNo`       VARCHAR(50)  NULL     DEFAULT NULL                   COMMENT '职员编号；系统内唯一',
  `sStaffName`     VARCHAR(50)  NOT NULL                                COMMENT '职员姓名',
  `sDepartment`    VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '所属部门（本期暂用字符串，未来可独立 tDepartment 字典表）',
  `sCreatedBy`     VARCHAR(50)  NULL     DEFAULT NULL                   COMMENT '制单人',
  `bDeleted`       TINYINT(1)   NOT NULL DEFAULT 0                      COMMENT '软删除标记',
  `tDeletedDate`   DATETIME     NULL     DEFAULT NULL                   COMMENT '软删除时间',
  `sDeletedBy`     VARCHAR(50)  NULL     DEFAULT NULL                   COMMENT '软删除操作人',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='职员维度（员工名 / 部门 / 编号）';

-- ─────────────────────────────────────────────────────────────
-- tPermissionCategory — 权限分类树
-- ─────────────────────────────────────────────────────────────
CREATE TABLE `tPermissionCategory` (
  `iIncrement`     INT          NOT NULL AUTO_INCREMENT                 COMMENT '整数主键 ID（标准列）',
  `sId`            VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '业务 ID（标准列）',
  `sBrandsId`      VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId`  VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate`    DATETIME     NOT NULL                                COMMENT '创建时间（标准列）',
  `sCategoryCode` VARCHAR(50)  NOT NULL                                 COMMENT '权限分类编码；系统内唯一',
  `sCategoryName` VARCHAR(100) NOT NULL                                 COMMENT '权限分类名称（界面展示）',
  `iParentId`     INT          NULL     DEFAULT NULL                    COMMENT '父分类 ID（自引用，根节点为 NULL）',
  `iSortOrder`    INT          NOT NULL DEFAULT 0                       COMMENT '同级排序号',
  `sCreatedBy`    VARCHAR(50)  NULL     DEFAULT NULL                    COMMENT '制单人',
  `bDeleted`      TINYINT(1)   NOT NULL DEFAULT 0                       COMMENT '软删除标记',
  `tDeletedDate`  DATETIME     NULL     DEFAULT NULL                    COMMENT '软删除时间',
  `sDeletedBy`    VARCHAR(50)  NULL     DEFAULT NULL                    COMMENT '软删除操作人',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限分类树';

-- ─────────────────────────────────────────────────────────────
-- tUserPermission — 用户与权限分类关联
-- ─────────────────────────────────────────────────────────────
CREATE TABLE `tUserPermission` (
  `iIncrement`     INT          NOT NULL AUTO_INCREMENT                 COMMENT '整数主键 ID（标准列）',
  `sId`            VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '业务 ID（标准列）',
  `sBrandsId`      VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId`  VARCHAR(100) NULL     DEFAULT NULL                   COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate`    DATETIME     NOT NULL                                COMMENT '创建时间（标准列）',
  `iUserId`        INT          NOT NULL                                COMMENT '关联用户 ID（外键 → tUser.iIncrement）',
  `iCategoryId`    INT          NOT NULL                                COMMENT '关联权限分类 ID（外键 → tPermissionCategory.iIncrement）',
  `sCreatedBy`     VARCHAR(50)  NULL     DEFAULT NULL                   COMMENT '授权操作人',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户与权限分类关联';

-- ─────────────────────────────────────────────────────────────
-- tModule — ERP 业务模块元数据树
-- ─────────────────────────────────────────────────────────────
CREATE TABLE `tModule` (
  `iIncrement`       INT          NOT NULL AUTO_INCREMENT               COMMENT '整数主键 ID（标准列）',
  `sId`              VARCHAR(100) NULL     DEFAULT NULL                 COMMENT '业务 ID（标准列）',
  `sBrandsId`        VARCHAR(100) NULL     DEFAULT NULL                 COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId`    VARCHAR(100) NULL     DEFAULT NULL                 COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate`      DATETIME     NOT NULL                              COMMENT '创建时间（标准列）',
  `sDisplayType`     VARCHAR(20)  NOT NULL DEFAULT '手机端'              COMMENT '显示类型；枚举：手机端 / 前端业务 / 系统配置 / 接口',
  `sProcedureName`   VARCHAR(100) NOT NULL                              COMMENT '存储过程（审核）名称；系统内唯一',
  `sModuleType`      VARCHAR(50)  NOT NULL                              COMMENT '模块类型（本期自由文本，未来如收敛到枚举再加约束）',
  `sManageDeptEn`    VARCHAR(50)  NOT NULL                              COMMENT '管理部门英文标识',
  `bShowPermission`  TINYINT(1)   NOT NULL DEFAULT 0                    COMMENT '权限是否显示；0 否 / 1 是',
  `sModuleNameZh`    VARCHAR(100) NOT NULL                              COMMENT '界面名称（中文，模糊查询用）',
  `iParentId`        INT          NULL     DEFAULT NULL                 COMMENT '父模块 ID（自引用，根节点为 NULL）',
  `iSortOrder`       INT          NOT NULL DEFAULT 0                    COMMENT '同级排序号',
  `sCreatedBy`       VARCHAR(50)  NULL     DEFAULT NULL                 COMMENT '制单人',
  `bDeleted`         TINYINT(1)   NOT NULL DEFAULT 0                    COMMENT '软删除标记',
  `tDeletedDate`     DATETIME     NULL     DEFAULT NULL                 COMMENT '软删除时间',
  `sDeletedBy`       VARCHAR(50)  NULL     DEFAULT NULL                 COMMENT '软删除操作人',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='ERP 业务模块元数据树';

-- ─────────────────────────────────────────────────────────────
-- 索引
-- ─────────────────────────────────────────────────────────────

-- tUser
CREATE UNIQUE INDEX `uk_user_no`           ON `tUser` (`sUserNo`);
CREATE UNIQUE INDEX `uk_user_name`         ON `tUser` (`sUserName`);
CREATE INDEX        `idx_staff_id`         ON `tUser` (`iStaffId`);
CREATE INDEX        `idx_brand_subsidiary` ON `tUser` (`sBrandsId`, `sSubsidiaryId`);
CREATE INDEX        `idx_deleted_login`    ON `tUser` (`bDeleted`, `tLastLoginDate`);

-- tStaff
CREATE UNIQUE INDEX `uk_staff_no`     ON `tStaff` (`sStaffNo`);
CREATE INDEX        `idx_staff_name`  ON `tStaff` (`sStaffName`);
CREATE INDEX        `idx_department`  ON `tStaff` (`sDepartment`);

-- tPermissionCategory
CREATE UNIQUE INDEX `uk_category_code` ON `tPermissionCategory` (`sCategoryCode`);
CREATE INDEX        `idx_parent`       ON `tPermissionCategory` (`iParentId`);

-- tUserPermission
CREATE UNIQUE INDEX `uk_user_category` ON `tUserPermission` (`iUserId`, `iCategoryId`);
CREATE INDEX        `idx_category`     ON `tUserPermission` (`iCategoryId`);

-- tModule
CREATE UNIQUE INDEX `uk_procedure_name`  ON `tModule` (`sProcedureName`);
CREATE INDEX        `idx_module_name_zh` ON `tModule` (`sModuleNameZh`);
CREATE INDEX        `idx_parent_module`  ON `tModule` (`iParentId`);
CREATE INDEX        `idx_display_type`   ON `tModule` (`sDisplayType`);

-- ─────────────────────────────────────────────────────────────
-- 外键
-- ─────────────────────────────────────────────────────────────

ALTER TABLE `tUser`
  ADD CONSTRAINT `fk_user_staff`
  FOREIGN KEY (`iStaffId`) REFERENCES `tStaff` (`iIncrement`)
  ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE `tPermissionCategory`
  ADD CONSTRAINT `fk_category_parent`
  FOREIGN KEY (`iParentId`) REFERENCES `tPermissionCategory` (`iIncrement`)
  ON DELETE RESTRICT ON UPDATE CASCADE;

ALTER TABLE `tUserPermission`
  ADD CONSTRAINT `fk_up_user`
  FOREIGN KEY (`iUserId`) REFERENCES `tUser` (`iIncrement`)
  ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `tUserPermission`
  ADD CONSTRAINT `fk_up_category`
  FOREIGN KEY (`iCategoryId`) REFERENCES `tPermissionCategory` (`iIncrement`)
  ON DELETE RESTRICT ON UPDATE CASCADE;

ALTER TABLE `tModule`
  ADD CONSTRAINT `fk_module_parent`
  FOREIGN KEY (`iParentId`) REFERENCES `tModule` (`iIncrement`)
  ON DELETE RESTRICT ON UPDATE CASCADE;

SET FOREIGN_KEY_CHECKS = 1;
