Files
docs/财务管理/海外仓费用统一接入财务评审方案.md
T
2026-09-21 13:22:46 +08:00

72 KiB
Raw Blame History

海外仓费用统一接入财务评审方案

文档状态:评审稿 V0.2(首轮评审修订,待继续评审)
编制日期:2026-09-21
适用范围:头程、柜级费用、海外仓作业费用及其进入 Finance 统一应收应付的链路
事实口径:当前代码静态盘点 + 既有财务跨服务契约;本稿不代表测试环境已经部署或通过真实 HTTP 验收

本轮仅修订方案,不表示新增能力已经实现。第三节记录当前事实;其余章节区分复用能力与目标改造。计费日期、收费单位、最低收费等业务口径仍为推荐值,第十四节集中列出待确认项。

V0.2 重点修正:区分漏生成、待审核和展示遗漏;纠正换标、拆柜、派送的接入判断;补齐资金账户关联、人工与自动收费去重、跨区变更结果闭环;重写仓租计量与算例;增加阶段 0,并将入仓、本土卡车、散板纳入覆盖清单。另补多海外仓报价的新增、复制、修改、生效、查看与试算流程(7.5—7.8)。

一、评审目标

本次不重建 Finance,也不让各业务模块直接生成账单或修改客户余额。目标是把分散在头程、柜子、海外仓、退货、仓租、销毁、滞留等环节的费用,先在业务域形成可追溯、可审核、可调整的费用事实,再统一进入 Finance 的应收应付费用池。

本次重点解决六个问题:

  1. 当前哪些费用已经进入 Finance,哪些只有字段或页面,哪些完全没有接入。
  2. “退货按票收费”中的一票如何定义,何时收费,如何避免分批收货导致重复收费。
  3. 仓租如何按仓库当地日期、库存批次和结算周期准确计费,而不是用当前库存倒推历史费用。
  4. 同一业务动作如何同时形成客户应收和供应商应付,并正确区分月结与已直付。
  5. 后续新增各种操作费时,如何只增加费用项目和计价规则,不再为每种费用重复建设一条财务链路。
  6. 一个或多个海外仓如何新增收费配置、区分销售价与成本价、调价生效、查看历史,并从实际费用反查所用报价。

二、先给结论

2.1 总体结论

Finance 现有统一费用来源、跨区域事件、费用池、对账单和应收应付结算能力可以继续复用。主要缺口在 Lastleg 的费用生产、计价、审核与业务页面聚合;Finance 仍需参与来源变更结果确认、资金账户关联扩展和必要的查询展示,不能把本次改造理解为只改海外业务服务。

建议采用以下唯一链路:

业务动作/库存事实
  -> Lastleg 海外仓计费中心
  -> 匹配客户销售价或供应商成本价
  -> 生成不可变费用来源版本
  -> 海外 Outbox / Event Bridge
  -> Finance 校验并保存来源,返回接受或拒绝结果(结果回传为本次新增目标)
  -> 未结算应收进入客户对账 / 已由资金账户结算的应收关联结清
     / 月结应付进入供应商结算 / 直接已付仅记录成本

核心原则:

  • 业务服务只生产费用事实;Finance 负责财务归集、出账、收付款和核销。
  • 同一业务动作的客户应收与供应商应付是两条独立费用来源,不能用一条记录同时表达收入和成本。
  • 已发布费用不原地改金额;调整形成新版本,作废形成可审计的变更请求。Finance 接受前不覆盖双方最后一致的有效版本;已冻结费用由财务单据调整处理,不能直接发送负数来源充当冲销。
  • Finance 不维护仓租算法和海外仓报价;Finance 只消费业务域已经确认的数量、单价、期间、币种和金额快照。
  • 新仓内费用优先复用 OVERSEAS_WAREHOUSE_FEE 来源类型,通过稳定的 businessType + feeItemCode 区分业务。既有采购、换标、派送等来源类型和资金关联按真实业务保留,不为统一展示强行改名或重复生成一套来源。

2.2 应收应付进入 Finance 后的口径

费用方向 结算方式 Finance 去向 说明
RECEIVABLE 对账收款 AVAILABLE 客户费用池 -> 对账单 -> 应收结算 尚未由资金账户结算的客户费用
RECEIVABLE 资金账户结算 关联资金结算记录并标记 SETTLED 采购、换标已有该分支,不再进入对账候选;关联中的费用按第九节阻止重复出账
PAYABLE ON_ACCOUNT 供应商应付来源 -> 应付结算单 尚未付款、后续与供应商结算
PAYABLE DIRECT_PAID 已确认成本 业务侧已经支付,只记成本,不再形成待付应付

表中应收“对账收款/资金账户结算”是业务收款路径,不复用应付的 settlementMode 字段。资金账户金额和流水仍由 Finance 负责,Lastleg 只发送受控资金指令。

三、当前接入盘点

3.1 已有费用生产或发布基础

“存在来源记录/事件”不等于所有业务分支、应收应付、调整和页面均已闭环。头程与国内柜费沿用既有契约,本轮重点核验海外链路。

业务范围 触发与来源 应收/应付现状 审核与调整现状 展示及本轮处理
头程 FBA/入库运费 已确认计费形成来源 自动客户应收 沿用现有审核发布链路 保持现有链路,受影响时回归
头程人工费用 人工费用审核发布 支持应收、应付 有审核、调整和作废能力 保持现有链路
国内柜级公共费用 按真实客户和业务订单分摊后发布 客户分摊与供应商应付独立 按现有整组处理契约 保持分摊守恒,不把客户分摊当作供应商应付
国内拖车预约费 按实际体积形成成本分摊 供应商成本链路已具备 沿用现有契约 保持现有链路
海外接柜相关费用 柜级页面人工维护港杂、仓储、维修、吊机、码头拖车等 已有通用应收/应付来源能力 柜级页面已有创建、提交、审核、调整和作废 补报价与标准项目映射,不能归为“海外全无审核入口”
海外拆柜打托费 全柜 PDA 入仓完成后,按实物托盘单价合计并按客户实收 CBM 分摊 自动生成 RECEIVABLE;未自动生成供应商应付 自动发布;DESTUFF_PALLET 项目及业务身份与通用调整校验不一致 阶段 0 修调整链路;后续独立补供应商成本
海外采购费用 人工维护费用;满足资金冻结和采购入库数量条件后发布 当前自动来源为客户应收,关联资金账户结算;缺自动供应商成本 存在自动发布链路 保留资金关联;补供应商、成本定价与结算方式
海外派送费用 转派送请求人工传入 fees,转单时发布 可传应收或应付;同请求不能提交同一费用项目的两个方向 当前人工金额也自动审核;去重键仅含费用类型 补方向/交易对手维度,按人工审核目标收敛;不视为报价自动计费已完成
海外换标费用 changeStatus(COMPLETED) 分支发布应收并发送资金结算指令 有应收生产者;纯 SKU 等无需出库分支客户确认后直接完成,未走发布/结算分支 存在漏发路径,不能整体标记完成 阶段 0 统一所有合法完成分支的费用与资金结算触发

3.2 已有基础,但尚未形成完整闭环

业务范围 当前事实 主要断点
尾程订单人工费用 页面创建后调用提交,形成 PENDING;应付页面当前仅提交 ON_ACCOUNT 缺待审页面和来源跳转;后端还缺草稿/驳回内容修改接口,直付证据未在该页面接通
海外入仓费 Lastleg 通用创建、审核、发布及真实入仓业务归属校验已具备 未找到对应业务自动生产者和专用页面闭环,不是只有 Finance 枚举预留
海外本土卡车费 Lastleg 通用来源接口及真实卡车业务归属校验已具备 缺业务自动触发、计价与页面闭环
海外散板费 Lastleg 通用来源接口及真实散板业务归属校验已具备 缺业务自动触发、计价与页面闭环
海外仓服务费 已有 OVERSEAS_WAREHOUSE_FEE 和 WAREHOUSE_SERVICE 通用入口 主要依赖人工录入,尚无统一业务触发、计价和自动发布能力
海外仓报价 已有仓库、服务商名称、币种、生效区间、版本、计费单位、单价和最低收费 服务商名称并非供应商主档 ID;项目和单位为自由文本,缺价格角色与计价消费者

3.3 当前未接入的重点费用

