-- Flyway migration V1 — initial schema for 小羚羊 -- Generated: 2026-05-14T01:37:50Z -- 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. -- =========================================================================== -- t_user — 系统用户主表,承载登录认证与基础属性 -- =========================================================================== CREATE TABLE `t_user` ( `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID(标准列)', `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID(标准列)', `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID(多租户隔离,标准列)', `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID(组织层级隔离,标准列)', `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(标准列)', `sUserNo` VARCHAR(50) NOT NULL COMMENT '用户号;关联职员后自动同步员工号;系统内唯一', `sUserName` VARCHAR(50) NOT NULL COMMENT '登录用户名;系统内唯一;3-50 位', `iEmployeeId` INT NULL DEFAULT NULL COMMENT '关联职员 t_employee.iIncrement;可空(非员工账号如系统管理员)', `sPasswordHash` VARCHAR(255) NOT NULL COMMENT '密码哈希(BCrypt / Argon2);禁止明文;初始密码 666666 哈希后存入', `sUserType` VARCHAR(20) NOT NULL DEFAULT 'NORMAL' COMMENT '用户类型枚举:NORMAL(普通用户)/ SUPER_ADMIN(超级管理员)', `sLanguage` VARCHAR(10) NOT NULL DEFAULT 'zh-CN' COMMENT '语言枚举:zh-CN(中文)/ en-US(英文)/ zh-TW(繁体)', `bModifyDoc` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '单据修改权限:0 否 / 1 是', `bVoid` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '作废标记(软删除):0 启用 / 1 已作废', `iLoginFailCount` INT NOT NULL DEFAULT 0 COMMENT '连续登录失败次数;达到阈值触发临时锁定;登录成功后清零', `tLockUntil` DATETIME NULL DEFAULT NULL COMMENT '锁定截止时间;NULL 表示未锁定', `tLastLoginDate` DATETIME NULL DEFAULT NULL COMMENT '最近一次登录时间', `sCreator` VARCHAR(100) NULL DEFAULT NULL COMMENT '制单人(创建该账号的操作员用户名)', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_user_username` (`sUserName`), UNIQUE KEY `uk_user_userno` (`sUserNo`), KEY `idx_user_employee` (`iEmployeeId`), KEY `idx_user_tenant` (`sBrandsId`, `sSubsidiaryId`), KEY `idx_user_void` (`bVoid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统用户主表,承载登录认证与基础属性'; -- =========================================================================== -- t_employee — 公司职员主档 -- =========================================================================== CREATE TABLE `t_employee` ( `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID(标准列)', `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID(标准列)', `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID(多租户隔离,标准列)', `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID(组织层级隔离,标准列)', `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(标准列)', `sEmployeeNo` VARCHAR(50) NOT NULL COMMENT '员工号;系统内唯一', `sName` VARCHAR(100) NOT NULL COMMENT '姓名', `iDepartmentId` INT NULL DEFAULT NULL COMMENT '部门 ID,关联 t_department.iIncrement', `sPhone` VARCHAR(20) NULL DEFAULT NULL COMMENT '手机号', `sEmail` VARCHAR(100) NULL DEFAULT NULL COMMENT '邮箱', `bDisabled` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否离职:0 在职 / 1 离职', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_employee_no` (`sEmployeeNo`), KEY `idx_employee_dept` (`iDepartmentId`), KEY `idx_employee_name` (`sName`), KEY `idx_employee_tenant` (`sBrandsId`, `sSubsidiaryId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司职员主档'; -- =========================================================================== -- t_department — 部门组织树 -- =========================================================================== CREATE TABLE `t_department` ( `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID(标准列)', `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID(标准列)', `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID(多租户隔离,标准列)', `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID(组织层级隔离,标准列)', `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(标准列)', `sName` VARCHAR(100) NOT NULL COMMENT '部门名称', `sCode` VARCHAR(50) NOT NULL COMMENT '部门编码;系统内唯一', `iParentId` INT NULL DEFAULT NULL COMMENT '上级部门 ID,NULL 表示根部门', `iSortOrder` INT NOT NULL DEFAULT 0 COMMENT '排序值,小者靠前', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_department_code` (`sCode`), KEY `idx_department_parent` (`iParentId`), KEY `idx_department_tenant` (`sBrandsId`, `sSubsidiaryId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门组织树'; -- =========================================================================== -- t_permission — 权限分类字典 -- =========================================================================== CREATE TABLE `t_permission` ( `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID(标准列)', `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID(标准列)', `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID(多租户隔离,标准列)', `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID(组织层级隔离,标准列)', `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(标准列)', `sCode` VARCHAR(50) NOT NULL COMMENT '权限码,例如 USR:ADD / USR:EDIT;系统内唯一', `sName` VARCHAR(100) NOT NULL COMMENT '权限分类名称(展示用)', `iSortOrder` INT NOT NULL DEFAULT 0 COMMENT '同分类内排序', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_permission_code` (`sCode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限分类字典'; -- =========================================================================== -- t_user_permission — 用户-权限分类关联表 -- =========================================================================== CREATE TABLE `t_user_permission` ( `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID(标准列)', `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID(标准列)', `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID(多租户隔离,标准列)', `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID(组织层级隔离,标准列)', `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(标准列)', `iUserId` INT NOT NULL COMMENT '用户 ID,关联 t_user.iIncrement', `iPermissionId` INT NOT NULL COMMENT '权限分类 ID,关联 t_permission.iIncrement', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_user_perm` (`iUserId`, `iPermissionId`), KEY `idx_user_perm_perm` (`iPermissionId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户-权限分类关联表'; -- =========================================================================== -- t_company — 公司 / 版本字典 -- =========================================================================== CREATE TABLE `t_company` ( `iIncrement` INT NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID(标准列)', `sId` VARCHAR(100) NULL DEFAULT (UUID()) COMMENT '业务 ID(标准列)', `sBrandsId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '品牌 ID(多租户隔离,标准列)', `sSubsidiaryId` VARCHAR(100) NULL DEFAULT '1111111111' COMMENT '子公司 ID(组织层级隔离,标准列)', `tCreateDate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间(标准列)', `sCode` VARCHAR(50) NOT NULL COMMENT '公司 / 版本编码;系统内唯一', `sName` VARCHAR(100) NOT NULL COMMENT '显示名称', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_company_code` (`sCode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司 / 版本字典'; -- =========================================================================== -- 外键约束(统一在最后追加,避免建表顺序依赖) -- =========================================================================== ALTER TABLE `t_user` ADD CONSTRAINT `fk_user_employee` FOREIGN KEY (`iEmployeeId`) REFERENCES `t_employee` (`iIncrement`) ON DELETE SET NULL ON UPDATE RESTRICT; ALTER TABLE `t_employee` ADD CONSTRAINT `fk_employee_department` FOREIGN KEY (`iDepartmentId`) REFERENCES `t_department` (`iIncrement`) ON DELETE SET NULL ON UPDATE RESTRICT; ALTER TABLE `t_department` ADD CONSTRAINT `fk_department_parent` FOREIGN KEY (`iParentId`) REFERENCES `t_department` (`iIncrement`) ON DELETE RESTRICT ON UPDATE RESTRICT; ALTER TABLE `t_user_permission` ADD CONSTRAINT `fk_userperm_user` FOREIGN KEY (`iUserId`) REFERENCES `t_user` (`iIncrement`) ON DELETE CASCADE ON UPDATE RESTRICT; ALTER TABLE `t_user_permission` ADD CONSTRAINT `fk_userperm_perm` FOREIGN KEY (`iPermissionId`) REFERENCES `t_permission` (`iIncrement`) ON DELETE RESTRICT ON UPDATE RESTRICT;