diff --git a/shopxo/app/plugins/vr_ticket/Hook.php b/shopxo/app/plugins/vr_ticket/Hook.php index 565348f..6548ea5 100644 --- a/shopxo/app/plugins/vr_ticket/Hook.php +++ b/shopxo/app/plugins/vr_ticket/Hook.php @@ -508,6 +508,7 @@ class Hook * 触发位置:plugins_service_goods_list_begin * * 向下兼容:无 user_lng/user_lat 参数时,不添加任何筛选,返回全部商品 + * 修复:只对票务商品(vr_goods_config 非空)应用城市筛选,非票务商品不受影响 * * @param array &$params 钩子参数引用 ['hook_name','is_backend','params','where','field','order_by','m','n'] */ @@ -540,12 +541,22 @@ class Hook return; } - // 注入 produce_region 城市筛选条件 + // 修复:只对票务商品应用城市筛选 + // 逻辑:(非票务商品 vr_goods_config='') OR (票务商品且城市匹配) $where = &$params['where']; if (!is_array($where)) { $where = []; } - $where[] = ['g.produce_region', '=', $cityId]; + + // 使用闭包实现 OR 条件:vr_goods_config 为空(非票务) OR produce_region = 城市ID + $where[] = function($query) use ($cityId) { + $query->where(function($q) { + $q->where('g.vr_goods_config', '=', ''); + })->whereOr(function($q) use ($cityId) { + $q->where('g.vr_goods_config', '<>', '')->where('g.produce_region', '=', $cityId); + }); + }; + // @file_put_contents($debugFile, date('Y-m-d H:i:s') . " OnGoodsListBegin: city filter applied to ticket goods only, cityId=$cityId\n", FILE_APPEND); } /** @@ -553,6 +564,7 @@ class Hook * 触发位置:plugins_service_search_goods_list_begin * * 向下兼容:无 user_lng/user_lat 参数时,不添加任何筛选,返回全部商品 + * 修复:只对票务商品(vr_goods_config 非空)应用城市筛选,非票务商品不受影响 * * @param array &$params 钩子参数引用 ['hook_name','is_backend','params','where_base','where_keywords','where_screening_price','field','order_by','page','page_start','page_size'] */ @@ -586,13 +598,23 @@ class Hook return; } - // 注入 produce_region 城市筛选条件(SearchService 使用 where_base 而非 where) + // 修复:只对票务商品应用城市筛选 + // 逻辑:(非票务商品 vr_goods_config='') OR (票务商品且城市匹配) + // SearchService 使用 where_base 而非 where $whereBase = &$params['where_base']; if (!is_array($whereBase)) { $whereBase = []; } - $whereBase[] = ['g.produce_region', '=', $cityId]; - // [调试代码] @file_put_contents($debugFile, date('Y-m-d H:i:s') . " OnSearchListBegin: city filter applied, cityId=$cityId\n", FILE_APPEND); + + // 使用闭包实现 OR 条件:vr_goods_config 为空(非票务) OR produce_region = 城市ID + $whereBase[] = function($query) use ($cityId) { + $query->where(function($q) { + $q->where('g.vr_goods_config', '=', ''); + })->whereOr(function($q) use ($cityId) { + $q->where('g.vr_goods_config', '<>', '')->where('g.produce_region', '=', $cityId); + }); + }; + // [调试代码] @file_put_contents($debugFile, date('Y-m-d H:i:s') . " OnSearchListBegin: city filter applied to ticket goods only, cityId=$cityId\n", FILE_APPEND); } /** diff --git a/shopxo/app/plugins/vr_ticket/admin/Admin.php b/shopxo/app/plugins/vr_ticket/admin/Admin.php index 82cd6be..b1511dd 100644 --- a/shopxo/app/plugins/vr_ticket/admin/Admin.php +++ b/shopxo/app/plugins/vr_ticket/admin/Admin.php @@ -197,6 +197,18 @@ class Admin extends Common $goods = \think\facade\Db::name('Goods')->find($ticket['goods_id']); + // 查询订单信息 + $order = []; + $user = []; + if ($ticket['order_id'] > 0) { + $order = \think\facade\Db::name('Order')->find($ticket['order_id']); + + // 查询用户信息 + if (!empty($order) && $order['user_id'] > 0) { + $user = \think\facade\Db::name('User')->find($order['user_id']); + } + } + $verifier = []; if ($ticket['verifier_id'] > 0) { $verifier = \think\facade\Db::name('vr_verifiers')->find($ticket['verifier_id']); @@ -204,6 +216,12 @@ class Admin extends Common $ticket['qr_code_url'] = \app\plugins\vr_ticket\service\TicketService::getQrCodeUrl($ticket['ticket_code']); + // 提取短码(从 qr_data 的前半部分) + $short_code = ''; + if (!empty($ticket['qr_data']) && strpos($ticket['qr_data'], '|') !== false) { + $short_code = explode('|', $ticket['qr_data'], 2)[0]; + } + $verifiers = \think\facade\Db::name('vr_verifiers') ->where('status', 1) ->order('id', 'asc') @@ -212,8 +230,11 @@ class Admin extends Common return MyView('../../../plugins/vr_ticket/view/admin/ticket/detail', [ 'ticket' => $ticket, 'goods' => $goods, + 'order' => $order, + 'user' => $user, 'verifier' => $verifier, 'verifiers' => $verifiers, + 'short_code'=> $short_code, ]); } diff --git a/shopxo/app/plugins/vr_ticket/api/Ticket.php b/shopxo/app/plugins/vr_ticket/api/Ticket.php index fc93bd0..5aef3b7 100644 --- a/shopxo/app/plugins/vr_ticket/api/Ticket.php +++ b/shopxo/app/plugins/vr_ticket/api/Ticket.php @@ -381,7 +381,8 @@ class Ticket ->where($where) ->order('id', 'desc') ->page($page, $page_size) - ->select(); + ->select() + ->toArray(); $total = \think\facade\Db::name('vr_verifications') ->where($where) ->count(); @@ -389,12 +390,28 @@ class Ticket // 关联票和商品信息 $ticket_ids = array_filter(array_column($list, 'ticket_id')); $tickets_map = []; + $user_ids = []; if (!empty($ticket_ids)) { $tickets_raw = \think\facade\Db::name('vr_tickets') ->where('id', 'in', $ticket_ids) - ->select(); + ->select() + ->toArray(); foreach ($tickets_raw as $t) { $tickets_map[$t['id']] = $t; + if (!empty($t['user_id'])) { + $user_ids[] = $t['user_id']; + } + } + } + + $users_map = []; + if (!empty($user_ids)) { + $users_raw = \think\facade\Db::name('User') + ->where('id', 'in', array_unique($user_ids)) + ->select() + ->toArray(); + foreach ($users_raw as $u) { + $users_map[$u['id']] = !empty($u['nickname']) ? $u['nickname'] : (!empty($u['username']) ? $u['username'] : '用户' . $u['id']); } } @@ -410,12 +427,27 @@ class Ticket $result = []; foreach ($list as $v) { $ticket = $tickets_map[$v['ticket_id']] ?? []; + + // 提取短码(从 qr_data 的前半部分) + $short_code = ''; + if (!empty($ticket['qr_data']) && strpos($ticket['qr_data'], '|') !== false) { + $short_code = explode('|', $ticket['qr_data'], 2)[0]; + } else { + $short_code = !empty($ticket['ticket_code']) ? substr($ticket['ticket_code'], 0, 8) : ''; + } + + $buyer_name = $users_map[$ticket['user_id'] ?? 0] ?? ''; + $result[] = [ 'id' => $v['id'], 'ticket_id' => $v['ticket_id'], 'ticket_code' => $v['ticket_code'], + 'short_code' => $short_code, 'seat_info' => $ticket['seat_info'] ?? '', - 'real_name' => $ticket['real_name'] ?? '', + 'real_name' => $ticket['real_name'] ?? '', + 'phone' => $ticket['phone'] ?? '', + 'order_no' => $ticket['order_no'] ?? '', + 'buyer_name' => $buyer_name, 'goods_title' => $goods_map[$v['goods_id']] ?? '已下架商品', 'created_at' => $v['created_at'], ]; diff --git a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php index 0c14847..fd2d314 100644 --- a/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php +++ b/shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php @@ -140,7 +140,7 @@ class AdminGoodsSave
@@ -157,11 +157,11 @@ class AdminGoodsSave
-
+ +
- +
+
-
票条形码
-
-
- - -
-

