-- Flyway migration V1 — initial schema for 小羚羊 -- Generated: 2026-05-14T15:46:57Z -- 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. -- ============================================================================= -- Table: sys_company — 公司 / 版本字典,登录页下拉选择来源 -- ============================================================================= CREATE TABLE `sys_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 '创建时间(标准列)', `sCompanyName` VARCHAR(100) NOT NULL COMMENT '公司 / 版本名称(登录页下拉显示文本)', `sCompanyCode` VARCHAR(50) NOT NULL COMMENT '公司编码(前端唯一识别)', `iSortOrder` INT NOT NULL DEFAULT 0 COMMENT '下拉列表排序权重,升序', `iIsDeleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '软删除标记,0=正常 1=已删', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_sys_company_code` (`sCompanyCode`), KEY `idx_sys_company_is_deleted` (`iIsDeleted`, `iSortOrder`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司 / 版本字典,登录页下拉选择来源'; -- ============================================================================= -- Table: sys_department — 部门字典,职员归属 -- ============================================================================= CREATE TABLE `sys_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 '创建时间(标准列)', `sDepartmentName` VARCHAR(100) NOT NULL COMMENT '部门名称', `sDepartmentCode` VARCHAR(50) NOT NULL COMMENT '部门编码', `iIsDeleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '软删除标记', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_sys_department_code` (`sDepartmentCode`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门字典,职员归属'; -- ============================================================================= -- Table: sys_employee — 职员档案,员工基础信息 -- ============================================================================= CREATE TABLE `sys_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 '创建时间(标准列)', `sEmployeeName` VARCHAR(50) NOT NULL COMMENT '员工姓名(2-50 字符)', `sEmployeeCode` VARCHAR(50) NOT NULL COMMENT '员工工号(系统内唯一)', `iDepartmentId` INT NOT NULL COMMENT '所属部门 ID(FK → sys_department.iIncrement)', `sPhone` VARCHAR(20) NULL DEFAULT NULL COMMENT '手机号', `sEmail` VARCHAR(100) NULL DEFAULT NULL COMMENT '邮箱', `iIsDeleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '软删除标记', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_sys_employee_code` (`sEmployeeCode`), KEY `idx_sys_employee_department` (`iDepartmentId`), KEY `idx_sys_employee_name` (`sEmployeeName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='职员档案,员工基础信息'; -- ============================================================================= -- Table: sys_user — 用户账号(登录认证 + 类型 + 语言 + 状态 + 登录追踪) -- ============================================================================= CREATE TABLE `sys_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 '创建时间(标准列)', `sUsername` VARCHAR(50) NOT NULL COMMENT '用户名(登录凭据,系统内全局唯一,3-20 位字母数字下划线)', `sUserCode` VARCHAR(50) NOT NULL COMMENT '用户号(业务展示用编码,系统内唯一)', `sPasswordHash` VARCHAR(255) NOT NULL COMMENT '密码哈希(BCrypt / Argon2,禁明文)', `iEmployeeId` INT NULL DEFAULT NULL COMMENT '关联职员 ID(可选;FK → sys_employee.iIncrement)', `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=繁体', `iCanEditDocument` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '单据修改权限:0=否 1=是', `iIsDeleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否作废:0=启用 1=作废(停用)', `iFailedLoginCount` INT NOT NULL DEFAULT 0 COMMENT '累计登录失败次数,达阈值锁定,登录成功清零', `tLockUntil` DATETIME NULL DEFAULT NULL COMMENT '锁定截止时间,NULL=未锁定,过期自动解锁', `tLastLoginDate` DATETIME NULL DEFAULT NULL COMMENT '最后一次成功登录时间,REQ-USR-004 登录日期来源', `sCreatedBy` VARCHAR(50) NULL DEFAULT NULL COMMENT '制单人(创建该用户的用户名),REQ-USR-002 制单人', `sUpdatedBy` VARCHAR(50) NULL DEFAULT NULL COMMENT '最后修改人用户名', `tUpdatedDate` DATETIME NULL DEFAULT NULL COMMENT '最后修改时间', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_sys_user_username` (`sUsername`), UNIQUE KEY `uk_sys_user_code` (`sUserCode`), KEY `idx_sys_user_employee` (`iEmployeeId`), KEY `idx_sys_user_type` (`sUserType`), KEY `idx_sys_user_is_deleted` (`iIsDeleted`), KEY `idx_sys_user_created_by` (`sCreatedBy`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户账号(登录认证 + 类型 + 语言 + 状态 + 登录追踪)'; -- ============================================================================= -- Table: sys_permission_category — 权限分类字典 -- ============================================================================= CREATE TABLE `sys_permission_category` ( `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 '创建时间(标准列)', `sCategoryName` VARCHAR(100) NOT NULL COMMENT '权限分类名称(如 采购管理 / 销售管理)', `sCategoryCode` VARCHAR(50) NOT NULL COMMENT '权限分类编码(系统内唯一,代码层引用)', `sCategoryDesc` VARCHAR(255) NULL DEFAULT NULL COMMENT '分类说明', `iSortOrder` INT NOT NULL DEFAULT 0 COMMENT '列表展示顺序', `iIsDeleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '软删除标记', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_sys_permission_category_code` (`sCategoryCode`), KEY `idx_sys_permission_category_sort` (`iIsDeleted`, `iSortOrder`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限分类字典'; -- ============================================================================= -- Table: sys_user_permission_category — 用户 × 权限分类授权关系 -- ============================================================================= CREATE TABLE `sys_user_permission_category` ( `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(FK → sys_user.iIncrement)', `iPermissionCategoryId` INT NOT NULL COMMENT '权限分类 ID(FK → sys_permission_category.iIncrement)', `sGrantedBy` VARCHAR(50) NULL DEFAULT NULL COMMENT '授予人用户名', PRIMARY KEY (`iIncrement`), UNIQUE KEY `uk_sys_user_permission_category` (`iUserId`, `iPermissionCategoryId`), KEY `idx_sys_user_permission_category_category` (`iPermissionCategoryId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户 × 权限分类授权关系'; -- ============================================================================= -- Foreign keys -- ============================================================================= ALTER TABLE `sys_employee` ADD CONSTRAINT `fk_sys_employee_department` FOREIGN KEY (`iDepartmentId`) REFERENCES `sys_department` (`iIncrement`) ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE `sys_user` ADD CONSTRAINT `fk_sys_user_employee` FOREIGN KEY (`iEmployeeId`) REFERENCES `sys_employee` (`iIncrement`) ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE `sys_user_permission_category` ADD CONSTRAINT `fk_sys_upc_user` FOREIGN KEY (`iUserId`) REFERENCES `sys_user` (`iIncrement`) ON DELETE CASCADE ON UPDATE CASCADE; ALTER TABLE `sys_user_permission_category` ADD CONSTRAINT `fk_sys_upc_permission_category` FOREIGN KEY (`iPermissionCategoryId`) REFERENCES `sys_permission_category` (`iIncrement`) ON DELETE CASCADE ON UPDATE CASCADE;