-- Flyway migration V1 — initial schema for 小羚羊
-- Generated: 2026-06-01T03:43:38Z
-- 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.

-- ============================================================
-- CREATE TABLE
-- ============================================================

CREATE TABLE `usr_user` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL 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 位字母数字下划线）',
  `sUserNo` varchar(50) NULL COMMENT '用户号，关联职员后可自动带出员工编号/姓名',
  `sPassword` varchar(100) NOT NULL COMMENT '登录密码，BCrypt 哈希存储（初始密码 666666）',
  `iEmployeeId` int NULL COMMENT '关联职员 ID（可选），外键 -> usr_employee.iIncrement',
  `sUserType` varchar(20) NOT NULL DEFAULT '普通用户' COMMENT '用户类型：普通用户 / 超级管理员',
  `sLanguage` varchar(20) NOT NULL DEFAULT '中文' COMMENT '界面语言：中文 / 英文 / 繁体',
  `iCanModifyBill` tinyint(1) NOT NULL DEFAULT 0 COMMENT '单据修改权限：0 否 / 1 是',
  `iIsVoid` tinyint(1) NOT NULL DEFAULT 0 COMMENT '作废/禁用标志：0 正常 / 1 已作废（禁用后不可登录）',
  `tLastLoginDate` datetime NULL COMMENT '最后登录时间，登录成功时更新',
  `sCreator` varchar(50) NULL COMMENT '制单人（创建该用户的操作员）',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表：登录账号与用户属性核心表';

CREATE TABLE `usr_employee` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL 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 '职员/员工姓名（用户员工名下拉来源）',
  `sEmployeeNo` varchar(50) NULL COMMENT '员工编号',
  `sDepartment` varchar(100) NULL COMMENT '所属部门（用户查询输出部门来源）',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='职员表：员工名/部门等支撑信息';

CREATE TABLE `usr_company` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL 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 '公司名称（登录页版本下拉的显示来源）',
  `sVersion` varchar(50) NULL COMMENT '版本/账套标识',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公司表：登录版本下拉数据来源';

CREATE TABLE `usr_permission` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL 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 '创建时间（标准列）',
  `sPermissionName` varchar(100) NOT NULL COMMENT '权限名称',
  `sPermissionCode` varchar(100) NOT NULL COMMENT '权限编码（程序判定用，系统内唯一）',
  `sPermissionCategory` varchar(100) NULL COMMENT '权限分类（权限组的权限分类）',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表：可分配权限项定义';

CREATE TABLE `usr_user_permission` (
  `iIncrement` int NOT NULL AUTO_INCREMENT COMMENT '整数主键 ID（标准列）',
  `sId` varchar(100) NULL 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，外键 -> usr_user.iIncrement',
  `iPermissionId` int NOT NULL COMMENT '权限 ID，外键 -> usr_permission.iIncrement',
  PRIMARY KEY (`iIncrement`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户权限关联表：用户↔权限多对多授权';

-- ============================================================
-- CREATE INDEX
-- ============================================================

CREATE UNIQUE INDEX `uk_usr_user_username` ON `usr_user` (`sUserName`);
CREATE INDEX `idx_usr_user_employee` ON `usr_user` (`iEmployeeId`);
CREATE INDEX `idx_usr_user_type` ON `usr_user` (`sUserType`);
CREATE INDEX `idx_usr_user_tenant` ON `usr_user` (`sBrandsId`, `sSubsidiaryId`);

CREATE INDEX `idx_usr_employee_name` ON `usr_employee` (`sEmployeeName`);
CREATE INDEX `idx_usr_employee_tenant` ON `usr_employee` (`sBrandsId`, `sSubsidiaryId`);

CREATE UNIQUE INDEX `uk_usr_company_name` ON `usr_company` (`sCompanyName`);

CREATE UNIQUE INDEX `uk_usr_permission_code` ON `usr_permission` (`sPermissionCode`);
CREATE INDEX `idx_usr_permission_category` ON `usr_permission` (`sPermissionCategory`);

CREATE UNIQUE INDEX `uk_usr_user_permission` ON `usr_user_permission` (`iUserId`, `iPermissionId`);
CREATE INDEX `idx_usr_user_permission_perm` ON `usr_user_permission` (`iPermissionId`);

-- ============================================================
-- ADD FOREIGN KEY
-- ============================================================

ALTER TABLE `usr_user`
  ADD CONSTRAINT `fk_usr_user_employee` FOREIGN KEY (`iEmployeeId`) REFERENCES `usr_employee` (`iIncrement`) ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE `usr_user_permission`
  ADD CONSTRAINT `fk_usr_up_user` FOREIGN KEY (`iUserId`) REFERENCES `usr_user` (`iIncrement`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `usr_user_permission`
  ADD CONSTRAINT `fk_usr_up_permission` FOREIGN KEY (`iPermissionId`) REFERENCES `usr_permission` (`iIncrement`) ON DELETE CASCADE ON UPDATE CASCADE;
