Commit Graph

11 Commits (fix/ticket-select-refresh)

Author SHA1 Message Date
Council e053e03c7c feat(ticket): 票务管理后台增强 - 订单信息展示、城市筛选修复、观影人管理
- Admin.php: 票详情页新增订单信息、用户信息展示
- Hook.php: 修复城市筛选只对票务商品生效
- Ticket.php: 核销记录新增短码、观演人手机号、订单号、购买者信息
- AdminGoodsSaveHandle.php: 新增商品保存后置处理 - SKU重建、价格刷新、缓存清理
- AdminGoodsSave.php: 观影人配置UI优化
- detail.html: 票详情页重构 - 新增订单信息展示面板
- list.html: 票列表新增订单号、手机号列,优化列宽
2026-06-25 17:16:58 +08:00
Council 2ceb7824aa feat(ticket): 新增观影人信息管理功能
- AdminGoodsSave.php: 添加观影人配置UI(版本 v1.0.1)
  - 支持勾选是否需要观影人信息
  - 支持配置必填字段:手机号(默认)、姓名、身份证号
  - Vue 初始化和还原时自动补充 viewer_config 默认值

- Hook.php: BuyCheck 中新增观影人信息校验
  - 校验 viewer_data 必填性
  - 手机号格式校验(/^1[3-9]\d{9}$/)
  - 姓名和身份证号必填校验
  - 阶段1:支持单个观影人(所有座位共用)

数据结构:viewer_config 嵌入到每个场馆配置中
兼容性:老数据自动补充默认值(不要求观影人信息)
2026-06-24 09:06:44 +08:00
Council e282a5af2b feat(city-filter): 城市坐标筛选核心 - GeoCityService + 商品列表/搜索钩子
- 新增 GeoCityService::FindNearestCityId():根据用户坐标反推最近城市ID(使用GeoTransUtil距离计算)
- 新增 Hook::OnGoodsListBegin():商品列表查询钩子,注入 produce_region 城市筛选
- 新增 Hook::OnSearchListBegin():搜索列表查询钩子,注入 produce_region 城市筛选
- 新增 Hook::OnSearchListResult():搜索结果后处理钩子,票务商品按 coding 合并(优先选最近演出日期)
- SearchService.php:增加 plugins_service_search_goods_list_result 钩子触发点
- event.php:注册新的3个钩子(goods_list_begin / search_list_begin / search_list_result)
- config.json:同步注册新钩子
- 新增 DiyHomeCityRouter:根据用户坐标路由到城市专属DIY首页模板
2026-06-11 22:28:47 +08:00
Council c5eb2e9996 feat: VR ticket plugin full update - Tree API, City selector, seatmap service, wallet plugin
Core changes:
- Add Tree API design docs + implementation plan (14/15/16_*.md)
- Add CityService + City API (city selector component)
- Enhance SeatMapService + SeatSkuService (seatmap.test.json)
- Add Hook.php event injection, AdminGoodsSave hooks
- Update ticket_detail.html, venue/save.html views
- Add CORS middleware, Weixin payment fix

Wallet plugin (new submodule):
- Full wallet plugin: admin (Cash/Recharge/Transfer/Config)
- API layer: User/Walletlog/Recharge/Cash/Transfer endpoints
- Hook integration

Docs:
- VR_TICKET_TREE_API.md, VR_TICKET_WALLET_VERIFY_API.md
- Council evaluation report, test files

Tools:
- strip_batch.py, strip_page.py (cleanup utilities)

(153 files, +27784/-686 lines)
2026-06-03 13:34:38 +08:00
Council cd0e70e9d5 remove: 座位模板页面和控制器(被场馆配置覆盖)
- 删除 SeatTemplateList/Save/Delete/Enable 四个方法(194行)
- 从 Hook.php AdminSidebarInit 移除座位模板菜单项
- 删除 view/admin/seat_template/ 目录(list.html + save.html)
- SeatSkuService/BaseService 等仍保留 seat_map 逻辑,供场馆配置使用
2026-04-25 20:12:49 +08:00
Council 44553442e0 fix(admin): 修复菜单注册项属性名 item→items(ShopXO sidebar 渲染器期望 items 复数,导致所有子菜单项丢失) 2026-04-25 19:32:03 +08:00
Council c93cc1134a feat(B): B端核销功能合入(最终修正 session key + $this->admin)
核心修正(基于 ShopXO 框架实现):
- Admin.php extends app\admin\controller\Common(ShopXO admin基类)
- 父类构造函数已执行 $this->admin = AdminService::LoginInfo()
- 所有 auth 检查改为 $this->admin['id'](不再用 session())
- Session key 全部修正为框架标准用法

