# pb_tbl_order

> 来源：订单表需求草图、`script/pocketbase.cart-order.js`
> 类型：`base`
> 读写规则：微信端原生访问建议仅允许记录所有者访问；当前脚本已按 `order_owner = 当前 token 对应 openid` 配置原生 collection 规则，管理后台建议通过 hooks / API 聚合查询

## 表用途

用于存储订单主记录与订单快照。

当前结构按“一个订单一条记录”设计：

- `order_id` 是订单业务 ID，由数据库自动生成（`ORDER-时间戳-随机串`）
- `order_number` 是订单编号，由 PocketBase 原生字段自动生成纯数字编号（`[0-9]{18}`）
- `order_snap` 使用 JSON 完整保存下单时的商品、数量、价格、折扣等快照，避免后续商品数据变化影响历史订单

## 字段清单

| 字段名 | 类型 | 必填 | 说明 |
| :--- | :--- | :---: | :--- |
| `id` | `text` | 是 | PocketBase 记录主键 |
| `order_id` | `text` | 是 | 订单业务 ID，唯一标识；数据库自动生成，格式：`ORDER-[0-9]{13}-[A-Za-z0-9]{6}` |
| `order_number` | `text` | 是 | 订单编号，PocketBase 原生自动生成 18 位纯数字（`[0-9]{18}`），唯一可追踪 |
| `order_create` | `autodate` | 否 | 订单创建时间，由数据库自动生成 |
| `order_owner` | `text` | 是 | 生成者 openid，约定保存 `tbl_auth_users.openid` |
| `order_source` | `text` | 是 | 订单来源，建议值：`购物车` / `方案清单` |
| `order_status` | `text` | 是 | 订单状态，建议值：`订单已生成` / `订单已确定` / `订单已交付` / `订单已验收` / `订单已结束` |
| `order_source_id` | `text` | 是 | 订单来源关联 ID，如购物车 ID 或方案清单 ID |
| `order_snap` | `json` | 是 | 订单快照，完整保存订单明细信息 |
| `order_product_quantity` | `number` | 否 | 订单商品总数量，允许为空，不建立索引 |
| `order_pay_status` | `text` | 否 | 订单支付状态，允许为空，不建立索引 |
| `order_amount` | `number` | 是 | 订单总金额 |
| `order_remark` | `text` | 否 | 订单备注 |
| `is_delete` | `number` | 否 | 软删除标记，`0` 表示未删除，`1` 表示已删除，默认 `0` |

## 索引

| 索引名 | 类型 | 说明 |
| :--- | :--- | :--- |
| `idx_tbl_order_order_id` | `UNIQUE INDEX` | 保证 `order_id` 唯一 |
| `idx_tbl_order_order_number` | `UNIQUE INDEX` | 保证 `order_number` 唯一 |
| `idx_tbl_order_order_owner` | `INDEX` | 加速按下单用户查询 |
| `idx_tbl_order_order_source` | `INDEX` | 加速按订单来源过滤 |
| `idx_tbl_order_order_status` | `INDEX` | 加速按订单状态过滤 |
| `idx_tbl_order_order_source_id` | `INDEX` | 加速按来源关联 ID 查询 |
| `idx_tbl_order_order_create` | `INDEX` | 加速按订单创建时间倒序查询 |
| `idx_tbl_order_owner_status` | `INDEX` | 加速查询某用户在不同状态下的订单 |

## 补充约定

- `order_snap` 建议至少包含商品信息、数量、下单时价格、折扣、优惠、实际成交金额等字段。
- 当订单进入 `订单已确定` 及之后状态时，建议业务侧锁定关键字段，不再允许修改订单核心数据。
- `order_owner`、`order_source_id` 当前按文本字段保存业务 ID，不直接建立 relation，便于兼容现有 hooks 业务模型。
- `order_owner` 统一保存 `tbl_auth_users.openid`，便于直接使用微信登录返回 token 做原生访问控制。
- `is_delete` 用于软删除控制，订单删除/归档时建议优先标记为 `1`。
- 集合默认查询规则已内置 `is_delete = 0`，常规列表/详情不会返回已软删除数据。
- `order_amount` 使用 `number`，货币精度策略建议后续统一为“分”或固定小数位。
- `order_create` 由数据库自动写入，接口层不需要也不应允许客户端自行填值。
- PocketBase 系统字段 `created`、`updated` 仍然存在，只是不在 collection 字段清单里单独声明。