费用 已有业务事实 当前缺口
退货按票处理费 退货单、分批收货、收货批次均已存在 没有按退货单去重的费用来源
退货收货操作费 每次 PDA 确认形成技术签收批次,当前限定单 SKU 并生成签收箱 技术批次不等于一次物流到货;需先冻结按件/包裹/到货批次的业务口径
退货仓租 完成收货时已经记录 storageStartedAt 和 PENDING_PRICING 没有价格匹配、日库存计量、账期切分和费用发布消费者
普通库存仓租 有库存和出入库业务 缺统一计费批次、每日数量事实和最后计费截止日
销毁费 已保存包裹数、每包单价、总金额和 USD 币种;已有 PDA 作业后正式 complete 节点 完成节点未发布 Finance 费用;现有金额来自配置,尚未统一报价
滞留/扣留费 订单有收费标记、原因及暂扣/解除历史时间 缺稳定的暂扣期间对象、收费数量、价格和费用来源;不得用解除后的当前标记倒推是否收费
入库、出库、换箱、托盘、转仓、异常处理等 页面已有部分人工费用项目 仍是分散人工录入,未统一接入价格规则和业务动作

3.4 “费用为空”的诊断口径与证据

断点 当前证据 应采取的处理
未生产 业务完成后没有费用事实,例如退货处理/仓租/销毁,以及换标漏发分支 补生产者或修完成触发,不能用手工补录掩盖漏发
未审核发布 尾程人工费用只调用 create + submit 在海外费用中心完成审核、驳回修改和发布
页面未聚合 尾程详情只查 LASTLEG_ORDER + orderId 按稳定业务关联汇总其他来源,不能凭页面空认定未入池
Finance 未接受或无需待出账 发布失败、被拒绝,或已由资金账户结清/供应商已直付 展示接收结果及结算状态,不能重复生成一笔待收待付

本次证据为源代码及既有契约,详见附录 A;不以历史 P0/P1 的验收报告证明新增计价和所有完成分支已经通过。本方案范围完成后须补第十三节的直接证据。

四、统一费用分类

4.1 来源类型、业务类型和费用项目分层

三者职责必须分开:

层级 示例 用途
sourceType OVERSEAS_WAREHOUSE_FEE Finance 归集大类,保持稳定
businessType RETURN_ORDER、RETURN_RECEIPT_BATCH、STORAGE_LOT、CARGO_DISCARD 说明费用由哪个业务对象产生
feeItemCode RETURN_HANDLING、STORAGE_FEE、DISCARD_FEE 说明具体收的是什么费用

不建议用“其他”长期承接可识别费用。OTHER_MANUAL 只用于低频、暂未标准化的人工费用,必须填写原因并人工审核。

4.2 首批标准费用项目

费用编码 中文名称 推荐计费对象 常见计费单位 默认触发点
RETURN_HANDLING 退货按票处理费 退货单 TICKET 首个有效收货批次完成
RETURN_RECEIPT_OPERATION 退货收货操作费 实收事实 首期推荐 ITEM;PACKAGE/BATCH 需先有对应真实事实 每次有效签收,按实收增量计费
REPACK_FEE 重新打包费 作业单/包裹 PACKAGE、ITEM 重新打包完成
REBOX_FEE 换箱费 作业单/箱 BOX 换箱完成
RELABEL_SERVICE 换标费(沿用现有编码) 换标单/件/箱 ITEM、BOX,由作业与报价明确 所有合法换标完成分支汇合;禁止再次按新编码收费
STORAGE_FEE 仓租 库存计费批次 PACKAGE_DAY、PALLET_DAY、CBM_DAY 日结/月结或库存清零
INBOUND_OPERATION 入库操作费 入库单/收货批次 TICKET、PALLET、CBM 入库完成
OUTBOUND_OPERATION 出库操作费 出库单 TICKET、PACKAGE、PALLET 出库完成
DESTUFF_PALLET 拆柜打托费(沿用现有编码) 拆柜与客户分摊 现有按实收 CBM 分摊 全柜入仓完成
PALLET_FEE 独立托盘作业费 独立托盘作业 PALLET 作业完成;不得对已包含于拆柜打托的同一服务重复收费
TRANSFER_FEE 转仓费 转仓单 TICKET、PALLET、CBM 转仓完成
DISCARD_FEE 销毁费 销毁申请 当前按申请实物包裹数;扩展 ITEM 需事实支持 PDA 作业后正式 complete 确认完成
HOLD_FEE 滞留处理费 滞留期间 TICKET、DAY 解除滞留或周期结算
EXCEPTION_FEE 异常处理费 异常单 TICKET、HOUR 异常处理完成
OTHER_MANUAL 其他人工费用 明确业务对象 由录入人选择 人工提交并审核通过

费用编码是稳定契约。中文名称、外文名称和页面展示可以调整,但编码一旦产生财务来源不得复用为另一种业务含义。

现有人工项目与自动项目必须建立一份唯一目标映射。同一收费含义使用同一目标编码和收费身份;不同服务只有在合同明确可分别收费时才保留不同项目。实现时直接同步源码、调用端、报价、初始化 SQL 和测试,不维护旧编码别名、双发来源或开发存量迁移。

4.3 同一收费事项的唯一身份

目标收费身份至少包含:客户、业务事实类型与 ID、事实明细/作业轮次、费用项目、价格角色,以及成本侧实际供应商;周期费用另含已占用的计费日期范围。报价版本、操作人和请求幂等键不是收费身份,换人补录或换报价不能生成第二笔正常收费。

  • 自动任务与人工补录共用收费身份和数据库唯一约束。人工补录必须选择真实业务事实;已有自动费时进入该费的调整流程。
  • 客户应收与供应商应付身份独立;同一服务涉及多个真实供应商时按实际成本责任拆分,不能由缺失报价自动猜测供应商。
  • 业务事件重放、人工与自动并发、报价补齐后重试均返回同一计费结果。需要补差时记录原来源和调整原因,不使用新业务键规避冻结。
  • 仓租不能只依赖“起止日期完全相同”的键;不同范围的重叠期间也须在锁定计费对象后拒绝,见第六节。

五、退货按票收费设计

5.1 “一票”的推荐定义

推荐将“一票”定义为一个退货单 returnNo,不是一次 PDA 收货批次。

原因:一个退货单允许分批到仓。如果按收货批次收取按票费,同一退货单分三次收货会被收三次;这通常与客户理解的“一票退货”不一致。确实需要按每次收货收费时,应使用 RETURN_RECEIPT_OPERATION,不能复用 RETURN_HANDLING。

5.2 推荐触发与去重

  • 触发:退货单的首个有效收货批次完成时生成一次 RETURN_HANDLING。
  • 数量:1。
  • 单位:TICKET。
  • 业务对象:RETURN_ORDER + returnOrderId + returnNo。
  • 幂等业务键:RETURN_ORDER:{returnOrderId}:RETURN_HANDLING:{priceRole}。
  • 后续分批收货:不重复生成按票处理费;阶段 1 推荐按实收件数生成操作费,包裹/到货批次收费按 5.4 定义后启用。
  • 未发生任何收货即取消:不收费。
  • 已收货后退货单作废:不直接删除已发布费用;未冻结时申请作废并等待 Finance 接受,已冻结时进入待财务处理,不自动生成冲销版本。

priceRole 用于区分 CUSTOMER_SALE 和 SUPPLIER_COST。以上为对客简式;成本身份必须再包含实际供应商,完整约束按 4.3 执行。首个有效收货以服务端事务内的实收事实判断,不以事件到达顺序决定。

5.3 金额形成

退货单首个收货批次完成
  -> 按客户 + 海外仓 + 业务日期匹配客户销售价
  -> 生成 RECEIVABLE / RETURN_HANDLING
  -> 按服务商 + 海外仓 + 业务日期匹配供应商成本价(如配置)
  -> 生成 PAYABLE / RETURN_HANDLING

没有匹配到价格时不得默认为 0 元并自动发布,应进入“待定价”队列。允许有业务但不收费时,必须命中一条明确的零价规则并记录规则版本。

5.4 签收技术批次与收货收费单位

当前 ReturnReceiptBatch 随每次 PDA 确认生成,并限定单 SKU、生成一个签收箱;它是库存追溯起点,不自动等于快递包裹、一次运输到货或一次预约到货。

阶段 1 推荐按实收 ITEM 数量增量计收操作费,技术签收批次只承担事实去重。例:同一退货单 30 件,分 3 次每次 10 件签收,按票费为 1 票,操作费合计为 30 件;操作员拆分确认次数不改变金额。最低收费若存在,推荐在该退货单操作费范围汇总一次,不能每按一次确认就收一次最低收费。

