diff --git a/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php b/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php index f6a30b8..456ba35 100644 --- a/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php +++ b/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php @@ -510,27 +510,59 @@ class SeatSkuService extends BaseService return $seatSpecMap; } - // 2. 查询每个 spec_base_id 对应的 GoodsSpecValue - $specBaseIds = array_column($specs, 'id'); - $specValues = \think\facade\Db::name('GoodsSpecValue') - ->whereIn('goods_spec_base_id', $specBaseIds) - ->order('id', 'asc') // 按插入顺序,确保维度顺序一致 + // 2. 查询 GoodsSpecType 获取维度映射(name => index) + $specTypes = \think\facade\Db::name('GoodsSpecType') + ->where('goods_id', $goodsId) + ->order('id', 'asc') ->select() ->toArray(); - // 3. 按 spec_base_id 分组,按 SPEC_DIMS 顺序映射维度 - // 不依赖 type 字段,而是按插入顺序匹配 SPEC_DIMS + // 构建 name => index 映射 + $dimIndexByName = []; + $dimValuesByName = []; // name => [value1, value2, ...] + foreach ($specTypes as $idx => $type) { + $dimName = $type['name'] ?? ''; + if (!empty($dimName)) { + $dimIndexByName[$dimName] = $idx; + // 解析 value JSON 数组 + $values = json_decode($type['value'] ?? '[]', true); + $dimValuesByName[$dimName] = []; + foreach ($values as $v) { + if (isset($v['name'])) { + $dimValuesByName[$dimName][] = $v['name']; + } + } + } + } + + // 3. 查询每个 spec_base_id 对应的 GoodsSpecValue + $specBaseIds = array_column($specs, 'id'); + $specValues = \think\facade\Db::name('GoodsSpecValue') + ->whereIn('goods_spec_base_id', $specBaseIds) + ->select() + ->toArray(); + + // 4. 按 spec_base_id 分组,通过值匹配确定维度 $specByBaseId = []; foreach ($specValues as $sv) { $baseId = $sv['goods_spec_base_id']; + $value = $sv['value'] ?? ''; + + // 通过值匹配找到对应的维度名 + $dimName = ''; + foreach ($dimValuesByName as $name => $values) { + if (in_array($value, $values)) { + $dimName = $name; + break; + } + } + if (!isset($specByBaseId[$baseId])) { $specByBaseId[$baseId] = []; } - $idx = count($specByBaseId[$baseId]); // 当前维度索引 - $dimName = self::SPEC_DIMS[$idx] ?? ('dim_' . $idx); $specByBaseId[$baseId][] = [ - 'type' => $dimName, // 使用 SPEC_DIMS 顺序推断维度名 - 'value' => $sv['value'] ?? '', + 'type' => $dimName, + 'value' => $value, ]; }