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