若合同按 PACKAGE 收费,先明确其含义是入仓包裹还是签收后新箱,并建立真实标识及防重复计数;若按到货 BATCH 收费,先补业务到货批次对象及其与技术签收的关系。两者未经确认不以技术批次数量替代。多个分批收货操作费的合计应与业务单位守恒。

六、仓租设计

6.1 为什么不能直接用当前库存乘天数

当前库存只代表此刻数量,无法证明过去每天存了多少。如果发生部分出库、拆包、合箱、转仓或库存调整,用当前数量倒推历史仓租会多收或少收,并且无法审计。

仓租必须以“库存计费批次 + 每日数量事实 + 已计费期间”计算。

6.2 计费批次

每一批可独立追踪实收时间和数量的库存形成一个原始计费分量 storageLot:

  • 退货:从 ReturnReceiptBatch 和实收明细建立原始分量;批次数不决定最低收费次数。
  • 普通入库:按真实收货明细建立原始分量,不能只引用汇总库存余额。
  • 转仓:记录来源与目标仓的数量转移,结束原仓物理占用并开始目标仓物理占用;原始库龄和免租期不自动重置。仓租归属按 6.5 处理。
  • 合箱/拆箱、合托/拆托:保存“原始分量—实际箱/托盘—数量/份额—生效时间”的关系,不能只拼接来源批次号。一次出库必须能扣减对应原始分量,不用 FIFO 猜测来源。

每个原始分量至少保存:客户、真实仓库、业务编号、实收 UTC 时间、仓库 IANA 时区、当地收货日期、数量及单位、原始库龄起点、免费截止日、物理占用区间和来源关系。日计费事实另保存当天数量、报价版本、免费/收费依据及金额;计费期间保存计算版本、已发布/已接受金额和截止日,不能只依靠一个最后计费日期恢复所有状态。

包裹数、托盘数、体积必须来自对应业务事实;缺少测量、仓位份额或历史来源时进入异常,不用默认体积、整托数量或当前库存倒推。

6.3 推荐日计费口径

以下为一套相互一致的推荐值,仍待第十四节确认;不再同时采用“同日进出收一天”和“只取日终库存”。

  1. 按仓库当地自然日计费,每日区间为当地 [00:00, 次日00:00);实际事件保存 UTC 时间和时区。夏令时产生的 23/25 小时仍为一个自然日。
  2. 对每个不追加实收的原始分量,收货日使用实际入仓数量,后续日使用日初仍在库数量。当日出库数量当日仍计,次日减少;同日入库出库计一天,但免租优先。日界线整点出库仅归结束前的占用日。同仓移库、换托和重复事件不新增实收量。
  3. 收货当地日期为库龄第 1 天,freeDays=N 表示前 N 个自然日免费。首次匹配收货日适用规则时冻结免费天数/截止日,后续报价改价不自动改变既有免租资格。库龄按自然日连续计算,包装转换不重置;转仓途中整日无仓储占用时不收仓租。
  4. 每日先按原始分量的库龄、数量与适用报价计算高精度金额,再按自然月归集;数量/库龄阶梯须明确逐段累进或整量套档,未确认的规则不可启用。
  5. 最低收费推荐按“客户 + 仓库 + 费用项目 + 价格角色 + 原币 + 自然月”汇总一次,成本侧另分供应商。最低收费与按批次的库龄阶梯是不同维度;同组命中互相矛盾的最低收费规则进入异常。
日基础费 = Σ(非免租且有实际计费占用的分量数量 × 对应日单价)
月累计目标金额 = 0                          (无正价应收费事实,或整组明确免收)
             = max(月最低收费, Σ日基础费)   (存在正价应收费事实)
本次待处理差额 = 月累计目标金额 - 本组已经生效的累计净额

最低收费不能由零库存、全免租或明确零价事实触发。清零结算、补结算、月末结算及同月再次入仓共用同一累计范围,不重复收最低费。正差额形成有关联明细的增量来源;零差额不发来源;负差额或历史纠错进入第九节的调整流程,不直接发布负数,也不能忽略差额。

阶段 2 同时支持 PACKAGE_DAY、PALLET_DAY、CBM_DAY;若业务选择按件天,还须明确增加 ITEM_DAY。报价单位与事实单位不匹配时停止计算,禁止自动换算。计量分量可按日追溯,Finance 接收按计费组/期间汇总的来源及其明细关联,不能把每个分量都重复套一次月最低费。

内部期间统一使用半开区间 [periodStart, periodEnd),跨月强制拆分;用户显示的截止日为 periodEnd 前一日。仅以起止日期组成幂等键不足以防止重叠:必须锁定计费组与原始分量日期占用,保证同一日期/分量/项目/价格角色只计入一次正常费用;调整引用原明细,不新占一份日期。

试算结果保存稳定计算 ID、日期明细与输入快照;发布关联同一计算 ID,重跑返回已有结果。每个计费组至多有一个待 Finance 确认的增量或调整;未收到结果时不再次按同一累计差额收费。业务已计算、来源已发布与 Finance 已接受的截止日分开记录。

6.4 仓租状态

当前退货收货批次已经写入 PENDING_PRICING 和 storageStartedAt,建议扩展为统一状态:

状态 含义 允许动作
PENDING_PRICING 尚未匹配有效价格 补报价、重新试算
READY 价格和计费单位已确认 等待日结/月结
BILLING 当前账期正在计算 防止重复任务并发
BILLED 已生成至少一个期间的计费结果 继续下一期间;独立展示 Finance 接受状态
CLOSED 库存清零,全部尾期费用已被 Finance 接受或形成免收事实 停止新增占用计费;历史调整仍走独立流程
EXCEPTION 数量、价格或期间异常 人工修复后重试

状态只描述仓租计费进度,不能替代 Finance 的审核、出账和结算状态。

6.5 转仓与包装转换的归属

  • 同一时区、同一当地日期离仓并到达目标仓,推荐当天仓租归当天首个实际存放仓,目标仓次日开始计费;同日多次转仓仍只归一个仓。跨日运输时原仓计至离仓日,途中整日不计,目标仓从实际到仓日计费。例如 9 月 1 日离 A、9 月 3 日到 B,A 计至 1 日、2 日不计、B 从 3 日计。目标仓保留真实物理到仓时间,不能为了收费归属修改库存事实。
  • 跨时区转仓的自然日不可直接对齐。启用前须确认统一结算时区和归属规则;规则缺失时相关期间转人工计费异常,不自动双收,不阻断真实库存转移。
  • 合拆箱/托盘推荐转换次日起按新单位计量,操作当天只计转换前单位。同日多次转换按已冻结日初/实收单位和次日最终包装事实计量,不能累加每次中间包装。
  • 多批次合成一箱/一托,按已确认的实际件数或体积分摊份额,合计必须等于真实箱/托数量;各份额继续使用原始库龄与免费期。禁止每个来源批次都收一个整箱/整托。不同计价单位的份额依据不能混用,无法还原来源时停止自动发布。
  • 库存盘点或迟到事实影响已计费日期时,保留旧日事实及纠正版本,进入受控重算/调整,不悄悄改历史快照或只修改当前余额。

6.6 评审算例(推荐口径,未代表已实现)

金额均使用原币,除注明外无最低收费;仅当报价支持对应单位时适用。

场景 输入 应得到的结果
同日入出 9 月 10 日 10:00 入 10 包,18:00 全出,0.2/包天,免租 0 天 收 2;若免租 1 天则收 0,不触发最低收费
免租、部分出库、跨月 9 月 28 日入 100 包,免租 2 天;9 月 30 日出 40 包,10 月 2 日出余下 60 包;0.1/包天,每月最低 15,同组无其他库存 9 月 28—29 日免费,30 日基础费 10,9 月收 15;10 月 1—2 日每天 6,10 月收 15;清零后月末重跑新增 0
全免租期间 一批全部在免租期内出库,月最低 15 基础费与应收费事实均为 0,最终收 0
同日转仓 已过免租的 10 包从 A 转 B,同一时区;A 为 0.2/包天,B 为 0.3/包天 转仓日 A 收 2、B 收 0;次日仍在 B 则 B 收 3,库龄不重置
不同库龄合箱 A 批 4 件已过免租、B 批 6 件免费至 9 月 3 日,原各一箱,9 月 2 日合一箱;0.5/箱天,按件数分箱份额 9 月 2 日 A 收 0.5、B 免费;3 日 A 占 0.4 箱收 0.2、B 免费;4 日全箱合计收 0.5

