From 37b143cc2e83464c9f9031ed329b466ac1105fef Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 23 Sep 2026 17:47:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AI工程执行与协作约束.md | 2 +- 业务快速索引.md | 2 +- 数据库版本迁移与Jenkins自动发布方案.md | 23 +- 财务管理/README.md | 1 + 财务管理/海外仓费用统一接入阶段0技术契约.md | 229 ++++++++++++++++++++ 5 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 财务管理/海外仓费用统一接入阶段0技术契约.md diff --git a/AI工程执行与协作约束.md b/AI工程执行与协作约束.md index 6d838d6..4dec714 100644 --- a/AI工程执行与协作约束.md +++ b/AI工程执行与协作约束.md @@ -28,7 +28,7 @@ ## 联调、部署与数据库 - 默认只准备代码、验证结果和人工部署步骤,不触发 Jenkins、不启动本地 Java/Nacos/数据库。开发全流程总控可按 `开发环境独立任务协作登记.md` 的授权操作开发数据库、部署开发环境并执行开发环境真实 HTTP;登记专项可按 `独立任务协作登记.md` 的持续授权查询和修改用户指定的测试数据库。两类授权不得跨环境复用,也不得自动扩大到 Jenkins 或生产环境。 -- 只有用户在当前轮明确授权指定环境、服务和提交时,才可部署或执行 HTTP 验收;测试数据库的读写例外仅适用于登记表中已持续授权的总控与专项,并遵守其中的职责和破坏性操作门禁。 +- 只有用户在当前轮明确授权指定环境、服务和提交时,才可部署或执行 HTTP 验收;同一环境和服务的非破坏性写入可复用本轮授权,删除、重置、执行 SQL、部署或发布仍逐项授权。测试数据库的读写例外仅适用于登记表中已持续授权的总控与专项,并遵守其中的职责和破坏性操作门禁。 - 环境地址、凭据和 Token 不写入源码或 `AGENTS.md`。接口不可用或契约不一致时记录路径、状态、错误码、`requestId`/`traceId` 和阻断原因,不回退到模拟成功。 - 测试环境联调、部署和验收命令读取 `测试环境Jenkins部署指南.md`;开发全流程只按 `开发环境独立任务协作登记.md` 的授权与目标项目指引执行,不把测试 Jenkins 流程当作开发部署入口。 diff --git a/业务快速索引.md b/业务快速索引.md index de28a07..4be0900 100644 --- a/业务快速索引.md +++ b/业务快速索引.md @@ -85,6 +85,6 @@ | 海外仓库与通用资料 | `docs/海外仓业务/README.md` | 全部仓库主档进入 Admin `modules/warehouses/` 与国内 `warehouse/`;海外库位/托盘/锁进入 `warehouse-overseas-service/` 并引用国内 warehouseId;报价、汇率、车辆按海外服务实际契约 | | 国内出仓后船节点 | `docs/海外仓业务/README.md` | Admin `modules/port-schedules/`、`ocean-bookings/`、货柜详情;Backend `firstleg/portschedule/`、`integration-service/`;从确认国内出仓查询至目的港到达、提柜和还柜。节点按 `containerBookingId` 柜级聚合,跨区事件使用 `tenantId=0` 平台技术范围,不携带或校验客户 | | 海外出库、排车、派送、异常与回访 | 当前海外履约契约 | Admin `modules/overseas-warehouse/pages/OutboundsView.vue`、`DeliveryOrdersView.vue`、`ExceptionOrdersView.vue`、`CustomerVisitsView.vue`;Backend `lastleg-service/dispatch/`、`delivery/`、`dropship/`、`exceptionorder/`、`customervisit/`;统一经 `gateway-overseas/`。异常单按 `PENDING → PROCESSING → COMPLETED` 流转,处理完成必须引用归属为 `OVERSEAS_EXCEPTION_EVIDENCE` 的证据;派送退回只从原出库拣货事实选择可退明细,退回海外仓时先把实收恢复到指定真实托盘/库位,再原子完成异常单并将派送置为 `RETURNED` | -| 海外业务费用来源与客户财务 | 财务契约、`docs/跨区域认证与服务通信契约.md` | 海外入仓、采购、美国卡车、本土散板和海外仓服务费由 `lastleg-service/financefee/` 校验真实业务归属并版本化审核;通过 `BUSINESS_FEE_SOURCE_CHANGED` 完整快照、`event-bridge-service/` 和国内 Finance `/internal/finance/v1/business-fee-source-events` 可靠入池。`PAYABLE + DIRECT_PAID` 进入已确认成本且不得再次进入 AP 待结算;Client 仍从 `modules/finance/` 读取获准客户财务,不自动开放平台费用来源维护页 | +| 海外业务费用来源与客户财务 | 当前实现查财务契约与跨区域通信契约;阶段 0A—0E 开发再读 `docs/财务管理/海外仓费用统一接入阶段0技术契约.md` | 当前 V1 由 `lastleg-service/financefee/` 校验海外入仓、采购、美国卡车、本土散板和海外仓服务费,通过完整快照、Event Bridge 和 Finance 内部入口入池;阶段 0 目标改为收费身份/候选版本、Finance 接受或拒绝结果事件及版本化资金计划。必须沿代码确认落地范围,不把技术契约当成已实现状态;Client 仍只读取获准客户财务 | 散货托盘码生成、打印与跨区传递:Admin `modules/loading-lists/components/PalletLabelPrintDialog.vue`;Firstleg `LoadingPalletLabelService`、`LoadingCompletedOutboxService`;Lastleg `LastlegSourcePalletMapper`、`InboundPlanService`。从各项目最近指引继续定位;散货 FBA 标签与一件代发实装托盘分别取各自冻结事实。 diff --git a/数据库版本迁移与Jenkins自动发布方案.md b/数据库版本迁移与Jenkins自动发布方案.md index 0235c97..65dafa3 100644 --- a/数据库版本迁移与Jenkins自动发布方案.md +++ b/数据库版本迁移与Jenkins自动发布方案.md @@ -182,7 +182,7 @@ baiyue-firstleg/ ## 6. 自动编号和文件命名 -SQL 迁移使用每个 schema 内递增的整数序号,由创建工具生成。业务版本、Git commit 和 Jenkins 构建号只用于发布追踪,不参与 SQL 序号计算。无需开发人工决定“这次是 0.0.10 还是 0.0.11”。 +2026-09-22 确认:SQL 迁移保持 `V1、V2、V3、V4、V5……`,每个 schema 独立递增,由创建工具生成,不采用时间戳编号。序号随变更自然增长,不因位数增加而重置、归零或重新编号。生产发布版本、Git commit 和 Jenkins 构建号只用于发布追踪,不参与 SQL 序号计算。 ```text migrations/cn/baiyue_order/V1__add_order_reference.sql @@ -225,6 +225,24 @@ migrations/cn/baiyue_auth/V1__create_login_audit_table.sql - 同一库内按完整版本链推进,不按某个服务或某个文件跳过中间版本。该库随包包含的其他待执行变更必须一并评审;尚不具备发布条件时阻断本候选,不通过删文件、临时降低目标或开启乱序绕过。 - 例如只发布 Auth,且与 Firstleg 无依赖,则只核验并迁移 Auth 的必要库。同一提交中 Firstleg 的待执行 SQL 不被带入;若 Auth 确实依赖 Firstleg 的新结构,则先补齐发布范围和测试证据再发布。 +### 6.3 功能分支与生产发布编号 + +以下为确认的发布工作流;跨分支检查和发布编号自动分配尚待流水线实现,不代表当前工具已经提供这些门禁。 + +| 记录 | 示例 | 增长规则 | +|---|---|---| +| 单库 SQL 迁移编号 | Auth 的 `V1`、`V2`;Order 的 `V1`、`V2` | 该库新增数据库逻辑变更时自动生成;普通提交、重复构建和重复部署不增加 | +| 生产发布版本 | `release-1`、`release-2` | Jenkins 为新的生产发布候选自动分配,不要求开发手工维护版本文件;只有发布成功才更新当前生产版本 | + +生产发布版本与 SQL 编号不绑定。例如 `release-12` 可以对应 Auth `V3`、Order `V7`;纯代码发布仍有新发布版本,但数据库目标不变。发布编号须在受保护记录中唯一分配,失败编号不回收;同一制品重试沿用原发布编号,修改代码、SQL 或其他制品内容后分配新编号并重新验证。`release-13` 失败时保留失败记录,当前生产版本仍为最近成功版本;各库和服务的实际状态另行记录,不能据此假定没有发生部分更新。 + +1. 功能分支从最新 `main` 创建,代码与 SQL 在同一分支维护;这里约定后续团队流程,不自动创建或切换本次工作区分支。 +2. 进入共享测试前,拉取并合并最新 `main`,检查同库重复编号和执行顺序。冲突只调整尚未冻结、未在保留历史环境执行的草稿;成功文件不改内容、不改编号,修复使用新增迁移。冻结失败候选只能按第 13.2.1 节处理。 +3. 两人可以并行开发;共享测试同一时间只验收一个待合并功能。前一功能测试通过、合并并完成发布或处理失败后,下一功能同步最新 `main` 再进入测试,避免未合并 SQL 污染其他功能的验证起点。 +4. 测试结果绑定提交和 SQL 哈希;合并前重新检查 `main` 是否变化,变化时同步并重新验证,不能仅凭“以前拉取过 main”放行。 +5. 合并后的 `main` 构建正式候选并再次自动验证;生产使用该正式候选原制品。功能分支测试证据不自动等同于合并后候选证据;已成功的 SQL 保持原编号及内容,由数据库历史决定跳过或执行。 +6. 发布记录绑定 `release-N`、`main` 的完整提交、镜像 digest、SQL 清单及各库版本,并保存成功发布的 Git 标签。`main` 表示已合并代码,实际生产版本以成功发布记录为准,不通过分支名称推断数据库历史。 + ## 7. 迁移类型 ### 7.1 版本迁移 @@ -581,7 +599,7 @@ MySQL DDL 可能已隐式提交,不能假定整个文件自动回滚。按以 - Jenkins 构建号。 - Git commit 和镜像标签。 - 发布身份、清单/SQL 包 SHA-256、各镜像 digest、审批及发布锁状态。 -- 候选制品身份、可选的业务发布标签,以及对应测试通过记录;不维护独立手工 SQL 发布版本。 +- 候选制品身份、生产发布版本 `release-N`、发布状态及对应测试通过记录;不维护独立手工 SQL 发布版本,编号规则见第 6.3 节。 - 环境与区域。 - schema 名称。 - Flyway 镜像版本。 @@ -651,6 +669,7 @@ MySQL DDL 可能已隐式提交,不能假定整个文件自动回滚。按以 - 实现 `plan/run` 及分阶段校验配置,在获授权的隔离数据库验证原始 SQL、首次执行、重复执行、结构断言与失败恢复;验证单服务范围隔离,并用应用预期结构及实际读写测试发现漏写迁移。 - 单服务 Job 先支持构建与部署解耦;总控固定为“全部目标镜像就绪 -> SQL 阶段 -> 同批镜像部署”,此能力必须先于共享测试接入完成。 - 全部独立部署入口纳入环境锁和候选资格校验,补齐归档保护、镜像保留、未决状态及撤销记录;禁止旧 Job 绕过新的 SQL 门禁。 +- 接入第 6.3 节的 main 同步检查、分支编号冲突检查和合并后候选验证;自动分配并保护 `release-N`,同一候选重试不换号,成功后更新生产版本和发布标签。 - 对从未成功、未进入生产的失败候选验证第 13.2.1 节修订链;对已成功或生产尝试过的文件验证例外被拒绝。 ### 阶段 D:共享测试完整演练 diff --git a/财务管理/README.md b/财务管理/README.md index 9fb6f51..2d8a5f4 100644 --- a/财务管理/README.md +++ b/财务管理/README.md @@ -63,6 +63,7 @@ 详细设计材料: - [海外仓费用统一接入财务评审方案](海外仓费用统一接入财务评审方案.md) +- [海外仓费用统一接入阶段0技术契约](海外仓费用统一接入阶段0技术契约.md) - [财务业务操作流程图](财务全链路流程图.md) - [财务业务全流程总览图(PNG)](财务业务全流程总览图.png) - [财务来源接入现状](财务来源接入现状.md) diff --git a/财务管理/海外仓费用统一接入阶段0技术契约.md b/财务管理/海外仓费用统一接入阶段0技术契约.md new file mode 100644 index 0000000..f26ddab --- /dev/null +++ b/财务管理/海外仓费用统一接入阶段0技术契约.md @@ -0,0 +1,229 @@ +# 海外仓费用统一接入阶段 0 技术契约 + +> 文档状态:开发基线配套契约 V0.1 +> 编制日期:2026-09-21 +> 适用范围:阶段 0A—0E;配套需求基线为 [海外仓费用统一接入财务评审方案](海外仓费用统一接入财务评审方案.md) + +本文把 V0.5 的阶段 0 规则转成可编码的跨服务边界、状态和唯一性约束。本文不是数据库字段逐项施工单;开发时可以调整表名和类名,但不得改变这里的业务语义、状态分离、幂等边界和跨区域结果规则。 + +## 一、阶段 0 目标与顺序 + +阶段 0 不是新增仓租算法,先修复已有海外费用链路的一致性: + +| 子阶段 | 目标 | 依赖 | +|---|---|---| +| 0A | 统一收费身份、人工/自动去重、换标漏发、拆柜费用身份、派送收付方向 | 先冻结本文模型和唯一键 | +| 0B | 人工费用草稿/驳回修改、待审工作台、业务费用聚合、直付证据 | 0A 收费身份 | +| 0C | Finance 费用接受/拒绝结果回传、来源版本变更裁决 | 0A 的版本模型 | +| 0D | 资金计划 ID/版本、来源精确分配、冻结/结算/释放旧计划隔离 | 0C 的有效版本结果 | +| 0E | 商业减免、取消收费、待财务处理及自动重算门禁 | 0C、0D | + +0A—0E 可以在前序数据结构稳定后并行实现,但不能在未冻结本契约前各模块自行新增状态或幂等字段。 + +## 二、当前代码事实与必须修正的断点 + +| 现状入口 | 当前行为 | 阶段 0 修正 | +|---|---|---| +| `lastleg-service/financefee/OverseasFeeSourceService` | `adjust` 先把旧版本设为 `SUPERSEDED`,`voidSource` 先设为 `VOIDED` | Finance 接受前旧有效版本继续保留;新候选/作废命令等待 Finance 结果 | +| `OverseasFeeOutboxService` / `BusinessFeeSourceChangedV1` | 只有海外向 Finance 的完整快照事件,没有业务可消费的接受/拒绝结果 | 增加版本化费用变更命令和 Finance 结果事件,双向 Outbox/Inbox 幂等 | +| `BusinessFeeSourceEventService` | Finance 直接入池并返回本地方法结果,无结果事件;资金关联按业务类型、业务单号和金额匹配 | 同事务记录命令结果;接受、拒绝、冲突、超时可回传;资金按计划版本和来源分配关联 | +| `WalletCommandRequestedV1` | 只带业务类型、业务单号、金额和聚合版本 | 资金计划 ID/版本、收费身份、计划金额快照和来源分配进入新目标协议 | +| `DestuffingPalletCostService` | 手工构造 `APPROVED/PUBLISHED` 来源,绕过通用审核和统一收费身份 | 复用计费身份、来源版本、审核策略和调整门禁;分摊组保持守恒 | +| 换标完成分支 | 仅部分 `COMPLETED` 路径发布换标费并发起资金结算 | 所有合法完成分支汇合到唯一发布/结算入口,重复完成幂等 | +| 派送转单 | 转派送时人工费用自动审核,且同一费用项目的应收/应付身份不完整 | 人工费用进入待审核;应收与应付按收费身份独立,实际供应商和直付证据必填 | +| `listForBusiness` | 主要按单一 `businessType + businessId` 查询 | 业务详情按稳定关系聚合来源,当前有效版本与待确认变更分开返回 | + +## 三、收费身份模型 + +### 3.1 收费身份与来源版本分离 + +收费身份表示“同一业务应该收哪一笔钱”;来源版本表示“这一笔钱当前提交了哪个金额版本”。二者不得混用。 + +收费身份逻辑字段: + +```text +identityKey +customerId +sourceSystem +businessType +businessId / businessNo +scenarioCode +feeItemCode +direction +priceRole CUSTOMER_SALE / SUPPLIER_COST +supplierId 成本侧必填;销售侧为空 +periodScope 离散事实或计费期间范围 +``` + +约束: + +- 客户应收和供应商应付是两条身份;不能用方向字段在一行中来回切换。 +- 成本侧实际供应商进入身份。多个供应商责任必须拆成多个身份。 +- 自动任务、人工补录、重放、报价恢复和资金计划都引用同一身份。 +- 明确免收也占用身份,不能因为没有 Finance 来源而再次收费。 +- 退货按票身份按 `RETURN_ORDER + RETURN_HANDLING + CUSTOMER_SALE` 去重;退货操作费按实收累计组;仓租按原始分量、角色、供应商和日期范围占用。 + +### 3.2 来源候选版本状态 + +业务审核状态、Finance 同步状态、财务来源状态和结算状态分开保存: + +| 状态轴 | 首版值 | 含义 | +|---|---|---| +| `reviewStatus` | `DRAFT`、`PENDING`、`APPROVED`、`REJECTED` | 业务是否允许向 Finance 提交 | +| `financeSyncStatus` | `NOT_SENT`、`PENDING_FINANCE`、`ACCEPTED`、`REJECTED` | 该候选命令的跨区结果 | +| `sourceStatus` | `ACTIVE`、`SUPERSEDED`、`VOIDED` | Finance 接受后的来源有效性;接受前不得覆盖旧有效版本 | +| `settlementStatus` | `AVAILABLE`、`PENDING_WALLET`、`SETTLED`、`BILLED`、`BLOCKED_FINANCE` | 出账或资金路径状态 | + +同一收费身份最多一个待 Finance 确认的候选或变更。Finance 拒绝后,旧有效版本继续有效;修订必须以最后 Finance 接受的版本为前序生成新候选。 + +## 四、跨区域费用命令与结果 + +### 4.1 费用变更命令 + +现有 `BusinessFeeSourceChangedV1` 保留为被替换的旧目标,不新增双协议兼容。阶段 0 直接收敛到新版本事件,建议逻辑载荷名为 `BusinessFeeSourceCommandV2`,事件动作: + +- `PUBLISH`:首次发布一个候选版本; +- `REPLACE`:申请替代当前有效版本; +- `VOID`:申请作废当前有效版本。 + +命令必须携带: + +```text +commandId +identityKey +sourceFeeId +targetVersion +expectedActiveVersion 首次发布显式为空 +action +sourceSnapshot +sourceHash +requestedAt +``` + +`sourceSnapshot` 继续沿用现有完整客户、业务、方向、供应商、付款、币种、数量、期间和审核快照。Finance 不跨区回查 Lastleg。 + +### 4.2 Finance 结果事件 + +Finance 在同一事务完成校验、来源写入/变更裁决和结果 Outbox,向海外发送 `BusinessFeeSourceResultV2`: + +```text +commandId +identityKey +result ACCEPTED / REJECTED +acceptedSourceFeeId +acceptedSourceVersion +activeSourceVersion +errorCode +errorMessage +processedAt +``` + +规则: + +- 同 `commandId + payloadHash` 重放返回原结果;同命令异载荷拒绝。 +- `expectedActiveVersion` 不等于 Finance 当前有效版本时拒绝,不回退当前有效版本。 +- `ACCEPTED` 才能让海外候选变为有效版本;`REJECTED` 只关闭该候选命令,不删除事实。 +- 超时和网络失败保持 `PENDING_FINANCE`,不能标记成功或拒绝。 +- 结果回传失败不改变 Finance 已接受状态;海外重试同一结果事件。 +- Event Bridge 只负责路由和投递,不把“已转发”当作 Finance 已接受。 + +## 五、资金计划版本 + +费用来源与资金冻结不能再通过“业务类型 + 业务单号 + 金额”模糊关联。 + +### 5.1 计划模型 + +资金计划逻辑字段: + +```text +planId +planVersion +identityKey +customerId +amountCny +status PENDING / FROZEN / SETTLE_PENDING / SETTLED / RELEASE_PENDING / RELEASED / FAILED +sourceAllocations[] sourceFeeId + sourceVersion + amountCny +``` + +一笔计划可以分配多笔来源,但所有分配金额之和必须等于计划金额;一份来源版本只能被该计划消费一次。计划金额、身份和版本一旦冻结,不允许先改费用再等待来源到达。 + +### 5.2 指令规则 + +资金命令至少携带 `planId + planVersion + operation + identityKey + amountSnapshot`。`SETTLE` 先到时,Finance 持久化等待;只有目标来源全部接受、分配完整且金额守恒后才扣款。`RELEASE` 结果未知时保持锁定,不允许同时建立新计划。 + +旧计划释放后收到迟到 `SETTLE`,只能访问旧计划并返回拒绝,不能按业务单号找到新计划执行扣款。计划 ID 不复用。 + +## 六、业务链路修复要求 + +### 6.1 换标 + +- 统一所有合法完成分支进入一个费用/资金编排入口。 +- `RELABEL_SERVICE` 保持现有费用编码,不新增同义 `RELABEL_FEE`。 +- 费用发布、资金结算和业务完成各自幂等;纯 SKU、需要出库和退货换标路径都必须覆盖。 +- Finance 接受前允许业务保持原有效候选;资金结算必须绑定计划版本和已接受来源版本。 + +### 6.2 拆柜打托 + +- 保留全柜成本总额和客户分摊守恒;每客户分摊来源拥有稳定收费身份。 +- 不再手工直接插入“已审核已发布”绕过通用服务;自动审核必须来自获批规则,调整和作废复用统一命令。 +- 首版继续 `DESTUFF_PALLET` 与 `OVERSEAS_CONTAINER` 业务身份,但应在通用校验中明确允许该组合,避免项目编码与调整校验不一致。 +- 当前仅自动客户应收;供应商成本属于后续阶段,不能伪造应付。 + +### 6.3 派送 + +- 同一派送业务允许一条客户应收和一条供应商应付,但两者身份、价格、供应商和结算方式独立。 +- 人工金额默认进入 `PENDING`,不能在转派送动作中自动审核。 +- 业务日期使用真实费用触发日期,不使用无关任务执行时刻作为历史补价日期。 +- `DIRECT_PAID` 必须有付款时间、方式、流水号或凭证,并由 Finance 形成已确认成本;`ON_ACCOUNT` 进入应付。 + +### 6.4 业务费用查询 + +业务详情查询按稳定关系聚合订单、入仓、柜、派送、换标和退货来源;返回: + +- 当前 Finance 接受的有效版本; +- 待 Finance 确认的候选/变更; +- 被拒绝、超时、待资金、已结算和已作废结果; +- 共享费用的分摊金额,不重复计入多个订单小计。 + +Finance 尚未接受的来源必须能从海外异常入口查询,不能以 Finance 费用池没有记录作为“未生成”的唯一判断。 + +## 七、ID、供应商和事件边界 + +- 跨端 DTO 和事件中的仓库、供应商、客户、业务 ID 使用十进制字符串;领域层严格解析,禁止使用名称或 FBA 目的仓代码替代主档 ID。 +- Lastleg 报价仓、实际作业仓、库存仓引用同一国内 Warehouse 主档 ID;`providerName` 只能是快照,不能作为供应商身份。 +- 供应商成本来源必须通过 Warehouse 校验启用状态和类别;Finance 再次失败关闭校验。 +- 事件载荷不携带用户 JWT,不跨区域回查数据库;生产者、Event Bridge、Finance、结果消费者和测试必须同步升级。 + +## 八、开发与验证门禁 + +### 8.1 0A 开工前 + +开发先提交以下技术设计并在代码中一次性收敛: + +1. 收费身份、候选版本、当前有效版本和唯一约束; +2. `BusinessFeeSourceCommandV2` / `BusinessFeeSourceResultV2` 事件 DTO、事件类型和双向路由; +3. 资金计划、分配表、计划版本和 V2 指令事件; +4. 仓库/供应商 ID 与业务场景枚举校验; +5. Lastleg、Finance、Event Bridge 的锁顺序、Outbox/Inbox 和拒绝重试分类。 + +### 8.2 阶段验证 + +- 0A:换标四类完成路径、拆柜分摊守恒、派送应收/应付和人工审核。 +- 0B:草稿驳回修改、统一待审查询、业务聚合和直付证据。 +- 0C:Finance 接受、拒绝、超时、乱序、重放、前序版本冲突和来源冻结。 +- 0D:冻结/结算/释放乱序、计划版本隔离、来源分配守恒、旧指令拒绝。 +- 0E:减免接受、减免拒绝、自动重算暂停、取消收费和待财务处理。 + +跨服务修改至少运行公共事件契约、Lastleg、Finance、Event Bridge 直接消费者测试,并执行 `node scripts/mapper-scan-contract.mjs`、`node --test scripts/gateway-route-contract.test.mjs`;未经明确环境授权不启动服务、不执行真实 HTTP、不部署。 + +## 九、代码入口 + +- 海外费用来源:`baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/` +- Finance 海外费用消费:`baiyue-firstleg/finance/src/main/java/com/baiyue/finance/service/BusinessFeeSourceEventService.java` +- 资金事件:`baiyue-firstleg/common-event-contract/src/main/java/com/baiyue/common/event/WalletCommandRequestedV1.java`、`WalletCommandCompletedV1.java` +- 资金生产/消费:`baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/wallet/`、`baiyue-firstleg/finance/src/main/java/com/baiyue/finance/service/WalletCommandEventService.java` +- 换标:`baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/relabel/service/RelabelApplicationService.java` +- 派送:`baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/service/DeliveryTransferService.java` +- 拆柜打托:`baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/service/DestuffingPalletCostService.java` +- 业务费用来源表:`lastleg-service/src/main/resources/db/lastleg.sql` 的 `ll_finance_fee_source`;Finance 表:`finance/src/main/resources/db/finance.sql` 的 `fin_fee_source`、`fin_wallet_hold`、`fin_wallet_command_inbox` +