vr-shopxo-plugin/docs/SPEC_DESIGN_DECISION.md

90 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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 方向)