最低收费补结算例:同组当月基础费先为 10、最低 15,清零时已收 15;同月再次入仓使累计基础费到 18,只新增 3。技术批次拆成几次、任务执行几次均不改变月累计 18。

七、报价与计价规则

7.1 在现有海外报价上直接收敛

现有海外报价已具备仓库、服务商名称、币种、生效起止日、版本、状态、计费单位、单价和最低收费。服务商当前是名称文本,尚不是可用于供应商应付的主档引用。直接将这套报价升级为结构化规则并接业务消费者,不另建平行报价。

建议至少增加以下能力:

字段/能力 说明
feeItemCode 稳定费用项目编码,替代仅靠自由文本匹配
priceRole CUSTOMER_SALE 或 SUPPLIER_COST
customerId 客户销售价可限定客户;空值可作为仓库公共价
supplierId 成本价必须关联有效供应商主档及名称/分类快照,不能把 providerName 文本当作供应商身份
billingMode 固定按业务、按数量、按期间数量
billingUnit 票、批次、包裹、件、托盘、立方、公斤及其天数组合
freeDays 仓租免费天数
minimumCharge / 作用范围 明确按业务单据还是客户仓库月度汇总;技术批次/执行任务不是最低收费单位
阶梯规则 明确按数量或存储天数、逐段累进或整量套档,以及取单批次还是同仓汇总
autoApproval 是否允许确定性计算后自动审核发布
生效版本 费用来源必须保存命中的报价版本和规则快照

7.2 价格匹配优先级

建议客户应收价格按以下顺序匹配:

  1. 客户 + 海外仓 + 费用项目 + 业务日期;
  2. 海外仓公共销售价 + 费用项目 + 业务日期;
  3. 未命中则进入待定价,不自动发布。

供应商成本价格按以下步骤匹配:

  1. 从真实作业委托/成本责任确定供应商;仓库默认服务商仅在确实承担该业务时作为实际供应商,不因缺价更换交易对手。
  2. 按该供应商 + 海外仓 + 费用项目 + 业务日期匹配成本价;首期不再增加客户专属成本价层级。
  3. 无供应商成本责任的业务不生成成本;已有成本责任但缺价时进入成本待定价,不能改取另一供应商的报价或静默省略。

同一优先级出现两条同时生效的规则必须报冲突,不允许随机取一条。

供应商应从真实作业委托/成本责任中确定,“默认服务商”必须有明确有效主档配置;没有成本责任与“成本应计但缺报价”分别展示,不能都静默省略。直付还需真实支付日期、方式、流水和凭证;仅填写 DIRECT_PAID 不构成已支付事实。

7.3 业务日期、币种、汇率与舍入

当前来源支持 CNY、USD 原币,结算币固定 CNY;USD 必须命中业务日期所在月份的有效 USD/CNY 汇率。此能力可以复用,但以下计费口径需要明确实施:

  • 离散费用冻结真实收费触发的当地业务日期;仓租先按当地自然月拆分,推荐每个期间以最后一个实际收费日作为业务日期,汇率月份始终属于该计费月。
  • 补报价、补结算和任务重跑不改变业务日期及汇率归属月份。缺报价、缺汇率分别进入可见队列,不用执行日期、汇率 1 或零金额兜底。
  • 日金额先保留计算精度,按收费组/期间汇总,将原币金额四舍五入至 2 位、乘以冻结的 6 位汇率、将 CNY 四舍五入至 2 位。离散单笔可复用现有转换;仓租月内多次结算必须按下述双币累计差额扩展转换契约,不能把每个原币增量独立折汇后相加。
  • 记录报价版本、原币单价、数量/份额、原币金额、汇率值及月份、结算金额与计算规则快照。已形成版本重放使用原快照,不随新报价或新汇率重算历史版本。
  • 报价中途生效如何影响存量仓租需确认:推荐未计费日单价按当天有效报价冻结,原始免租天数/截止日保持不变;免租资格变更须单独受控审核,不由新报价静默重置。若合同锁定入仓价,则显式配置,不混用两种规则。

同一月计费组首次形成收费结果时冻结该月统一汇率快照;后续结算分别计算月累计原币目标与月累计 CNY 目标,再分别减去 Finance 已接受的双币累计净额,得到本次双币增量。待确认候选不计入已接受净额,但占用该组唯一待确认名额。

例:同组 USD 累计先 0.01、后 0.02,汇率 7.500000。首次 CNY 目标为 0.08;第二次累计 CNY 目标为 0.15,因此第二笔原币增量 0.01、CNY 增量 0.07,最终累计为 0.02/0.15,而非 0.02/0.16。增量来源保存累计计算关联和折算尾差,Finance/展示/导出校验相同口径,不能用单笔增量乘汇率把尾差“修正”掉。这是阶段 2 新增能力,当前转换服务不直接具备。

本次差额为零则不发来源;双币差额不能同时满足正金额契约时进入精度/调整异常,不伪造原币金额或放宽为零/负数来源。冻结月汇率若需纠错,走受控调整,不在后续补结算中混入新汇率。

7.4 零价和免收事实

Finance 当前要求原币金额与 CNY 结算金额均大于 0。明确零价或全免租应在 Lastleg 保存“已免收”事实、规则版本、数量、期间和原因,不生成 Finance 应收应付来源;免收事实也占用收费身份,重试和人工录入不能再重复收费。

缺报价不是免收。正数费用因舍入变成零时也不能标成命中零价:先按规定范围汇总,仍无法形成正金额时进入精度异常,处理口径另行确认。免收后改为收费须经过带原因的受控审核,不能因报价更新自动补收。

7.5 配置入口与多仓组织

当前正式入口为“通用 → 海外仓报价”,路由 /overseas-master-data/quotes。已支持报价列表、仓库筛选、新增、详情、编辑、启停和 CSV 导出;一个报价头绑定一个仓库。现状只有报价资料维护,尚不能等同于自动计费已经使用这些价格。

本次沿用该入口,目标组织方式为:

标准费用项目(平台统一定义收费含义)
  -> 选择实际海外仓
     -> 客户销售价:本仓公共价 / 本仓客户专属价
     -> 供应商成本价:本仓实际供应商
        -> 报价版本、生效期间、币种
           -> 各费用项目的单位、单价、免租、最低收费和阶梯规则

费用项目与仓库报价分开维护:“退货按票费”“仓租”只定义一次收费含义,A 仓、B 仓各自填写价格,不为每个仓复制新的费用编码。一个仓可同时拥有多家客户专属价和多家实际供应商成本价;客户销售价不要求虚填供应商,供应商成本价必须绑定真实供应商。

仓库必须引用国内仓库主档的实际作业仓 ID。当前报价候选来自“海外合作仓”接口,不能假定已覆盖所有实际海外作业仓;本次需统一报价候选与业务冻结的真实仓 ID,纳入需要计费的自营/合作海外仓,并校验启用状态及适用业务能力。FBA 目的仓、仓库名称文本、国内来源仓均不能替代实际作业仓。已停用仓仍允许查历史报价,不允许新启用报价。

示例配置(示例价格) 仓库 适用对象 费用项目 单价 匹配结果
A 仓公共销售价 A 仓 无专属价的客户 退货按票费 USD 5/票 A 仓普通客户命中
A 仓客户甲专属价 A 仓 客户甲 退货按票费 USD 4/票 客户甲在 A 仓优先命中
B 仓公共销售价 B 仓 无专属价的客户 退货按票费 USD 7/票 客户甲在 B 仓也只查 B 仓规则,不套 A 仓专属价
A 仓供应商乙成本价 A 仓 实际受托供应商乙 退货按票费 USD 2/票 另生成供应商应付,不改变客户销售价

