| 内部模块化基线与依赖分析 |
docs/lastleg-internal-modularization-baseline.md、scripts/analyze-lastleg-dependencies.mjs、scripts/analyze-lastleg-dependencies.test.mjs、src/test/resources/architecture/lastleg-slice-dependencies.json;只约束本服务内部包依赖,不改变部署单元或数据库边界 |
| 事件接收、平台订单列表/详情/导出、柜级进度、目的仓调整 |
src/main/java/com/baiyue/lastleg/controller/LastlegOrderController.java;/api/platform/v1/last-leg/orders/container-summaries 按 sourceContainerBookingId 服务端聚合全柜订单、入仓码和有效计划,分页前排除全部入仓码均已生成有效独立计划的柜,/{sourceContainerBookingId} 返回柜内全部订单/入仓码/计划状态且不受订单分页截断;plannedArrivalAt 只取装柜完成事件 estimatedWarehouseArrivalAt 冻结到 ll_order.estimated_warehouse_at 的正式事实,按其升序、null 最后、稳定柜 ID 排序;目的仓调整仅接受国内 Warehouse Service 平台公共 ACTIVE + FBA 主档,写入前由 service/FbaWarehouseValidator.java 经内部只读目录校验 ID/编码/名称一致 |
| 尾程订单完整计划、暂扣与人工节点 |
controller/LastlegOrderController.java、service/LastlegOrderCommandService.java、inboundplan/service/InboundPlanService.java、dto/LastlegOrderCommandDtos.java;单票计划写入校验订单版本、客户范围、订单冻结入仓码、稳定接柜仓 ID、当前仓库主档与幂等键;接柜仓编码/名称以该 ID 当前目录快照为准,不要求订单残留旧展示快照。暂扣/解除写不可变历史并发布 InboundOrderDetainedOutboxService,已拣货、已发运或已有出库单时禁止新增暂扣;暂扣期间不得进入排车或出库。人工节点必须一次提交固定八行完整快照且至少一个时间,首次保存后永久使用 MANUAL 来源,不得回退柜级节点或反向修改头程船节点 |
| 客户尾程订单列表与详情 |
controller/MerchantLastlegOrderController.java;客户范围只取认证身份,稳定类型/状态见 model/LastlegOrderType.java、LastlegOrderStatus.java |
| 装柜完成事件消费 |
service/LoadingCompletedConsumer.java;当前生产信封为 FIRST_LEG_LOADING_PLAN_COMPLETED V2,消费端冻结 destinationType:FBA 可按箱数且不生成逐箱作业账,OVERSEAS 必须逐箱校验并生成箱级事实;历史缺字段事件仅按明确 FBA 单号或目的仓与接柜仓一致性安全推断,歧义直接拒绝 |
| 尾程单号生成 |
service/LastlegOrderNoGenerator.java |
| 订单查询与更新 |
service/LastlegOrderService.java |
| 业务 Inbox |
entity/LastlegEventInbox.java、mapper/LastlegEventInboxMapper.java |
| 尾程订单、明细、状态历史 |
entity/LastlegOrder.java、LastlegOrderDetail.java、LastlegOrderStatusHistory.java 及对应 Mapper |
| 独立尾程入仓单快照 |
entity/LastlegInboundOrder.java、mapper/LastlegInboundOrderMapper.java;按客户与来源入仓标识冻结 inboundCode、来源/根订单及目的仓,不以尾程订单行代替入仓单聚合 |
| 内部令牌保护 |
security/InternalServiceTokenGuard.java |
| IAM 海外安全投影与实时校验 |
内部入口 security/controller/LastlegSecurityController.java,固定 /internal/lastleg/security/v1/events、/validate 且复用 InternalServiceTokenGuard;投影/校验 security/service/,DTO security/dto/,表固定 ll_security_event_inbox、ll_security_projection;MySQL 投影缺失、落后或不可用一律 fail-closed,Redis 仅为提交后可重建镜像;业务切片不得直接依赖投影内部类,边界由 SecurityProjectionArchitectureTest 与 Node 合同锁定 |
| 入仓计划分页、转换与详情 |
平台 inboundplan/controller/InboundPlanController.java,客户只读 inboundplan/controller/MerchantInboundPlanController.java;共用 inboundplan/dto/InboundPlanRequests.java、InboundPlanListResponse.java、inboundplan/mapper/InboundPlanQueryMapper.java、inboundplan/service/InboundPlanService.java;客户入口固定 /api/merchant/v1/last-leg/inbound-plans,范围只取 Token;整柜转换固定为 /convert-container,锁定同一 sourceContainerBookingId 后每票独立生成计划,整批原子且幂等 |
| 托盘分配算法 |
inboundplan/service/PalletAllocator.java |
| FBA 预约创建、详情与编辑 |
InboundPlanController.java 的 /fba-appointments/**、inboundplan/service/InboundFbaAppointmentService.java、BatchFbaAppointmentRequest.java、UpdateFbaAppointmentRequest.java |
| PDA 入仓、实收、上架与完成 |
inboundplan/pda/controller/ReceivingContainerController.java、inboundplan/pda/service/ReceivingContainerService.java、内部编排 InboundPdaWorkflowService.java;公网入口固定为 /api/pda/v1/last-leg/receiving-containers/**,/warehouse-profile 只按 Token 绑定仓解析共享仓库中文名称与编码,旧 planNo/allocationId Controller 已移除 |
| PDA 卸柜照片上传、归属校验与预览 |
ReceivingContainerController.java 的 /current/unload-photos/files、/current/unload-photos/files/{fileId}/download,网关 inboundplan/pda/gateway/UnloadPhotoFileGateway.java、HttpUnloadPhotoFileGateway.java;File 类型固定 OVERSEAS_UNLOAD_PHOTO,下载只允许当前会话已签收的 fileId 并返回 no-store |
| 卸柜照片与海外卸柜完成 Outbox |
ReceivingContainerController.java、ReceivingContainerService.java、inboundplan/pda/service/InboundUnloadCompletedOutboxService.java、entity/LastlegEventOutbox.java、mapper/LastlegEventOutboxMapper.java;多计划同柜只能在全柜完成后调用 publishContainerCompleted,按来源柜预订 ID 幂等发布一次,完成时刻与拍照时刻分离;事件模型见 ../common-event-contract/AGENTS.md |
| 尾程暂扣状态回传 |
service/InboundOrderDetainedOutboxService.java;暂扣与解除暂扣在订单更新事务内按 sourceInboundId 写入海外到国内 Outbox,国内按来源入仓单绑定更新 |
| 入仓后 SKU 库存余额、库位和流水 |
inventory/;平台只读查询与非出库库存命令分别从 inventory/query/controller/InventoryQueryController.java、inventory/command/controller/InventoryCommandController.java 进入 |
| 海外PDA盘点、同仓整托移库、托盘组拆换绑与换标现场作业 |
pda/stocktake/、pda/move/、palletops/、relabel/pda/;版本化契约 src/main/resources/openapi/overseas-pda-operations-v1.yaml;全部范围取自PDA Token,排车和出库使用独立 PDA Controller |
| PDA 仓内通用扫码与操作历史 |
pda/warehouse/controller/PdaWarehouseController.java、pda/warehouse/service/PdaWarehouseService.java;解析库存、库位和托盘码并查询操作历史,固定要求 lastleg:pda:operate 与 ROLE_WAREHOUSE_PICKER,仓库范围只能取自 PDA Token |
| 船节点接收与海外 PDA 可收货门禁 |
shipping/service/ContainerShippingNodeConsumer.java、shipping/entity/ContainerShippingGate.java、shipping/mapper/ContainerShippingGateMapper.java;只单调接受实际标准节点,PICKUP_READY 及以后才允许对应柜进入 PDA 收货候选 |
| 平台排车列表/详情与智能预排 |
dispatch/controller/DispatchQueryController.java、SmartDispatchController.java、dispatch/mapper/DispatchCandidateMapper.java、dispatch/service/DispatchService.java;草稿柜 entity/DispatchDraftContainer.java、mapper/DispatchDraftContainerMapper.java,托盘锁 DispatchPalletLock.java;入口 /api/platform/v1/last-leg/dispatches,查询、预排与执行边界见“海外仓全流程开发路由” |
| 排车编辑、PDA 出库、派送与交接 |
dispatch/controller/DispatchController.java、dispatch/pda/controller/DispatchPdaController.java、delivery/controller/DeliveryTransferController.java、MerchantDeliveryController.java、OutboundPdaController.java |
| 仓储资源调用 |
inboundplan/pda/gateway/WarehouseResourceGateway.java、HttpWarehouseResourceGateway.java |
| 仓储转运、历史订单/入仓绑定、可选换标联动 |
transfer/controller/WarehouseTransferController.java、transfer/service/WarehouseTransferService.java |
| 一件代发接收、SKU/箱唛库存 |
内部接收入口 dropship/controller/DropshipOrderController.java 的 /internal/v1/lastleg/dropship/receive,必须经 InternalServiceTokenGuard;版本化契约 src/main/resources/openapi/lastleg-internal-dropship-v1.yaml;处理 dropship/service/DropshipOrderService.java、dropship/entity/、dropship/mapper/ |
| 货物废弃、待审锁箱、审批扣减 |
discard/controller/CargoDiscardController.java、discard/service/CargoDiscardService.java |
| 客户拜访、派送状态与签收附件 |
customervisit/controller/CustomerVisitController.java、customervisit/service/CustomerVisitService.java;平台维护拜访、附件上传、派送完成/状态 |
| 异常订单与派送退回入仓 |
exceptionorder/controller/ExceptionOrderController.java、exceptionorder/service/ExceptionOrderService.java;异常订单建档、关联解析、派送退回候选与标记 |
| 海外采购、客户下单、采购审核、客户/采购仓候选与操作流水 |
procurement/controller/、procurement/service/OverseasProcurementService.java;客户入口要求 merchant:cross-border:procurement 且只取 Token 客户范围;OpenAPI src/main/resources/openapi/overseas-business-v1.yaml |
| 海外业务费用来源 |
financefee/controller/PlatformOverseasFeeSourceController.java、financefee/service/OverseasFeeSourceService.java、OverseasFeeBusinessGuard.java、OverseasFeeOutboxService.java、OverseasFeeOutboxRelay.java;海外入仓、采购、美国卡车、本土散板和海外仓服务费必须匹配当前客户的真实业务,入仓记录和入仓码按事实选填;审核通过、调整或作废后以版本化完整快照经 Outbox/Event Bridge 进入独立 Finance,OpenAPI src/main/resources/openapi/overseas-finance-fees-v1.yaml |
| 美国/本土卡车订单 |
trucking/controller/PlatformUsTruckOrderController.java、MerchantUsTruckOrderController.java 及同子域 Service/DTO;客户入口要求 merchant:cross-border:domestic-trucking |
| 本土散板订单 |
looseboard/controller/PlatformLocalLooseboardController.java、MerchantLocalLooseboardController.java 及同子域 Service/DTO/Entity/Mapper;客户入口要求 merchant:cross-border:pallet-shipping;OpenAPI src/main/resources/openapi/overseas-business-v1.yaml |
| 海外仓报价、月度汇率、车辆主数据 |
报价 masterdata/quote/、汇率 masterdata/exchange/;车辆入口 masterdata/vehicle/adapter/in/web/PlatformVehicleController.java,应用服务 application/VehicleApplicationService.java,持久化端口与适配器 application/port/out/VehicleRepository.java、adapter/out/persistence/;OpenAPI src/main/resources/openapi/overseas-master-data-v1.yaml,车辆档案不含派送履约历史 |
| 跨服务 HTTP 客户端装配 |
config/LastlegRestClientFactory.java、config/LastlegRestClientProperties.java;目标地址与内部服务令牌只来自配置,不在业务子域手工创建客户端 |
| 数据库基线、表索引与中文注释契约 |
src/main/resources/db/lastleg.sql、src/test/java/com/baiyue/lastleg/schema/SchemaChineseCommentContractTest.java |
| 测试 |
src/test/java/com/baiyue/lastleg/ |
| 真实事件消费验收 |
src/test/java/com/baiyue/lastleg/service/TaillegRealConsumerAcceptanceTest.java;覆盖真实 V2 建单、独立入仓单快照及下游转运/换标可消费性 |