# Phase 3 P0 — 5维 Spec Migration SQL Script # # 执行顺序: # 1. 先备份数据 # 2. 执行 Step 1:更新 seat_map JSON(加 rooms 层) # 3. 执行 Step 2:重建 GoodsSpecType(5维,含 $vr-演播室) # 4. 执行 Step 3:清空并重建 GoodsSpecValue(关联 SPEC_DIMS) # # 假设 goods_id=112,座位模板 ID=1 -- ============================================================ -- Step 1:更新 seat_map JSON(座位模板) -- ============================================================ -- 查看当前 seat_map -- SELECT id, name, seat_map FROM vrt_vr_seat_templates WHERE id=1; -- 将旧结构 flat sections/map/seats → 移入 rooms[0] -- 注意:实际执行时需要根据当前数据进行转换 -- 示例转换(请根据实际数据调整): -- UPDATE vrt_vr_seat_templates -- SET seat_map = JSON_SET( -- JSON_SET( -- JSON_SET( -- JSON_OBJECT( -- 'venue', JSON_EXTRACT(seat_map, '$.venue'), -- 'rooms', JSON_ARRAY( -- JSON_OBJECT( -- 'id', 'room_001', -- 'name', '主厅', -- 'sections', JSON_EXTRACT(seat_map, '$.sections'), -- 'map', JSON_EXTRACT(seat_map, '$.map'), -- 'seats', JSON_EXTRACT(seat_map, '$.seats') -- ) -- ) -- ), -- '$.sections', JSON_EXTRACT(seat_map, '$.sections'), -- '$.map', JSON_EXTRACT(seat_map, '$.map'), -- '$.seats', JSON_EXTRACT(seat_map, '$.seats') -- ), -- '$.rooms[0].sections', JSON_EXTRACT(seat_map, '$.sections'), -- '$.rooms[0].map', JSON_EXTRACT(seat_map, '$.map'), -- '$.rooms[0].seats', JSON_EXTRACT(seat_map, '$.seats') -- ), -- '$.rooms[0].id', 'room_001', -- '$.rooms[0].name', '主厅' -- ) -- WHERE id = 1; -- ============================================================ -- Step 2:重建 GoodsSpecType(5维) -- ============================================================ -- 删除旧的 4 维记录 DELETE FROM vrt_goods_spec_type WHERE goods_id=112; -- 插入新的 5 维记录(按 SPEC_DIMS 顺序) INSERT INTO vrt_goods_spec_type (goods_id, name, value, add_time) VALUES (112, '$vr-场次', '[{"name":"待选场次","images":""}]', UNIX_TIMESTAMP()), (112, '$vr-场馆', '[{"name":"国家体育馆","images":""}]', UNIX_TIMESTAMP()), (112, '$vr-演播室', '[{"name":"主厅","images":""}]', UNIX_TIMESTAMP()), (112, '$vr-分区', '[{"name":"A区","images":""},{"name":"B区","images":""},{"name":"C区","images":""}]', UNIX_TIMESTAMP()), (112, '$vr-座位号', '[{"name":"待选座位","images":""}]', UNIX_TIMESTAMP()); -- ============================================================ -- Step 3:清空并重建 GoodsSpecValue -- -- 当前 GoodsSpecValue 为 0 的根因: -- BatchGenerate() 没有写入 name 字段关联 SPEC_DIMS -- -- 修复后,BatchGenerate() 会: -- 1. 按 SPEC_DIMS 顺序写入 5 条 GoodsSpecValue -- 2. 每条记录包含 name 字段关联维度 -- 3. buildSeatSpecMap() 通过 name 字段直接读取维度 -- ============================================================ -- 先清空旧的 GoodsSpecValue(关联 goods_id=112) DELETE FROM vrt_goods_spec_value WHERE goods_id=112; -- 如果需要手动重建(仅用于修复历史数据): -- 注意:需要先确保 GoodsSpecBase 存在且有 seat_key -- 示例:手动生成 GoodsSpecValue(修复历史数据) -- 假设 GoodsSpecBase.id=1, seat_key='room_001_A_1' -- -- INSERT INTO vrt_goods_spec_value (goods_id, goods_spec_base_id, name, value, md5_key, add_time) VALUES -- (112, 1, '$vr-场次', '08:00-23:59', MD5('08:00-23:59'), UNIX_TIMESTAMP()), -- (112, 1, '$vr-场馆', '国家体育馆', MD5('国家体育馆'), UNIX_TIMESTAMP()), -- (112, 1, '$vr-演播室', '主厅', MD5('主厅'), UNIX_TIMESTAMP()), -- (112, 1, '$vr-分区', '国家体育馆-主厅-A', MD5('国家体育馆-主厅-A'), UNIX_TIMESTAMP()), -- (112, 1, '$vr-座位号', '国家体育馆-主厅-A-A1', MD5('国家体育馆-主厅-A-A1'), UNIX_TIMESTAMP()); -- ============================================================ -- 验证查询 -- ============================================================ -- 验证 GoodsSpecType(应该有 5 条) -- SELECT * FROM vrt_goods_spec_type WHERE goods_id=112 ORDER BY id; -- 验证 GoodsSpecValue(修复后应该 > 0) -- SELECT COUNT(*) FROM vrt_goods_spec_value WHERE goods_id=112; -- 验证 seat_map JSON 结构(应该有 rooms[]) -- SELECT id, name, JSON_EXTRACT(seat_map, '$.rooms') FROM vrt_vr_seat_templates WHERE id=1; -- ============================================================ -- 推荐:重新执行 BatchGenerate -- ============================================================ -- 由于 BatchGenerate() 现在正确写入 GoodsSpecValue, -- 推荐执行以下 PHP 代码重建所有 SKU: -- -- \app\plugins\vr_ticket\service\SeatSkuService::BatchGenerate( -- $goodsId = 112, -- $seatTemplateId = 1, -- $selectedRooms = [], -- $selectedSections = [], -- $sessions = [['start' => '08:00', 'end' => '23:59']] -- );