V1__initial_schema.sql 11.9 KB
-- 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__<desc>.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;