2026-07-17-payment-settlement-design.md 4.3 KB

收费结算模块 — 设计文档

日期:2026-07-17 | 优先级:P0-3

1. 目标

在出场环节增加收费结算流程。临时车人工收费(现金),月租/VIP 车自动免密放行。架构上预留 POS 机、扫码支付的扩展入口。

2. 核心改造

出场流程

输入车牌 → 查询车辆
  ├─ 月租/VIP(is_system=false)→ 点"确认出场" → 免密 → 自动放行
  └─ 临时车(is_system=true)→ 显示费用
       ├─ 应付金额
       ├─ 支付方式:[现金] [扫码(预留)] [POS(预留)]
       └─ 现金模式:
            ├─ 收费员输入实收金额
            ├─ 系统自动计算找零
            └─ "确认收款" → 创建支付记录 → 出场+开闸

扩展性设计

  • 后端定义 PaymentMethod 常量(cash / free / pos / wechat / alipay)
  • 新增支付方式:加常量 + 前端加支付按钮 → 调同一接口传不同 payment_method
  • 前端支付按钮按 paymentMethodList 渲染,新增只需加数组项

3. 数据结构

新增表:payment_record

字段 类型 说明
id uint 主键
record_id uint 关联 vehicle_record.id
payment_method string cash / free / pos / wechat / alipay
amount float64 应收金额
paid_amount float64 实收金额(现金时由收费员输入)
change_amount float64 找零
operator_id uint 收费员用户ID
paid_at datetime 支付时间
remark string 备注

vehicle_record 表新增字段

字段 类型 说明
payment_method string 支付方式

4. API 设计

4.1 费用预览

POST /vehicle/exit/preview

Request:  { plate_number, rfid_tag }
Response: { plate_number, entry_time, stay_time, fee, vehicle_type, is_temp }

不修改数据库,仅查询进场记录 + 计算费用。

4.2 确认出场(+支付)

POST /vehicle/exit/confirm

Request:  { plate_number, rfid_tag, payment_method, paid_amount }
Response: { plate_number, entry_time, exit_time, stay_time, fee, change_amount, payment_method }
  1. 更新 vehicle_record(exit_time, stay_time, fee, payment_status, payment_method)
  2. 创建 payment_record
  3. 更新车辆统计

payment_method=free 时paid_amount=0,直接放行。

5. 前端改造(entryExit.vue 出场 Tab)

查询到车辆后,根据 is_temp 分两路:

月租/VIP(非临时车)

直接显示"确认出场"按钮 → 调 /vehicle/exit/confirm(payment_method=free)

临时车

显示费用信息 + 支付方式选择 + 现金输入(选现金时) + "确认收款"按钮

┌───────────────────────────────────┐
│ 出场信息                          │
│ 车牌: 粤A12345  进场: 10:30       │
│ 停留: 2小时15分  应收: ¥15.00     │
│                                   │
│ 支付方式: [现金] [扫码] [POS]     │
│                                   │
│ 实收金额: [______] 元             │
│ 找零: ¥5.00                       │
│                                   │
│ [确认收款并放行]                   │
└───────────────────────────────────┘

6. 文件变更清单

文件 操作 说明
internal/dao/payment_record.go 新增 支付记录 DAO
internal/dao/vehicle_record.go 修改 加 payment_method 字段
internal/model/vehicle/request/vehicle.go 修改 新增 ExitPreview / ExitConfirm 请求
internal/service/vehicle/vehicle.go 修改 拆出 Preview / Confirm 方法
internal/api/v1/vehicle/vehicle.go 修改 新增路由 handler
internal/router/vehicle/vehicle.go 修改 注册新路由
frontend/src/view/parking/entryExit.vue 修改 出场 Tab 增加收费 UI
frontend/src/api/vehicle.js 修改 新增 preview / confirm API

7. 边界情况

场景 处理
现金收不够 前端校验:实收 < 应收,提示"金额不足"
金额输入非数字 前端过滤,仅允许数字和点
已出场的车再次点出场 后端 preview 返回错误
免密车类型不对 confirm 时二次校验 is_system