7.6 怎么新增、给多个仓配置

  1. 在报价列表选仓库,点击“新增报价”;未筛选仓库时,表单必须先选择一个真实海外仓。
  2. 选择“客户销售价”或“供应商成本价”。销售价再选“本仓公共价”或具体客户;成本价选择真实供应商,首期按供应商和本仓维护,不另加客户专属成本价。
  3. 填写报价名称/业务编号、币种、生效起止日;仓库时区随主档展示。日期口径统一为当地开始日含、截止日含,后端转换为半开区间,空截止表示持续有效。
  4. 从标准项目中添加收费行,填写计费单位、单价及必要的免租、最低收费/范围、阶梯和自动审核配置。明确不收费时选择“免收”并写原因;空白项目表示未配置,不能自动视为 0 元。
  5. 保存草稿,可预览金额与使用样例;执行“校验并生效”时展示覆盖对象、日期、被替代项目与冲突。校验同仓、同价格角色、同客户/供应商范围、同项目和计费条件的生效区间,禁止同优先级重叠。

多仓可逐仓新增,也可“复制为其他仓草稿”:选择一个源版本和一个或多个目标仓,逐仓生成独立草稿。复制收费项目及规则供核对,不复制启用状态、历史引用和费用;客户/供应商归属、币种、时区和适用日期均需在目标仓确认。目标仓已有报价时不覆盖,逐仓返回冲突或草稿创建结果;每个草稿可单独修改和生效。修改 A 仓的报价不会联动修改 B 仓。

新增标准费用项目应从统一费用项目维护入口完成,并定义收费对象、支持单位和业务触发。报价表里不能通过随意输入文字绕过项目定义;若当前业务尚无事实生产者,页面明确标注“已配置价格,业务计费尚未接入”,不能承诺立即自动收费。

7.7 怎么修改、停用和查看版本

当前报价启用时禁止编辑,但停用后可原地修改明细;计价接入后必须收敛为以下规则,不能继续停用、改旧版、再启用来改写历史价格。

对象 允许操作 对费用的影响
从未生效且未被引用的草稿 编辑、保存或删除草稿 不影响业务费用
已安排生效但尚未生效且未被引用的版本 取消计划后修改草稿,重新校验并安排 不可与其他同优先级报价重叠
已生效、已过期或已被费用引用的版本 查看;“基于此版本调价”生成新版本 历史报价与已形成费用快照保持可追溯
新版本生效 预览后原子切换新旧有效区间 生效后的新事实按匹配规则取价;存量仓租按 R18 的已确认规则执行
停用/结束报价 填终止时间与原因,显示影响项目及后续可用报价 不修改已有费用;后续无可用报价进入待定价

生效版本内容不可原地改写;报价启停/替代保存独立时间记录,旧费用仍按冻结版本及有效区间追溯。变更客户、供应商或仓库属于新建对应范围的报价,不把已生效报价移到另一个仓。

客户专属价未覆盖的项目按 7.2 逐项目查询本仓公共价;明确免收的专属规则已经命中,不再取公共价。停用专属价可能改为命中公共价,操作前必须展示影响;用户若希望停止收费,应配置明确免收,若希望阻止自动收费,应将该业务收费设为待人工定价,不能靠删掉专属价表达。

7.8 怎么查看和验证配置

  • **全部仓库看覆盖:**列表支持仓库、销售/成本、客户、供应商、费用项目、币种、有效日期和状态筛选;显示已配置、未配置、即将到期、冲突的项目数量。只维护报价记录的现有列表不等于已具备这些覆盖指标。
  • **单仓看明细:**查看公共销售价、客户专属价、供应商成本价;每行显示项目、单位、单价、免费期、最低收费范围、生效区间和版本,操作列放第一列。
  • **单项看历史:**按仓库、价格角色、适用对象和费用项目查看历次版本、修改原因、生效时间和引用费用;显示当前、将来和历史版本,不以“停用”隐藏历史。
  • **按业务试算:**输入真实仓库、客户、项目、业务日期、数量或仓租期间;成本另选实际供应商。返回命中范围/版本、数量依据、免租、最低费、原币与汇率计算;未命中说明缺哪个条件。试算不生成费用,也不能绕过正式业务事实创建应收。
  • **从费用反查:**费用详情显示使用的仓库、项目、报价版本和计量依据,点击可看当时价格快照;当前最新价另行展示,避免用新价解释旧费用。

报价查看、维护草稿、安排/启用/停用价格、删除未使用草稿的权限应分别落实;实际费用审核仍是独立权限。仓库配置权不自动授予查看全部客户或供应商成本的权限,数据范围由服务端控制。

八、统一计费中心职责

建议在 Lastleg 内收敛 WarehouseChargeService 和 StorageBillingService 两类职责,具体类名可在实现阶段确定。

8.1 WarehouseChargeService

  • 接收退货、入库、出库、换标、换箱、托盘、转仓、销毁、滞留和异常处理等已完成业务事实;
  • 按业务日期匹配客户销售价和供应商成本价;
  • 计算数量、单价、最低收费和金额;
  • 生成待定价、待审核或已审核费用;
  • 调用现有海外费用来源服务生成不可变版本和 Outbox;
  • 保证同一业务动作重放不重复收费。

业务完成与计费事实/待处理任务必须在 Lastleg 本地事务内可靠落地。缺报价、缺汇率进入计费队列,不应让真实收货、销毁等作业因为价格尚未维护而无法完成;也不能先完成业务再用无持久化保障的临时回调计费。

8.2 StorageBillingService

  • 管理库存计费批次的开始、转移和结束;
  • 基于库存流水或每日库存快照计算历史数量;
  • 应用免费天数、阶梯价、最低收费和账期切分;
  • 记录最后计费截止日,支持任务失败后安全重跑;
  • 生成客户仓租应收和供应商仓储成本;
  • 对异常库存、缺报价和规则冲突进入异常队列。

计算锁与并发门禁以数据库事务、版本和唯一约束为准,不能仅靠 BILLING 字样或单机定时任务防重复;失败重跑应复用已保存的输入和计算身份。

8.3 发布到现有费用来源

现有 ll_finance_fee_source 已包含客户、供应商、方向、结算方式、数量、单位、单价、计费期间、币种、原币金额、汇率、审核和发布状态,能够承接上述结果。首期应优先复用,不应把仓租明细直接写入 Finance 数据库。

需要扩展的是业务类型校验和来源关联,使 RETURN_ORDER、RETURN_RECEIPT_BATCH、STORAGE_LOT、CARGO_DISCARD、WAREHOUSE_TRANSFER、HOLD_PERIOD 等业务对象可以安全发布为 OVERSEAS_WAREHOUSE_FEE。

仓租月度汇总涉及多个原始分量时,费用绑定真实计费结算记录(目标业务类型如 STORAGE_BILLING),通过明细关联各 storageLot;不能随意选一个批次冒充整笔费用归属。业务类型和表名在实现契约冻结时确定,并同步归属校验、事件、查询与页面。

现有来源表不能替代待定价事实、日计量明细、报价快照、收费身份、资金分配和 Finance 结果记录。只扩展必要模型,保留来源表作为统一发布出口;新接口同时纳入 Gateway、OpenAPI 和权限清单。

九、审核、调整与作废

9.1 推荐审核策略

场景 推荐策略
已命中有效报价、数量来自已完成业务事实、计算无异常 可按费用项目配置自动审核并发布
人工录入费用 必须人工审核
未命中报价 待定价,不能发布
多条报价冲突、数量为负、计费期间重叠 异常,不能发布
零价规则/全免租 业务侧记录免收及依据,不发布零金额 Finance 来源
OTHER_MANUAL 必须填写原因并人工审核

当前派送人工金额在转派送时自动审核,与本节目标不一致,必须列入阶段 0 改造。人工录入、业务作业完成和费用审核是独立权限;标准报价自动审核必须能追溯规则授权,不能由页面自行声明“自动费用”。

9.2 草稿、驳回和调整边界

  • 未发布草稿/驳回费用允许按版本编辑并重新提交;补后端修改接口、操作历史、页面和权限。待审核费用不得绕过重新提交静默改金额。
  • 已发布费用修改生成候选新版本,作废生成变更命令。Finance 接受前保留原有效版本;每个来源最多一个待确认变更。
  • 已进入有效账单、结算单或资金账户结算的来源不可直接替换或作废。业务侧创建关联原来源/原单据的调整申请,由 Finance 按可执行流程处理。
  • 本次阶段 0/1 交付冻结拒绝及“待财务处理”队列,不宣称已收款退款、供应商退款、资金账户退款或任意负向冲销已经可用。需要新增这类动作时,先明确单据、权限和收付款反向处理;不得用负金额来源或反转应收应付方向代替。
  • Finance 页面不编辑上游业务数量和单价;提供真实来源定位和跳转,由海外业务维护计价事实。

9.3 跨区接受结果与冻结竞态(本次新增目标)

