From b44f2232db04d11c9454d1b458711fe4784871d7 Mon Sep 17 00:00:00 2001 From: Council Date: Wed, 15 Apr 2026 21:22:22 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=BF=BD=E5=8A=A0=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=B5=81=E8=BD=AC=E5=9B=BE+=E6=97=B6?= =?UTF-8?q?=E5=BA=8F=E5=9B=BE=EF=BC=88=E5=95=86=E6=88=B7=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=B5=81=E7=A8=8B/=E7=94=A8=E6=88=B7=E4=B8=8B=E5=8D=95?= =?UTF-8?q?=E6=B5=81=E7=A8=8B/=E7=BC=96=E8=BE=91=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=96=B9=E6=A1=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/11_EDITOR_AND_INJECTION_DESIGN.md | 79 ++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/docs/11_EDITOR_AND_INJECTION_DESIGN.md b/docs/11_EDITOR_AND_INJECTION_DESIGN.md index 848264d..365a68c 100644 --- a/docs/11_EDITOR_AND_INJECTION_DESIGN.md +++ b/docs/11_EDITOR_AND_INJECTION_DESIGN.md @@ -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商品发布页
(注入后的表单) + participant AdminGoodsSaveHook as AdminGoodsSave
(钩子返回HTML) + participant SaveHook as plugins_service_
goods_save_handle + participant BatchGen as SeatSkuService
::BatchGenerate() + participant DB as goods_spec_base
goods_spec_value + + 商户->>商品发布页: 选择场馆 + 分区 + 商户->>商品发布页: 点"发布商品" + + 商品发布页->>SaveHook: POST {venue_id, zones[]} + SaveHook->>BatchGen: BatchGenerate(goods_id, template_id, zones[]) + + loop 每500条一批 + BatchGen->>DB: INSERT spec_base
$vr-场馆 = "鸟巢"
$vr-分区 = "VIP区A"
$vr-时段 = "2026-06-01 19:00"
$vr-座位号 = "A_1" ~ "A_500" + end + + BatchGen-->>SaveHook: 返回座位级spec_base_id_map + SaveHook-->>商品发布页: 保存成功 + 商品发布页-->>商户: 商品上架 +``` + +```mermaid +flowchart LR + subgraph UserFlow["用户端"] + U1["用户浏览商品详情页
ticket_detail.html"] + U2["看到:场次选择器
座位可视化图(彩色热力图)"] + U3["点击座位 A_1"] + U4["goodsParams 自动组装
goodsParamsList[0]:
spec_ids: [场馆spec, 分区spec,
时段spec, 座位spec]
stock: 1
spec_base_id: 座位spec的ID"] + U5["提交订单"] + end + + subgraph Invisible["用户不可见的底层"] + DB1["spec_base 表
包含全部spec记录
但用户端只展示座位图"] + 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["显示空表单
提示「请重新选择」"] + B -->|有| D["解析 vr_ticket_config JSON"] + D --> E["还原:场馆 → 分区 → 座位选择状态"] + E --> F["管理员可修改选择
重新生成 spec_base 映射"] + F --> G["保存时:先删除旧spec
再批量插入新spec"] +```