diff --git a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSaveHandle.php b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSaveHandle.php index c6f1762..5638af7 100644 --- a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSaveHandle.php +++ b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSaveHandle.php @@ -81,6 +81,15 @@ class AdminGoodsSaveHandle // 条件:snapshot 为空,或者前端有 selected_rooms if ($templateId > 0 && (!empty($selectedRooms) || empty($config['template_snapshot']) || empty($config['template_snapshot']['rooms']))) { $template = Db::name('vr_seat_templates')->find($templateId); + + // 模板不存在时(硬删除场景): + // - 跳过 snapshot 重建,保持 template_id=null 状态 + // - 前端下次打开时将看到选单为空,用户可重新选择或清空配置 + if (empty($template)) { + continue; + } + + $seatMap = json_decode($template['seat_map'] ?? '{}', true); $allRooms = $seatMap['rooms'] ?? []; // 注意:v3 格式 room.id 可能为空(用数组索引代替 id), diff --git a/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php b/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php index 6259330..11d1c24 100644 --- a/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php +++ b/shopxo/app/plugins/vr_ticket/service/SeatSkuService.php @@ -377,6 +377,22 @@ class SeatSkuService extends BaseService ->where('id', $templateId) ->find(); + // 模板不存在时(硬删除场景): + // - 将 template_id 置 null,让前端选单显示为空 + // - 同时清掉 template_snapshot,下次保存时整块 config 干净地失效 + if (empty($seatTemplate)) { + $config['template_id'] = null; + $config['template_snapshot'] = null; + \think\facade\Db::name('Goods')->where('id', $goodsId)->update([ + 'vr_goods_config' => json_encode([$config], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), + ]); + return [ + 'vr_seat_template' => null, + 'goods_spec_data' => [], + 'goods_config' => $config, + ]; + } + // 解码 seat_map JSON(存储时是 JSON 字符串) if (!empty($seatTemplate['seat_map'])) { $decoded = json_decode($seatTemplate['seat_map'], true);