# 尾程平台已完成功能报告(2026-08-15) ## 1. 交付结论 头程装柜完成到尾程订单的真实链路已打通。头程按客户发布 `FirstLegLoadingPlanCompleted V1` 事件,经 Event Bridge 可靠投递后,尾程按事件中 每一笔最终实装入仓单分别落一条订单记录。同一柜的订单记录共享尾程单号, `sourceInboundId` 作为来源建单唯一标识。 本报告仅描述当前代码和已经取得证据的能力,不把规划中的功能列为已完成。 ## 2. 已完成功能 ### 2.1 跨区域事件桥 - 接收并持久化版本化事件信封,保存幂等键、负载摘要和冻结 JSON。 - 使用数据库租约领取待投递事件,支持多实例竞争和超时租约恢复。 - `RECEIVED` 与 `RETRY` 都可重新调度,失败采用指数退避,达到上限进入 `DEAD`。 - 每次投递写入 `bridge_delivery_attempt`,记录投递序号、结果、响应码和错误。 - 支持经过内部令牌保护的死信人工补投;成功后才把 Inbox 标记为 `PROCESSED`。 - Event Bridge 与尾程内部接口使用统一的 `X-Internal-Service-Token`。 ### 2.2 装柜完成事件消费与尾程建单 - 只接受 `CN -> OVERSEAS`、`LOADING_PLAN`、版本为 1 的装柜完成事件。 - 强制校验实际 `containerNo` 和非空 `orders`,尾程不回查头程数据。 - 事件 Inbox 以 `eventId` 防重复,并校验重复事件的 `payloadHash`。 - 按 `orders` 逐笔创建尾程订单;同柜入仓单共享一个不可碰撞的尾程单号。 - 以 `(tenant_id, source_region, source_inbound_id)` 保证来源入仓单建单幂等。 - 保存根入仓单、来源订单、装柜计划版本、交接版本和来源摘要等追溯字段。 - 保存商品、箱数、数量、托数、重量、体积、目的仓、SKU、FBA 跟踪号、 shipmentNo 和唛头等实装冻结明细。 - 新订单初始化为 `PENDING_ASSIGNMENT`,同步写入状态历史。 - 同一来源入仓单摘要不一致时拒绝静默覆盖。 ### 2.3 尾程订单查询与转仓 - 按租户分页查询,支持尾程单号、入仓码、头程订单号、柜号、状态、转仓、 异常、暂扣和创建时间筛选。 - 查询订单详情、实装明细和状态历史。 - 导出 UTF-8 CSV,并处理公式注入风险。 - 支持单笔和批量转仓,更新订单及明细目的仓快照并写状态历史。 - 已生成入库计划的订单禁止再次修改目的仓。 - 普通客户只能查询认证身份对应租户;平台身份必须显式指定客户租户, 不允许通过请求参数任意跨客户查询。 ### 2.4 尾程入库计划与 PDA 作业 - 按租户和实际集装箱生成唯一入库计划。 - 保存入仓码明细、目的仓快照、计划托盘和托盘分配关系。 - 按目的仓隔离合托,支持固定容量托盘分配。 - 提供 PDA 任务、操作幂等记录、托盘合并记录及仓库资源锁关联字段。 ### 2.5 仓库资源和海外认证边界 - 仓库维护库位、托盘及资源锁,资源锁使用租户幂等键并记录业务归属。 - 仓库数据源启动保护避免 schema 接错后误执行建表脚本。 - 海外 Gateway 使用 JWKS 验证非对称 JWT,校验 `lastleg-api` Audience 及必需 claims。 - 尾程内部事件入口使用常量时间令牌比较;未配置或令牌错误时拒绝消费。 ### 2.6 工程规范与数据库交付 - 生产 Spring Bean 的依赖注入已统一为 `jakarta.annotation.Resource`;仅保留配置值 `@Value` 和普通值对象/校验器构造器参数,不把不可变业务值误当作 Bean 注入。 - 新增统一增量入口 `scripts/db/incremental.sql`,按 `001-006` 归档 Event Bridge、尾程订单与入库计划/PDA、仓库资源及仓库主数据的字段、中文注释和索引变更。 - 增量脚本使用 `information_schema` 守卫,45 个动态 DDL 均成对释放,且不包含业务数据写入、删除或清理语句。 ## 3. 真实链路验收证据 | 项目 | 结果 | |---|---| | loadingPlanId | `2091000814000009002` | | containerNo | `LLSYNC-CNTR-20260814` | | tenantId/accountId | `10001` | | eventId | `88cd0f63-dc9e-4c16-bdb7-c32b20a83c3b` | | payloadHash | `sha256:23011feff2ff91203fb94ebab7cab8306f58e3e128f61d17913d2f74af5c87f4` | | Event Bridge 状态 | `PROCESSED` | | 尾程单号 | `LMO43831679558828067566368238939` | 同一事件实际生成两条入仓单维度订单记录: | sourceInboundId | 入仓码 | 箱数 | 托数 | 明细数 | |---|---|---:|---:|---:| | `2091000814000000301` | `LLSYNC-20260814-IN-01` | 2 | 1 | 1 | | `2091000814000001301` | `LLSYNC-20260814-IN-02` | 2 | 1 | 1 | 重复投递相同 `eventId` 后接口仍返回成功,数据库订单记录总数保持为 2,未重复建单。 ## 4. 数据库交付约定 全量初始化脚本继续由各服务维护: - `lastleg/src/main/resources/db/lastleg.sql` - `event-bridge-service/src/main/resources/db/event-bridge.sql` - `warehouse/src/main/resources/db/warehouse.sql` 从本次交付开始,所有字段和索引变更同时追加到 `scripts/db/incremental.sql`。该文件按日期和序号只追加,已发布段落不得修改; 新增字段和索引必须查询 `information_schema` 后再执行,禁止放入测试数据、 业务数据修复、`DELETE` 或 `TRUNCATE`。 当前归档段为 `001` Event Bridge、`002` 仓库资源、`003` 入库计划/PDA、 `004` Event Bridge 存量字段升级、`005` 尾程订单投影和 `006` 仓库主数据注释/索引。 脚本静态契约校验结果:UTF-8、614 行、45 个 `PREPARE` 与 45 个释放操作, 未包含业务 DML,也未检测到乱码字符。 ## 5. 验证结果 - `mvn -pl lastleg -am test`:34 tests passed。 - `mvn -pl event-bridge-service -am test`:15 tests passed。 - `mvn -pl warehouse -am test`:26 tests passed。 - `mvn -pl gateway -am test`:7 tests passed。 - 注入改造额外验证:`integration-service` 1 test passed,`audit-service` 编译通过。 - 生产代码扫描无 `@Autowired`、`@Inject` 或 Lombok 构造器注入残留;文档和 SQL UTF-8 乱码扫描通过。 ## 6. 当前未声明完成的范围 - 到港、清关、拆柜、正式入库、出库、派送和签收的完整状态命令链路。 - 前端尾程订单页面。 - 权限冻结事件的海外本地投影和完整生产密钥轮换演练。 - 生产级 mTLS、来源网络白名单、监控告警和灾备演练。