-- 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__.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;