Files
2026-09-30 11:11:54 +08:00

249 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SaaS:租户、用户、权限、日志
约定见 [00-conventions.md](./00-conventions.md)。本文件在 Phase 1 锁定,Phase 4 写迁移。
认证令牌用 Laravel Sanctum 自带的 `personal_access_tokens`,不另建 `wms_` 表。
## wms_tenant 租户
用途:租户注册表。行本身就是租户,不套 TenantContext 的自动过滤。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| name | VARCHAR(128) | N | | 租户名称 |
| status | VARCHAR(32) | N | active | 状态 |
| timezone | VARCHAR(64) | N | UTC | IANA 时区 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_code | UNIQUE | (tenant_code) | 按租户编码查找 |
状态:`active` 可用,`suspended` 停用(拒绝新的业务写入)。
关联:被所有带 `tenant_code` 的表引用。
并发 / 审计:无乐观锁。不停用后物理删除。状态变更写 `wms_status_log`,`biz_type = tenant`。
## wms_user 用户
用途:租户内登录用户。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| user_code | VARCHAR(64) | N | | 用户编码 |
| name | VARCHAR(128) | N | | 显示名 |
| email | VARCHAR(255) | N | | 登录邮箱 |
| password | VARCHAR(255) | N | | 密码哈希,禁止写入日志 |
| status | VARCHAR(32) | N | active | 状态 |
| last_login_at | TIMESTAMP | Y | | 最近登录 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
| deleted_at | TIMESTAMP | Y | | 软删除 |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_user_code | UNIQUE | (tenant_code, user_code) | 按用户编码查找 |
| uk_tenant_email | UNIQUE | (tenant_code, email) | 登录 |
状态:`active`、`disabled`。
关联:`wms_user_role.user_code`。操作人字段一律存 `user_code`。
并发 / 审计:无乐观锁。软删除规则见约定。权限变更写 `wms_operation_log`。
## wms_role 角色
用途:租户内角色。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| role_code | VARCHAR(64) | N | | 角色编码 |
| name | VARCHAR(128) | N | | 角色名称 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
| deleted_at | TIMESTAMP | Y | | 软删除 |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_role_code | UNIQUE | (tenant_code, role_code) | 按角色编码查找 |
关联:`wms_user_role`、`wms_role_permission`。
并发 / 审计:被用户引用时不能软删。
## wms_permission 权限目录
用途:系统预置权限,全租户共用。不按租户复制,因此没有 `tenant_code`。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| permission_code | VARCHAR(64) | N | | 权限编码,如 `inbound.receive` |
| name | VARCHAR(128) | N | | 名称 |
| module | VARCHAR(64) | N | | 模块,如 `inbound` |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_permission_code | UNIQUE | (permission_code) | 按权限编码查找 |
关联:`wms_role_permission.permission_code`。数据由迁移或 Seeder 写入,不开放租户自行新增。
## wms_role_permission 角色权限
用途:租户角色与权限目录的对应。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| role_code | VARCHAR(64) | N | | 角色编码 |
| permission_code | VARCHAR(64) | N | | 权限编码 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_role_permission | UNIQUE | (tenant_code, role_code, permission_code) | 防止重复授权 |
| idx_tenant_permission | INDEX | (tenant_code, permission_code) | 反查拥有某权限的角色 |
并发 / 审计:变更写 `wms_operation_log`。无软删除,收回权限即删行。
## wms_user_role 用户角色
用途:用户与角色的对应。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| user_code | VARCHAR(64) | N | | 用户编码 |
| role_code | VARCHAR(64) | N | | 角色编码 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_user_role | UNIQUE | (tenant_code, user_code, role_code) | 防止重复绑定 |
| idx_tenant_role | INDEX | (tenant_code, role_code) | 查角色下的用户 |
并发 / 审计:同角色权限。无软删除。
## wms_tenant_setting 租户设置
用途:租户级配置。值用字符串,由应用解析。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| setting_key | VARCHAR(64) | N | | 配置键 |
| setting_value | TEXT | Y | | 配置值 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_setting_key | UNIQUE | (tenant_code, setting_key) | 读取一项配置 |
并发 / 审计:覆盖写 `updated_at`。变更写 `wms_operation_log`。不存第三方密钥明文以外的内容;密钥加密存储留到平台对接 Phase。
## wms_number_sequence 取号
用途:租户内单号序号。见 [00-conventions.md](./00-conventions.md)。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| biz_type | VARCHAR(32) | N | | 单据类型,如 `inbound` |
| period | CHAR(8) | N | | `yyyyMMdd` |
| current_value | INT UNSIGNED | N | 0 | 当日已分配到的序号 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| uk_tenant_biz_period | UNIQUE | (tenant_code, biz_type, period) | 取号时锁这一行 |
并发 / 审计:`SELECT ... FOR UPDATE` 后递增。独立短事务。不软删除。
## wms_status_log 状态变更日志
用途:状态机审计。只追加。登录日志与 API 日志留在后续 `95-audit.md`。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| biz_type | VARCHAR(32) | N | | `order`、`inbound`、`outbound`、`wave`、`adjust`、`stocktake`、`tenant` |
| biz_no | VARCHAR(64) | N | | 业务单号 |
| from_status | VARCHAR(32) | Y | | 变更前,新建时可空 |
| to_status | VARCHAR(32) | N | | 变更后 |
| operator_user_code | VARCHAR(64) | Y | | 操作人,系统任务为空 |
| request_id | VARCHAR(64) | Y | | 请求标识 |
| remark | VARCHAR(500) | Y | | |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | 行创建后不更新 |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| idx_tenant_biz_created | INDEX | (tenant_code, biz_type, biz_no, created_at) | 查一张单据的状态历史 |
并发 / 审计:禁止更新和删除。与状态变更同一事务写入。
## wms_operation_log 操作日志
用途:主数据、权限、设置等关键变更。只追加。
| 字段 | 类型 | 可空 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| id | BIGINT UNSIGNED | N | AUTO_INCREMENT | 内部主键 |
| tenant_code | VARCHAR(32) | N | | 租户编码 |
| operator_user_code | VARCHAR(64) | Y | | 操作人 |
| action | VARCHAR(64) | N | | 如 `user.update`、`role.grant` |
| biz_type | VARCHAR(32) | N | | 对象类型 |
| biz_no | VARCHAR(64) | N | | 对象编码 |
| biz_ip | VARCHAR(64) | Y | | 来源 IP |
| request_id | VARCHAR(64) | Y | | 请求标识 |
| before_data | JSON | Y | | 变更前 |
| after_data | JSON | Y | | 变更后 |
| created_at | TIMESTAMP | Y | | |
| updated_at | TIMESTAMP | Y | | 行创建后不更新 |
索引:
| 名称 | 类型 | 字段 | 支撑的查询 |
| --- | --- | --- | --- |
| idx_tenant_biz_created | INDEX | (tenant_code, biz_type, biz_no, created_at) | 查某对象的操作历史 |
| idx_tenant_created | INDEX | (tenant_code, created_at) | 按时间查日志 |
并发 / 审计:禁止更新和删除。`before_data` / `after_data` 不得包含密码、Token。