需求背景
09-23-net-paid-amount-fee-breakdown)。paid_amount 是终身累计支付事实、不随退款减少,发生退款后详情页展示的「已支付」会偏高;首版净额公式 paid − Σ已完成退款 在存在不可退支付手续费时仍会超过总稿酬(#191 实测 16746 > 15000),业务上不成立。net_paid_amount(仅实际口径)。本次不改 paid_amount 语义与所有消费方、不改退款链路、不新增迁移。WorkTask(委托);credit = 站内 Credit 钱包余额。更新记录
2026-09-22 首次发布:新增只读字段 net_paid_amount 与计算口径(开发阶段契约,后端未发版)。2026-09-23 修订:字段表去除 emoji 前缀(按在途同域迭代规则,展示形式调整,契约无变化)。2026-09-23 口径迭代:⚠️ net_paid_amount 定义修正为「合同覆盖金额」(working 态 min(retained, price)、取消态 max(0, retained − 不可退手续费));✨ 详情接口新增 projected_net_paid_amount / retained_amount / non_refundable_fee / uncovered_retained_amount / non_refundable_fee_issues;✨ 列表接口新增 net_paid_amount(仅实际口径)。依据:#191 净额 16746 超总稿酬 15000 的根因核验(差额 1746 = 平台留存 PayPal 手续费),见第 4 章。2026-09-23 账目异常修正:✨ 详情接口再新增 accounting_issues 字段;retained_amount 保留原始账目值(退款合计超过支付史的损坏数据下可为负,不再截零),仅 net_paid_amount 有展示下限 0——保证两条可证明关系在异常账目下仍成立,异常经 accounting_issues 报告。2026-09-23 事实修订:费用明细改为独立试算接口(《约稿画师端费用明细》方案 B),同步修正本文对详情内嵌 fee_breakdown 的过时引用;契约无变化。建议阅读顺序:第 1 章(一分钟上手)→ 第 2 章(接口变更总览)→ 第 3 章(接口示例)→ 第 4 章(字段口径与前端跟进清单)→ 第 5 章(兼容性)。遇到「这个数为什么和 paid_amount 不一样」先看第 1 章流程图与第 4 章口径表。
| 章 | 内容 | 什么时候看 |
|---|---|---|
| 1. 一分钟上手 | 口径模型图 + 取值来源 + 对接要点 | 刚拿到文档 |
| 2. 接口变更 | 四个接口与变更摘要 | 找接口 |
| 3. 接口示例 | 请求参数、响应示例与错误 | 对接具体接口 |
| 4. 字段补充说明 | 净额派生口径、两条可证明关系与前端跟进清单 | 查具体取值与展示 |
| 5. 兼容性说明 | 兼容项与发布协同 | 发布前确认 |
状态与口径:开发阶段契约、后端未发版;
net_paid_amount为行为变更(口径修正,数值可能与首版契约不同);无错误码与请求参数变化。 本次没有新增状态、枚举、错误码;paid_amount的语义与所有既有消费方完全不变。
working 态净额是合同覆盖金额,不是客户实际净支出:受
price约束,手续费留存与卡价差额不体现在该字段;要看客户实际留存读retained_amount。
只按退款债权债务轴(
obligation_status)纳入:fulfilled计入实际口径;open(含retryable_failed等全部执行中状态,债务仍存在)计入预计口径;voided两口径都剔除。退款作废时retained_amount会回弹,而受price约束的net_paid_amount不一定变化。
net_paid_amount 是只读派生字段,定义为「合同覆盖金额」:working 态 min(retained, price),全额支付且无退款时等于 price;存在不可退手续费留存时(如 #191)也不会超过总稿酬。要看客户实际留存读 retained_amount,两者不要混用。paid_amount 语义与取值完全不变:它仍是终身累计支付事实。退款上限、付全款门槛、取消/改价判定继续读 paid_amount。net_paid_amount:双口径(projected_net_paid_amount 等)只在详情接口返回;卡片展示直接读列表字段即可。obligation_status 参与——fulfilled 进实际口径、open(含全部执行中状态)进预计口径、voided 剔除;执行状态(retryable_failed 等)不改变纳入。0 而非 null:paid_amount 为空或 0 时净额相关字段恒为 0。non_refundable_fee_issues 非空时的提示义务:issues 非空表示存在订单缺少业务币种手续费事实,此时 non_refundable_fee 是部分和、取消态的 net_paid_amount 是上界估计;working 态不受影响。前端在取消态且 issues 非空时应提示「金额为估算」。accounting_issues 非空 = 账目异常:退款合计超过累计支付(损坏数据)时,retained_amount 保留原始负值、net_paid_amount 展示下限 0,同时返回 accounting_issues(code=refunds_exceed_paid_amount,scope 区分实际/预计口径)。前端收到该 issues 时应提示「账目异常,金额不可信」,不要按正常金额展示。POST /api/work_tasks/info
net_paid_amount 口径修正为合同覆盖金额;✨ 新增 projected_net_paid_amount / retained_amount / non_refundable_fee / uncovered_retained_amount / non_refundable_fee_issuesPOST /api/work_tasks/list
net_paid_amount(仅实际口径)POST /api/artist_center/work_tasks/info
net_paid_amount 口径修正为合同覆盖金额;✨ 新增四个派生字段与 issues(口径与用户侧完全一致)POST /api/artist_center/work_tasks/list
net_paid_amount(仅实际口径)四个接口共用同一套派生服务(
CommissionNetPaidAmountService),列表与详情的实际口径由同一批量原语计算,数值保证一致。费用明细走独立试算接口(POST /api/artist_center/work_tasks/fee_estimate),见独立文档《约稿画师端费用明细》。
POST /api/work_tasks/infonet_paid_amount 口径修正;✨ 新增净额派生字段组。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 是 | commission id(work_tasks.id),必须属于当前用户 |
上例是一笔「原价 10000、改价到 8000、差价 2000 已退款完成」的 working commission:
retained_amount= 10000 − 2000 = 8000,net_paid_amount= min(8000, 8000) = 8000。若存在不可退手续费留存(如 PayPal 手续费),retained_amount可能高于price,此时net_paid_amount仍受price约束,差额见uncovered_retained_amount。
无新增,沿用原有错误语义(如 404 Work task not found、422 id 校验失败)。
POST /api/work_tasks/listnet_paid_amount(实际口径)。沿用既有列表参数,无新增。
无新增,沿用原有错误语义。
POST /api/artist_center/work_tasks/infonet_paid_amount 口径修正;✨ 新增净额派生字段组,与用户侧口径完全一致;费用明细由独立试算接口供数(见《约稿画师端费用明细》)。| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | integer | 是 | commission id(work_tasks.id),必须属于当前画师 |
无新增,沿用原有错误语义(如 404 Work task not found、422 id 校验失败)。
POST /api/artist_center/work_tasks/listnet_paid_amount(实际口径)。沿用既有列表参数,无新增。
无新增,沿用原有错误语义。
三个事实量(读取时实时计算,不落库):
| 场景 | net_paid_amount(实际口径) |
|---|---|
| 从未支付 | 0 |
| 已支付、无退款(working) | 等于 min(paid_amount, price) |
| 改价/取消退款已完成(working) | 不超过当前 price(手续费留存与卡价差由 uncovered_retained_amount 体现) |
退款债权 open(含执行中各状态) | 实际口径不扣、projected_net_paid_amount 已扣 |
退款债权 voided | 两口径都不扣 |
| 已取消(全额退款) | 0(如 #241:retained 4599 − 手续费 4599) |
| 已取消(协商保留) | max(0, retained − 不可退手续费);该值 ≠ 画师实际结算额 |
| 关系 | 公式 | 说明 |
|---|---|---|
| 关系 1 | retained_amount − (retained_amount − Σ open 债权退款额) = projected | 实际与预计口径的差 = 未结退款 |
| 关系 2 | retained_amount − net_paid_amount = uncovered_retained_amount | 未计入合同覆盖额的留存余额 |
uncovered_retained_amount 的内部构成(手续费留存 / 零退款卡价差 / 未结退款)不做归因拆分;non_refundable_fee 作为独立事实字段呈现。实测观测:#191 uncovered 1746 恰为手续费;#173 uncovered 4200 含 open 退款 2226 与手续费 1974。
non_refundable_fee 为已知部分和(下界);net_paid_amount = max(0, retained − 部分手续费) 是上界估计,前端需提示「金额为估算」;min(retained, price) 不消费手续费)。accounting_issues 非空 = 退款合计超过支付史的损坏数据:retained_amount 保留原始负值(不截零,保证两条可证明关系成立),net_paid_amount / projected_net_paid_amount 展示下限 0;scope=actual / projected 分别对应实际与预计口径。| 约稿 | paid | retained | 不可退手续费 | price | net | uncovered |
|---|---|---|---|---|---|---|
| #191(多次改价+退款,working) | 62619 | 16746 | 1746 | 15000 | 15000 | 1746 |
| #241(全额退款取消) | 100000 | 4599 | 4599 | — | 0 | 4599 |
| #173(open 退款中,working) | 19200 | 19200 | 1974 | 15000 | 实际/预计均 15000 | 4200 |
以下为前端(pipipen-front,由前端负责人实施)需要跟随本次后端供数完成的改造项:
pages/a/[id]/commissions/info.vue 现用 workTaskInfo.paid_amount,改为 workTaskInfo.net_paid_amount(列表卡片同理改读列表新字段)。POST /api/artist_center/work_tasks/fee_estimate(入参 amount = net_paid_amount,见《约稿画师端费用明细》文档),不再由前端写死费率计算。0,直接展示,不要显示 --。price)次要小字对照。non_refundable_fee_issues 非空且约稿已取消时,「已支付金额」旁标注估算提示。net_paid_amount 为行为变更(后端未发版,无线上兼容负担):取值从「paid − 已完成退款」修正为「合同覆盖金额」,依赖该字段的展示口径以前端改绑后为准;paid_amount 及全部既有消费方零改动。net_paid_amount;请求参数、错误码零改动。