-- Flyway migration V1 — initial schema for 小羚羊 -- Generated: 2026-05-08T01:01:55Z -- 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 CHARACTER_SET_CLIENT = utf8mb4; -- ============================================================ -- Table: usr_user -- ============================================================ CREATE TABLE `usr_user` ( `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 '创建时间(标准列)', `sUserCode` VARCHAR(50) NOT NULL COMMENT '用户号(业务编号,人类可读唯一标识)', `sUsername` VARCHAR(100) NOT NULL COMMENT '用户名(登录标识,全局唯一,不可修改)', `sPasswordHash` VARCHAR(255) NOT NULL COMMENT 'BCrypt 哈希密码,禁止存储明文', `sUserType` VARCHAR(20) NOT NULL DEFAULT '普通用户' COMMENT '用户类型:普通用户 / 超级管理员', `sLanguage` VARCHAR(20) NOT NULL DEFAULT '中文' COMMENT '界面语言:中文 / 英文 / 繁体', `bCanEditDoc` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '单据修改权限:0=否,1=是', `bIsDisabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否作废/禁用:0=正常,1=禁用', `sEmployeeId` VARCHAR(100) NULL COMMENT '关联职员 ID(跨模块引用,职员未关联时为 NULL)', `sCreatorUsername` VARCHAR(100) NULL COMMENT '制单人用户名(冗余字段,便于列表展示)', `tLastLoginDate` DATETIME NULL COMMENT '最后登录时间', `iLoginFailCount` INT NOT NULL DEFAULT 0 COMMENT '连续登录失败次数,用于防暴力破解', `tLockUntil` DATETIME NULL COMMENT '账号锁定截止时间,NULL 表示未锁定', PRIMARY KEY (`iIncrement`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户账户主表,存储登录信息、类型、语言偏好及安全控制字段'; -- ============================================================ -- Table: usr_permission_group -- ============================================================ CREATE TABLE `usr_permission_group` ( `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 '创建时间(标准列)', `sGroupCode` VARCHAR(100) NOT NULL COMMENT '权限代码(如 usr:create、usr:edit),全局唯一', `sGroupName` VARCHAR(200) NOT NULL COMMENT '权限显示名称(如"新增用户"、"修改用户")', `sCategory` VARCHAR(100) NULL COMMENT '权限分类标签,用于前端权限分组展示', PRIMARY KEY (`iIncrement`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限分类/权限组定义表,每行对应一个可分配给用户的权限项'; -- ============================================================ -- Table: usr_user_permission -- ============================================================ CREATE TABLE `usr_user_permission` ( `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 '创建时间(标准列)', `sUserId` VARCHAR(100) NOT NULL COMMENT '关联 usr_user.sId', `sPermGroupId` VARCHAR(100) NOT NULL COMMENT '关联 usr_permission_group.sId', PRIMARY KEY (`iIncrement`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户与权限组的多对多关联表'; -- ============================================================ -- Table: 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 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='职员维度(员工名 / 部门 / 编号)'; -- ============================================================ -- Table: brand -- ============================================================ CREATE TABLE `brand` ( `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 '创建时间(标准列)', `sName` VARCHAR(100) NULL COMMENT '公司名称', `sShortName` VARCHAR(100) NULL COMMENT '公司简称', `sNo` VARCHAR(100) NULL COMMENT '单位编号(登录账号根据单位编号作为前缀)', PRIMARY KEY (`iIncrement`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司表'; -- ============================================================ -- Indexes: usr_user -- ============================================================ CREATE UNIQUE INDEX `uk_usr_user_sid` ON `usr_user` (`sId`); CREATE UNIQUE INDEX `uk_usr_user_username` ON `usr_user` (`sUsername`); CREATE UNIQUE INDEX `uk_usr_user_usercode` ON `usr_user` (`sUserCode`); CREATE INDEX `idx_usr_user_tenant` ON `usr_user` (`sBrandsId`, `sSubsidiaryId`); CREATE INDEX `idx_usr_user_type` ON `usr_user` (`sUserType`); CREATE INDEX `idx_usr_user_disabled` ON `usr_user` (`bIsDisabled`); -- ============================================================ -- Indexes: usr_permission_group -- ============================================================ CREATE UNIQUE INDEX `uk_usr_perm_group_sid` ON `usr_permission_group` (`sId`); CREATE UNIQUE INDEX `uk_usr_perm_group_code` ON `usr_permission_group` (`sGroupCode`); CREATE INDEX `idx_usr_perm_group_tenant` ON `usr_permission_group` (`sBrandsId`, `sSubsidiaryId`); -- ============================================================ -- Indexes: usr_user_permission -- ============================================================ CREATE UNIQUE INDEX `uk_usr_user_perm` ON `usr_user_permission` (`sUserId`, `sPermGroupId`); CREATE INDEX `idx_usr_user_perm_user` ON `usr_user_permission` (`sUserId`); CREATE INDEX `idx_usr_user_perm_group` ON `usr_user_permission` (`sPermGroupId`); -- ============================================================ -- Indexes: 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`); -- ============================================================ -- Indexes: brand -- ============================================================ CREATE UNIQUE INDEX `uk_brand_no` ON `brand` (`sNo`); CREATE INDEX `idx_brand_name` ON `brand` (`sName`); -- ============================================================ -- Foreign Keys -- ============================================================ ALTER TABLE `usr_user_permission` ADD CONSTRAINT `fk_usr_user_perm_user` FOREIGN KEY (`sUserId`) REFERENCES `usr_user` (`sId`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `usr_user_permission` ADD CONSTRAINT `fk_usr_user_perm_group` FOREIGN KEY (`sPermGroupId`) REFERENCES `usr_permission_group` (`sId`) ON DELETE CASCADE ON UPDATE CASCADE;