Session key 修正历程:
  admin_id              → session('admin')           × 17(第一版,错误)
  admin_login_info['id']→ session('admin')['id']    × 18(第二版,错误)
  session('admin')['id']→ $this->admin['id']        × 18(最终版,正确)

+ Event.php: M-03 PDO fetchAll() bug fix
+ Hook.php: TicketVerify 菜单项
+ view/admin: 9个 B端 模板
+ docs: Phase B plan
2026-04-25 17:15:31 +08:00
Council 29f4c61110 feat(Task1): seat_number display + CODE128 barcode rendering
- WalletService: add seat_number field (parseSeatNumber helper)
- ticket_card.html: seat_info → seat_number in all 3 locations
  (card template + viewTicket modal + showTicketDetail modal)
- ticket_card.html: add barcode canvas in both modals
- ticket_card.html: JsBarcode() calls after renderQrCode (3 locations)
- ticket_wallet.html: load JsBarcode.all.min.js before ticket_card.js
2026-04-24 23:58:09 +08:00
Council d85eb8e19d fix(Task2): 修复 onOrderPaid seat_info 为空的 ThinkPHP Query 懒加载 bug
根本原因:\think\facade\Db::name('order_detail')->select() 返回懒加载的 Query 对象,
每次 foreach 迭代都重新执行 SELECT,返回全新的 Collection。
第一 foreach 解析 spec 并写入 _parsed_* 到 Collection A,
第二 foreach 迭代的是 Collection B(全新干净数据),
导致 _parsed_seat_info 永远为空,票数据丢失。

修复:加 ->toArray() 强制物化一次,两个 foreach 操作同一份数组。

同时补票:order 10 (票26,27)、order 12 (票28)、order 13 (票25)。
2026-04-24 22:09:08 +08:00
Council 8b15283376 feat(phase4.3): 完成 C端票夹
新增文件:
- api/Ticket.php: C端票夹API控制器(list/detail/refreshQr)
- service/WalletService.php: 票夹核心服务
- view/goods/ticket_card.html: 票卡片共享组件
- view/goods/ticket_wallet.html: 票夹列表页

修改文件:
- Hook.php: 注册订单详情页注入钩子(plugins_service_order_detail_page_info)
- install.sql: 添加 qr_issued_at 字段

数据库变更:
- ALTER TABLE vr_tickets ADD qr_issued_at INT UNSIGNED
2026-04-23 13:44:48 +08:00
Council 2452fde466 refactor(vr_ticket): full plugin restructure - Admin.php root pattern + Hook.php
Phase 2 completion - complete backend management rebuild:

Plugin architecture change (旧 → 新):
- 删: admin/controller/ 子目录多控制器 → 留: admin/Admin.php 单控制器
- 删: admin/view/ → 留: view/{module}/
- 删: EventListener.php, app.php, plugin.json → 留: Hook.php, config.json

New files:
- Hook.php: 插件钩子入口(侧边栏菜单 + 订单支付处理)
- config.json: 插件配置(is_enable 等)
- install.sql / uninstall.sql: 安装卸载脚本
- view/venue/list.html, save.html: 场馆管理视图(AmazeUI)
- view/admin/setup.html: 插件设置页

Modified files:
- service/AuditService.php, BaseService.php, SeatSkuService.php, TicketService.php
- admin/Admin.php: 全新 Admin.php 根目录控制器

ShopXO core changes:
- app/index/controller/Goods.php: ticket 类型商品详情页路由
- app/service/AdminPowerService.php: 权限系统适配
- config/shopxo.php: 配置

AmazeUI frontend migration:
- All views migrated from LayUI to AmazeUI
- Vue 3 editor for venue/seat configuration
- CDN: unpkg.com → cdn.staticfile.net

Fixes included:
- Infinite loading (missing footer include)
- Vue3 textarea interpolation bug
- Template path resolution (../../../plugins/...)
- Hook return fields (id/url/is_show)
- DB field names verified from source
2026-04-17 00:46:00 +08:00