Commit f1e20216ce91aa1651cc1676f77b94b2c49a41dc

Authored by zichun
1 parent b63ac3d2

chore(schema): switch boolean flag columns from TINYINT(1) to BIT(1)

V2 ALTERs all 6 b* columns across tUser/tStaff/tPermissionCategory/
tModule from TINYINT(1) to BIT(1). MySQL preserves data on the type
change (0 → b'0', 1 → b'1') and indexes survive the modify.

MyBatis-Plus entity Boolean fields and existing 'WHERE bDeleted = 0'
queries continue to work — MySQL Connector/J 8.x maps BIT(1) ↔ Boolean
automatically and accepts integer literals via implicit conversion.

Verified: setup-test-db + mvn test → 149/149 pass with V2 applied.

Also updates docs/03-数据库设计文档.md (schema SSoT) so the table
descriptors say bit(1) instead of tinyint(1).
docs/03-数据库设计文档.md
... ... @@ -56,11 +56,11 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply)
56 56 | `iStaffId` | int | 是 | NULL | 关联职员 ID(可选,外键 → `tStaff.iIncrement`) |
57 57 | `sUserType` | varchar(20) | 否 | `普通用户` | 用户类型;枚举:`普通用户` / `超级管理员` |
58 58 | `sLanguage` | varchar(10) | 否 | `zh` | 语言偏好;枚举:`zh` / `en` / `zh-TW` |
59   -| `bCanModifyDocs` | tinyint(1) | 否 | 0 | 单据修改权限;0 否 / 1 是 |
  59 +| `bCanModifyDocs` | bit(1) | 否 | 0 | 单据修改权限;0 否 / 1 是 |
60 60 | `sPasswordHash` | varchar(255) | 否 | — | 密码哈希值(BCrypt 等强哈希算法),新增默认初始密码 `666666` 的哈希 |
61 61 | `tLastLoginDate` | datetime | 是 | NULL | 最后登录时间 |
62 62 | `sCreatedBy` | varchar(50) | 是 | — | 制单人(创建用户的操作员用户号) |
63   -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记;0 有效 / 1 已作废 |
  63 +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记;0 有效 / 1 已作废 |
64 64 | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 |
65 65 | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 |
66 66  
... ... @@ -100,7 +100,7 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply)
100 100 | `sStaffName` | varchar(50) | 否 | — | 职员姓名 |
101 101 | `sDepartment` | varchar(100) | 是 | NULL | 所属部门(本期暂用字符串,未来如需独立 `tDepartment` 字典表再另行重构) |
102 102 | `sCreatedBy` | varchar(50) | 是 | — | 制单人 |
103   -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记 |
  103 +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记 |
104 104 | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 |
105 105 | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 |
106 106  
... ... @@ -137,7 +137,7 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply)
137 137 | `iParentId` | int | 是 | NULL | 父分类 ID(自引用,根节点为 NULL) |
138 138 | `iSortOrder` | int | 否 | 0 | 同级排序号 |
139 139 | `sCreatedBy` | varchar(50) | 是 | — | 制单人 |
140   -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记 |
  140 +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记 |
141 141 | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 |
142 142 | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 |
143 143  
... ... @@ -204,12 +204,12 @@ Migration 清单: `sql/migrations/V*.sql`(由 Flyway 顺序 apply)
204 204 | `sProcedureName` | varchar(100) | 否 | — | 存储过程(审核)名称;系统内唯一 |
205 205 | `sModuleType` | varchar(50) | 否 | — | 模块类型(本期按自由文本处理,VARCHAR(50);如未来收敛到枚举再加 CHECK 约束) |
206 206 | `sManageDeptEn` | varchar(50) | 否 | — | 管理部门英文标识 |
207   -| `bShowPermission` | tinyint(1) | 否 | 0 | 权限是否显示;0 否 / 1 是 |
  207 +| `bShowPermission` | bit(1) | 否 | 0 | 权限是否显示;0 否 / 1 是 |
208 208 | `sModuleNameZh` | varchar(100) | 否 | — | 界面名称(中文,模糊查询用) |
209 209 | `iParentId` | int | 是 | NULL | 父模块 ID(自引用,根节点为 NULL) |
210 210 | `iSortOrder` | int | 否 | 0 | 同级排序号 |
211 211 | `sCreatedBy` | varchar(50) | 是 | — | 制单人 |
212   -| `bDeleted` | tinyint(1) | 否 | 0 | 软删除标记 |
  212 +| `bDeleted` | bit(1) | 否 | 0 | 软删除标记 |
213 213 | `tDeletedDate` | datetime | 是 | NULL | 软删除时间 |
214 214 | `sDeletedBy` | varchar(50) | 是 | NULL | 软删除操作人 |
215 215  
... ...
sql/migrations/V2__bool_columns_to_bit.sql 0 → 100644
  1 +-- Flyway migration V2 — switch boolean flag columns from TINYINT(1) to BIT(1).
  2 +--
  3 +-- Why: BIT(1) gives strict 0/1 storage at the type level. MySQL Connector/J 8.x
  4 +-- maps BIT(1) ↔ Boolean automatically (no driver param needed). MyBatis-Plus
  5 +-- entity fields stay `Boolean`, no Java code changes required. Existing queries
  6 +-- like `WHERE bDeleted = 0` continue to work because MySQL implicitly converts
  7 +-- integer literals to bit values.
  8 +--
  9 +-- ALTER TABLE on a populated table preserves data: TINYINT 0 → BIT b'0',
  10 +-- TINYINT 1 → BIT b'1'. Indexes (e.g. idx_deleted_login) survive the modify.
  11 +
  12 +ALTER TABLE `tUser`
  13 + MODIFY COLUMN `bCanModifyDocs` BIT(1) NOT NULL DEFAULT b'0' COMMENT '单据修改权限;0 否 / 1 是',
  14 + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记;0 有效 / 1 已作废';
  15 +
  16 +ALTER TABLE `tStaff`
  17 + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记';
  18 +
  19 +ALTER TABLE `tPermissionCategory`
  20 + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记';
  21 +
  22 +ALTER TABLE `tModule`
  23 + MODIFY COLUMN `bShowPermission` BIT(1) NOT NULL DEFAULT b'0' COMMENT '权限是否显示;0 否 / 1 是',
  24 + MODIFY COLUMN `bDeleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '软删除标记';
... ...