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

1037 lines
129 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 海外仓费用统一接入财务评审方案
> 文档状态:开发基线 V0.5(可按阶段实施,尚未实施)
> 编制日期:2026-09-21
> 适用范围:头程、柜级费用、海外仓作业费用及其进入 Finance 统一应收应付的链路
> 事实口径:当前代码静态盘点 + 既有财务跨服务契约;本稿不代表测试环境已经部署或通过真实 HTTP 验收
本文已经定稿为开发基线,可以按第十一节顺序开始实施,但不表示新增能力已经实现。第三节记录现状;其余章节与第十四节共同定义首版目标,原推荐口径收敛为固定规则、可配置参数和后续范围。实际各仓价格、合同参数和岗位人员由业务配置,文中示例金额不作为真实报价;数据库、接口命名及内部代码结构由开发团队在阶段开工契约中设计并冻结,不再列为待定业务问题。
V0.2 重点修正:区分漏生成、待审核和展示遗漏;纠正换标、拆柜、派送的接入判断;补齐资金账户关联、人工与自动收费去重、跨区变更结果闭环;重写仓租计量与算例;增加阶段 0,并将入仓、本土卡车、散板纳入覆盖清单。另补多海外仓报价的新增、复制、修改、生效、查看与试算流程(7.5—7.8)。
V0.3 补齐第二轮六项问题:资金冻结期间绑定收费计划与费用版本;商业减免纳入最终收费目标;客户应收与各供应商成本独立计算;退货操作费累计舍入;计费条件在配置与匹配中保持一致;停用仓真实待定价业务可受控补价。新增规则和算例均为目标设计,尚未实施。
V0.4 完成业务交接定义:明确计费约定与实际供应商的操作入口、普通补价后的恢复流程、岗位权限与自审限制、异常处理动作及恢复条件;第十四节改为首版规则和配置边界,第十三节补对应验收。本文描述产品行为,不代表真实收费合同已录入、实际账号已授权或系统已上线。
V0.5 完成开工门禁收敛:增加首版封闭业务场景编码、退货计费人工结束/重开规则、阶段 0A—0E 实施顺序、跨区费用与资金事件技术契约先行要求、仓库/供应商统一身份规则及仓租事实模型门禁。本文自 V0.5 起可作为阶段 0—2 的开发基线,不再等待另一轮完整业务评审;具体表结构、API、事件版本和任务拆分由开发团队在各阶段开工契约中冻结。
## 一、评审目标
本次不重建 Finance,也不让各业务模块直接生成账单或修改客户余额。目标是把分散在头程、柜子、海外仓、退货、仓租、销毁、滞留等环节的费用,先在业务域形成可追溯、可审核、可调整的费用事实,再统一进入 Finance 的应收应付费用池。
本次重点解决六个问题:
1. 当前哪些费用已经进入 Finance,哪些只有字段或页面,哪些完全没有接入。
2. “退货按票收费”中的一票如何定义,何时收费,如何避免分批收货导致重复收费。
3. 仓租如何按仓库当地日期、库存批次和结算周期准确计费,而不是用当前库存倒推历史费用。
4. 同一业务动作如何同时形成客户应收和供应商应付,并正确区分月结与已直付。
5. 后续新增各种操作费时,如何只增加费用项目和计价规则,不再为每种费用重复建设一条财务链路。
6. 一个或多个海外仓如何新增收费配置、区分销售价与成本价、调价生效、查看历史,并从实际费用反查所用报价。
## 二、先给结论
### 2.1 总体结论
Finance 现有统一费用来源、跨区域事件、费用池、对账单和应收应付结算能力可以继续复用。主要缺口在 Lastleg 的费用生产、计价、审核与业务页面聚合;Finance 仍需参与来源变更结果确认、资金账户关联扩展和必要的查询展示,不能把本次改造理解为只改海外业务服务。
采用以下统一链路:
```text
业务动作/库存事实
-> 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、事实明细/作业轮次、费用项目、价格角色,以及成本侧实际供应商;周期费用另含已占用的计费日期范围。报价版本、操作人和请求幂等键不是收费身份,换人补录或换报价不能生成第二笔正常收费。
- 自动任务与人工补录共用收费身份和数据库唯一约束。人工补录必须选择真实业务事实;已有自动费时进入该费的调整流程。
- 客户应收与供应商应付身份独立;同一服务涉及多个真实供应商时按实际成本责任拆分,不能由缺失报价自动猜测供应商。计费单位、免费期、最低收费及转仓日资格也按价格角色和实际供应商分别确定,不能仅拆出两条来源却共用一套收费资格。
- 业务事件重放、人工与自动并发、报价补齐后重试均返回同一计费结果。需要补差时记录原来源和调整原因,不使用新业务键规避冻结。
- 仓租不能只依赖“起止日期完全相同”的键;不同范围的重叠期间也须在锁定计费对象后拒绝,见第六节。
### 4.4 首版封闭业务场景编码
`scenarioCode` 是计费约定和报价匹配的结构化条件,不等同于 `businessType` 或 `feeItemCode`。首版只允许下表编码及组合;页面、保存校验、试算、正式计费和异常恢复必须共用同一枚举和适用矩阵,不接受自由文本场景参与自动计费。
| `scenarioCode` | 真实业务事实 | 首次阶段 | 允许自动关联的首版费用项目 | 允许单位 |
|---|---|---|---|---|
| `RETURN_RECEIPT` | 退货单及有效实收事实 | 1 | `RETURN_HANDLING`、`RETURN_RECEIPT_OPERATION` | `TICKET`、`ITEM` |
| `RETURN_STORAGE` | 退货实收形成的库存计费分量 | 2 | `STORAGE_FEE` | `PACKAGE_DAY`、`PALLET_DAY`、`CBM_DAY` |
| `NORMAL_INBOUND_STORAGE` | 普通入库实收形成的库存计费分量 | 2 | `STORAGE_FEE` | `PACKAGE_DAY`、`PALLET_DAY`、`CBM_DAY` |
| `CARGO_DISCARD` | 销毁申请正式完成事实 | 1 | `DISCARD_FEE` | `PACKAGE`;`ITEM` 待真实事实接入后启用 |
| `ORDER_HOLD` | 一次真实暂扣至解除期间 | 1 | `HOLD_FEE` | 首版 `TICKET` |
| `RELABEL` | 换标申请合法完成事实 | 0 | `RELABEL_SERVICE` | `ITEM`、`BOX`,以作业事实与既有约定为准 |
| `DELIVERY` | 派送委托及转派送事实 | 0 | 既有派送费用项目 | 既有真实单位;人工金额须审核 |
| `DESTUFF_PALLET` | 拆柜入仓完成和客户分摊事实 | 0 | `DESTUFF_PALLET` | 现有按实收 `CBM` 分摊 |
| `WAREHOUSE_INBOUND` | 海外仓入库作业完成事实 | 3 | `INBOUND_OPERATION` | `TICKET`、`PALLET`、`CBM` |
| `WAREHOUSE_OUTBOUND` | 海外仓出库作业完成事实 | 3 | `OUTBOUND_OPERATION` | `TICKET`、`PACKAGE`、`PALLET` |
| `WAREHOUSE_TRANSFER` | 转仓作业完成事实 | 3 | `TRANSFER_FEE` | `TICKET`、`PALLET`、`CBM` |
| `REPACK_REBOX` | 重新打包或换箱完成事实 | 3 | `REPACK_FEE`、`REBOX_FEE` | `PACKAGE`、`ITEM`、`BOX`,按具体项目限制 |
| `WAREHOUSE_EXCEPTION` | 已完成且允许收费的异常处理事实 | 3 | `EXCEPTION_FEE` | `TICKET`、`HOUR` |
约束如下:
- 每个业务事实只能绑定与上表相符的场景、费用项目和单位;不能为了命中已有低价或有值的数量字段切换场景。
- 同一 `scenarioCode` 可以分别建立客户销售和实际供应商成本约定,但价格角色、供应商责任、免费期及单位资格独立。
- `OTHER_MANUAL` 不参与自动场景匹配;人工录入时仍须绑定真实业务事实和原因。
- 新增场景或扩大允许组合属于需求契约变更,须同步更新本表、报价校验、生产者、页面、事件和验收;不得仅在代码中增加字符串。
## 五、退货按票收费设计
### 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 金额形成
```text
退货单首个收货批次完成
-> 按客户 + 海外仓 + 业务日期匹配客户销售价
-> 生成 RECEIVABLE / RETURN_HANDLING
-> 按服务商 + 海外仓 + 业务日期匹配供应商成本价(如配置)
-> 生成 PAYABLE / RETURN_HANDLING
```
没有匹配到价格时不得默认为 0 元并自动发布,应进入“待定价”队列。允许有业务但不收费时,必须命中一条明确的零价规则并记录规则版本。
### 5.4 签收技术批次与收货收费单位
当前 `ReturnReceiptBatch` 随每次 PDA 确认生成,并限定单 SKU、生成一个签收箱;它是库存追溯起点,不自动等于快递包裹、一次运输到货或一次预约到货。
阶段 1 按实收 `ITEM` 数量累计计收操作费,技术签收批次只承担事实去重。例:同一退货单 30 件,分 3 次每次 10 件签收,按票费为 1 票,操作费合计为 30 件。各次实收按 5.5 的累计差额发布,不能逐次独立舍入;在业务日期、价格与数量事实不变时,操作员拆分确认次数不改变总额。最低收费若存在,在退货单全部签收或人工结束后只补足一次,不按每次确认预收最低费。
若合同按 `PACKAGE` 收费,先明确其含义是入仓包裹还是签收后新箱,并建立真实标识及防重复计数;若按到货 `BATCH` 收费,先补业务到货批次对象及其与技术签收的关系。两者未经确认不以技术批次数量替代。多个分批收货操作费的合计应与业务单位守恒。
### 5.5 退货操作费的累计金额与跨月最低费
计费组按“退货单 + 费用项目 + 价格角色 + 实际供应商(成本侧)”确定,组内冻结单一原币和整单最低收费约定。单价按每次真实签收业务日期匹配;若中途币种或最低收费约定冲突,进入受控处理,不能另开一组重复最低费。
1. 每次有效签收保存不可变实收、日期、适用价格和高精度金额。按真实签收月份汇总,再将该月原币累计金额舍入到分,以该月冻结汇率计算 CNY 累计目标;分别减去 Finance 已接受的双币累计净额形成增量,沿用 7.3 的累计尾差处理。
2. 未结束的退货单只按实际操作基础费累计发布,不提前补整单最低费。全部签收完成或人工结束后,确认全部实收已经定价/免收,再按各月原币规则金额之和计算一次最低费补足额;存在缺价、价格冲突或待确认变更时不能宣称最低费已经结清。
3. 补足额归属最后一个实际产生正价操作费的签收月份,使用该月冻结汇率,重新计算该月累计目标后只发差额。人工结束月份、任务执行月份不改变归属;全部明确零价/免收不触发最低费。
4. 基础费增量与最低费补足属于同一收费组,保留明细成分、计算版本和一次最低费结算标识。组内只允许一个待 Finance 确认的变更,业务继续收货可累计事实,不能并发再次发布同一差额。结束计算冻结费用目标及补足额,重试复用该版本;结束后实收纠错、改价、减免按 9.5 处理,不删除结束标识后再正常补收。
```text
R月 = round2(Σ本月实收件数 × 各实收事实适用单价)
最低费补足额 = 0 (未结束或无正价应收费事实)
= max(0, 整单最低费 - ΣR月) (已结束且完整定价)
月规则目标 = R月 + 归属于本月的最低费补足额
月最终目标 = 月规则目标 + 适用的已批准商业调整
本次原币/CNY增量 = 对应币种月最终目标 - 对应币种Finance已接受净额
```
最低费用规则金额判定,不能因某月来源尚未被 Finance 接受就把它再算成最低费缺口;商业减免在最低费之后处理,不因减免再补最低费。跨实际业务月份分别舍入和折汇,不承诺不同真实月份使用同一汇率;仅拆分同样事实的 PDA 提交,金额必须不变。
算例:同月 CNY 0.335/件,3 件一次或三次确认,最终都为 1.01;分次累计目标为 0.34、0.67、1.01,增量依次为 0.34、0.33、0.34。USD 1/件、整单最低 5,9 月实收 1 件、10 月实收 1 件,基础费分别为 USD 1、1;结束时补 USD 3 至 10 月,最终各月为 USD 1、4。两月汇率分别为 7、7.5 时,合计 CNY 37,即使 11 月人工结束也不改用 11 月汇率。
不足最小金额时保留累计事实、不生成零金额来源;正价事实舍入为零不等于免收,结束时若有最低费仍按上述公式补足。应用最低费后的最终结算范围仍无法满足双币正金额契约时进入精度异常,不伪装为免收或改挂其他月份。退货按票费仍在首个有效签收时产生一次,不受操作费最低费补足时点影响。
### 5.6 退货计费结束、人工结束与迟到实收
退货操作费最低收费只能在计费组进入明确结束状态后补足。结束分为自动结束和人工结束,两者都保存不可变结束版本、结束时间、操作人/系统身份及原因。
1. **自动结束:**服务端确认退货单全部预计实收已经完成,且不存在进行中的签收任务或未落账实收时自动结束。只看页面状态、PDA 提交次数或某个技术批次完成不能作为整单结束依据。
2. **人工结束:**预计数量不会全部到货、客户明确放弃剩余退货或业务确认不再等待时,由具有“退货计费结束”独立权限的业务主管操作;原因必填,同时提交退货单版本和幂等键。普通仓库操作员、报价维护、财务经办不得代替业务主管结束。
3. **结束时校验:**所有已发生实收必须已保存;仍在执行的签收任务须先完成或取消。缺价、缺汇率、缺成本责任等不阻止保存结束事实,但在相关计费组完整定价/免收前不发布最低费补足,并继续显示阻断原因。
4. **结束后的普通行为:**结束版本不可原地修改,重复结束返回原结果。结束不删除实收、价格、最低费或已发布记录;后续任务不得通过清除结束标志再次收一遍最低费。
5. **迟到实收:**结束后出现真实到货时不阻断仓库保存实收,但该事实进入“结束后迟到实收”异常,默认不自动生成操作费或仓租计价资格。业务主管须选择“确认误收并按其他流程处理”或提交重开申请,不能由 PDA 自动重开。
6. **受控重开:**重开须填写原因、引用最后结束版本并通过业务主管审核;申请人或实质修改人不得终审。重开保留全部结束历史,恢复同一收费身份和累计组。新增实收按真实签收日期及原规则计算,最低费只按新的累计最终目标扣减 Finance 已接受净额,不形成第二次最低费。
7. **冻结限制:**若结束产生的费用已进入有效账单、已收款、已资金结算或存在待确认变更,重开只恢复业务事实记录和试算,金额差额进入第九节受控调整/待财务处理;不得发布负数来源,也不得绕开原冻结重新收费。
退货详情和费用中心必须展示预计数量、累计实收、结束方式、结束版本、原因、迟到实收和重开状态。自动结束、人工结束、重开及迟到实收均纳入审计和并发测试。
## 六、仓租设计
### 6.1 为什么不能直接用当前库存乘天数
当前库存只代表此刻数量,无法证明过去每天存了多少。如果发生部分出库、拆包、合箱、转仓或库存调整,用当前数量倒推历史仓租会多收或少收,并且无法审计。
仓租必须以“库存计费批次 + 每日数量事实 + 已计费期间”计算。
### 6.2 计费批次
每一批可独立追踪实收时间和数量的库存形成一个原始计费分量 `storageLot`:
- 退货:从 `ReturnReceiptBatch` 和实收明细建立原始分量;批次数不决定最低收费次数。
- 普通入库:按真实收货明细建立原始分量,不能只引用汇总库存余额。
- 转仓:记录来源与目标仓的数量转移,结束原仓物理占用并开始目标仓物理占用;原始实收时间和物理来源持续保留,销售与各供应商成本的库龄/免租约定独立,不能用客户免费期覆盖目标仓成本。仓租归属按 6.5 处理。
- 合箱/拆箱、合托/拆托:保存“原始分量—实际箱/托盘—数量/份额—生效时间”的关系,不能只拼接来源批次号。一次出库必须能扣减对应原始分量,不用 FIFO 猜测来源。
每个原始分量至少保存:客户、真实仓库、业务编号、实收 UTC 时间、仓库 IANA 时区、当地收货日期、数量及单位、物理占用区间和来源关系。计费资格另按“原始分量 + 价格角色 + 实际供应商(成本侧)”保存计费方式、合同/报价依据、库龄起点和免费截止日;例如客户可免 7 天、供应商成本免 0 天,不能共用一个 `freeDays`。
日计费事实按上述资格分别保存当天数量、报价版本、免费/收费依据及金额;计费期间保存计算版本、已发布/已接受金额和截止日,不能只依靠一个最后计费日期恢复所有状态。
包裹数、托盘数、体积必须来自对应业务事实;缺少测量、仓位份额或历史来源时进入异常,不用默认体积、整托数量或当前库存倒推。
### 6.3 日计费口径
以下为首版客户应收规则;供应商成本使用同一物理占用事实,按各自已确认且在 14.2 支持范围内的合同模板、单位、免费期及责任起点独立计算,不能自动套用客户销售资格。超出模板的合同按 10.5 转人工计费。
1. 按仓库当地自然日计费,每日区间为当地 `[00:00, 次日00:00)`;实际事件保存 UTC 时间和时区。夏令时产生的 23/25 小时仍为一个自然日。
2. 对每个不追加实收的原始分量,收货日使用实际入仓数量,后续日使用日初仍在库数量。当日出库数量当日仍计,次日减少;同日入库出库计一天,但免租优先。日界线整点出库仅归结束前的占用日。同仓移库、换托和重复事件不新增实收量。
3. 对客收货当地日期为库龄第 1 天,`freeDays=N` 表示前 N 个自然日免费。首次匹配收货日适用规则时按角色/供应商分别冻结免费天数/截止日,后续报价改价不自动改变既有免租资格。对客库龄按自然日连续计算,包装转换不重置;转仓途中整日无仓储占用时不收仓租。供应商按其约定的原始实收日或本责任开始日起算,该起点同时决定成本免费期和库龄阶梯,不覆盖客户原始库龄。
4. 每日先按原始分量在相应价格角色/成本责任下的计费库龄、数量与适用报价计算高精度金额,再按自然月归集;首版库龄阶梯逐日落档、逐段累进,数量阶梯和整量套档不自动计算。
5. 最低收费按“客户 + 仓库 + 费用项目 + 价格角色 + 原币 + 自然月”汇总一次,成本侧另分供应商。最低收费与按批次的库龄阶梯是不同维度;同组命中互相矛盾的最低收费规则进入异常。
```text
日基础费 = Σ(非免租且有实际计费占用的分量数量 × 对应日单价)
月规则金额 = 0 (无正价应收费事实,或整组明确免收)
= max(月最低收费, Σ日基础费) (存在正价应收费事实)
月最终收费目标 = 月规则金额 + 适用且已批准的商业调整净额
本次待处理差额 = 月最终收费目标 - Finance 已接受的累计净额
```
最低收费不能由零库存、全免租或明确零价事实触发。清零结算、补结算、月末结算及同月再次入仓共用同一累计范围,不重复收最低费。正差额形成有关联明细的增量来源;零差额不发来源;负差额或历史纠错进入第九节的调整流程,不直接发布负数,也不能忽略差额。
商业减免在最低收费计算之后作用于明确的收费范围,不能再次被最低收费补足。减免、收费取消及其撤销保存独立版本、原币金额、适用项目/事实/期间、原因和审批信息;正常重新计算必须带入仍有效的调整,不用新计算 ID 将其丢弃。固定金额减免不自动变为永久折扣,取消已发生期间的收费也不自动免掉未来新增期间。最终目标为负或涉及已结算退款时进入待财务处理,不擅自截成零或发布负来源。
例:月规则金额 100,已接受 100,批准减免 20 后最终目标为 80;未冻结来源的减价被 Finance 接受后净额为 80。次日新增基础费 10,最终目标为 `110−20=90`,只新增 10。即使批准后 Finance 尚未接受或拒绝,减免记录也不自动失效;该组暂停自动发布差额并显示待财务处理,不能按原价继续补收。具体衔接见 9.5。
阶段 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` | 数量、价格或期间异常 | 按 10.5 修正业务事实或配置,满足恢复条件后重试;不得直接改财务接受状态 |
状态只描述仓租计费进度,不能替代 Finance 的审核、出账和结算状态。
### 6.5 转仓与包装转换的归属
- 客户应收:同一时区、同一当地日期离仓并到达目标仓,当天仓租归当天首个实际存放仓,目标仓次日开始计费;同日多次转仓仍只归一个仓。跨日运输时原仓计至离仓日,途中整日不计,目标仓从实际到仓日计费。例如 9 月 1 日离 A、9 月 3 日到 B,A 计至 1 日、2 日不计、B 从 3 日计。目标仓保留真实物理到仓时间,不能为了收费归属修改库存事实。
- 供应商成本:按每家供应商真实成本责任和合同独立确定离仓日、到仓日、免费期及最低收费。若 A、B 两家均按实际占用日收费,同日 A→B 必须分别确认两家当日成本;“客户当天不双收”不能用于删除 B 的实际成本。合同未明确的成本进入待定价/异常,不默认免收。
- 跨时区转仓的自然日不可直接对齐。首版相关期间转人工计费异常,不自动双收,不阻断真实库存转移;后续自动化须另行定义统一结算时区和归属规则。
- 客户销售和首版供应商日模板均在合拆箱/托盘转换次日起按新包装计量,操作当天只计转换前包装;要求不同转换日口径的成本合同转人工处理。同日多次转换按真实包装事实计量,不能累加每次中间包装。
- 多批次合成一箱/一托,按已确认的实际件数或体积分摊份额,合计必须等于真实箱/托数量;各份额继续使用原始库龄与免费期。禁止每个来源批次都收一个整箱/整托。不同计价单位的份额依据不能混用,无法还原来源时停止自动发布。
- 库存盘点或迟到事实影响已计费日期时,保留旧日事实及纠正版本,进入受控重算/调整,不悄悄改历史快照或只修改当前余额。
### 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,库龄不重置 |
| 同日转仓的应收与应付 | 10 包同日 A→B,客户按上述规则收 2;供应商 A 当日成本 1、供应商 B 当日成本 3,双方合同均按实际占用日收费 | 客户应收 2;供应商 A 应付 1、B 应付 3,成本合计 4;两家成本不因同日规则而去重 |
| 应收与成本免租不同 | 同一批 10 包,客户免租 7 天;实际供应商免租 0 天、成本 0.1/包天 | 收货首日客户仓租 0,供应商成本 1;两条资格独立保存 |
| 不同库龄合箱 | 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 价格匹配优先级
先根据真实业务场景和已确认计费约定,确定并冻结计费方式、单位与数量依据,再匹配价格。约定从 7.10 的入口维护和带入;其适用性来自业务事实与约定,不按哪条价格便宜、哪个数量字段恰好有值来反向选择。首期仅使用可校验的结构化场景/方式/单位条件,不引入自由文本条件表达式;无法确定方式或缺必需计量事实时进入异常。
客户应收价格按以下顺序匹配:
1. 在业务日期及已冻结适用条件下,查客户 + 海外仓 + 费用项目的专属规则;
2. 该条件下确无专属项目规则时,查本仓公共销售价,计费方式和单位保持不变;
3. 没有报价进入待定价;已有适用专属规则但缺所需计量事实,进入异常,不能通过换单位/套公共价收费。明确免收属于有效命中。
供应商成本价格按以下步骤匹配:
1. 从 7.11 已确认的真实作业委托/成本责任确定供应商;仓库默认服务商仅在确实承担该业务时作为实际供应商,不因缺价更换交易对手。
2. 按该供应商 + 海外仓 + 费用项目 + 业务日期及该成本责任已冻结的计费条件匹配成本价;首期不再增加客户专属成本价层级,不能套用客户销售侧的单位和免费期。
3. 无供应商成本责任的业务不生成成本;已有成本责任但缺价时进入成本待定价,不能改取另一供应商的报价或静默省略。
报价保存/生效、试算和正式计费共用适用条件与优先级判定,条件包含业务已绑定的计费约定。同一范围内,两条同优先级规则的日期及适用条件有交集就禁止同时生效,不能仅比较条件文本是否相同;换币种也不能绕过同一收费约定的冲突校验。存量与新业务明确绑定不同约定时,其价格序列可并存,但单一业务仍须唯一命中。运行时仍发现冲突则停止自动计费。
同仓 `STORAGE_FEE` 可以维护托盘天、立方天报价,但前提是有能从业务事实明确区分的计费约定。冻结托盘天的业务只匹配托盘天;没有可区分条件时,保存阶段就禁止在同一范围启用多种单位。托数缺失不能自动改用立方价。销售有价、成本缺价时只阻塞缺价一侧,不能把已确定的另一侧金额丢弃。
供应商应从真实作业委托/成本责任中确定,“默认服务商”必须有明确有效主档配置;没有成本责任与“成本应计但缺报价”分别展示,不能都静默省略。直付还需真实支付日期、方式、流水和凭证;仅填写 `DIRECT_PAID` 不构成已支付事实。
### 7.3 业务日期、币种、汇率与舍入
当前来源支持 CNY、USD 原币,结算币固定 CNY;USD 必须命中业务日期所在月份的有效 USD/CNY 汇率。此能力可以复用,但以下计费口径需要明确实施:
- 离散费用冻结真实收费触发的当地业务日期;仓租先按当地自然月拆分,每个期间以最后一个实际收费日作为业务日期,汇率月份始终属于该计费月。
- 补报价、补结算和任务重跑不改变业务日期及汇率归属月份。缺报价、缺汇率分别进入可见队列,不用执行日期、汇率 1 或零金额兜底。
- 日/实收明细金额先保留计算精度,按收费组/期间汇总,将原币金额四舍五入至 2 位、乘以冻结的 6 位汇率、将 CNY 四舍五入至 2 位。独立、非累计的一次性费用可复用现有单笔转换;退货按件操作费和仓租必须使用双币累计差额,不能把每个签收或原币增量独立舍入/折汇后相加。
- 记录报价版本、原币单价、数量/份额、原币金额、汇率值及月份、结算金额与计算规则快照。已形成版本重放使用原快照,不随新报价或新汇率重算历史版本。
- 存量仓租未形成计价快照的日单价按当天有效报价冻结,已有日快照不随报价更新重算;单位、原始免租天数/截止日保持不变,免租资格纠错须单独受控审核。锁定入仓单价合同属于后续范围,首版转人工处理,不混用两种规则。
同一月计费组首次形成收费结果时冻结该月统一汇率快照;后续结算分别计算包含有效商业调整的月最终原币目标与月最终 CNY 目标,再分别减去 Finance 已接受的双币累计净额,得到本次双币增量。退货操作费各业务月按 5.5 分组并共同遵守整单最低费约束;仓租按客户仓库月度范围执行。待确认候选不计入已接受净额,但占用相应计费组唯一待确认名额。
例:同组 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/展示/导出校验相同口径,不能用单笔增量乘汇率把尾差“修正”掉。累计转换在阶段 1 为退货操作费引入,阶段 2 仓租复用;当前转换服务不直接具备。
本次差额为零则不发来源;双币差额不能同时满足正金额契约时进入精度/调整异常,不伪造原币金额或放宽为零/负数来源。冻结月汇率若需纠错,走受控调整,不在后续补结算中混入新汇率。
### 7.4 零价和免收事实
Finance 当前要求原币金额与 CNY 结算金额均大于 0。明确零价或全免租应在 Lastleg 保存“已免收”事实、规则版本、数量、期间和原因,不生成 Finance 应收应付来源;免收事实也占用收费身份,重试和人工录入不能再重复收费。
缺报价不是免收。正数费用因舍入变成零时也不能标成命中零价:先按规定范围汇总,仍无法形成正金额时进入精度异常,按 10.5 处理。免收后改为收费须经过带原因的受控审核,不能因报价更新自动补收。
### 7.5 配置入口与多仓组织
当前正式入口为“通用 → 海外仓报价”,路由 `/overseas-master-data/quotes`。已支持报价列表、仓库筛选、新增、详情、编辑、启停和 CSV 导出;一个报价头绑定一个仓库。现状只有报价资料维护,尚不能等同于自动计费已经使用这些价格。
本次沿用该入口,目标组织方式为:
```text
标准费用项目(平台统一定义收费含义)
-> 选择实际海外仓
-> 客户销售价:本仓公共价 / 本仓客户专属价
-> 供应商成本价:本仓实际供应商
-> 报价版本、生效期间、币种
-> 各费用项目的单位、单价、免租、最低收费和阶梯规则
```
费用项目与仓库报价分开维护:“退货按票费”“仓租”只定义一次收费含义,A 仓、B 仓各自填写价格,不为每个仓复制新的费用编码。一个仓可同时拥有多家客户专属价和多家实际供应商成本价;客户销售价不要求虚填供应商,供应商成本价必须绑定真实供应商。
仓库必须引用国内仓库主档的实际作业仓 ID。当前报价候选来自“海外合作仓”接口,不能假定已覆盖所有实际海外作业仓;本次需统一报价候选与业务冻结的真实仓 ID,纳入需要计费的自营/合作海外仓,并校验启用状态及适用业务能力。FBA 目的仓、仓库名称文本、国内来源仓均不能替代实际作业仓。停用仓保留历史查询,禁止为停用后的新作业启用报价;停用前真实发生且仍待定价的业务通过 7.9 的受控补价处理,不重新启用仓库。
| 示例配置(示例价格) | 仓库 | 适用对象 | 费用项目 | 单价 | 匹配结果 |
|---|---|---|---|---|---|
| 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. 从标准项目中添加收费行,选择 7.10 中唯一适用的计费约定,再填写单价及必要的免租、最低收费/范围、阶梯和自动审核配置;单位由约定带入,不能在价格行另选不一致单位。没有约定时可同步建立约定草稿,审批生效时同时校验一致性。成本侧单独确认供应商日收费规则。明确不收费时选择“免收”并写原因;空白项目表示未配置,不能自动视为 0 元。
5. 保存草稿,可预览金额与使用样例;执行“提交生效审核”时展示覆盖对象、日期、被替代项目与冲突,由 10.4 对应主管审核通过后立即生效或按计划日期生效。使用 7.2 的同一条件判定,禁止同仓、同角色、同适用对象/项目下同优先级规则在日期和业务条件上重叠;不同单位但无法从业务明确分流的配置也必须拒绝。
多仓可逐仓新增,也可“复制为其他仓草稿”:选择一个源版本和一个或多个目标仓,逐仓生成独立草稿。复制收费项目及规则供核对,不复制启用状态、历史引用和费用;客户/供应商归属、币种、时区和适用日期均需在目标仓确认。目标仓已有报价时不覆盖,逐仓返回冲突或草稿创建结果;每个草稿可单独修改和生效。修改 A 仓的报价不会联动修改 B 仓。
新增标准费用项目应从“通用 → 海外仓报价”的“费用项目”页签完成,并定义收费对象、支持单位和业务触发;由报价维护岗提交、财务主管审核启用。费用编码及收费含义一旦被引用不能改写,新增不同含义须使用新项目。报价表里不能通过随意输入文字绕过项目定义;若当前业务尚无事实生产者,页面明确标注“已配置价格,业务计费尚未接入”,不能承诺立即自动收费。
### 7.7 怎么修改、停用和查看版本
当前报价启用时禁止编辑,但停用后可原地修改明细;计价接入后必须收敛为以下规则,不能继续停用、改旧版、再启用来改写历史价格。
| 对象 | 允许操作 | 对费用的影响 |
|---|---|---|
| 从未生效且未被引用的草稿 | 编辑、保存或删除草稿 | 不影响业务费用 |
| 待生效审核的版本 | 审核人批准/驳回;经办人可撤回后修订重提 | 审核中不能改金额或规则;驳回/撤回保留提交记录,仍不参与计价 |
| 已安排生效但尚未生效且未被引用的版本 | 取消计划后修改草稿,重新校验并安排 | 不可与其他同优先级报价重叠 |
| 已生效、已过期或已被费用引用的版本 | 查看;“基于此版本调价”生成新版本 | 历史报价与已形成费用快照保持可追溯 |
| 新版本生效 | 审核通过后原子切换同一计费约定及适用范围内的新旧价格区间 | 不同时结束其他约定的价格序列;普通历史待定价事实按 7.12 恢复;存量仓租按 R18 执行 |
| 停用/结束报价 | 填终止时间与原因,显示影响项目及后续可用报价 | 不修改已有费用;后续无可用报价进入待定价 |
生效版本内容不可原地改写;报价启停/替代保存独立时间记录,旧费用仍按冻结版本及有效区间追溯。变更客户、供应商或仓库属于新建对应范围的报价,不把已生效报价移到另一个仓。
在已冻结的业务条件和计费单位下,客户专属价未覆盖的项目按 7.2 查询本仓公共价;专属规则缺计量事实不等于未配置,明确免收也不再取公共价。停用专属价可能在相同计费约定下改为命中公共价,操作前必须展示影响;用户若希望停止收费,应配置明确免收,若希望阻止自动收费,应将该业务收费设为待人工定价,不能靠删掉专属价表达。
### 7.8 怎么查看和验证配置
- **全部仓库看覆盖:**列表支持仓库、销售/成本、客户、供应商、费用项目、币种、有效日期和状态筛选;显示已配置、未配置、即将到期、冲突的项目数量。只维护报价记录的现有列表不等于已具备这些覆盖指标。
- **单仓看明细:**查看公共销售价、客户专属价、供应商成本价;每行显示项目、单位、单价、免费期、最低收费范围、生效区间和版本,操作列放第一列。
- **单项看历史:**按仓库、价格角色、适用对象和费用项目查看历次版本、修改原因、生效时间和引用费用;显示当前、将来和历史版本,不以“停用”隐藏历史。
- **按业务试算:**输入真实仓库、客户、项目、业务日期、数量或仓租期间;成本另选实际供应商。返回命中范围/版本、数量依据、免租、最低费、原币与汇率计算;未命中说明缺哪个条件。试算不生成费用,也不能绕过正式业务事实创建应收。
- **从费用反查:**费用详情显示使用的仓库、项目、报价版本和计量依据,点击可看当时价格快照;当前最新价另行展示,避免用新价解释旧费用。
报价查看、维护草稿、安排/启用/停用价格、删除未使用草稿的权限应分别落实;实际费用审核仍是独立权限。仓库配置权不自动授予查看全部客户或供应商成本的权限,数据范围由服务端控制。
### 7.9 停用仓的真实业务缺价补录
仓库停止接收新业务后,停用前已完成的收费事实可能仍在待定价。报价页提供独立“历史补价”动作及权限:选择真实待定价事实,填写原因、原业务适用期间、价格角色/供应商及规则,预览覆盖业务与预计金额后确认历史报价版本。
- 服务端核对业务客户/仓库归属、真实发生时间与可核对的仓库停用时间;来源不清或无法证明停用前发生时转人工核实,不用当前日期或自填业务事实绕过。
- 历史版本仅匹配预览并确认范围内、停用前发生且仍未定价的事实;截止于停用前,不对新作业开放。不能覆盖已接受费用、已有计价快照或明确免收事实,这些情况必须走调整。
- 继续执行相同的计费条件、日期冲突、权限和版本校验;补价确认与待定价事实认领须防并发,重复确认不产生新一轮收费。
- 确认后走正常计费、审核、Outbox 和 Finance 接受流程,保留原业务日期及汇率月份。缺原月份汇率仍待处理,不能借补价日期改用新月份价格。
例:A 仓 9 月底停用,10 月补录 9 月真实作业的缺价,可以完成这些业务计费;A 仓维持停用状态,10 月新作业或已确认费用不能借该版本收费。此动作是正常业务待定价队列的受控处理,不是开发测试存量迁移、数据库回填、直接 SQL 修复或重新开放仓库。
### 7.10 计费方式在哪里约定、何时冻结
在“通用 → 海外仓报价”增加“计费约定”页签,与报价明细相互跳转。约定说明“按什么计”,价格版本说明“收多少”;两者可以一并提交审核,但不得从最低单价或现有测量字段反推计费方式。
| 约定范围 | 必填内容 | 确定方式与审核 |
|---|---|---|
| 客户销售 | 实际仓、费用项目、结构化业务场景、公共/指定客户、计费方式、单位、数量依据、生效区间 | 同一日期/场景优先本仓客户专属约定,无专属约定才用本仓公共约定;业务主管审核 |
| 供应商成本 | 实际仓、费用项目、结构化业务场景、实际供应商、计费方式、单位、数量依据、日收费模板及生效区间 | 按已确认供应商查其约定,无客户专属成本层级;财务主管审核 |
同一优先级的适用条件和日期必须唯一;计费约定适用性校验与 7.2 的价格匹配共用业务条件。报价单位必须符合其引用约定,只有约定、没有适用价格时仍为待定价,不能从另一种单位的报价补缺。首版支持范围以 14.2 为准,未支持的合同不能以自由文本表达后自动运行。
- 退货按票费和按件操作费在该退货单首个有效签收时冻结适用约定;后续分批签收沿用同一单位及整单最低费约定,单价仍按实际签收日期匹配。整单不得通过新增报价切换计费单位。
- 仓租按原始实收分量到仓时冻结约定;转仓按目标仓实际到仓日期确定目标仓计费方式,同时保留原始物理来源及客户既有库龄/免费期。成本资格按实际供应商独立形成。
- 其他单次作业在委托确认时确定约定;没有前置委托确认的,在首个有效收费事实形成时确定。已有已确认价格的业务继续按其快照处理,不能被后续约定覆盖。
- 委托、收货、库存及作业详情显示适用方式/单位及约定版本,仓库操作员只提交真实数量,不临时选择按托盘还是按立方。缺约定不阻断真实作业,保留待定价事实;之后按原业务日期补约定并按 7.12 确认恢复。
- 修改计费方式或数量依据须建立新约定版本,只影响此后新业务/新计费分量。存量未计费日可按 R18 变更单价,但不能因此重置单位或免费期;存量约定错误走有原因的事实纠错与费用调整。
约定的生效区间控制新业务选择哪个约定;已有分量继续绑定原约定,其未来日期按原约定、原单位的价格序列匹配当天价格,不能改绑当前最新约定。新约定启用须预览存量报价覆盖,默认保留仍供存量使用的旧约定价格;确需结束旧价格时,单独列明会进入待定价的存量及日期,由对应主管审批。约定停止接收新业务不等于其存量价格自动失效。
例:A 仓公共仓租约定为立方天,客户甲有托盘天专属约定,则客户甲只匹配托盘天价格。其托数缺失时显示缺计量事实,不能因公共立方价可用而切换。约定修改为立方天后,新入仓批次使用新约定,旧批次仍保留原托盘天依据。
### 7.11 实际供应商及成本责任由谁确认
在报价入口提供“成本责任默认值”配置,按实际仓 + 费用项目 + 业务场景 + 生效期间维护默认承作供应商;引用统一供应商主档,不复制主档。默认值由报价维护岗维护、财务主管审核,只用于预填业务责任;选择较低成本价不能改变实际交易对手。
具体业务的 Admin 详情增加“费用责任”区:有采购/派送/换标/作业委托的,在委托确认时由获授权业务经办核对承作方;没有前置委托的退货收货/仓租,由经办核对真实收货及仓储责任后确认。若事实早于确认,保留真实日期;PDA 作业不承担价格或供应商成本选择,不因未确认成本责任而阻断收货。
| 成本责任状态 | 操作与依据 | 计费结果 |
|---|---|---|
| 待确认 | 默认值仅供核对;缺少委托证据、多个候选或无人确认时保留此态 | 客户应收可独立处理;成本侧留“成本责任待确认”,不能静默视为无成本 |
| 已确认供应商 | 经办确认实际承作方、项目、数量/责任期间及委托依据;与默认不同须写原因,由业务主管确认;多家真实承作方按责任明细分别确认 | 各责任独立匹配约定/成本价;缺价进入成本待定价,不能改取其他供应商 |
| 已确认无外部成本 | 经办提交原因及依据,由业务主管确认;自营仓不能自动代表所有项目均无外部成本 | 保存不生成供应商费用的责任结论,不伪造 0 元供应商来源;可审计 |
成本责任确认后冻结供应商与责任范围。报价维护可以查看已授权责任并配置成本价,不能从报价页修改实际承作方;更正须回原业务,由业务主管审核。已计价/已入池的同时进入受控重算/调整,不能换供应商再生成一笔正常费用。仓储供应商中途更换时按真实责任生效时刻拆分期间,交接日计费依各自已确认合同模板,不能回溯覆盖已发生责任。
“成本责任确认”只确认交易对手及业务事实,不等于批准价格或应付,也不授予成本金额查看权限。只有确实已确认无外部成本,才允许不形成供应商费用;责任已明确但不在首版自动计费范围的,在异常队列转受控人工费用处理。
### 7.12 普通仓补价后怎样恢复待定价费用
普通启用中的仓库也有原业务发生后才补齐价格/约定的情况。补齐配置本身不直接重收历史费用,统一采用“预览范围 → 确认恢复 → 按原审核策略处理”。停用仓仍走 7.9 独立历史补价审批,不因使用本流程而降低权限。
1. 新报价/约定经审核生效后,展示“查看待恢复业务”;也可从费用中心待定价队列筛选后执行“试算待恢复费用”。匹配原业务日期、实际仓、客户/供应商、项目和已冻结条件;配置期间不覆盖原日期时不列为可恢复,不能用当前价格硬套。
2. 预览逐项列出业务编号、原业务日期、角色/实际供应商、数量依据、命中约定/价格、原币金额、原月汇率及预计 CNY。没有既存约定快照的,按原日期补齐并展示;已有约定继续使用原快照。仅可选择尚无计价快照、未免收、未被其他计费任务认领的待定价事实,已审核/已接受费用排除。仓租及退货累计组按既定范围汇总,不逐项重复最低费。
3. 销售侧由业务主管、成本侧由财务主管按数据权限确认恢复范围;需要补录过去生效价格的,仍须先完成对应报价审核。报价停用或替代过往版本时,不能借补价覆盖已确认业务。
4. 确认时重新核对规则版本、事实版本和范围;预览已过期或事实已被处理则要求刷新,不沿用旧金额。确认后保存计价快照并进入正常费用审核:项目自动审核已获授权的按规则执行,其余进入待审核。恢复确认不替代人工费用审核,也不人为增加一轮标准费用逐笔审核。
5. 缺计量事实、成本责任、汇率或存在冲突的项目分别保留原异常;同组有阻断最低费/累计计算的缺口时不发布该组不完整结果。跨独立计费组可部分成功,逐组显示完成、仍待处理及原因。
6. 后续后台恢复任务仅继续处理已经确认的事实范围及其保存版本;重复点击、并发任务和重放均复用收费身份。选择“暂不恢复”保持待定价,不视为免收,也不妨碍新发生业务正常匹配报价。
例:A 仓 9 月 10 日完成真实退货但缺价,9 月 12 日生效的报价仅覆盖 12 日以后,不能用于该笔;经审核补齐覆盖 10 日的价格后,主管预览并确认该笔恢复,按 9 月汇率计费。此前已计价或已免收的其他退货不受影响。
**已有价格快照、仅缺汇率时,使用独立“补汇率恢复”动作。**财务经办补齐原业务月汇率,销售侧业务主管/成本侧财务主管预览并确认对应异常范围;已有计费组冻结汇率则直接沿用原值。此动作保留原数量、价格、商业调整及原币快照,不重新取价,也不受上述“尚无计价快照”的补价资格限制。累计费用结合该组既有事实计算双币最终目标,扣除 Finance 已接受净额,按唯一待确认门禁继续发布;组内仍有其他阻断项则留待办。已有有效汇率需要改值时走受控调整,不通过补汇率恢复覆盖。
## 八、统一计费中心职责
建议在 Lastleg 内收敛 `WarehouseChargeService` 和 `StorageBillingService` 两类职责,具体类名可在实现阶段确定。
### 8.1 `WarehouseChargeService`
- 接收退货、入库、出库、换标、换箱、托盘、转仓、销毁、滞留和异常处理等已完成业务事实;
- 按真实业务场景、约定计费依据和业务日期,分别匹配客户销售价和供应商成本价;
- 计算数量、单价和金额;退货操作费按月累计舍入、结束时补足整单最低费,并应用已批准商业调整;
- 生成待定价、待审核或已审核费用;
- 调用现有海外费用来源服务生成不可变版本和 Outbox;
- 保证同一业务动作重放不重复收费。
业务完成与计费事实/待处理任务必须在 Lastleg 本地事务内可靠落地。缺报价、缺汇率进入计费队列,不应让真实收货、销毁等作业因为价格尚未维护而无法完成;也不能先完成业务再用无持久化保障的临时回调计费。
### 8.2 `StorageBillingService`
- 管理库存计费批次的开始、转移和结束;
- 基于库存流水或每日库存快照计算历史数量;
- 分客户销售、实际供应商成本应用各自免费期、日收费资格、阶梯价、最低收费和账期切分;
- 分别保存规则金额、商业调整、最终目标和 Finance 已接受净额,按接受结果推进累计差额;
- 记录最后计费截止日,支持任务失败后安全重跑;
- 生成客户仓租应收和供应商仓储成本;
- 对异常库存、缺报价和规则冲突进入异常队列。
计算锁与并发门禁以数据库事务、版本和唯一约束为准,不能仅靠 `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 接受前保留原有效版本;每个来源最多一个待确认变更。
- 已进入有效账单、结算单,或已绑定有效资金冻结/待结算/已结算计划的来源不可普通替换或作废。资金尚未结算时按 9.4 先受控释放并终止有效关联;已经结算或出单时,业务侧创建关联原来源/原单据的调整申请,由 Finance 按可执行流程处理。
- 本次阶段 0/1 交付冻结拒绝及“待财务处理”队列,不宣称已收款退款、供应商退款、资金账户退款或任意负向冲销已经可用。需要新增这类动作时,先明确单据、权限和收付款反向处理;不得用负金额来源或反转应收应付方向代替。
- Finance 页面不编辑上游业务数量和单价;提供真实来源定位和跳转,由海外业务维护计价事实。
### 9.3 跨区接受结果与冻结竞态(本次新增目标)
当前海外 Relay 收到的是 Event Bridge 接收确认,Finance 在消费时才最终校验冻结状态;本地已发布不证明国内已经入池。
目标流程:
```text
业务审核通过 -> 本地计费版本/变更命令 + 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`。当前实际扣款使用原冻结金额;因此只排除对账候选不足以保护“冻结后、扣款前调价”。以下为本次新增目标,不表示现有服务已实现精确计划绑定。
1. **费用生成前可以冻结资金。**先建立稳定收费身份及不可复用的资金计划 ID/版本,冻结命令绑定客户、CNY 金额、收费身份和计划金额快照,不要求此时已有正式 `sourceFeeId`。计划生效后该收费身份的金额也受保护,不能先改业务价格再等待正式来源发现不一致。
2. **费用生成后精确分配。**将计划关联到来源 ID、确切版本和分配金额,每份分配只消费一次,合计等于该计划冻结金额。一笔计划对应多笔来源时保存完整分配,不能按同单号、同金额猜测。计划尚缺来源可保持冻结;已形成来源在分配或资金结果未确认前始终处于待资金结算,不进入 `AVAILABLE`。
3. **扣款等待费用可结算。**`SETTLE`、`RELEASE` 携带计划 ID/版本及目标冻结记录。`SETTLE` 先于来源事件到达时先持久化等待;全部目标来源版本已经 Finance 接受、分配完整且金额守恒后才允许实际扣款。无需等待海外先收到来源接受回执,避免循环等待。已有终态的重复事件返回原结果;仍在等待依赖的,由持久化处理任务在来源接受或分配补齐后继续执行同一命令,不另造结算命令。
4. **冻结期间不可普通调价。**金额或已绑定来源版本需变化时,先受控释放原计划并确认终止有效关联,保留历史记录,再申请来源变更及建立新的计划 ID/版本。若已扣款则进入待财务处理,不将其当作可直接释放的冻结。释放结果未知时保持锁定,不能同时按新价收费。
5. **旧命令不能操作新资金。**原计划释放/取消后,迟到 `SETTLE` 仅能访问原冻结记录并按状态拒绝,不能凭相同业务单号找到新冻结执行扣款。所有命令校验计划版本、目标冻结及分配快照;同命令异内容拒绝,计划 ID 不复用。
6. **出账路径切换受控。**改为账期收款前,确认原计划未结算、释放已经完成并终止有效分配,然后检查当前费用版本再开放对账资格。释放与扣款并发时只能有一个成功;扣款已成功则不能再改为未收款账期。扣款失败或回执超时不能自动降级为对账。
例:冻结计划 P1 为 100,费用 V1 也为 100;申请改为 80 时,不允许直接接受 V2 并让 P1 继续待扣。必须先确认释放 P1,再变更费用并建立 P2=80;若随后收到 P1 的旧结算指令,应拒绝对已释放 P1 的操作,不能扣 P2。该目标会调整现有“可先扣款、后关联来源”的执行顺序,需同步资金指令契约及全部生产者/消费者,不保留两套运行协议。
### 9.5 商业调整与自动重算衔接
业务事实更正和商业减免是两种动作:前者更正数量/价格依据并重算规则金额,后者在该规则金额后添加有明确作用范围的批准调整,不能为同一次减额同时改低基础价又再扣一份减免。
业务批准减免、取消收费或撤销减免时,在同一本地事务中记录不可变调整事实、目标计算版本及计费组的待处理状态。按 6.3 保留“规则金额、商业调整、最终收费目标、Finance 已接受净额”四项;调整原因、角色/供应商、项目、原币和适用期间均可追溯。首次实现至少明确支持固定金额减免和指定已发生收费事实取消,不用任意公式表达尚未定义的永久折扣。
批准即改变业务目标,不等于 Finance 已减账。待确认变更占用该组唯一发布名额;发生负差额、冻结冲突或 Finance 拒绝时保留批准记录和最后真实接受金额,该组停止自动发布差额并进入待财务处理。后续库存/签收事实继续记录和试算,不能借新日期、新计算 ID 或新来源补回已批准减免。
恢复发布须有对应财务处理结果,或经权限审核撤销/更正商业调整后形成的新目标;均重新核对 Finance 净额及占用状态,不删除审批历史。来源拒绝不能自动撤销业务审批,也不能假记减账成功。双币商业调整沿用所影响收费组的原汇率快照/金额规则,不能拿审批当月汇率改写旧费用。
仅撤回错误发布候选以修正数据,与业务上取消收费分别记录意图:前者复用相同收费身份继续修正,后者必须同步修改最终收费目标。单独作废来源而不处理其业务收费目标,会导致自动任务重新生成同一笔费用,不能作为允许的操作路径。
## 十、页面、岗位与异常操作
### 10.1 海外仓侧
新增或收敛为“海外仓费用中心”,至少包含:
- 待定价:未找到报价、计费约定缺失;独立展示成本责任待确认、待汇率;
- 待审核:人工费用和需要人工确认的自动费用;
- 已发布:分别展示业务版本、投递状态、Finance 接受结果及当前有效版本;
- 计费异常:报价冲突、重复期间、负库存、数量缺失、精度异常;分别展示财务同步待确认/拒绝、待资金结算、冻结冲突和待财务处理;
- 仓租批次:查看实物开始时间,以及销售/各供应商成本独立的免费期、日收费资格、已计费截止日、当前数量和历史期间;
- 计费明细:分列规则金额、批准减免、最终目标、Finance 已接受净额和待处理差额;退货操作费可查月度累计与整单最低费补足;
- 业务详情费用页签:按稳定业务关系汇总所有相关来源,并标明直接费用、客户分摊、共享费用及资金结清状态。
聚合查询不能用单号模糊匹配,也不能只查 `LASTLEG_ORDER`。订单、入仓、柜、派送、换标和退货等关系由服务端校验客户归属;跨客户柜费只展示当前客户的分摊。同客户多个订单共用一笔费用时,明确分摊金额或“共享费用”引用,不把整笔金额重复计入每票小计。聚合返回同一来源的当前有效版本,待确认变更另行展示。
待审工作台包括编辑草稿、提交、批准、驳回、修改重提、调整/作废申请和结果查询;Finance 侧提供按稳定来源身份跳转的真实入口,不能仅提示“请到海外业务处理”。
报价页把自由文本费用项目和单位改成标准选择,明确客户销售价/供应商成本价、适用业务场景与计费依据,供应商绑定主档。报价保存、启用、试算和实际收费使用相同匹配条件;停用仓的历史缺价从独立补价入口按真实业务事实预览和确认。应付表单补 `ON_ACCOUNT/DIRECT_PAID` 和直付证据录入。免收、待定价、待汇率、待资金结算、Finance 拒绝分别显示,避免统一呈现为空或零。
### 10.2 Finance 侧
继续使用现有客户应收应付、对账单和应付结算页面,不在 Finance 新增仓租计算页面。列表和详情需展示:
- 来源系统、来源类型、业务类型;
- 业务单号、退货单号或库存计费批次号;
- 费用项目;
- 数量、单位、单价、计费期间;
- 海外仓、客户、供应商、结算方式;
- 来源版本、商业调整关系、资金冻结计划及其绑定版本和分配金额。
现有 Finance DTO 和费用页已有数量、单位、单价、期间、原币与汇率字段,应复用;本轮补业务类型、仓库、结算路径、变更结果及关联跳转。来源拒绝尚未入池时从海外异常入口查询,不能依赖 Finance 费用池一定存在该记录。
### 10.3 权限最小集合
- 海外仓费用查看;
- 海外仓费用人工新增;
- 海外仓费用草稿/驳回修改与提交;
- 海外仓费用审核;
- 海外仓费用调整/作废;
- 海外仓费用商业减免审批;
- 退货计费人工结束/重开申请与审核;
- 海外报价维护;
- 费用项目及计费约定维护/审核,销售/成本报价生效与停用审核;
- 成本责任确认/更正、供应商成本查看;
- 海外报价历史补价(含停用仓真实业务,独立于普通报价维护);
- 待定价恢复试算/确认、财务同步结果查询/原命令重试;
- 仓租试算与结算;
- Finance 应收查看/出账;
- Finance 应付查看/结算。
查看权限和写权限分离,业务详情只读权限不能隐式获得报价维护、审核或作废权限。
客户页面只展示本企业应收及允许公开的计费依据,不暴露供应商成本、内部审核信息和平台付款凭证。新增写权限同步 IAM、Controller、OpenAPI 与页面;查询按列表权限覆盖详情只读,操作列放第一列。
### 10.4 岗位职责、数据范围与审批
以下为首版职责模板,可映射到现有 IAM 角色;岗位名称不要求重建组织,也不代表任何实际人员已经获权。每项操作仍检查独立权限和授权仓库/客户/供应商范围,不能仅按岗位名称放行。
| 职责模板 | 可见范围 | 经办动作 | 审批/生效权限 |
|---|---|---|---|
| 仓库作业/业务经办 | 授权作业及客户销售费用;默认不见供应商成本金额、利润、平台付款凭证 | 真实作业、人工费用、成本责任确认、调整/减免申请;业务责任区可见必要供应商名称及委托依据 | 无报价生效或费用终审权;变更承作方、无外部成本结论及事实更正报业务主管 |
| 报价维护 | 授权仓库销售报价;成本报价另需成本查看权限 | 项目/约定/报价及责任默认值草稿维护、复制、试算,提交生效/停用/历史补价申请 | 无终审或商业减免批准权 |
| 业务主管 | 授权业务及销售价格;成本金额另须单独授权 | 核实计费约定、业务事实、成本责任与销售侧待定价恢复范围 | 审批销售约定/报价生效及停用、人工客户应收、业务责任更正/无外部成本;商业减免仅申请 |
| 财务经办 | 授权客户/供应商范围内的应收、成本、应付及凭证 | 财务核对、凭证/结算经办、原业务月汇率维护、资金处理申请、异常跟进与结果查询 | 无报价、历史补价和商业减免终审权;既有财务审批链继续适用 |
| 财务主管 | 授权范围内销售、成本、应收应付及凭证 | 确认成本侧恢复范围、财务处理结论 | 审批费用项目、成本约定/报价及默认承作方配置、人工供应商应付、历史补价、商业减免及其撤销;资金释放/结算按既有 Finance 权限和状态执行 |
| 权限管理员 | 权限管理所需资料;该职责本身不授予业务金额/成本查看 | 按批准结果配置职责权限及数据范围 | 不因权限管理身份获得业务审批权,也不绕过自审和财务状态限制 |
| 客户 | 本企业应收及允许公开的业务依据 | 查询及既有对账确认/反馈动作 | 无平台计价/审核权限,不见供应商成本、内部审批、平台付款凭证 |
审批规则:
1. 人工费用、报价/约定、费用项目、历史补价、成本责任变更/无外部成本结论、商业减免的申请人及该提交版本中实质修改金额、责任或规则的人员,不得终审该版本。兼任岗位也不例外;没有其他合资格审核人时保持待审,不自动通过。审核人需要改内容时退回重提,不能边修改边批准。
2. 自动审核是对已获审批的有效计价规则执行,不要求每条标准费用再分配人工审批人。`autoApproval` 初始关闭,由对应销售/成本报价审核人随规则明确批准后启用;人工输入金额、异常及商业调整不能伪装成自动费用。历史补价由财务主管独立审批;补价审批人不得为其申请人或实质修改人。
3. 待定价恢复确认是确认规则命中及业务范围,不是批准人工费用。销售由业务主管、成本由财务主管确认;若其兼为某笔人工费用申请人,该笔仍须交另一名合资格人员审核。费用已满足自动审核条件时按获批规则发布,不增加额外逐笔审批。
4. 列表权限包含详情只读;维护、审批、导出、重试等分别授权。报价及费用的成本查询、试算、导出都同时检查成本查看权和业务数据范围;知道供应商名称不等于有权查看成本金额。销售侧恢复与总览不得通过合计、导出或错误信息泄露成本。
5. 投递超时的技术重试由另行授予“原命令重试”的运维/接口维护职责处理,业务人员可查看进度并发起跟进。该权限不允许改命令金额、修改有效来源或将状态手工置成功;实际账号配置由组织自行完成,不改变本表职责边界。
6. 退货人工结束和重开属于业务状态审批,不是财务金额审批。具有独立权限的业务主管方可结束;重开采用申请、另一名合资格业务主管审核,申请人或实质修改人不得自审。相关金额若已冻结或结算,仍由财务状态门禁决定是否只能进入待财务处理。
### 10.5 异常处理动作与恢复条件
费用中心按实际原因展示异常,可并列显示多个待办;只开放权限和前置条件均满足的动作。一个原因已解决但其他条件未满足时,仍保留对应待办。补事实/补配置不修改真实业务日期,不用统一“重试并成功”按钮替代下列流程。
| 异常类型 | 责任岗位 | 页面动作 | 恢复条件 | 无法处理时 |
|---|---|---|---|---|
| 缺价、缺计费约定、报价冲突 | 报价维护;销售业务主管/成本财务主管 | 查看命中依据、补约定/报价、处理冲突、试算待恢复费用、确认恢复;停用仓历史补价独立审批 | 原业务日期唯一命中,单位/数量依据一致,按 7.12 确认范围 | 保持待定价/报价冲突,不改用其他单位或当前价格 |
| 成本责任待确认 | 业务经办、业务主管 | 返回业务“费用责任”区,确认实际承作方或提交无外部成本依据 | 7.11 对应责任已确认;有供应商时再检查约定和价格 | 保留成本待办;不阻断客户销售侧,不自动判定无成本 |
| 缺数量/来源关系、负库存、重叠期间 | 仓库作业/业务经办、业务主管 | 返回原业务补测量/实收/来源,提交有依据的事实纠错;查看重叠来源 | 事实可验证、单位匹配、历史关系完整;已计费部分通过受控调整 | 保持计费异常,财务不能代填数量或覆盖历史金额 |
| 缺原月份汇率 | 财务经办,按既有汇率维护权限;对应主管确认恢复范围 | 维护原业务月汇率、查看冻结快照、执行 7.12 末段“补汇率恢复”;价格也缺失时先走普通补价 | 正确月份汇率有效;已有价格快照保留不重取,组内已有冻结汇率沿用,改汇率走调整 | 保持待汇率,不用执行月或汇率 1 |
| 财务同步待确认/超时 | 运维/接口维护;业务或财务经办跟进 | 查询命令结果、查看投递记录、按原命令重试 | 收到对应命令可信终态;依赖等待由原处理任务继续推进 | 保持待确认、原有效版本及组内发布占用;不能手工标成功 |
| Finance 明确拒绝 | 业务/费用经办,按原因转相应主管 | 查看拒绝原因、修改事实/主档、重新审核新候选;冻结原因转下一项 | 新候选被 Finance 接受,拒绝记录保留 | 保持拒绝/待财务处理,不换收费身份绕过 |
| 待资金结算、资金冻结冲突 | 财务经办及具有 Finance 相应权限的审核人 | 核对计划/版本/分配;补齐事实后等待原结算命令;调价先申请释放旧计划并查询结果 | 分配完整且金额守恒;改价须旧冻结已释放、活动关联已终止 | 保持待资金结果/冻结冲突,未知结果不解锁、不自动转账期 |
| 商业减免、已出单或已收付差错 | 业务经办申请,财务主管审批/跟进 | 查看原来源/单据、提交调整、记录处理依据;允许受控撤销/更正审批 | 有真实财务处理结果且目标、接受净额与占用一致;或撤销/更正审批后重新核对一致 | 保持待财务处理并暂停该组差额发布;首版无退款/冲销能力时不得标为处理完成 |
| 正价舍入零、双币差额不满足正金额 | 报价维护、财务经办/主管 | 查看明细、累计目标及尾差;未结束范围继续累计,结束时按规则计算最低费 | 双币金额与累计守恒均满足契约;若业务决定免收,须另发有原因的减免/取消申请并按 9.5 审批 | 保持精度异常,不凑最小金额、不改挂月份、不自动免收或发布零/负来源 |
“记录跟进/备注”仅保存沟通与依据,不改变费用、余额、Finance 接受状态或锁定状态。受控撤销商业调整必须保留历史,并重新核对最终目标;不得为了清空待办而删除已批准减免。首版暂不支持的合同算法和跨时区自动仓租进入计费异常,可依据真实合同提交人工费用并使用相同收费身份、占用日期和审核规则,不能与后续自动计算重复收费。
## 十一、分阶段交付范围
阶段是实现和验收顺序,不排除全流程范围。以下均为计划,不把本文修订视为代码或部署完成。
### 阶段 0:先修已有链路的漏发、审核、展示与一致性
阶段 0 开工不再等待新增业务评审,但必须先在代码和契约层冻结以下技术基线:收费身份/候选版本/有效版本模型、费用变更命令与 Finance 结果事件、资金计划及分配模型、统一仓库/供应商身份类型、锁顺序和幂等键。该技术基线是阶段 0 的首个交付物,不得先由各业务生产者各自扩展临时字段。
阶段 0 按以下顺序实施和验收;后序可以在前序契约稳定后并行开发,但不能跳过前序门禁:
| 子阶段 | 实施范围 | 直接完成标准 |
|---|---|---|
| 0A 既有链路与收费身份 | 修换标漏发、拆柜调整身份、派送收付方向;建立人工/自动共用收费身份和免收占用 | 重放、并发和人工补录不重复收费,既有合法完成分支不漏发 |
| 0B 人工审核与聚合 | 草稿/驳回修改、待审工作台、直付证据、业务费用稳定关联和共享/分摊展示 | 人工费用可完整修改重审,业务详情不因只查单一来源而显示为空 |
| 0C Finance 接受结果 | 费用变更命令、Finance 原子接受/拒绝、结果 Outbox/Inbox、有效版本切换 | 投递成功不冒充入池成功;拒绝、超时、乱序和重放均保持双方一致 |
| 0D 资金计划版本 | 计划 ID/版本、收费身份冻结、精确来源分配、扣款/释放结果和旧命令隔离 | 冻结 100 后不能直接按 80 扣款,迟到旧命令不能操作新计划 |
| 0E 商业调整与财务待办 | 不可变减免/取消事实、最终目标、自动重算门禁和待财务处理队列 | Finance 未接受减免时不假记减账,也不会被自动任务按原价补回 |
范围:
- 修正换标所有合法完成分支的费用发布及资金结算;修正拆柜打托费用的项目/业务身份与通用调整校验。
- 派送同项目支持独立应收应付身份,人工费进入审核;先明确转派送动作与财务审核的独立状态。
- 尾程费用按稳定关系聚合,补来源跳转、共享费用/分摊展示;复用柜级费用已有能力。
- 补草稿/驳回修改 API、统一待审页面、版本/幂等和权限;补应付直付表单与证据。
- 建立人工与自动共用的收费身份、免收事实与待处理队列,防止后续自动化重复收费。
- 落地 Finance 接受/拒绝回传和来源变更并发裁决;保留最后有效版本,冻结费用转待财务处理。
- 将生效中的资金冻结计划、费用版本和金额纳入统一冻结裁决;来源尚未生成时也先锁定收费身份。补精确资金分配和计划代次,资金未确认前不得进入对账候选;调价必须先确认释放旧冻结,迟到旧结算指令不能命中新冻结。
- 为商业减免建立不可变审批事实、作用范围和目标版本,与规则纠错区分;财务未接受或拒绝时暂停该组自动发布,阶段 1/2 的累计算法消费同一批准记录。
- 按 10.4—10.5 落实人工费用/商业调整的岗位分工、自审限制、数据范围,以及财务结果查询、拒绝和冻结异常处理动作;不能通过备注清除待财务处理。
完成标准:新建业务可分别验证“未生成、待审核、待确认、已接受、已结清、已拒绝”;换标合法完成不漏发,同一派送项目应收应付各一笔;人工费可以驳回修改重审;已冻结来源的调整与出账、资金扣款/释放竞态不会让双方有效金额不一致。冻结 100 后不能直接以来源 80 扣款,旧计划指令不能扣新计划;批准减免不能因 Finance 尚未接受而被自动重算补回。不是只验证页面有数据或 Outbox 已发送。
### 阶段 1:退货、销毁和固定滞留费
范围:
- 退货按票处理费;
- 退货收货操作费,按实收件数及真实业务月份累计原币/CNY 目标后发布差额;全部签收或人工结束时仅补一次整单最低费,不启用未经定义的到货批次固定费;
- 退货自动结束、业务主管人工结束、结束后迟到实收和受控重开按 5.6 实施;重开不产生第二个收费身份或第二次最低费;
- 销毁正式完成后的费用;现有单据已展示金额与最终收费必须一致,报价变更不能静默改已确认单价;
- 滞留固定处理费,每次真实暂扣至解除形成独立期间,按已批准业务约定保存当次收费/明确免收标记;标记收费的期间解除后只收一次固定费,不按暂扣天数或技术操作次数增加;重复真实期间各按当次标记处理;
- 标准费用项目和结构化报价最小字段;按 7.2、7.5—7.12 实现真实仓候选、多仓独立报价、销售/成本计费约定、实际供应商责任确认、草稿复制与版本审批、停用仓补价及普通待定价恢复。
- 保存校验、启用、试算与运行取价共用业务条件;未明确计费依据或缺对应计量事实时进入异常,不能自动选择较低价或切换单位。
- 配置范围限定 14.2,报价/约定审批、历史补价、暂停/恢复及各类异常按 10.4—10.5 的职责与条件执行。
完成标准:上述费用从业务事实生成应收及已配置真实成本责任的应付,跨区得到明确接受结果;未冻结费用可调整/作废,冻结费用拒绝并进入待财务处理。缺报价/汇率不丢业务事实,免收不发零金额来源,拆分同样事实的 PDA 提交不改变金额;跨月实收和次月人工结束不重复最低费、不改变业务汇率月份。停用仓真实历史缺价可补齐且不恢复新业务收费。
### 阶段 2:仓租闭环
范围:
- 退货与普通入库的原始计费分量、包装/托盘来源份额和实际数量事件;
- 每日占用事实、时区、部分出库、合拆箱与转仓;客户销售及各实际供应商成本分别确定免费期、日收费资格和计费归属;
- 月度最低收费累计、按角色/责任计费库龄逐段累进、跨月切分、清零及补结算;复用双币累计转换,应用已批准商业调整,不能重算追回减免;
- 仓租客户应收和供应商成本;
- 待定价、异常和补结算工作台。
完成标准:6.6 算例、重叠期间、迟到事实、相同输入重算和重复发布均有直接验证;每笔月度费用可追溯到历史数量、报价与汇率。最低收费不随技术批次数或任务次数增加,合箱后份额守恒,结果未确认时不重复发布累计差额。客户转仓日只收一仓不影响两个供应商按各自合同计成本;规则费 100、批准减免 20、新增规则费 10 后,最终目标为 90。跨时区及超出首版模板的期间显示异常,不宣称自动计费覆盖。
### 阶段 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、权限与直接受影响检查;不得仅按页面数量估算范围。
阶段开工契约至少冻结以下模型及唯一约束;它们是开发团队的技术设计交付,不要求业务方另写施工文档:
- 收费身份、业务事实认领、免收占用、候选版本、Finance 已接受有效版本及唯一待确认变更;
- 计费约定、报价版本、场景编码及其“场景—项目—单位”适用矩阵;
- 成本责任、实际供应商、责任期间及无外部成本审批事实;
- 费用变更命令、Finance 接受结果、事件版本、快照哈希、乱序/重放和拒绝分类;
- 资金计划 ID/版本、冻结记录、来源版本分配、结算/释放终态及旧指令隔离;
- 仓租原始分量、包装/托盘来源份额、每日占用、价格资格、计算版本和期间占用。
身份类型统一规则:业务数据库可以使用适合本服务的存储类型,但跨端 DTO 和跨区事件中的仓库、供应商、客户及业务 ID 一律使用十进制字符串;服务端进入领域模型时严格解析和校验,不接受名称、FBA 目的仓代码或其他编号代替主档 ID。Lastleg 的实际作业仓、报价仓和库存仓必须引用同一 Warehouse 主档身份;供应商必须引用启用的统一供应商主档并保存名称/分类快照。
阶段 2 另设库存事实门禁:现有普通库存流水以包裹余额为主,不能直接宣称能够计算 `ITEM_DAY/PALLET_DAY/CBM_DAY` 或还原合拆箱来源。进入仓租编码前必须逐个业务写入点证明能够形成 6.2 所需原始分量、数量/体积/托盘事实、来源份额和事件时间;缺失部分先补库存事实模型及回归,再实现仓租计算。不得以当前余额、默认体积或 FIFO 猜测替代。
代码实施遵守当前工作区/当前分支、最新初始化基线和既有服务数据库边界;本方案不包含历史测试数据迁移、回填、旧协议兼容或自动部署授权。新增/变更 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 | 全仓覆盖、单仓明细、单项历史和真实业务试算可查询;试算不产生费用,历史费用不因最新报价变化而改变 |
| A28 | 0 | 先冻结 100、来源后到也锁定相同收费身份;冻结中调整为 80 被拒绝,释放确认后才能提交新价/新计划;释放失败或超时不得自动转月结 |
| A29 | 0 | P1=100 释放后建立 P2=80;迟到的 P1 结算不能扣 P2,P2 按绑定费用版本仅扣 80;同计划扣款与释放并发只允许一个成功 |
| A30 | 0/2 | 规则仓租 100、批准减免 20 且 Finance 接受 80,新增规则费 10 时只补 10、最终 90;审批待处理或 Finance 拒绝时暂停该组自动发布,不撤销减免、不换任务重收;最低费不补回减免 |
| A31 | 1 | 同月 0.335/件的 3 件一次/三次确认最终均 1.01,分次增量为 0.34、0.33、0.34;重复请求、等待 Finance 结果和重跑不重复收费 |
| A32 | 1 | USD 1/件、整单最低 5,9/10 月各收 1 件,汇率 7/7.5;未结束只收基础费,结束后仅在 10 月补 USD 3,最终 USD 5/CNY 37;11 月结束不改汇率,重试不重补;正价舍入零仍可触发最低费 |
| A33 | 2 | 同日 A→B,客户仅收 A 仓 2,供应商合同分别应收 1/3 时成本合计 4;客户免租 7 天、供应商免租 0 天时,首日客户为 0 而供应商正常计费;不同真实供应商不会被日唯一键误去重 |
| A34 | 1/2 | 同场景存在 PALLET_DAY/CBM_DAY 且未划分互斥计费约定时拒绝保存/启用;已明确业务依据时,保存冲突检查、试算和实际取价命中相同规则;不能按较便宜单价或现有测量字段猜选 |
| A35 | 1 | 仓库 9 月末停用,10 月可凭独立补价权限为 9 月真实待定价事实补价;只覆盖确认范围并保留 9 月汇率,不能覆盖已确认/免收费用、为停用后新作业启用报价或重复发布;普通维护权限不足以补价 |
| A36 | 1/2 | 在计费约定入口为 A 仓配置公共立方天、客户甲专属托盘天;客户甲新实收自动绑定托盘天且 PDA 不可改选,缺托数留异常,不能回退公共立方价;报价行单位与约定不符不能生效 |
| A37 | 1/2 | 客户甲新约定改为立方天,旧库存仍绑定原托盘天并从原价格序列取当天价格;新旧业务分别唯一命中;启用新约定不自动结束旧价,主动结束时预览列明受影响存量并转待定价 |
| A38 | 1/2 | 同仓有多家供应商时,默认值只预填,未经业务确认保持成本责任待确认;经确认承作方后查其成本价;已确认无外部成本须有主管审核及原因,自营仓和未填供应商不能自动免成本 |
| A39 | 1/2 | 更正已确认实际供应商须回原业务留依据并审核;已计价费用走调整、不换身份重复生成;同仓多家真实成本责任分别留明细,不能因为另一家有价就换承作方 |
| A40 | 1/2 | 普通仓补齐覆盖原业务日期的价格后先预览再确认,只恢复选定的未计价/未免收事实;新价日期不覆盖旧事实则不可恢复;已处理或预览版本变化要求刷新,重复确认不重收,独立组部分成功可追踪 |
| A41 | 1/2 | 费用已有 USD 10 的价格/数量快照,仅缺原月汇率;补原月 7 后执行补汇率恢复得到 CNY 70,即使当前报价变为 USD 12 也不重取;已有冻结汇率不被覆盖,累计组仍扣除已接受净额 |
| A42 | 0/1/2 | 报价、人工费、成本责任例外、历史补价、减免的申请人及实质修改人不能终审自己的版本,兼岗无例外;无合资格人保留待审;成本查询/试算/导出按专门权限及数据范围拦截,权限管理员不因管理身份查看成本 |
| A43 | 0/1/2 | 按 10.5 从每类异常实际进入对应修复入口;多阻断项只解决一项时不发布;超时以同命令继续,明确拒绝用新候选;备注不能假结清,冻结释放未确认及退款未支持时保持待处理 |
| A44 | 1/2 | 不支持单位/算法、空免租/最低费参数、阶梯断档/重叠不能启用;明确无免租/无最低费可用,零价须有免收依据;同月换币不能拆两组最低费,首版之外合同进入人工处理且不与自动收费重复 |
| A45 | 1/2 | 审批暂停客户甲在 A 仓某项目后,新事实待人工定价,即使存在公共价也不回退收费;客户乙与其他仓按实际暂停范围不受影响;恢复开关不自动补收积压,须预览确认且不改写已有快照 |
| A46 | 2 | 原始库龄第 20 天的一托交给供应商 B;B 免费 0 天、责任起点选交接日,阶梯 1—7 天为 1/托天、8 天起为 2,则交接日成本 1;另一个独立试算中起点选原始实收日则为 2,客户库龄均仍为 20;启用后不得换起点重算历史 |
| A47 | 0/1/2 | `scenarioCode` 只允许 4.4 的封闭编码;场景、费用项目、单位不匹配时保存/启用/正式计费均拒绝;页面、试算和任务使用同一适用矩阵,不能靠自由文本或有值字段绕过 |
| A48 | 1 | 退货预计 100 件实收 80 件后由有权业务主管填写原因人工结束,只结一次整单最低费;重复结束幂等。结束后迟到 10 件先进入异常,未经重开不自动收费;另一名主管审核重开后沿用原收费身份累计至 90 件,不产生第二次最低费。已冻结时差额进入待财务处理 |
自动化接口/计算检查与页面验收分开记录。Admin/Client 页面按 1920×1080、100% 缩放执行人工操作;当前无本稿变更后的人工截图,状态为“待人工截图确认”。真实 HTTP、数据库操作和部署仍需对应轮次明确授权,本次文档修订不执行。
## 十四、首版规则、配置边界与后续范围
### 14.1 固定业务规则
以下将原 R1—R19 推荐项及本次新增 R20—R21 收敛为本版产品需求,保留编号便于追踪;不再由开发人员自行选择不同算法。阶段 0—2 为首版完整范围,按第十一节顺序交付;阶段 3 保留为后续业务接入。阶段 0 的独立缺陷修复可先交付,不等于首版所有费用已完成。
| 编号 | 事项 | 本版规则 |
|---|---|---|
| R1 | 退货“一票” | 一个退货单 `returnNo`;不按 SKU、包裹或 PDA 确认次数增加票数 |
| R2 | 按票费触发 | 首个有效签收完成产生一次;未收货取消不收费 |
| R3 | 退货操作费 | 首版按实收 `ITEM`,启用/明确免收及价格按仓配置;按真实月份累计舍入,整单结束后只补一次最低费并归最后正价实收月 |
| R4 | 销毁触发与金额 | 正式 `complete` 后收费,沿用已确认数量/单价;仅审核通过不收费 |
| R5 | 客户仓租库龄 | 实际入仓当地日期为第 1 天;包装转换、同客户转仓不重置原始库龄 |
| R6 | 同日入出 | 客户计占用 1 天,免租优先;免费 1 天则当日 0,不触发最低费 |
| R7 | 客户仓租数量 | 收货日实收量,后续日日初量;出库当日仍计、次日减少,日界线整点按 6.3 处理 |
| R8 | 仓租结算周期 | 仓库当地自然月结;库存清零结清已发生尾期,同月后续新增仍并入同一累计范围 |
| R9 | 缺价与恢复 | 待定价,不当作 0;按 7.9/7.12 的范围预览、确认恢复,不自动重收已计价/免收事实 |
| R10 | 审核 | 人工费/异常调整必须审核;标准费用只有获批规则明确启用自动审核才自动发布,默认关闭;按 10.4 限制自审 |
| R11 | 供应商成本 | 模型及权限独立支持;阶段 1 已交付项目与阶段 2 仓租按已确认真实责任生成成本,责任未明留待办;阶段 3 业务按后续范围接入 |
| R12 | 仓租阶梯 | 首版支持不分阶梯或按各价格角色/成本责任冻结的计费库龄逐日落档、逐段累进;客户汇总数量阶梯及整量套档列为后续范围 |
| R13 | 免费期与自然日 | 使用仓库当地自然日,夏令时仍算一天;客户与各供应商分别配置免费天数/成本起点,按 14.2 支持的日模板执行 |
| R14 | 库存或历史事实异常 | 停止受影响组自动发布,按 10.5 修正事实或受控调整,不自动发布负仓租 |
| R15 | 仓租最低费范围 | 客户+仓库+项目+角色+原币+自然月,成本另分实际供应商;同月累计一次,全免租/明确零价不触发,批准减免在最低费之后应用 |
| R16 | 转仓 | 客户同时区同日归首个实际存放仓,目标次日计;跨日目标从实际到仓日计;供应商按实际责任及各自模板计日,可两仓均有成本。跨时区自动分日首版不支持 |
| R17 | 合拆箱/托盘 | 首版日模板次日起按新包装计量,以确认件数/体积分份额;份额守恒且保留原始库龄,接受小数箱天/托盘天;不支持的供应商转换日合同转人工处理 |
| R18 | 存量调价与舍入 | 未形成计价快照的日单价取当天有效报价,已有单位/免费期不变;已计价历史仅受控调整。按原月冻结汇率和双币累计目标结算,重算保留批准减免 |
| R19 | 冻结与已收付差错 | 冻结中先确认释放再调价,旧指令不操作新计划;已出单/已收付先拒绝并转待财务处理,首版不交付实际退款或负向冲销 |
| R20 | 退货计费结束与重开 | 全部预计实收且无在途签收时自动结束;不足时仅有独立权限的业务主管可填写原因人工结束。结束后迟到实收先留异常,经另一名合资格主管审核重开;沿用原收费身份和累计目标,不再收第二次最低费,冻结差额转待财务处理 |
| R21 | 业务场景编码 | 首版只允许 4.4 的封闭 `scenarioCode` 及场景—项目—单位组合;保存、审批、试算、计费和恢复共用同一矩阵。新增编码或组合先修改需求契约和验收,不允许各模块自造字符串 |
R15 不套用于退货操作费;退货最低费按 5.5 在整单结束后补足一次,结束与重开按 5.6/R20。任何需求变更须同时修订正文、规则表、算例和验收,不能只修改 R 表留下两套收费口径。
### 14.2 每仓可配置的参数及支持边界
| 参数 | 首版配置规则 | 缺失或超出范围 |
|---|---|---|
| 实际仓、客户、供应商及适用场景 | 7.10—7.11 的主档引用和结构化业务条件;销售专属约定/价格优先本仓公共规则 | 缺责任或缺约定留对应待办,不猜供应商、不跨仓取价 |
| 业务场景编码 | 仅使用 4.4 的封闭编码和适用矩阵;由真实业务事实带入,页面不可自由输入 | 新编码/组合先更新需求、契约和验收,未定义场景不得启用自动计费 |
| 项目与单位 | 退货按票费固定票、操作费固定件;仓租可选包裹天/托盘天/立方天,数量来源须真实;其余项目只允许第四节已定义并有对应事实的单位 | 未接入业务可保存资料并显示未接入,不启用自动收费;按件天、真实到货批次等不冒用现有单位 |
| 单价、免费天数、最低金额 | 单价非负、最多 6 位小数;最低金额最多 2 位小数且非负,作用范围固定按 R3/R15;零价须明确免收及原因;免费天数为非负整数。“无免租/无最低费”须明确选定,不把空白按 0 处理 | 缺参数不能启用;真实金额由业务维护,算例不是默认报价 |
| 仓租日资格与库龄起点 | 客户按 R5—R7/R16/R17 固定模板;供应商独立使用“实际责任占用自然日、入仓/离仓日均计、日数量与包装转换按 6.3/6.5”的模板,计费库龄起点可选原始实收日或本仓本供应商责任开始日,同时决定其免费期和阶梯档位。各供应商免费天数、单位和价格独立 | 成本合同要求跳过首/尾日、按小时或其他包装转换日规则时,不套客户模板,转受控人工计费 |
| 库龄阶梯 | 可关闭;启用时填写从第 1 天起连续、不重叠的整数天区间及各段单价,最后一段无上限;逐日按实际库龄命中一段,先应用免费期,不将全部库龄套入最终档 | 缺档、交叉档、数量阶梯或整量套档不能启用 |
| 币种与汇率 | CNY/USD,原币单价及汇率精度满足 7.3,结算 CNY;退货组固定单一原币,仓租同月最低费范围内不得用换币拆两组重复最低费 | 缺汇率留待办;仓租换币从新自然月生效,中途需换币走受控调整 |
| 自动审核 | 初始关闭,销售业务主管/成本财务主管可随规则审批开启;只适用于确定性自动计算 | 人工金额、异常及调整始终走人工审核 |
| 日期、调价与停止收费 | 按实际仓当地日期,开始/截止含当天;新版本先审核,再按日期生效;免收与暂停自动计费分别表达 | 停用专属价可能回退公共价,必须预览影响;不能把删价当作停止收费 |
报价“暂停自动计费”按仓 + 角色 + 客户/实际供应商 + 项目 + 适用场景及生效期间设置,由对应报价主管审批;公共范围可覆盖本仓该销售项目所有客户,具体范围在预览中列清。暂停判断先于价格回退,期间新事实保存为待人工定价,不停止真实作业、不生成免收记录;已发布命令继续取得真实结果,不当作已撤回。恢复该开关后,新事实正常取价,暂停期间积压事实仍经 7.12 预览确认,不自动补收。已有计价快照的费用不由此开关改价或作废。
### 14.3 后续范围与业务配置清单
首版不自动处理:跨时区转仓的仓租归日、按小时/满 24 小时收费、客户汇总数量阶梯/整量套档、锁定入仓单价合同、未经建模的到货批次/包裹操作费、任意折扣公式、实际退款和负向冲销。涉及这些合同的真实事实保留,并按 10.5 进入人工处理;没有合法处理能力的保持待处理,不能假记结清。第十一节阶段 3 的其余作业及海外本土业务保留为后续接入范围。
启用实际收费前由业务完成:各实际仓报价及计费约定、成本责任默认值和真实委托依据、原业务月汇率、岗位人员与数据范围配置。以上是经营参数与授权配置,不要求在本文填入真实客户价格或人员名单;技术团队不得用示例价、自动授予角色或默认免收代替。
## 十五、开发交接与需求变更
1. 本文自 V0.5 起作为开发基线;开发团队可立即按第十一节从阶段 0 技术基线和 0A 开始,之后依次完成 0B—0E、阶段 1 和阶段 2。阶段 3 后续接入,不以个别通用接口通过代替全业务完成。
2. 表字段、索引、内部类名及具体接口由开发团队设计,遵守既有服务边界、状态/金额契约和权限要求;第十二节用于核对受影响模块,不再要求需求方补一份技术施工文档。
3. 实施时将第十三节每项验收对应到真实业务入口、计算/事件结果与页面;按阶段报告通过、未通过和未覆盖范围,保留业务事实及金额证据。
4. 接口/事件/权限变化同步调用端、Gateway、OpenAPI、IAM 及受影响契约。实际账号分配、真实报价启用、部署与环境操作另按对应流程执行,本文只定义目标行为。
5. 如需新增合同算法或改变 R1—R21,先更新对应需求条款、配置范围、算例和验收,再实施;V0.5 不再要求另一轮完整业务评审才能启动阶段 0,但真实报价、账号授权、部署和环境验收仍按各自门禁执行。
## 十六、与现有契约的关系
- Finance 服务边界、费用来源唯一键、版本和跨区域 Outbox/Inbox 机制继续遵循 [Firstleg-Finance 跨服务契约](Firstleg-Finance跨服务契约.md)。
- 费用进入统一费用池后的对账、应收应付与结算继续遵循 [财务费用入池 P0 闭环](财务费用入池P0闭环.md) 和 [财务对账结算 P1 闭环](财务对账结算P1闭环.md)。
- 本文专门补充海外仓费用如何形成业务费用事实;与历史盘点冲突时,以后续评审确认和实现契约为准。
- 本稿是需求基线,不改变既定服务边界、资金主账和区域通信约束。接受结果回传、资金计划冻结与版本分配、商业调整事实和双币累计差额属于新增目标;开发实施时须同步修订受影响契约及其全部生产/消费端,不能仅凭本文标记闭环完成。
## 附录 A:当前实现证据入口
以下入口用于复核“当前状态”;代码可能随实施变化,不反向证明本稿新增目标已经完成。代码入口均相对本文件可访问。
| 事实/问题 | 证据入口与定位符号 |
|---|---|
| Finance 待出账范围、应付结算 | [FinanceQueryService](../../baiyue-firstleg/finance/src/main/java/com/baiyue/finance/service/FinanceQueryService.java)、[FinanceSettlementService](../../baiyue-firstleg/finance/src/main/java/com/baiyue/finance/service/FinanceSettlementService.java) |
| 正金额、冻结检查与费用后到的资金关联 | [BusinessFeeSourceEventService](../../baiyue-firstleg/finance/src/main/java/com/baiyue/finance/service/BusinessFeeSourceEventService.java) |
| 资金结果后到的费用关联 | [WalletCommandEventService](../../baiyue-firstleg/finance/src/main/java/com/baiyue/finance/service/WalletCommandEventService.java) |
| 来源字段、审核发布、调整和作废 | [OverseasFeeSource](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/entity/OverseasFeeSource.java)、[OverseasFeeSourceService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/service/OverseasFeeSourceService.java) 的 `create/submit/review/adjust/voidSource` |
| 通用业务归属校验及当前接口动作 | [OverseasFeeBusinessGuard](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/service/OverseasFeeBusinessGuard.java)、[PlatformOverseasFeeSourceController](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/controller/PlatformOverseasFeeSourceController.java) |
| 桥接接收与实际入池的差别 | [OverseasFeeOutboxRelay](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/service/OverseasFeeOutboxRelay.java) |
| USD/CNY 与按业务月份转换 | [OverseasFeeCurrencyConverter](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/service/OverseasFeeCurrencyConverter.java) 的 `convert` |
| 尾程详情只查本业务类型,人工费只提交 | [LastlegOrderService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/service/LastlegOrderService.java) 的 `detail/createFee` |
| 换标完成分支差异 | [RelabelApplicationService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/service/RelabelApplicationService.java) 的 `changeStatus/confirmCompletion` |
| 拆柜打托应收及通用调整身份不一致 | [DestuffingPalletCostService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/DestuffingPalletCostService.java) 的 `fee`,联查 `OverseasFeeBusinessGuard` |
| 派送人工费用与仅按项目去重 | [DeliveryTransferService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/service/DeliveryTransferService.java) 的 `validateTransferFees` 及 `publishApproved` 调用 |
| 退货技术批次与仓租起点 | [ReturnReceiptService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/service/ReturnReceiptService.java) 的 `confirm`、[ReturnReceiptBatch](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/entity/ReturnReceiptBatch.java) |
| 合箱来源与实际数量 | [ReturnInventoryService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/service/ReturnInventoryService.java) 的 `merge/createReceiptCarton` |
| 销毁现有金额与正式完成节点 | [CargoDiscardService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/discard/service/CargoDiscardService.java) 的 `create/review/complete` |
| 暂扣收费标记与历史 | [LastlegOrderCommandService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/service/LastlegOrderCommandService.java) 的 `hold` |
| 尾程人工费用页面和柜级审核入口 | [LastMileOrderDetailView](../../apps/admin-web/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue)、[ContainerLastLegFeesPanel](../../apps/admin-web/src/modules/container-loading/components/ContainerLastLegFeesPanel.vue) |
| Finance 来源展示与海外来源动作提示 | [FinanceCustomerArapView](../../apps/admin-web/src/modules/finance/pages/FinanceCustomerArapView.vue) |
| 现有报价入口与增改查界面 | [adminNavigation](../../apps/admin-web/src/core/navigation/adminNavigation.ts)、[OverseasQuotesView](../../apps/admin-web/src/modules/overseas-master-data/pages/OverseasQuotesView.vue) |
| 报价仓候选、启停及停用后原地编辑 | [OverseasQuoteService](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/service/OverseasQuoteService.java)、[DomesticPartnerWarehouseClient](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/masterdata/quote/client/DomesticPartnerWarehouseClient.java) |
## 附录 B:文档交接核对索引
1. 第十四节:首版固定规则、每仓参数、后续范围与业务启用前配置清单。
2. 4.4、7.5—7.12、10.4—10.5:封闭业务场景、多仓配置、计费约定、实际供应商、补价恢复、岗位权限及异常操作。
3. 5.5—5.6、6.6、9.4—9.5:退货累计金额及结束/重开、仓租金额、资金冻结、商业减免和跨区确认。
4. 第十一至十三节:阶段 0A—0E、受影响模块与 A01—A48 验收;第三节和附录 A 仅证明实现现状,不能当成新增目标已交付。