票码:{{$ticket.ticket_code}}

- - -
- -
-
-
- - - {{if $ticket.status == 0}} -
-
核销操作
+
订单信息
-
- -
- -
-
+ {{if !empty($order)}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
订单号{{$order.order_no}}
用户昵称{{if !empty($user)}}{{$user.nickname|default=$user.username|default='未设置'}}{{else}}-{{/if}}
订单状态 + {{if $order.status == 0}} + 待确认 + {{elseif $order.status == 1}} + 待支付 + {{elseif $order.status == 2}} + 待发货 + {{elseif $order.status == 3}} + 待收货 + {{elseif $order.status == 4}} + 已完成 + {{elseif $order.status == 5}} + 已取消 + {{elseif $order.status == 6}} + 已关闭 + {{else}} + 未知 + {{/if}} +
支付状态 + {{if isset($order.pay_status) && $order.pay_status == 1}} + 已支付 + {{else}} + 未支付 + {{/if}} +
订单金额¥{{$order.total_price|default='0.00'}}
购买数量{{$order.buy_number_count|default='0'}} 张票
支付方式{{if !empty($order.payment_name)}}{{$order.payment_name}}{{else}}-{{/if}}
支付时间{{if !empty($order.pay_time) && $order.pay_time > 0}}{{:date('Y-m-d H:i:s', $order.pay_time)}}{{else}}未支付{{/if}}
下单时间{{if !empty($order.add_time)}}{{:date('Y-m-d H:i:s', $order.add_time)}}{{else}}-{{/if}}
用户备注{{if !empty($order.user_note)}}{{$order.user_note}}{{else}}{{/if}}
+ {{else}} +

订单信息不存在或已删除

+ {{/if}}
- {{/if}} +
- - + {{:ModuleInclude('public/footer')}} \ No newline at end of file diff --git a/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html b/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html index 048ba8b..2ad03a4 100644 --- a/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html +++ b/shopxo/app/plugins/vr_ticket/view/admin/ticket/list.html @@ -9,6 +9,20 @@ border-bottom: 2px solid #e8e8e8; margin-bottom: 20px; } + /* 列宽优化 */ + .ticket-list-table th:nth-child(4), /* 手机号 */ + .ticket-list-table td:nth-child(4) { + width: 12%; /* 增加100% */ + min-width: 110px; + } + .ticket-list-table th:nth-child(5), /* 座位信息 */ + .ticket-list-table td:nth-child(5) { + width: 8%; /* 缩减30% */ + max-width: 100px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + }
@@ -89,11 +103,13 @@
电子票列表 共 {{$count|default=0}} 条
- +
+ + @@ -105,8 +121,10 @@ {{if !empty($list)}} {{volist name="list" id="ticket"}} + + - + {{/if}}
订单号 票码 观演人手机号 座位信息 商品名 状态
{{$ticket.order_no|default='—'}} {{$ticket.ticket_code}} {{$ticket.real_name|default='—'}}{{$ticket.phone|default='—'}} {{if !empty($ticket.seat_info)}}{{$ticket.seat_info}}{{else}}无{{/if}} {{$ticket.goods_title|default='已删除商品'}} @@ -121,7 +139,7 @@ {{if !empty($ticket.issued_at)}}{{:date('Y-m-d H:i', $ticket.issued_at)}}{{else}}—{{/if}} - 查看详情 @@ -130,7 +148,7 @@ {{/volist}} {{else}}
暂无数据暂无数据