当前海外 Relay 收到的是 Event Bridge 接收确认,Finance 在消费时才最终校验冻结状态;本地已发布不证明国内已经入池。

目标流程:

业务审核通过 -> 本地计费版本/变更命令 + Outbox
  -> Event Bridge 接收(仅投递状态)
  -> Finance 锁定来源并校验版本、快照、占用与资金关系
  -> 同事务保存接受/拒绝结果、必要来源变更及结果 Outbox
  -> 海外消费结果,接受才切换有效版本或确认作废;拒绝保留原有效版本

业务审核状态、投递状态和财务同步状态分别保存。财务同步至少区分 PENDING_FINANCE、ACCEPTED、REJECTED;超时/网络失败保持待确认并重试,不当作业务拒绝或成功。首次发布被拒绝也必须显示原因,不能进入“已入池”。

每次命令携带稳定 commandId、来源身份、目标版本、预期有效前序版本和快照哈希;作废引用预期有效版本。同命令同内容重放返回原结果,同命令异内容或同版本异快照拒绝。预期有效前序指最后被 Finance 接受且仍有效的版本,不是上一个本地候选;首次发布无有效前序时显式为空。

候选被审核或 Finance 拒绝后保留审计,修订生成新候选和新命令,仍以最后有效版本为基准,不修改原拒绝命令载荷,也不等待被拒绝候选生效。例如 V1 有效、V2 被拒绝,V3 可基于 V1 申请;候选编号允许有未生效间隔。已知前序正在投递而尚未到达时等待重试,真正有效版本冲突则返回拒绝,不能无限等待。迟到/重复结果仅更新对应命令,不回退当前有效版本;业务拒绝结果应可靠回传,不能只有无休止重试日志。

Finance 的来源变更与创建对账/结算占用必须锁定同一来源,在事务内原子裁决。海外先查“未冻结”再发布、或缓存一份冻结状态,均不能替代这个最终校验。

此机制应同步修改 Lastleg、Finance、公共事件契约与 Event Bridge 的双向路由、Inbox/Outbox 和权限/内部服务校验;不通过跨区数据库回查。开发阶段直接使用新目标协议,更新全部生产者、消费者和测试,不引入双协议或旧数据补偿。

9.4 资金账户结算关联

当前采购/换标费用与资金结算事件支持先后到达,Finance 按客户、业务类型、业务单号和金额匹配,成功后来源变为 SETTLED,不再进入对账候选。这一能力须保留,但不能据此认为多费用拆分或所有事件竞态已经覆盖。

  • 现有采购/换标业务身份与收费粒度不因统一展示而改变。若一笔扣款对应多笔费用,建立明确的结算关联 ID 和分配明细,校验分配总额与扣款一致;不得继续靠同额猜测关联。
  • 计划走资金账户的应收来源,从进入 Finance 起先处于“待资金结算”,在结果到达前也不能暂时进入 AVAILABLE 对账池;成功后 SETTLED,失败进入异常。
  • 切换为账期收款必须显式处理原资金冻结/扣款及分配关系并校验状态,不能扣款失败就自动转待出账。
  • 验收须覆盖费用先到、扣款先到、重复/迟到事件、同单多个同额项目、合计不等及出账并发。

十、页面与权限建议

10.1 海外仓侧

新增或收敛为“海外仓费用中心”,至少包含:

  • 待定价:未找到报价、报价冲突、计费单位缺失;
  • 待审核:人工费用和需要人工确认的自动费用;
  • 已发布:分别展示业务版本、投递状态、Finance 接受结果及当前有效版本;
  • 计费异常:重复期间、负库存、数量缺失和事件投递失败;
  • 仓租批次:查看开始时间、免费期、已计费截止日、当前数量和历史期间;
  • 业务详情费用页签:按稳定业务关系汇总所有相关来源,并标明直接费用、客户分摊、共享费用及资金结清状态。

聚合查询不能用单号模糊匹配,也不能只查 LASTLEG_ORDER。订单、入仓、柜、派送、换标和退货等关系由服务端校验客户归属;跨客户柜费只展示当前客户的分摊。同客户多个订单共用一笔费用时,明确分摊金额或“共享费用”引用,不把整笔金额重复计入每票小计。聚合返回同一来源的当前有效版本,待确认变更另行展示。

待审工作台包括编辑草稿、提交、批准、驳回、修改重提、调整/作废申请和结果查询;Finance 侧提供按稳定来源身份跳转的真实入口,不能仅提示“请到海外业务处理”。

报价页把自由文本费用项目和单位改成标准选择,明确客户销售价/供应商成本价,供应商绑定主档。应付表单补 ON_ACCOUNT/DIRECT_PAID 和直付证据录入。免收、待定价、待汇率、待资金结算、Finance 拒绝分别显示,避免统一呈现为空或零。

10.2 Finance 侧

继续使用现有客户应收应付、对账单和应付结算页面,不在 Finance 新增仓租计算页面。列表和详情需展示:

  • 来源系统、来源类型、业务类型;
  • 业务单号、退货单号或库存计费批次号;
  • 费用项目;
  • 数量、单位、单价、计费期间;
  • 海外仓、客户、供应商、结算方式;
  • 来源版本和调整关系。

现有 Finance DTO 和费用页已有数量、单位、单价、期间、原币与汇率字段,应复用;本轮补业务类型、仓库、结算路径、变更结果及关联跳转。来源拒绝尚未入池时从海外异常入口查询,不能依赖 Finance 费用池一定存在该记录。

10.3 权限最小集合

  • 海外仓费用查看;
  • 海外仓费用人工新增;
  • 海外仓费用草稿/驳回修改与提交;
  • 海外仓费用审核;
  • 海外仓费用调整/作废;
  • 海外报价维护;
  • 仓租试算与结算;
  • Finance 应收查看/出账;
  • Finance 应付查看/结算。

查看权限和写权限分离,业务详情只读权限不能隐式获得报价维护、审核或作废权限。

客户页面只展示本企业应收及允许公开的计费依据,不暴露供应商成本、内部审核信息和平台付款凭证。新增写权限同步 IAM、Controller、OpenAPI 与页面;查询按列表权限覆盖详情只读,操作列放第一列。

十一、分阶段实施建议

阶段是实现和验收顺序,不排除全流程范围。以下均为计划,不把本文修订视为代码或部署完成。

阶段 0:先修已有链路的漏发、审核、展示与一致性

范围:

  • 修正换标所有合法完成分支的费用发布及资金结算;修正拆柜打托费用的项目/业务身份与通用调整校验。
  • 派送同项目支持独立应收应付身份,人工费进入审核;先明确转派送动作与财务审核的独立状态。
  • 尾程费用按稳定关系聚合,补来源跳转、共享费用/分摊展示;复用柜级费用已有能力。
  • 补草稿/驳回修改 API、统一待审页面、版本/幂等和权限;补应付直付表单与证据。
  • 建立人工与自动共用的收费身份、免收事实与待处理队列,防止后续自动化重复收费。
  • 落地 Finance 接受/拒绝回传和来源变更并发裁决;保留最后有效版本,冻结费用转待财务处理。
  • 保留并补强资金账户关联,资金未确认前不得进入对账候选。

完成标准:新建业务可分别验证“未生成、待审核、待确认、已接受、已结清、已拒绝”;换标合法完成不漏发,同一派送项目应收应付各一笔;人工费可以驳回修改重审;已冻结来源的调整与出账竞态不会让双方有效金额不一致。不是只验证页面有数据或 Outbox 已发送。

阶段 1:退货、销毁和固定滞留费

范围:

  • 退货按票处理费;
  • 退货收货操作费,推荐先按实收件数,不启用未经定义的到货批次固定费;
  • 销毁正式完成后的费用;现有单据已展示金额与最终收费必须一致,报价变更不能静默改已确认单价;
  • 滞留固定处理费,先建立每次暂扣至解除的稳定期间身份,保存当次收费标记;解除后触发,重复暂扣是否每次收费按合同规则;
  • 标准费用项目和结构化报价最小字段;按 7.5—7.8 实现实际自营/合作仓候选、多仓独立报价、客户公共/专属价、供应商成本价、草稿复制与不可变版本。

完成标准:上述费用从业务事实生成应收及已配置真实成本责任的应付,跨区得到明确接受结果;未冻结费用可调整/作废,冻结费用拒绝并进入待财务处理。缺报价/汇率不丢业务事实,免收不发零金额来源,重复实收或拆分 PDA 操作不改变应收费总额。

