# pb_tbl_scheme

> 来源：用户提供的结构草图（2026-04-08）与现有 `tbl_cart` / `tbl_order` owner 行级权限模式
> 类型：`base`
> 状态：`draft`，仅文档设计，尚未执行建表
> 读写规则：任意已登录用户可新增，但仅可访问 `scheme_owner = 当前 token 对应 openid` 且 `is_delete = 0` 的记录

## 表用途

用于存储用户自己的方案主表，承载方案名称、适用酒店类型、方案筛选条件、房型配置、设备偏好以及引用的高/中/低端模板。

## 字段清单

| 字段名 | 类型 | 必填 | 说明 |
| :--- | :--- | :---: | :--- |
| `id` | `text` | 是 | PocketBase 记录主键 |
| `scheme_id` | `text` | 是 | 方案业务 ID，唯一标识 |
| `scheme_name` | `text` | 是 | 方案名称 |
| `scheme_owner` | `text` | 是 | 方案所有者 openid，保存 `tbl_auth_users.openid` |
| `scheme_share_status` | `text` | 否 | 方案分享状态，便于快速识别是否已分享 |
| `scheme_expires_at` | `date` | 否 | 方案有效期 |
| `scheme_hotel_type` | `text` | 否 | 酒店类型，如经济型 / 中高端 / 连锁型 / 特色名宿 / 特色酒店 |
| `scheme_solution_type` | `text` | 否 | 方案类型，建议保存枚举或 `|` 聚合值 |
| `scheme_solution_feature` | `text` | 否 | 方案特点，建议保存枚举或 `|` 聚合值 |
| `scheme_room_type` | `json` | 否 | 房型配置，建议格式：`[{"room_type":"大床房","qty":20}]` |
| `scheme_curtains` | `text` | 否 | 窗帘类型 |
| `scheme_voice_device` | `text` | 否 | 语音设备 |
| `scheme_ac_type` | `text` | 否 | 空调类型 |
| `scheme_template_highend` | `text` | 否 | 高端模板 ID，建议保存 `tbl_scheme_template.scheme_template_id` |
| `scheme_template_midend` | `text` | 否 | 中端模板 ID，建议保存 `tbl_scheme_template.scheme_template_id` |
| `scheme_template_lowend` | `text` | 否 | 地端模板 ID，建议保存 `tbl_scheme_template.scheme_template_id` |
| `scheme_status` | `text` | 否 | 方案状态，如草稿 / 生效 / 失效 |
| `scheme_remark` | `text` | 否 | 备注 |
| `is_delete` | `number` | 否 | 软删除标记，`0` 表示未删除，`1` 表示已删除，默认 `0` |

## 索引

| 索引名 | 类型 | 说明 |
| :--- | :--- | :--- |
| `idx_tbl_scheme_scheme_id` | `UNIQUE INDEX` | 保证 `scheme_id` 唯一 |
| `idx_tbl_scheme_scheme_owner` | `INDEX` | 加速按方案所有者查询 |
| `idx_tbl_scheme_scheme_name` | `INDEX` | 加速按方案名称检索 |
| `idx_tbl_scheme_scheme_share_status` | `INDEX` | 加速按分享状态过滤 |
| `idx_tbl_scheme_scheme_expires_at` | `INDEX` | 加速按有效期过滤 |
| `idx_tbl_scheme_scheme_hotel_type` | `INDEX` | 加速按酒店类型过滤 |
| `idx_tbl_scheme_scheme_solution_type` | `INDEX` | 加速按方案类型过滤 |
| `idx_tbl_scheme_scheme_solution_feature` | `INDEX` | 加速按方案特点过滤 |
| `idx_tbl_scheme_scheme_status` | `INDEX` | 加速按方案状态过滤 |
| `idx_tbl_scheme_owner_status` | `INDEX` | 加速同一用户下按状态查询 |

## 建议 PocketBase 原生权限规则

说明：

- 采用和 `tbl_cart` / `tbl_order` 一致的 owner 行级隔离模式。
- 这里按“任意已登录用户可创建自己的方案”设计，因此 `createRule` 仍要求携带有效 token。
- 若后续由 hooks 自动回填 `scheme_owner`，也建议保留 `@request.body.scheme_owner = @request.auth.openid` 约束，避免越权代建。

| Rule | 建议表达式 |
| :--- | :--- |
| `listRule` | `@request.auth.id != "" && scheme_owner = @request.auth.openid && is_delete = 0` |
| `viewRule` | `@request.auth.id != "" && scheme_owner = @request.auth.openid && is_delete = 0` |
| `createRule` | `@request.auth.id != "" && @request.body.scheme_owner = @request.auth.openid` |
| `updateRule` | `@request.auth.id != "" && scheme_owner = @request.auth.openid && is_delete = 0` |
| `deleteRule` | `@request.auth.id != "" && scheme_owner = @request.auth.openid && is_delete = 0` |

## 补充约定

- `scheme_template_highend` / `scheme_template_midend` / `scheme_template_lowend` 当前建议先保存模板业务 ID，不直接建立 relation，便于兼容现有 hooks 风格。
- `scheme_room_type` 推荐使用 `json` 数组，避免后续字符串解析成本。
- `scheme_solution_type` 与 `scheme_solution_feature` 如果后续要做模板筛选，建议统一保存字典枚举值，而不是自由文本。
- `is_delete` 用于软删除控制；对外列表、详情、修改、删除规则都建议默认排除已删除数据。
- PocketBase 系统字段 `created`、`updated` 仍然存在，只是不在 collection 字段清单里单独声明。
