需求背景
docs/pipipen/feature/COMMISSION_REFUND_PRD.md §3.1 延期项补齐(退款去向自动选定)。awaiting_destination 后若用户长期不选,资金会无限期停在待退状态;需要提供「到期自动选定」兜底,同时让用户能提前看到自己的截止时间。destination_deadline_at,新增 destination_source 列与两个 internal 配置接口;本次不改用户主动选择去向的接口与行为、不动汇率与 credit 币种逻辑。WorkTask(委托);退款债权 = commission_refunds 记录;credit = 站内 Credit 钱包余额。更新记录
2026-09-22 首次发布:新增只读字段 destination_deadline_at、destination_source 列与两个 internal 配置接口(开发阶段契约,后端未发版)。2026-09-22 勘误上线步骤权限口径:权限标识由前端菜单树自动生成,上线只需在角色管理里授权,原文「需先创建权限」表述作废。2026-09-23 修订:字段表去除 emoji 前缀(按在途同域迭代规则,展示形式调整,契约无变化)。建议阅读顺序:第 1 章(一分钟上手)→ 第 2 章(接口变更总览)→ 第 3 章(接口示例)→ 第 4 章(字段与配置口径)→ 第 5 章(兼容性与上线)。遇到「这个债权什么时候被自动选定」先看第 1 章流程图与第 4 章取值口径。
| 章 | 内容 | 什么时候看 |
|---|---|---|
| 1. 一分钟上手 | 状态机 + 流程 + 优先级回落 + 六条对接要点 | 刚拿到文档 |
| 2. 接口变更 | 端点清单与变更摘要 | 找接口 |
| 3. 接口示例 | 每个端点的参数、示例与错误 | 对接具体接口 |
| 4. 字段补充说明 | destination_deadline_at 与配置项口径 | 查具体取值 |
| 5. 兼容性说明 | 兼容项与上线部署步骤 | 发布前确认 |
先看状态机与流程图理解「等待中的债权如何到期自动选定」,再读六条对接要点即可开始对接。 本次没有状态、枚举、错误码变更;既有「用户主动选择去向」的接口与行为完全不变。
自动选定与用户手动选择走同一条状态迁移(
awaiting_destination → ready),因此并发时先落库的一方生效,另一方由既有状态校验安全跳过;不会出现中间态或新状态。
自动选定不发新站内信、没有到期前提醒(产品决策 D2);退款执行完成仍沿用既有
commission_refund.completed通知与refund_awaiting_destination页面事件关闭规则。
配置示例:优先级 ['credit', 'original'] 时,债权可选 credit 就选 credit,不可选则回落 original;优先级 ['credit'] 且债权不可选 credit 时,列表耗尽回落 original(original 对有效债权恒可用)。
destination_deadline_at 是动态值:等于 action_required_at + 当前配置时限,不是创建时固化。运营改时限会即时改变存量等待中债权的该字段;关闭开关则返回 null,且不再自动选定。destination_deadline_at 仅在 execution_status = awaiting_destination 且 action_required_at 非空时返回 ISO8601 字符串,其余情况(已选、已执行、关闭开关)一律 null。无需按字段是否存在推断债权状态。summary.destination_deadline_at 是所有等待中债权里最早的一个截止时间,用于展示「最近一笔即将自动选定」;逐条时间在 data[] 每笔债权的同名字段。destination_source = auto_default 表示到期自动选定,user 表示用户主动选择,preference 表示创建债权时应用了冻结偏好;如需区分展示读该字段即可,不要用它反推流程合法性。enabled = true、expire_hours = 168;命令上线后第一次执行会把所有等待超过 7 天的债权一次性自动选向(见上线部署步骤)。POST /api/commission_refunds/list
destination_deadline_at;summary 新增最早到期时间 destination_deadline_atPOST /api/commission_refunds/info
destination_deadline_atPOST /api/commission_refunds/select_destination
destination_deadline_at(选定后恒为 null);既有响应字段不变POST /api/commission_refunds/select_destinations
destination_deadline_at(同上);summary.destination_deadline_at 为剩余等待中债权的最早到期时间上述四个接口共用同一套债权 payload 投影,只列出一次示例标题(第 3 章),锚点相同即为设计意图。
自动选定命令本身无需新接口与 new seeder;
commission_refund.completed通知沿用既有场景与模板。
POST /api/commission_refunds/listsummary 新增只读字段 destination_deadline_at。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
work_task_id | integer | 是 | commission id,必须属于当前用户 |
page | integer | 否 | 页码,默认 1 |
size | integer | 否 | 每页条数,1~50,默认 15 |
完整字段以既有文档为准;此处只列本次相关字段。已选定/已执行的债权
destination_deadline_at为null。
无新增,沿用原有错误语义。POST /api/commission_refunds/info、POST /api/commission_refunds/select_destination、POST /api/commission_refunds/select_destinations 的请求参数、响应结构与错误码同样无新增,仅多出 destination_deadline_at 字段(select_* 选定后为 null)。
destination_deadline_at 取值口径| 场景 | 返回值 |
|---|---|
execution_status = awaiting_destination 且 action_required_at 非空,开关启用 | action_required_at + expire_hours 的 ISO8601 字符串 |
| 开关关闭 | null(该字段不展示,命令也停止自动选定) |
已选定 / 已执行 / 无 action_required_at | null |
补充口径:
summary.destination_deadline_at 取所有等待中债权里最早的一个截止时间;没有任何等待中债权时为 null。action_required_at 加时限推算(时限可能已被运营调整)。| 配置项 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|
enabled | true | 布尔 | 关闭后等待中的债权无限期等待,命令直接退出 |
expire_hours | 168(7 天) | 1~720 | 等待时限;改小会加速处理存量债权 |
destination_priority | ["original"] | 非空去重列表,∈ {original, credit} | 到期按顺序在债权可选去向内回落,列表耗尽回落 original |
SystemSetting,key 为 commission_refund.auto_destination;更新带 expected_version 乐观锁与 SystemSettingChangeLog 审计。/business-settings/refund-auto-destination),页内提示「修改配置即时影响存量等待中债权」。system-settings.refund-auto-destination、按钮 system-settings.refund-auto-destination.update(由前端菜单树自动生成,无需手动创建)。destination_source 来源标记新增列 commission_refunds.destination_source(可空字符串),区分去向决定来源;不改变任何接口契约,供排查与统计使用:
| 取值 | 含义 |
|---|---|
user | 用户主动选择(含退款池批量选择) |
preference | 创建债权时应用了冻结去向偏好 |
auto_default | 到期由命令自动选定 |
null | 仍在等待选择去向(存量数据可能为 null) |
destination_deadline_at 为新增字段,前端忽略即可;不读取该字段时行为与现状一致。enabled = true, expire_hours = 168, destination_priority = ["original"],等价于「七天后自动原路退回」;即使后台配置页尚未上线,命令上线即安全。commission_refund.completed。selectDestination 的行锁与状态校验,与用户手动选择的并发由既有机制互斥;命令对状态冲突安静跳过,单条失败不阻断批次。destination_source 列 + 回填存量)。回填规则:cash_destination 非空时,preference_applied = true 填 preference,否则填 user;等待中的债权保持 null。上线前建议在 testing 库确认回填行数符合预期。enabled = true / expire_hours = 168 / destination_priority = ["original"]。commission-refund:auto-apply-destination,withoutOverlapping)。上线后第一次执行会把所有 action_required_at 超过 7 天的等待中债权一次性自动选向并进入执行。若希望先人工确认,可先通过 internal 更新接口把 enabled 置为 false,或按需把 expire_hours 调大,待确认后再开启/恢复。menu-permissions.ts → permissions.ts),无需创建;上线后需在角色管理里把新权限 system-settings.refund-auto-destination 与 system-settings.refund-auto-destination.update 勾选授予相应角色,否则角色看不到菜单/页面 403。后台入口:业务配置 → 退款去向自动选定。enabled 置为 false,命令立即停止自动选定(免回滚);如需彻底回滚,revert 对应提交即可,两个迁移可独立 down()(回填 down() 只清理由回填写入且 cash_destination 非空的行,不影响应用后续写入的标记)。