This commit is contained in:
2026-08-17 09:18:03 +08:00
parent 8b768125c6
commit d6fe79b0f2
128 changed files with 7053 additions and 76 deletions
+121
View File
@@ -0,0 +1,121 @@
# 尾程平台已完成功能报告(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、来源网络白名单、监控告警和灾备演练。
+2 -3
View File
@@ -62,10 +62,9 @@
- 已完成独立根 POM、业务模块抽取、公共依赖坐标调整和海外配置收敛。
- 已移除文件服务中依赖国内权限服务的企业资质链路。
- 海外网关已改为 JWKS 验签并默认启用海外显式路由。
- 海外网关已改为 JWKS 验签,强制校验 Audience 和必要身份声明,并默认启用海外显式路由。
- 公共安全组件的 JWKS 解码、本地权限快照和冻结事件处理仍需在公共制品中完成。
- 海外提单、装箱单、清关文件和签收证明能力仍待实现。
- 跨区发送器、消息中间件接入、重试调度和死信补投仍待实现。
- 海外事件桥到尾程消费者的本地调度已具备租约、指数退避、投递审计、死信和人工补投;头程跨区发送端、尾程反向回传和生产 mTLS 仍需完成联调验收。
只有上述待办完成并通过故障注入、跨区断网、重复事件、乱序事件和密钥轮换验收后,尾程服务才允许迁移到海外生产环境。