-- Flyway migration V1 — initial schema for 小羚羊
-- Generated: 2026-05-06T08:30:00Z
-- 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.

-- ============================================================
-- 1) tUser — 系统用户账户与登录凭据
-- ============================================================
CREATE TABLE `tUser` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL COMMENT '业务 ID（标准列）',
  `sBrandsId` varchar(100) NULL COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` varchar(100) 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` bit(1) NOT NULL DEFAULT b'0' COMMENT '单据修改权限；0 否 / 1 是',
  `sPasswordHash` varchar(255) NOT NULL COMMENT '密码哈希值（BCrypt 等强哈希算法），新增默认初始密码 666666 的哈希',
  `tLastLoginDate` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
  `sCreatedBy` varchar(50) NULL COMMENT '制单人（创建用户的操作员用户号）',
  `bDeleted` bit(1) NOT NULL DEFAULT b'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='系统用户账户与登录凭据';

-- ============================================================
-- 2) tStaff — 职员维度（员工名 / 部门 / 编号）
-- ============================================================
CREATE TABLE `tStaff` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL COMMENT '业务 ID（标准列）',
  `sBrandsId` varchar(100) NULL COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` varchar(100) NULL COMMENT '子公司 ID（组织层级隔离，标准列）',
  `tCreateDate` datetime NOT NULL COMMENT '创建时间（标准列）',
  `sStaffNo` varchar(50) NULL COMMENT '职员编号；系统内唯一',
  `sStaffName` varchar(50) NOT NULL COMMENT '职员姓名',
  `sDepartment` varchar(100) NULL DEFAULT NULL COMMENT '所属部门（本期暂用字符串，未来如需独立 tDepartment 字典表再另行重构）',
  `sCreatedBy` varchar(50) NULL COMMENT '制单人',
  `bDeleted` bit(1) NOT NULL DEFAULT b'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='职员维度（员工名 / 部门 / 编号）';

-- ============================================================
-- 3) tPermissionCategory — 权限分类树
-- ============================================================
CREATE TABLE `tPermissionCategory` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL COMMENT '业务 ID（标准列）',
  `sBrandsId` varchar(100) NULL COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` varchar(100) 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 COMMENT '制单人',
  `bDeleted` bit(1) NOT NULL DEFAULT b'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='权限分类树';

-- ============================================================
-- 4) tUserPermission — 用户与权限分类关联
-- ============================================================
CREATE TABLE `tUserPermission` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL COMMENT '业务 ID（标准列）',
  `sBrandsId` varchar(100) NULL COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` varchar(100) 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 COMMENT '授权操作人',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户与权限分类关联';

-- ============================================================
-- 5) tModule — ERP 业务模块元数据树
-- ============================================================
CREATE TABLE `tModule` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL COMMENT '业务 ID（标准列）',
  `sBrandsId` varchar(100) NULL COMMENT '品牌 ID（多租户隔离，标准列）',
  `sSubsidiaryId` varchar(100) 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 '模块类型（本期按自由文本处理，VARCHAR(50)；如未来收敛到枚举再加 CHECK 约束）',
  `sManageDeptEn` varchar(50) NOT NULL COMMENT '管理部门英文标识',
  `bShowPermission` bit(1) NOT NULL DEFAULT b'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 COMMENT '制单人',
  `bDeleted` bit(1) NOT NULL DEFAULT b'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`         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;
