V1__initial_schema.sql 10.5 KB
-- 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__<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.

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;