2026-07-23-digital-ticket-design.md 3.8 KB

数字票(Digital Ticket)— 设计文档

日期:2026-07-23 | 优先级:P0

1. 目标

引入数字票作为停车业务的统一抽象模型。所有进场方式(RFID/车牌识别/手动)最终创建数字票,以票的状态驱动计费、支付和放行。

2. 状态机

                    ┌──────────┐
               ┌──→ │  已过期   │ ←──┐
               │    └──────────┘    │
               │     超时未支付      │ 超时未离场
               │                    │
  ┌────────┐  │  ┌───────────┐  ┌──┴───┐  ┌────────┐
  │ 已创建  │─→│  │  待支付    │─→│ 已支付 │─→│ 已离场  │
  └────────┘    └───────────┘  └──────┘  └────────┘
  车辆入场      自动转换       支付成功    验证放行
状态 描述 触发条件
created 车辆入场,数字票生成 入场事件触发
pending_payment 待支付 创建完成后自动进入
paid 已支付,费用结清 支付成功回调
exited 已离场,流程结束 验证通过后开闸
expired 超时未支付或未离场 定时任务/超时逻辑

3. 数据模型

digital_ticket 表

字段 类型 说明
id uint 主键
ticket_no string 票号(UUID,二维码凭证)
plate_number string 车牌
trigger_mode string rfid / plate_recognition / manual
state string created / pending_payment / paid / exited / expired
vehicle_record_id uint 关联 vehicle_record
entry_time datetime 入场时间
exit_time datetime 出场时间
fee float64 计费金额
payment_method string cash / free / wechat / alipay
payment_order_no string 支付单号(关联 payment_record)
paid_at datetime 支付时间
expire_at datetime 超时过期时间
event_log text(JSON) 事件日志数组

event_log 格式

[
  {"at": "2026-07-23 10:30", "event": "created", "trigger": "manual"},
  {"at": "2026-07-23 12:30", "event": "fee_calculated", "fee": 15.0},
  {"at": "2026-07-23 12:31", "event": "paid", "method": "cash", "amount": 20}
]

4. API

方法 路径 说明
POST /digital-ticket/create 创建票(入场时)
GET /digital-ticket/:ticketNo 查询票(扫码用)
POST /digital-ticket/:ticketNo/calculate 计费
POST /digital-ticket/:ticketNo/pay 支付
POST /digital-ticket/:ticketNo/exit 离场验证
GET /digital-ticket/list 列表

5. 与现有流程关系

任何进场方式 → DigitalTicket.Create() + VehicleEntry()
                                    │
                            状态: created → pending_payment
                                    │
                             ExitPreview / ExitConfirm
                                    │
                            状态: paid → exited

数字票作为业务状态层,位于 internal/modules/digital-ticket/,不替代 vehicle_record。

6. 文件变更

文件 操作
internal/dao/digital_ticket.go 新建
internal/modules/digital-ticket/api.go 新建
internal/modules/digital-ticket/service/service.go 新建
internal/modules/digital-ticket/repository/repo.go 新建
internal/service/vehicle/vehicle.go 修改(VehicleEntry 创建 digital_ticket)
internal/initialize/gorm.go 修改(AutoMigrate)
internal/initialize/router.go 修改(路由注册)