vr-shopxo-plugin/docs/SPEC_DESIGN_DECISION.md

90 lines
2.6 KiB
Markdown
Raw Permalink Normal View History

# SPEC 设计方向决策
> 创建2026-04-15
> 关联 Issue#9
---
## 核心发现
Phase 0-2 实现与原始设计文档(`docs/06_SEAT_MAP_INTEGRATIONATION.md`)存在架构偏差。
---
## ShopXO SPEC 机制
### 机制说明
- 商品有**多个 SPEC 维度**(场馆/分区/时段/座位),每个维度有多个 VALUE
- `goods_spec_base` 表:每行 = 一个完整 SKUspec_base_id = SKU ID含 inventory + price
- `goods_spec_value` 表:(spec_base_id, value) 对
- ShopXO 购买流程:`BuyGoods` → `GoodsSpecDetail` → 用 spec 值数组查对应 spec_base_id → 原子扣 inventory
### 关键代码路径
```
BuyService.php:94 GoodsSpecificationsHandle($v)
→ 提取 spec 字段({type, value} 对)
→ GoodsService.php:2763 GoodsSpecDetail()
→ goods_spec_value 表查 spec_base_id
→ goods_spec_base 表读 inventory + price
```
---
## 原始设计(文档)
`spec_base_id_map` = `{seat_id: {spec_base_id, row, col, price}}`
- key = 具体座位("1_1" = 第1排第1座
- spec_base_id = ShopXO 里该座位的完整 SPEC 组合的 SKU ID
- stock = 1每个座位独立库存
- 购买:每个座位单独 spec_base_id → ShopXO 原生防超卖
---
## 当前代码实现
`submit()` 发送:
```javascript
{
spec_base_id: this.sessionSpecId, // ← zone 级别,不是每个座位
stock: this.selectedSeats.length, // ← 座位总数
extension_data: { seats: [所有选中座位] }
}
```
**问题**
- spec_base_id 是 zone 级别的ShopXO 只能检查该 zone 的库存
- seats[] 里包含所有 Zone 的座位,与 spec_base_id 不匹配
- 绕过了 ShopXO spec 验证
---
## 两种方向
### 方案 A每个座位一个 SPEC原始设计
- spec_base_id_map每个座位一个 keyspec_base_id = 该座位在 ShopXO 的 SKU ID
- 后台:批量在 ShopXO 生成 N 个 SPECinventory=1
- submit():按 spec_base_id 分组,每组单独一行 goods_params
- ShopXO 原生防超卖
### 方案 B每个 Zone 一个 SPEC当前实现
- spec_base_id_map每个 Zone 一个 key
- submit():每个 Zone 单独一行 goods_params
- 自建 FOR UPDATE 锁(在 onOrderPaid
- Zone 间混买需前端分组
---
## 待确认问题
1. **spec_base_id_map 实际存储格式**Zone 级还是座位级?
- 查 ShopXO 数据库:`SELECT id, goods_id, inventory FROM sxo_goods_spec_base WHERE goods_id = ?`
2. **ShopXO SPEC 数量上限**5000 座 × 多 Zone × 多时段 = 大量 SPEC上限
3. **决策**:选择方案 A 还是 B
---
## 关联
- Issue #6P0-2 价格验证(相关)
- Issue #7M-04 loadSoldSeats 未实现(取决于 SPEC 方向)