阶段 2:仓租闭环

范围:

  • 退货与普通入库的原始计费分量、包装/托盘来源份额和实际数量事件;
  • 每日占用事实、时区、免费期、部分出库、合拆箱与转仓计费归属;
  • 月度最低收费累计、库龄阶梯、跨月切分、清零及补结算;
  • 仓租客户应收和供应商成本;
  • 待定价、异常和补结算工作台。

完成标准:6.6 算例、重叠期间、迟到事实、相同输入重算和重复发布均有直接验证;每笔月度费用可追溯到历史数量、报价与汇率。最低收费不随技术批次数或任务次数增加,合箱后份额守恒,结果未确认时不重复发布累计差额。跨时区规则缺失的期间必须显示异常,不能宣称自动计费覆盖。

阶段 3:其余作业费、海外本土业务与供应商成本

范围:

  • 入库、出库、换箱、重新打包、托盘、转仓、异常处理等;
  • 海外入仓、本土卡车、本土散板的业务触发、计价、审核与页面;
  • 采购、拆柜、派送、换标的供应商成本与客户销售价独立计价,明确真实供应商及月结/直付;
  • 按合同需要扩展滞留按天费、真实到货批次费,不复用普通仓租或技术签收次数冒充;
  • 统计报价命中率、待定价量和投递异常量。

完成标准:第三节每项都有明确生产者、触发点、收付方向、业务归属、审核、调整边界、页面和验收证据;已有标准业务事实与算法的新增项目通过配置接入,新业务动作仍需补事实适配,不能承诺所有费用都“只配规则无需开发”。Finance 继续复用统一入池链路。

覆盖对象 首次交付阶段 后续范围
已有接柜/拆柜/派送/换标/采购、尾程人工费 0:修现有发布、审核、关联和展示 3:补自动定价及真实供应商成本
退货按票、实收操作、销毁、固定滞留 1 3:确有合同需要时扩展收费单位/按天滞留
普通库存与退货仓租 2 同阶段覆盖最低收费、合拆箱、转仓与异常边界
海外入仓、本土卡车、本土散板及其他仓内作业 3 每种业务逐项留验收证据,不只验证通用 API

十二、预计改造范围

评审通过后,预计涉及以下部署单元。此表用于评估范围,不是已经确认的开发清单。

部署单元 主要改造 不应承担的职责
Lastleg 收费身份、结构化报价、业务触发、日计量、草稿修改/审核、变更命令及结果 Inbox 不生成 Finance 账单,不修改财务余额
Admin 海外仓/海外业务/通用资料模块 报价与供应商绑定、审核/异常队列、仓租、资金关联状态及聚合费用页签 不在前端自行计算最终金额
Finance 来源接受/拒绝及结果 Outbox、冻结原子裁决、待资金结算门禁和必要分配关系、查询展示 不实现退货、库存或仓租算法
Admin Finance 模块 展示业务单号、费用项目、数量、期间、供应商和来源版本 不允许修改上游业务计价事实
公共事件契约 / Event Bridge 扩展费用命令身份和接受结果契约、双向路由、幂等、拒绝与重试分类 不跨区域回查海外数据库,不把转发成功当消费成功
Gateway Overseas / IAM 随新增或变化接口同步路由、内部结果入口隔离、权限资源及初始化 SQL 不在网关实现计价与财务状态机
国内 Warehouse 主档接口(按实际需要) 支持按计费适用范围查询真实自营/合作海外仓,供报价复用;保持唯一仓库 ID 不在 Lastleg 复制另一套仓库主档或用 FBA 目的仓替代
Admin/Client/PDA 受影响调用端 同步费用查询、业务身份及字段类型;PDA 继续只提交真实作业事实 不在终端决定最终价格、审核结果或 Finance 状态

实现前需要特别核对一个现状:退货收货批次中的 overseasWarehouseId 当前为字符串,而统一海外费用来源的 warehouseId 为数值类型。进入开发时应直接统一当前目标类型和调用端,不能靠运行时猜测或保留双类型兼容。

阶段 0 最小实现清单应逐项列出:草稿/驳回修改、统一待审查询与动作、业务关联费用查询、来源变更命令、Finance 结果消费及查询、资金待结算标识、直付证据。每项对应 DTO/表字段、Controller、Gateway、OpenAPI、权限与直接受影响检查;不得仅按页面数量估算范围。

代码实施遵守当前工作区/当前分支、最新初始化基线和既有服务数据库边界;本方案不包含历史测试数据迁移、回填、旧协议兼容或自动部署授权。新增/变更 API 按仓库规则执行 Gateway 合同,事件变更覆盖生产者、消费者、桥接、乱序和事务回滚检查。

十三、验收场景

以下为本方案验收清单,全部待实施验证。每项保存业务事实、Lastleg 计费/来源版本、事件结果、Finance 状态以及页面/接口证据,不能以历史报告代替。

编号 阶段 场景与断言
A01 0 正价纯 SKU、退货 SKU、需要出库的换标分别走合法完成路径,费用与资金结算各一次;重复完成不增加金额
A02 0 自动拆柜打托费可在未冻结时按正确业务身份调整;客户分摊守恒,不能误标为供应商应付
A03 0 同一派送费用项目可产生独立应收和应付;人工金额未经审核不入池,不阻断已完成的真实作业事实
A04 0 尾程人工费新增、提交、驳回、修改、重审、接受全链可操作;旧版本并发编辑被拒绝
A05 0 尾程详情聚合接柜、派送、换标等来源,同一来源只显示一次;跨客户柜费只显示本人分摊,共享费用不重复计小计
A06 0 人工补录和自动任务并发命中同一收费身份,只产生一笔正常费用;免收也不能重跑再收费
A07 0 Finance 接受前海外保留原有效版本;拒绝/超时、重复结果、迟到结果、前序事件晚到均不造成版本倒退或假成功;V2 被拒绝后 V3 可基于有效 V1 接受
A08 0 来源调整/作废与创建账单/结算并发,Finance 原子裁决;冻结冲突进入待财务处理,不产生负数来源或覆盖已出账金额
A09 0 资金事件与费用事件双向乱序、同单同额多项目、分配金额不等;待资金结果期间不可出账,成功后只结算一次
A10 1 同一退货单 100 件分多个 SKU、2/3/5 次 PDA 确认,按票费均 1 票、按件费均 100 件;重复请求不增量,不按技术批次收最低费
A11 1 销毁审核通过但未正式完成不收费,PDA 作业后正式完成收费一次;数量与已确认单价可追溯,取消/拒绝不收费
A12 1 暂扣、解除、再次暂扣按不同真实期间关联,保留当次收费标记;重复解除不重复收费
A13 1/3 有销售价、无成本责任时只生成应收;有成本责任但缺成本价则成本侧待定价,不虚构供应商也不静默漏记
A14 0/1/3 ON_ACCOUNT 进入应付,DIRECT_PAID 有完整付款证据且只形成成本;缺证据或供应商错误被拒绝
A15 1/2 缺报价、报价冲突、缺汇率各自可诊断并重试,业务完成事实不丢;明确零价/全免租不发零金额来源
A16 2 6.6 全部算例金额一致;7 天免租从第 8 天开始收费,日界线与夏令时按当地自然日处理
A17 2 月中清零、同月再次入仓、补结算与月末任务共用累计最低费;重放和待 Finance 确认时不再发同一差额
A18 2 完全相同期间和不同起止但重叠期间均不能重复计费;迟到库存事实不能静默修改已出账历史
A19 2 合拆箱/托盘保留原始数量与免费期,份额守恒;同日转仓不双收,跨日到仓从真实到仓日计,跨时区无规则时进入明确异常;新单价不重置旧免费期
A20 1/2 次月补价/重跑仍使用原业务月份;仓租分两次 USD 0.01、0.01,汇率 7.5,CNY 分别 0.08、0.07,累计与单次月结 0.15 相同;正数舍入为零不冒充免收
A21 3 入仓、本土卡车、散板各自从真实业务动作产生费用;采购等供应商成本与客户应收独立,并具有正确页面入口
A22 全部 同命令同载荷幂等、异载荷拒绝;事务回滚无半笔来源;越权/跨客户查询与写入被拒绝,客户不见供应商成本及平台凭证
A23 1 A/B 两仓分别配置同一项目;同一客户在 A 用专属价、在 B 用 B 仓公共价,不能跨仓取价;销售与成本各自匹配
A24 1 从 A 复制到 B/C 只生成独立草稿;不覆盖已有价、不自动启用;修改 A 不改变 B/C;自营和合作真实作业仓均可按权限配置
A25 1 已生效/已引用版本不能停用后原地改金额;调价产生新版本,旧费用可反查原价;新旧生效区间无同优先级重叠
A26 1 专属项目缺失、明确免收、专属价停用分别命中公共价/免收/预览后的有效规则;无报价、未接计费和零价三种状态可区分
A27 1/2 全仓覆盖、单仓明细、单项历史和真实业务试算可查询;试算不产生费用,历史费用不因最新报价变化而改变

