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"]
+```