# pb_tbl_scheme_template

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

## 表用途

用于存储方案模板，作为方案配置时可复用的标准模板库，承载图标、标签、方案适配条件以及模板内产品清单。

## 字段清单

| 字段名 | 类型 | 必填 | 说明 |
| :--- | :--- | :---: | :--- |
| `id` | `text` | 是 | PocketBase 记录主键 |
| `scheme_template_id` | `text` | 是 | 模板业务 ID，唯一标识 |
| `scheme_template_icon` | `text` | 否 | 模板图标，建议保存 `tbl_attachments.attachments_id` |
| `scheme_template_label` | `text` | 否 | 模板标签，便于关键词检索 |
| `scheme_template_name` | `text` | 是 | 模板名称 |
| `scheme_template_owner` | `text` | 是 | 模板所有者 openid，保存 `tbl_auth_users.openid` |
| `scheme_template_status` | `text` | 否 | 模板状态，如有效 / 主推 / 过期 |
| `scheme_template_solution_type` | `text` | 否 | 适用方案类型 |
| `scheme_template_solution_feature` | `text` | 否 | 适用方案特点 |
| `scheme_template_product_list` | `json` | 否 | 产品清单，支持保存精简结构或完整产品快照数组 |
| `scheme_template_description` | `text` | 否 | 模板说明 |
| `scheme_template_remark` | `text` | 否 | 备注 |
| `is_delete` | `number` | 否 | 软删除标记，`0` 表示未删除，`1` 表示已删除，默认 `0` |

## 索引

| 索引名 | 类型 | 说明 |
| :--- | :--- | :--- |
| `idx_tbl_scheme_template_scheme_template_id` | `UNIQUE INDEX` | 保证 `scheme_template_id` 唯一 |
| `idx_tbl_scheme_template_scheme_template_owner` | `INDEX` | 加速按模板所有者查询 |
| `idx_tbl_scheme_template_scheme_template_name` | `INDEX` | 加速按模板名称检索 |
| `idx_tbl_scheme_template_scheme_template_label` | `INDEX` | 加速按模板标签检索 |
| `idx_tbl_scheme_template_scheme_template_status` | `INDEX` | 加速按模板状态过滤 |
| `idx_tbl_scheme_template_solution_type` | `INDEX` | 加速按适用方案类型过滤 |
| `idx_tbl_scheme_template_solution_feature` | `INDEX` | 加速按适用方案特点过滤 |
| `idx_tbl_scheme_template_owner_status` | `INDEX` | 加速同一用户下按状态查询 |

## 建议 PocketBase 原生权限规则

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

## 补充约定

- `scheme_template_icon` 建议延续现有项目做法，仅保存 `attachments_id`，真实文件统一走 `tbl_attachments`。
- `scheme_template_product_list` 建议使用 `json` 数组。
- 兼容两种结构：
- 精简结构：`{"product_id":"PROD-xxx","qty":5,"note":"客厅使用"}`
- 完整快照结构：直接保存 `tbl_product_list` 导出的整行产品对象，至少应包含 `prod_list_id`，如存在产品型号 / 产品料号也建议一并保留（如 `prod_list_modelnumber`、`prod_list_barcode`）。
- 页面 `/manage/scheme` 当前优先通过产品选择器保存完整产品快照，便于后续直接展示产品摘要与排序。
- 若模板将来需要“官方模板 + 用户私有模板”并存，则需要额外引入发布状态字段或放宽公共模板读取规则；当前文档严格按 owner 私有模板设计。
- `is_delete` 用于软删除控制，模板删除时建议优先标记为 `1`。
- PocketBase 系统字段 `created`、`updated` 仍然存在，只是不在 collection 字段清单里单独声明。
