17 KiB
schema, ticket, title, consumer, author, change_type, backend_status, gateway_status, frontend_status, frontend_owner, frontend_ref, target_release, verified_at, status_note, updated_at, base
| schema | ticket | title | consumer | author | change_type | backend_status | gateway_status | frontend_status | frontend_owner | frontend_ref | target_release | verified_at | status_note | updated_at | base |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hl-changelog/v2 | 8181 | 线下收款废除报账人代收 DRIVER_CASH 渠道(尾款收款模型重构 PR-1) | admin | yst(GIT) | 修改接口 | merged | not_required | not_required | backend_status: merged - 已合 dev-v3(PR #8183,merge commit a1fb7bc5ef),未部署测试服; gateway_status: not_required - 零网关改动,/v3/admin/order/** 走 hl-gateway 既有通配路由; frontend_status: pending - 前端适配情况未知,需排查 options 消费方是否硬编码 DRIVER_CASH 前端核验(2026-09-22):渠道 radio 由 options.channels 数据驱动渲染(channelText 优先 CHANNEL_LABELS 兜底),无「必有 DRIVER_CASH」硬编码假设,下线自动生效;历史行渲染映射 CHANNEL_LABELS.DRIVER_CASH 按 ⑫-2 明示保留;520417 由 request.js 拦截器透 message(msg 即操作指引);表单 DRIVER_CASH 分支成惰性保留防回滚。行为零改动判 not_required;orderV2.js JSDoc 与映射注释订正(412d7408)。 | 2026-09-22 | dev-v3 |
线下收款废除「报账人代收 DRIVER_CASH」渠道(尾款收款模型重构 PR-1,#8181)
订单线下收款登记的「报账人收款(DRIVER_CASH)」渠道下线:登记选项接口不再返回该渠道,登记接口传 DRIVER_CASH 直接报新错误码 520417。历史 DRIVER_CASH 收款记录的查询、撤销不受影响。
① 接口背景
此前管理后台给订单补录线下收款时有三个渠道:定制师代收、对公转账、报账人收款(司机/导游等报账人手持现金收尾款)。「报账人代收尾款」模式资金不入公账、对账困难,尾款收款模型重构(Epic #8181)将其废除,改为「确认行程时指定主报账人,尾款挂其代收债务」的新链路(后续 PR 上线)。
本 PR 是该重构的第 1 步:只下线 DRIVER_CASH 的登记入口,存量数据完全兼容。
② 变更清单
| 类型 | 接口 | 变更 |
|---|---|---|
| 修改(出参结构收缩) | GET /v3/admin/order/{orderId}/payment/manual-receipt/options |
出参 channels[] 从 3 项变 2 项,移除 DRIVER_CASH 渠道项 |
| 修改(行为变更 + 新错误码) | POST /v3/admin/order/{orderId}/payment/manual-receipt |
channel=DRIVER_CASH 不再可登记,返回 520417(此前可正常登记尾款) |
| 不变 | GET /v3/admin/order/{orderId}/payment/manual-receipt 列表 |
历史 DRIVER_CASH 记录照常返回 |
| 不变 | DELETE /v3/admin/order/{orderId}/payment/manual-receipt/{receiptId} 撤销 |
历史 DRIVER_CASH 记录照常可撤销 |
③ 接口详情
3.1 查询线下收款登记选项
GET /v3/admin/order/{orderId}/payment/manual-receipt/options
- 使用场景:订单详情「登记线下收款」弹窗打开时拉取,渲染渠道 tabs + 各渠道可选款项/代收人/收款方式
- 认证:管理后台 JWT(hl-gateway 统一鉴权)
- 权限:订单归属校验(订单顾问/财务相关角色可读),车务管理员(VEHICLE_MANAGER)可读;房源角色(HOUSE)禁止
- 幂等性:只读接口,天然幂等
- 限流:走网关默认限流,无单独配额
3.2 登记线下收款
POST /v3/admin/order/{orderId}/payment/manual-receipt
- 使用场景:线下收到款项后补录(对公转账到账、定制师代收款),同事务推进订单
paid_amount/pay_status - 认证:管理后台 JWT
- 权限:需线下收款写权限(结算写守卫)
- 幂等性:非幂等,每次成功调用新增一条收款凭据并累加已付金额;重复提交会重复收款,前端须防连击
- 事务:凭据落库与订单已付金额累加在同一事务,不会出现半成功状态
④ 入参
4.1 选项接口入参
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
orderId |
path | Long | 是 | 订单 ID |
无 query / body 参数。
4.2 登记接口请求体
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
channel |
string | 是 | 收款渠道:CONSULTANT_COLLECTION(定制师代收)/ BANK_TRANSFER(对公转账)。⚠️ DRIVER_CASH 已下线,传了返回 520417 |
payType |
string | 是 | 款项类型:DEPOSIT(订金)/ BALANCE(尾款)/ FULL(全款) |
amount |
number | 是 | 收款金额,必须 > 0,不能超过当前可收余额 |
receivedAt |
string(datetime) | 否 | 收款时间,可补录过去时间;不传默认当前时间 |
transferRef |
string | 条件必填 | 对公转账流水号,BANK_TRANSFER 渠道必填 |
receiptMethod |
string | 否 | 收款方式(字典 manual_receipt_method),BANK_TRANSFER 为空 |
collectorStaffId |
Long | 否 | 代收人 assignmentId。原为 DRIVER_CASH 必填,该渠道下线后登记链路不再使用 |
collectorType |
string | 否 | 实际代收人类型 ORDER_STAFF/CONSULTANT/COMPANY_ACCOUNT;不传按 channel 兼容推导 |
voucherUrls |
string[] | 否 | 凭证图片 URL 列表 |
remark |
string | 否 | 备注,最长 500 字 |
⑤ 出参
5.1 选项接口出参 ManualReceiptOptionsVO
| 字段 | 类型 | 说明 |
|---|---|---|
channels |
array | 收款渠道选项。本次变更后固定 2 项:CONSULTANT_COLLECTION、BANK_TRANSFER(顺序即此顺序) |
channels[] 元素 ChannelOption:
| 字段 | 类型 | 说明 |
|---|---|---|
channel |
string | 渠道值 |
channelText |
string | 渠道显示文案(「定制师代收」/「对公转账」) |
allowedPayTypes |
string[] | 当前订单状态下允许的款项类型,空数组 = 该渠道不可用 |
disabled |
boolean | 是否禁用,true 时前端置灰 |
disabledReason |
string | 禁用原因,disabled=true 时有值 |
collectors |
array | 该渠道可选代收人(见下表);BANK_TRANSFER 恒为空 |
receiptMethods |
array | 该渠道可选收款方式(见下表);BANK_TRANSFER 恒为空 |
collectors[] 元素 CollectorOption:
| 字段 | 类型 | 说明 |
|---|---|---|
collectorType |
string | ORDER_STAFF / CONSULTANT / COMPANY_ACCOUNT |
collectorId |
Long(string) | 代收人 ID:CONSULTANT 为 adminId |
collectorName |
string | 代收人姓名 |
collectorRole |
string | 代收人角色 |
collectorRoleText |
string | 角色显示文案 |
defaultSelected |
boolean | 是否默认选中 |
receiptMethods[] 元素 OptionItem:
| 字段 | 类型 | 说明 |
|---|---|---|
value |
string | 选项值(字典 manual_receipt_method) |
label |
string | 显示文案 |
defaultSelected |
boolean | 是否默认选中(首项为 true) |
5.2 登记接口出参 ManualReceiptVO
| 字段 | 类型 | 说明 |
|---|---|---|
id |
Long(string) | 收款凭据 ID(雪花,String 防 JS 精度丢失) |
orderId |
Long(string) | 订单 ID |
channel |
string | 收款渠道值 |
channelLabel |
string | 渠道显示标签 |
payType |
string | 款项类型值 |
payTypeLabel |
string | 款项类型显示标签 |
amount |
number | 收款金额 |
receivedAt |
string(datetime) | 收款时间 |
collectorStaffId |
Long(string) | 代收人 assignmentId(历史 DRIVER_CASH 行才有值) |
collectorStaffName |
string | 代收人姓名(历史 DRIVER_CASH 行才有值) |
collectorType |
string | 实际代收人类型 |
collectorAdminId |
Long(string) | 定制师/管理员代收人 ID |
collectorName |
string | 通用代收人姓名快照 |
collectorRole |
string | 通用代收人角色快照 |
transferRef |
string | 对公转账流水号(BANK_TRANSFER) |
receiptMethod |
string | 收款方式值 |
receiptMethodLabel |
string | 收款方式显示标签 |
voucherUrls |
string[] | 凭证图片 URL 列表 |
remark |
string | 备注 |
operatorName |
string | 登记人姓名 |
createTime |
string(datetime) | 登记时间 |
voided |
boolean | 是否已撤销 |
voidedByName |
string | 撤销人姓名 |
voidedAt |
string(datetime) | 撤销时间 |
voidReason |
string | 撤销原因 |
paidAmountAfter |
number | 登记/撤销后订单累计已付金额(仅登记/撤销响应有值,列表查询为 null) |
payStatusAfter |
string | 登记/撤销后订单支付状态(同上) |
⑥ 枚举 / 数据字典
收款渠道 channel:
| 值 | 含义 | 本次变化 |
|---|---|---|
CONSULTANT_COLLECTION |
定制师代收 | 不变 |
BANK_TRANSFER |
对公转账 | 不变 |
DRIVER_CASH |
报账人收款 | 已下线:options 不再返回、register 拒绝(520417)。⚠️ 但列表接口的历史数据仍可能出现该值(channelLabel=「报账人收款」),渲染映射不能删 |
款项类型 payType:DEPOSIT 订金 / BALANCE 尾款 / FULL 全款(不变)。
代收人类型 collectorType:ORDER_STAFF / CONSULTANT / COMPANY_ACCOUNT(不变)。
收款方式 receiptMethod:走数据字典 manual_receipt_method(如 WECHAT_TRANSFER 微信转账、CASH 现金收款),以 options 接口实际返回为准。
⑦ 错误码
| 码 | 语义 | 触发场景 |
|---|---|---|
| 520417 | 报账人代收尾款已下线,请通过确认行程挂账主报账人代收 | 本次新增:register 传 channel=DRIVER_CASH |
| 520401 | 收款渠道非法: {0} | register 传了枚举外的渠道值 |
| 520402 | 对公转账渠道必须填写转账流水号 | BANK_TRANSFER 缺 transferRef |
| 520407 | 订单已取消,不允许登记线下收款 | 订单状态 CANCELLED |
| 520412 | 订单没有可用定制师,不能登记定制师代收 | CONSULTANT_COLLECTION 但订单无定制师 |
| 520413 | 本次收款金额超过当前可收余额 | 金额超可收余额 |
| 520415 | 收款方式不能为空 | 渠道要求 receiptMethod 但未传 |
| 520416 | 收款方式非法: {0} | receiptMethod 不在字典内 |
| 520405 | 线下收款凭据不存在 | 撤销时 receiptId 无效或不属本单 |
| 520406 | 该收款凭据已撤销,无法重复操作 | 重复撤销 |
| 520414 | 当前订单状态禁止撤销收款 | 当前订单/流程状态不允许撤销 |
注:原 DRIVER_CASH 专属错误码 520403(缺代收人)/ 520404(代收人不属本单)/ 520410(只能登尾款)/ 520411(必须选报账人)因入口下线在 register 链路不再可达,前端无需再处理这几个码(保留兼容无害)。
⑧ 示例
8.1 典型:options 返回 2 个渠道 + BANK_TRANSFER 登记成功
请求 GET /v3/admin/order/2100123456789012345/payment/manual-receipt/options(订单状态非待支付、尾款未收齐):
{
"code": 200,
"success": true,
"data": {
"channels": [
{
"channel": "CONSULTANT_COLLECTION",
"channelText": "定制师代收",
"allowedPayTypes": ["BALANCE"],
"disabled": false,
"disabledReason": null,
"collectors": [
{
"collectorType": "CONSULTANT",
"collectorId": "2090001111222233334",
"collectorName": "王定制",
"collectorRole": "CONSULTANT",
"collectorRoleText": "定制师",
"defaultSelected": true
}
],
"receiptMethods": [
{ "value": "WECHAT_TRANSFER", "label": "微信转账", "defaultSelected": true },
{ "value": "CASH", "label": "现金收款", "defaultSelected": false }
]
},
{
"channel": "BANK_TRANSFER",
"channelText": "对公转账",
"allowedPayTypes": ["BALANCE"],
"disabled": false,
"disabledReason": null,
"collectors": [],
"receiptMethods": []
}
]
}
}
请求 POST /v3/admin/order/2100123456789012345/payment/manual-receipt:
{
"channel": "BANK_TRANSFER",
"payType": "BALANCE",
"amount": 3000.00,
"transferRef": "GZL20260922001",
"remark": "客户对公转账尾款"
}
响应:
{
"code": 200,
"success": true,
"data": {
"id": "2102999888777666555",
"orderId": "2100123456789012345",
"channel": "BANK_TRANSFER",
"channelLabel": "对公转账",
"payType": "BALANCE",
"payTypeLabel": "尾款",
"amount": 3000.00,
"receivedAt": "2026-09-22T17:00:00",
"transferRef": "GZL20260922001",
"collectorType": "COMPANY_ACCOUNT",
"voided": false,
"paidAmountAfter": 8800.00,
"payStatusAfter": "FULLY_PAID"
}
}
8.2 边界:订单无定制师 → 定制师代收渠道置灰
订单无定制师快照时,CONSULTANT_COLLECTION 渠道 collectors 为空且禁用:
{
"channel": "CONSULTANT_COLLECTION",
"channelText": "定制师代收",
"allowedPayTypes": [],
"disabled": true,
"disabledReason": "订单没有可用定制师",
"collectors": [],
"receiptMethods": [
{ "value": "WECHAT_TRANSFER", "label": "微信转账", "defaultSelected": true },
{ "value": "CASH", "label": "现金收款", "defaultSelected": false }
]
}
尾款已收齐时各渠道 allowedPayTypes=[]、disabled=true、disabledReason="尾款已收齐,无可收余额";订单已取消时 disabledReason="订单已取消,不能登记收款"。
8.3 业务失败:DRIVER_CASH 登记被拒(520417)
请求:
{
"channel": "DRIVER_CASH",
"payType": "BALANCE",
"amount": 2000.00,
"collectorStaffId": "2099888777666555444",
"receiptMethod": "CASH"
}
响应:
{
"code": 520417,
"success": false,
"message": "报账人代收尾款已下线,请通过确认行程挂账主报账人代收"
}
不会落库任何收款记录,订单金额无变化。
⑨ 业务边界
- 适用:订单收到线下款项后补录(订金/全款仅限待支付状态,尾款在非待支付、非已取消状态);定制师代收、对公转账两种渠道照常可用。
- 不适用:报账人(司机/导游)手持现金收尾款的场景——此入口已废除,改走「确认行程挂账主报账人代收」链路(后续 PR 上线,前端关注后续 changelog)。
- 存量兼容:历史已登记的 DRIVER_CASH 收款记录正常返回在列表接口、正常可撤销,撤销后
paid_amount精确回退,行为与旧版一致。 - 可收余额:
amount不能超过订单当前可收余额(520413);可收余额 ≤ 0 时各渠道allowedPayTypes为空且置灰。 - 登记接口非幂等:重复点击会产生重复收款记录,前端须做按钮防重。
⑩ 修改前后对比
字段/结构级
| 项 | 修改前 | 修改后 |
|---|---|---|
options 出参 channels[] |
[CONSULTANT_COLLECTION, BANK_TRANSFER, DRIVER_CASH](3 项,DRIVER_CASH 项内含本单报账人候选 collectors) |
[CONSULTANT_COLLECTION, BANK_TRANSFER](2 项,DRIVER_CASH 项整体移除) |
register 入参 channel=DRIVER_CASH |
合法值,可登记尾款(仅 BALANCE,需 collectorStaffId 属本单报账人) | 非法值,一律返回 520417,不落库 |
行为级
| 项 | 修改前 | 修改后 |
|---|---|---|
| 报账人代收尾款登记 | 可在订单详情登记 | 入口下线,需走确认行程挂账主报账人代收(后续 PR) |
| 历史 DRIVER_CASH 记录查询/撤销 | 可查可撤 | 不变,仍可查可撤 |
| 订金/全款/尾款的定制师代收、对公转账补录 | 可用 | 不变,照常可用 |
⑪ 影响评估 / 回滚
- 破坏兼容:是。options 出参结构收缩(少一个渠道项)+ register 对 DRIVER_CASH 的行为从成功变为报错。
- 前端同步上线要求:前端必须先排查并适配(见 ⑫),否则若按旧 channels 结构硬编码索引/枚举映射,渠道 tabs 渲染或默认值逻辑可能异常;若仍向用户展示 DRIVER_CASH 入口,登记会收到 520417。
- 后端兼容:已合 dev-v3,未部署测试服;列表/撤销接口对历史数据完全兼容。
- 回滚方案:代码回滚至本 PR 前版本即恢复 DRIVER_CASH 渠道;下线期间不会产生新 DRIVER_CASH 数据,回滚无数据迁移负担。
⑫ 注意事项
- 前端排查 options 消费方是否硬编码 DRIVER_CASH:检查渠道 tabs 渲染、渠道枚举映射、默认渠道选中逻辑、channel 文案映射表(
DRIVER_CASH → 报账人收款)等位置。options 不再返回该渠道,任何按「必有 3 项 / 必有 DRIVER_CASH」假设的代码都要清理。 - 列表接口渲染映射不能删 DRIVER_CASH:历史收款记录仍可能返回
channel=DRIVER_CASH、channelLabel=报账人收款,列表/详情的展示映射需保留该值,否则历史行显示异常。 - 新错误码 520417 的 message 可直接透出给用户(文案即操作指引)。
- 原 DRIVER_CASH 专属错误码 520403/520404/520410/520411 在 register 链路不再可达,前端可不再处理。