V1__initial_schema.sql
10.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
-- 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;