自动化接口/计算检查与页面验收分开记录。Admin/Client 页面按 1920×1080、100% 缩放执行人工操作;当前无本稿变更后的人工截图,状态为“待人工截图确认”。真实 HTTP、数据库操作和部署仍需对应轮次明确授权,本次文档修订不执行。

十四、本次评审需要拍板的问题

下一轮优先确认退货操作费单位、仓租日数量、最低收费、转仓和合箱口径。以下全部为待确认推荐值;“按建议修订文档”不等于已批准收费合同。现有 Finance 服务边界、正金额入池、已结算不得重复出账等已确认约束不重复列作开放问题。

编号 待确认问题 推荐口径
R1 退货“一票”按什么定义 一个退货单 returnNo
R2 退货按票费何时产生 首个有效收货批次完成;未收货取消不收费
R3 是否另收操作费,按什么单位 首期按实收 ITEM,同票总件数决定金额;按包裹/到货批次需先补真实对象,不按 PDA 提交次数收费
R4 销毁收费节点和已确认价格 使用已有正式 complete 节点,单据已确认数量/单价与收费一致;不在仅审核通过时收费
R5 仓租入仓当天是否算第 1 天 推荐算第 1 天,按仓库当地日期
R6 同日入库并出库是否收 1 天仓租 推荐计占用 1 天,但仍先应用免租;有 1 天免租则当日为 0
R7 仓租以哪个数量为准 收货日实收量、后续日日初量;出库当日仍计、次日减少;不取单纯日终余额
R8 首批仓租结算周期 推荐自然月结;库存清零时立即结清尾期
R9 客户销售价未配置时怎么办 待定价,不按 0 元、不自动发布
R10 自动计算费用是否需要逐笔人工审核 推荐标准规则自动审核,人工和异常费用人工审核,可按项目配置
R11 是否首批同时生成供应商成本 推荐数据模型一次支持,阶段 1 可先对已明确服务商的费用启用
R12 仓租阶梯范围及算法 库龄阶梯推荐按原始计费分量、逐段累进;按客户汇总数量或整量套档的合同需显式选择,不能自动解释
R13 免费天数按自然日还是满 24 小时 推荐仓库当地自然日,便于对账和月结
R14 负库存或历史库存调整如何处理 停止自动发布并进入异常,不自动生成负仓租
R15 最低收费按什么范围、是否清零后重收 推荐客户+仓库+项目+角色+原币+自然月,成本另分供应商;同月只累计一次,全免租/零价不触发
R16 转仓日与跨时区归属 同时区同日转仓归首个实际存放仓、目标次日计;跨日运输目标从真实到仓日计,不重置免租。跨时区启用前专项确认,无规则则异常
R17 合拆箱/托盘如何分摊 推荐次日按新单位,以确认的件数/体积分份额并保留各自库龄;接受小数箱天/托盘天,不能每个来源各收一整单位
R18 存量仓租调价、业务日期与金额舍入 推荐未计费日适用新单价、既有免费期不变;期间最后收费日确定汇率月,同组冻结月汇率并按双币累计目标结算尾差
R19 已收款、已付供应商或资金账户已扣款后的差错 阶段 0/1 先交付冻结拒绝和待财务处理;需要新增退款/冲销闭环时单独冻结单据、权限和资金处理,不能当作现成能力

R15 的仓租最低收费范围不自动套用于退货按件费;退货若需要最低收费,建议按退货单汇总一次,具体金额与适用范围随 R3 确认。上述算例随着确认结论同步调整,不能正文一套、验收另一套。

十五、评审通过后的下一步

  1. 下一轮先评审 V0.2 的接入矩阵、阶段 0 和仓租算例,记录 R1—R19 中实际确认的结论;未讨论项保持待确认。
  2. 阶段 0 不以仓租商业口径未定为由搁置现有漏发、审核和展示修复;开工前形成该阶段表字段、API、事件、页面、权限和验证清单。
  3. 根据阶段 1 相关确认结果冻结收费身份、项目编码、单位、触发和金额快照,实施退货、销毁及固定滞留费。
  4. 阶段 2 在 R5—R8、R12—R18 口径与可计算样例一致后实施历史数量、份额和周期计费;阶段 3 补齐范围矩阵剩余业务。
  5. 各阶段交付时分别报告本地检查、真实 HTTP、人工页面证据和未覆盖边界,不用通用费用接口通过代替全部业务完成。

十六、与现有契约的关系

  • Finance 服务边界、费用来源唯一键、版本和跨区域 Outbox/Inbox 机制继续遵循 Firstleg-Finance 跨服务契约。
  • 费用进入统一费用池后的对账、应收应付与结算继续遵循 财务费用入池 P0 闭环 和 财务对账结算 P1 闭环。
  • 本文专门补充海外仓费用如何形成业务费用事实;与历史盘点冲突时,以后续评审确认和实现契约为准。
  • 本稿是待确认方案,不覆盖已确认的服务边界、资金主账和区域通信约束。接受结果回传、待资金结算和多来源资金分配属于新增目标,评审通过后必须同步修订受影响契约,不能只改本稿就宣称闭环完成。

附录 A:当前实现证据入口

以下入口用于复核“当前状态”;代码可能随实施变化,不反向证明本稿新增目标已经完成。代码入口均相对本文件可访问。

事实/问题 证据入口与定位符号
Finance 待出账范围、应付结算 FinanceQueryService、FinanceSettlementService
正金额、冻结检查与费用后到的资金关联 BusinessFeeSourceEventService
资金结果后到的费用关联 WalletCommandEventService
来源字段、审核发布、调整和作废 OverseasFeeSource、OverseasFeeSourceService 的 create/submit/review/adjust/voidSource
通用业务归属校验及当前接口动作 OverseasFeeBusinessGuard、PlatformOverseasFeeSourceController
桥接接收与实际入池的差别 OverseasFeeOutboxRelay
USD/CNY 与按业务月份转换 OverseasFeeCurrencyConverter 的 convert
尾程详情只查本业务类型,人工费只提交 LastlegOrderService 的 detail/createFee
换标完成分支差异 RelabelApplicationService 的 changeStatus/confirmCompletion
拆柜打托应收及通用调整身份不一致 DestuffingPalletCostService 的 fee,联查 OverseasFeeBusinessGuard
派送人工费用与仅按项目去重 DeliveryTransferService 的 validateTransferFees 及 publishApproved 调用
退货技术批次与仓租起点 ReturnReceiptService 的 confirm、ReturnReceiptBatch
合箱来源与实际数量 ReturnInventoryService 的 merge/createReceiptCarton
销毁现有金额与正式完成节点 CargoDiscardService 的 create/review/complete
暂扣收费标记与历史 LastlegOrderCommandService 的 hold
尾程人工费用页面和柜级审核入口 LastMileOrderDetailView、ContainerLastLegFeesPanel
Finance 来源展示与海外来源动作提示 FinanceCustomerArapView
现有报价入口与增改查界面 adminNavigation、OverseasQuotesView
报价仓候选、启停及停用后原地编辑 OverseasQuoteService、DomesticPartnerWarehouseClient

附录 B:下一轮 review 建议顺序

  1. 先看 7.5—7.8:多仓新增、公共/专属销售价、供应商成本价、复制与版本是否符合实际操作。
  2. 再看第三节与阶段 0:确认先修已有链路的漏发、审核和展示,并接受跨区结果与资金待结算的必要改造范围。
  3. 按 5.4 和 6.6 算例确认收费结果:退货按件、同日进出、免费期、最低收费、转仓与合箱。
  4. 最后按第十四节记录具体确认项,再冻结阶段接口/数据契约;未实现或未验证的能力继续保持待办,不写成已上线。