docs: 追加完整状态流转图+时序图(商户发布流程/用户下单流程/编辑解析方案)

refactor/vr-ticket-20260416
Council 2026-04-15 21:22:22 +08:00
parent 7dd288a4dc
commit b44f2232db
1 changed files with 79 additions and 0 deletions

View File

@ -366,3 +366,82 @@ AdminGoodsSaveHandle() 收到 POST 数据
```
商户不需要知道 Spec不需要碰规格管理不需要理解 SKU。插件把这些全部封装成"选场馆、选分区"两个动作。
---
## 附录完整状态流转图Mermaid
> 以下为系统完整状态流转,覆盖场馆配置 → 商品发布 → 用户下单全链路。
```mermaid
stateDiagram-v2
[*] --> 新建场馆: 管理员创建
新建场馆 --> 新建分区: 绑定场馆
新建分区 --> 绘制座位布局: 绑定分区
绘制座位布局 --> 生成SeatMapJSON: 保存
生成SeatMapJSON --> 发布票务商品: 选择模板
发布票务商品 --> 选择场次: 注入表单
选择场次 --> 批量生成Spec: 保存商品
批量生成Spec --> 商品上架: Spec写入完成
商品上架 --> 用户浏览: C端展示
用户浏览 --> 用户选座下单: 选择座位
用户选座下单 --> 订单生成: goodsParams提交
```
```mermaid
sequenceDiagram
participant 商户
participant 商品发布页 as ShopXO商品发布页<br/>(注入后的表单)
participant AdminGoodsSaveHook as AdminGoodsSave<br/>(钩子返回HTML)
participant SaveHook as plugins_service_<br/>goods_save_handle
participant BatchGen as SeatSkuService<br/>::BatchGenerate()
participant DB as goods_spec_base<br/>goods_spec_value
商户->>商品发布页: 选择场馆 + 分区
商户->>商品发布页: 点"发布商品"
商品发布页->>SaveHook: POST {venue_id, zones[]}
SaveHook->>BatchGen: BatchGenerate(goods_id, template_id, zones[])
loop 每500条一批
BatchGen->>DB: INSERT spec_base<br/>$vr-场馆 = "鸟巢"<br/>$vr-分区 = "VIP区A"<br/>$vr-时段 = "2026-06-01 19:00"<br/>$vr-座位号 = "A_1" ~ "A_500"
end
BatchGen-->>SaveHook: 返回座位级spec_base_id_map
SaveHook-->>商品发布页: 保存成功
商品发布页-->>商户: 商品上架
```
```mermaid
flowchart LR
subgraph UserFlow["用户端"]
U1["用户浏览商品详情页<br/>ticket_detail.html"]
U2["看到:场次选择器<br/>座位可视化图(彩色热力图)"]
U3["点击座位 A_1"]
U4["goodsParams 自动组装<br/>goodsParamsList[0]:<br/>spec_ids: [场馆spec, 分区spec,<br/>时段spec, 座位spec]<br/>stock: 1<br/>spec_base_id: 座位spec的ID"]
U5["提交订单"]
end
subgraph Invisible["用户不可见的底层"]
DB1["spec_base 表<br/>包含全部spec记录<br/>但用户端只展示座位图"]
end
U1 --> U2 --> U3 --> U4 --> U5
```
### 编辑商品时的 Spec 解析问题
> ⚠️ 如果不解析直接展示spec_base 里几千条记录会把编辑页撑爆。
**解决方案**:商品表增加一个 `vr_ticket_config` 字段JSON只存「选择了什么」编辑时从此 JSON 还原选择状态,而非从 spec_base 反推。
```mermaid
flowchart TB
A["编辑已有票务商品"]
A --> B{是否有 vr_ticket_config}
B -->|无(存量数据)| C["显示空表单<br/>提示「请重新选择」"]
B -->|有| D["解析 vr_ticket_config JSON"]
D --> E["还原:场馆 → 分区 → 座位选择状态"]
E --> F["管理员可修改选择<br/>重新生成 spec_base 映射"]
F --> G["保存时先删除旧spec<br/>再批量插入新spec"]
```