From 5675bb679fdc9f736d06fdad55a5a4478f3e9fe5 Mon Sep 17 00:00:00 2001 From: Council Date: Mon, 20 Apr 2026 14:32:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=A8=A1=E6=9D=BF=E7=A1=AC=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=9C=BA=E6=99=AF=E4=B8=8B=E4=BC=98=E9=9B=85=E9=99=8D?= =?UTF-8?q?=E7=BA=A7=20+=20snapshot=20=E5=90=8C=E6=AD=A5=E6=B8=85=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 方案逻辑(用户提出): - 模板被硬删除后,GetGoodsViewData() 将 template_id + template_snapshot 同时置 null - 前端看到选单为空,用户可重新选择或清空配置 - AdminGoodsSaveHandle() 跳过不存在模板的 snapshot 重建(continue) 修改文件: - SeatSkuService.php: GetGoodsViewData() 加硬删除检测,空模板时清空 config - AdminGoodsSaveHandle.php: 模板不存在时 continue,不触发 json_decode(null) Fatal Error --- .../vr_ticket/hook/AdminGoodsSaveHandle.php | 9 +++++++++ .../plugins/vr_ticket/service/SeatSkuService.php | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) 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);