From 4f59f7bd286c1aeb04f379af5a431f6bfbdbb6d9 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 18 Sep 2026 09:59:07 +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 --- deploy/sql/头程数据库统一增量-MySQL8.sql | 6 +- firstleg/AGENTS.md | 2 +- .../mapper/ContainerBookingMapper.java | 3 - .../oceanbooking/dto/OceanBookingDtos.java | 2 +- .../mapper/OceanBookingMapper.java | 2 +- .../repository/OceanBookingRepository.java | 9 ++- .../service/OceanBookingService.java | 18 ++++- .../repository/ContainerRepository.java | 3 +- .../firstleg/service/ContainerService.java | 12 ++- .../firstleg/service/LoadingListService.java | 9 ++- .../db/phase3-ocean-booking-schema.sql | 13 ++++ .../db/phase3-smart-loading-schema.sql | 17 ++++- .../main/resources/openapi/firstleg-v1.yaml | 4 +- .../resources/openapi/ocean-bookings-v1.yaml | 5 +- .../ContainerControllerContractTest.java | 2 +- .../OceanBookingMapperContractTest.java | 1 + .../OceanBookingSqlContractTest.java | 12 +++ .../service/OceanBookingServiceTest.java | 14 +++- .../ContainerBookingMapperContractTest.java | 8 +- .../SmartLoadingSqlContractTest.java | 3 +- .../service/ContainerServiceTest.java | 10 +-- .../service/LoadingListServiceTest.java | 9 ++- iam/src/main/resources/openapi/iam-v1.yaml | 2 +- ...urnInventoryPermissionSqlContractTest.java | 2 +- ...seasCustomerPermissionSqlContractTest.java | 2 +- lastleg-service/AGENTS.md | 2 +- .../controller/LastlegOrderController.java | 3 +- .../lastleg/dto/LastlegOrderRequests.java | 6 -- .../mapper/InboundPlanOrderMapper.java | 2 +- .../pda/dto/ReceivingContainerRequests.java | 4 +- .../service/ReceivingContainerService.java | 15 +++- .../service/InboundPlanService.java | 2 - .../mapper/InventoryCommandMapper.java | 6 ++ .../service/InventoryCommandService.java | 11 +++ .../service/LastlegOrderCommandService.java | 12 +++ .../lastleg/service/LastlegOrderService.java | 43 ----------- .../openapi/overseas-business-v1.yaml | 18 ++--- .../pda/ReceivingContainerContractTest.java | 2 + ...ReceivingContainerServiceBehaviorTest.java | 73 +++++++++++++++++++ .../ContainerInboundPlanPreviewTest.java | 16 ++++ .../service/InboundPlanServiceTest.java | 16 ++-- .../command/InventoryCommandServiceTest.java | 17 +++++ .../MerchantOverseasOpenApiContractTest.java | 23 ++++++ .../LastlegOrderCommandServiceTest.java | 37 ++++++++++ .../service/LastlegOrderServiceTest.java | 37 ---------- 45 files changed, 358 insertions(+), 157 deletions(-) diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 680ecd368..302100797 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -1438,7 +1438,7 @@ CREATE TABLE fl_consumed_event ( CREATE TABLE fl_container_booking ( id bigint unsigned NOT NULL COMMENT '货柜预订ID(雪花ID)', booking_no varchar(40) NOT NULL COMMENT '平台唯一货柜预订单号', - container_no varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '集装箱号;确认前允许修订', + container_no varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '真实集装箱号权威快照;同一订舱内唯一,不同提单允许复用;确认前允许修订', cabinet_no varchar(64) NOT NULL COMMENT '平台唯一内部柜号', source_type varchar(24) NOT NULL DEFAULT 'SIMULATION' COMMENT '记录来源:SIMULATION内部模拟柜、OCEAN_BOOKING订舱真实柜', record_status varchar(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '记录状态:ACTIVE可操作、MERGED已合并历史', @@ -1494,7 +1494,8 @@ CREATE TABLE fl_container_booking ( PRIMARY KEY (id), UNIQUE KEY uk_container_booking_no (booking_no), UNIQUE KEY uk_container_booking_cabinet (cabinet_no), - UNIQUE KEY uk_container_booking_container_no (container_no), + UNIQUE KEY uk_container_booking_ocean_container (ocean_booking_id,container_no), + KEY idx_container_booking_container_no (container_no,updated_at,id), KEY idx_container_booking_merge (record_status,merged_into_container_booking_id), KEY idx_container_booking_warehouse (warehouse_id,updated_at,id), KEY idx_container_booking_voyage (voyage_no,updated_at), @@ -3368,6 +3369,7 @@ CREATE TABLE fl_ocean_booking ( version int unsigned NOT NULL DEFAULT '0' COMMENT '乐观锁版本号', PRIMARY KEY (id), UNIQUE KEY uk_ocean_booking_no (booking_no), + UNIQUE KEY uk_ocean_booking_bill_of_lading (bill_of_lading_no), KEY idx_ocean_booking_customer (customer_id,status,updated_at,id), KEY idx_ocean_booking_voyage (vessel_name,voyage_no,updated_at), CONSTRAINT chk_ocean_booking_carrier_code CHECK (((carrier_code is null) or (carrier_code in (_utf8mb4'MATSON',_utf8mb4'SML',_utf8mb4'ZIM',_utf8mb4'COSCO',_utf8mb4'EMC',_utf8mb4'HEDE',_utf8mb4'OTHER')))), diff --git a/firstleg/AGENTS.md b/firstleg/AGENTS.md index de489a7d2..1365faa92 100644 --- a/firstleg/AGENTS.md +++ b/firstleg/AGENTS.md @@ -73,7 +73,7 @@ - Order 渠道变更门禁必须检查装柜或后续状态、PDA task、预装、分柜及同柜组兼容性;任何不确定结果均失败关闭。`ORDER_DECLARATION_UPDATED_V1` 消费必须校验订单号/入仓码归属,永久保留 `eventId + payload hash` 幂等历史并按版本单调更新申报投影;不得覆盖仓库实测、箱码、测量审核或已确认费用。 - 订舱状态固定为 `DRAFT → RELEASED`:草稿允许资料不完整并可替换或删除,放舱时校验完整持久化聚合,放舱后永久只读。创建草稿和放舱都只维护订舱聚合、三类参与方及柜型需求,不创建真实 `containerNo`、货柜行或分配关系;真实货柜只在后续提柜关联时占用已放舱柜型需求。 - 订舱柜型需求至少一项、最多 20 项,数量必须为正整数,容量和限重必须匹配平台柜型规格。起运仓必须是启用的国内中转仓;物流渠道必须来自该仓当前 ACTIVE 价格版本,服务端保存渠道名称快照,渠道失效时失败关闭。 -- 订舱号统一使用 `OB-yyMMdd-####`,按北京时间创建日每日独立递增且单日最多 9999;不得以实体 ID 拼接生成。放舱不要求真实柜号,也不得为满足放舱校验伪造柜号。 +- 订舱号统一使用 `OB-yyMMdd-####`,按北京时间创建日每日独立递增且单日最多 9999;不得以实体 ID 拼接生成。提单号在订舱主表全局唯一,柜次表只保存快照;真实集装箱号只在同一订舱内唯一,不同提单允许复用。放舱不要求真实柜号,也不得为满足放舱校验伪造柜号。 - 订舱列表 `containerCount` 固定为该订舱全部柜型需求 `quantity` 之和,与真实柜关联/解除无关;关联候选只返回 `RELEASED`、剩余数量大于 0 且 `warehouseId + channelCode + containerType` 精确匹配的需求,由服务端集合查询 ACTIVE 分配量。前端不得扇出详情计算或用已关联柜数覆盖该字段,最终关联命令仍须重验目标货柜可修改性。 - 拖车预约是平台级订舱聚合,不是客户或柜次资源:请求、实体、查询、响应和附件不得恢复 `customerId/customerName`,公开 DTO 也不得出现 `containerBookingId/loadingPlanId/cabinetNo/containerNo`。创建候选只返回有提单号、ACTIVE `BOOKING_CONFIRMATION` 或 `BILL_OF_LADING` 且没有非终态拖车单的 `RELEASED` 订舱;创建或编辑只冻结订舱仓库/提单与 TRUCKING/DOMESTIC 国内拖车供应商快照。每订舱通过查询锁与唯一约束最多一张非终态预约,重复创建返回现有派车单号;PDA 装柜完成不得改变拖车状态;只有订舱全部柜型需求均已关联且每柜全部入仓绑定确认国内离仓,才自动完成(含草稿/晚提交)。离仓、拖车创建/编辑/操作统一先锁订舱,完成状态、`AUTO_COMPLETE` 历史、按实装体积守恒分摊的柜次应付及 Finance Outbox 同事务落库;取消/异常单不自动恢复,已有有效或完成单不得重复创建。应付拖车费仅人民币 RMB(财务快照为 CNY),固定使用 `FEE_TYPE_108`,关联 ACTIVE/TRUCKING/DOMESTIC 供应商,零金额不生成费用;正金额缺归属、有效体积或费用配置时失败关闭,不丢费、不伪造均分。手工 DEPART/COMPLETE 动作已移除。附件使用 `tenantId=0 + TRUCK_APPOINTMENT_ATTACHMENT + appointmentId`,提单文件继续归订舱。 - 海外仓业务船节点任务从确认柜子离开国内仓库后启用,必须绑定真实订舱和柜次;十个标准节点、预计/实际时间、异常事实、供应商缺失节点和还柜停止规则统一以 `../../docs/海外仓业务/船节点标准化契约.md` 为准。`CarrierScheduleQuery` 的正常业务查询槽位固定为 `Asia/Shanghai` 每日 09:00、12:30、16:00;每分钟任务只扫描已到期 `next_allowed_at`,不是每分钟请求船司。成功、无变化、需人工或永久失败进入下一固定槽位;仅技术性 `RETRYABLE_FAILURE` 在当前槽内按15/30分钟退避,含首次最多3次且不得跨下一槽,实际 `EMPTY_RETURNED` 后停止。错过的正常槽位直接顺延,不在服务恢复时补跑;单轮按受控批次持续领取并受最大任务数保护。租约、调度尝试和内部停止入口不得暴露为平台页面 API,外部失败不得推进业务节点,不得在国内货柜履约另建查询任务。 diff --git a/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java b/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java index f503a3a7f..66605e865 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java @@ -168,9 +168,6 @@ public interface ContainerBookingMapper extends BaseMapper { @Select("""