# 停车收费与结算流程 > 更新日期:2026-08-07 > 本文档以当前实现为准,真实 POS、中央缴费机和线上支付网关尚待接入。 ## 1. 结算对象与职责 | 对象 | 作用 | 是否可替代 | | --- | --- | --- | | 停车会话 `vehicle_record` | 保存本次停车的费用、支付摘要和进出场事实 | 不可替代 | | 数字票 `digital_ticket` | 保存待支付、已支付、已离场状态和票号 | 不可替代 | | 支付流水 `payment_record` | 保存实际收款、实收、找零、操作员 | 财务事实来源 | 不得只修改数字票状态或只插入支付流水。所有结算必须通过支付服务和停车会话事务统一更新。 ## 2. 支付入口与支付方式 支付入口和支付方式为独立配置。 | 概念 | 解决的问题 | 示例 | | --- | --- | --- | | 支付入口 | 在哪里发起结算 | 收费岗亭、停车小票、中央缴费机 | | 支付方式 | 用什么方式收款 | 现金、POS、小票扫码、免费放行 | 入口与方式通过配置关系限制可用组合。例如,中央缴费机可配置扫码和 POS;收费岗亭可配置现金和 POS。禁用配置只影响后续新结算,不修改历史记录。 ## 3. 当前结算主流程 ```text 定位停车会话和数字票 -> 计算应收金额 -> 校验支付入口和支付方式可用 -> 校验金额 -> 插入 payment_record -> 更新 vehicle_record.payment_status / fee / payment_entry / payment_method -> 更新 digital_ticket 为 paid -> 确认出场时关闭会话并更新数字票为 exited ``` ### 3.1 规则 - 应收金额、实收金额不能为负数。 - 现金等手工金额方式,实收不得低于应收;超出部分记录为找零。 - 零费用允许零金额结算。 - 已支付会话不允许再次支付;已出场会话不允许再次结算或离场。 - 预支付数字票在出口只做离场确认,不再创建第二笔支付流水。 - 任意步骤失败时,事务回滚,不能遗留半完成支付数据。 ## 4. 已实现支付场景 | 场景 | 状态 | 说明 | | --- | --- | --- | | 收费岗亭人工现金 | 已实现 | 支持实收、找零、操作员记录 | | 免费放行 | 已实现 | 用于零费用、白名单等合法免费场景 | | 数字票结算 | 已实现 | 从数字票页面选择入口和方式并完成支付 | | 出口消费预支付票 | 已实现 | 已支付数字票在出口确认离场,不重复收费 | | POS 支付方式配置 | 已实现 | 可配置、可选择,真实 POS 交易未接入 | | 小票扫码支付方式配置 | 已实现 | 可配置、可选择,真实支付网关未接入 | | 中央缴费机入口配置 | 已实现 | 可配置为支付入口,终端协议和回调未接入 | ## 5. 外部支付接入要求 POS、中央缴费机、线上支付接入时必须遵守: 1. 外部终端先根据 `ticket_no` 查询数字票及应收金额。 2. 终端支付成功后携带 `ticket_no`、外部订单号、支付入口和支付方式回调。 3. 服务端以票号和外部订单号进行幂等校验,不允许因回调重试产生重复支付。 4. 支付服务成功后,出口仍由统一出场流程关闭停车会话并开闸。 5. 终端超时或状态不确定时进入人工核对,不得直接标记支付成功。 ## 6. 对账 交接班和收入报表以 `payment_record` 为主进行汇总;停车会话和数字票的支付字段用于业务展示和快速筛选。出现差异时,应以支付流水、操作日志和外部支付订单号核对。