diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index c039540ff..32ba49d8b 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -5115,6 +5115,14 @@ BEGIN (OLD.plan_status = 'EDITING' AND NEW.plan_status IN ('EDITING', 'LOADING')) OR (OLD.plan_status = 'LOADING' AND NEW.plan_status IN ('LOADING', 'COMPLETED')) + OR (OLD.plan_status = 'LOADING' AND NEW.plan_status = 'EDITING' + AND NOT EXISTS ( + SELECT 1 + FROM fl_loading_pick_item pick_item + JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id + WHERE pick_task.loading_plan_id = OLD.id + AND pick_item.picked_package_count > 0 + )) ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '装柜状态只允许单向推进'; END IF; @@ -10606,6 +10614,20 @@ DROP PROCEDURE IF EXISTS assert_unified_final_schema; CALL assert_loading_pick_task_shapes(1); DROP PROCEDURE IF EXISTS assert_loading_pick_task_shapes; +-- 修复旧版本“推送预装即拣货中”的状态污染;从未实际拣货的计划回收到预装柜中。 +UPDATE fl_loading_plan plan + SET plan_status = 'EDITING', + updated_at = CURRENT_TIMESTAMP(3), + version = version + 1 + WHERE plan.plan_status = 'LOADING' + AND NOT EXISTS ( + SELECT 1 + FROM fl_loading_pick_item pick_item + JOIN fl_loading_pick_task pick_task ON pick_task.id = pick_item.pick_task_id + WHERE pick_task.loading_plan_id = plan.id + AND pick_item.picked_package_count > 0 + ); + -- 二、三期对外统一使用 INBOUNDED;历史 WAIT_SPLIT 仅由查询适配为 INBOUNDED,统一迁移不改写主表或历史状态。 SELECT 'PASS' AS migration_status, '统一增量全部执行完成;父子订单、履约分片、装柜门禁、订舱拖车、报关船期、船司查询、仓库角色、费用、Finance人工财务、公共资源及可靠审计结构校验通过' AS message; diff --git a/docs/系统状态枚举说明.md b/docs/系统状态枚举说明.md index 72fb192ab..c1c8f478d 100644 --- a/docs/系统状态枚举说明.md +++ b/docs/系统状态枚举说明.md @@ -134,9 +134,10 @@ | 字段 | 状态值 | 中文含义 | | --- | --- | --- | -| 装柜计划 | `EDITING` | 编辑中,可维护货柜信息,并可增删未拣货明细。 | -| 装柜计划 | `LOADING` | 装柜中,已生成 PDA 拣货任务;未拣货明细仍可追加、修改或删除。 | -| 装柜计划 | `COMPLETED` | PDA 拣货完成后自动完成,计划、明细和货柜信息只读。 | +| 货柜聚合 | `WAIT_LOADING` | 待装柜。货柜已创建但尚未创建装柜计划的派生状态,只在查询结果中返回,不写入装柜计划表。 | +| 装柜计划 | `EDITING` | 预装柜中,可维护货柜信息,并可增删未拣货明细。 | +| 装柜计划 | `LOADING` | 拣货中,已生成拣货任务;未拣货明细仍可追加、修改或删除。 | +| 装柜计划 | `COMPLETED` | 装柜完成。拣货完成后自动完成,计划、明细和货柜信息只读。 | | PDA 拣货任务 | `LOADING` | 拣货作业进行中。 | | PDA 拣货任务 | `COMPLETED` | 拣货已完成。 | | PDA 拣货明细 | `PENDING` | 尚未开始拣货。 | @@ -153,7 +154,7 @@ | 旧版拆单记录 | `LOCKED` | 已锁定待完成。 | | 旧版拆单记录 | `COMPLETED` | 已完成并关联子入库单。 | -装柜计划只能单向推进:`EDITING` -> `LOADING` -> `COMPLETED`,没有撤回状态。`COMPLETED` 后不允许编辑或删除装柜明细。 +货柜列表状态为:`WAIT_LOADING`(待装柜)-> `EDITING`(预装柜中)-> `LOADING`(拣货中)-> `COMPLETED`(装柜完成)。其中 `WAIT_LOADING` 是货柜没有装柜计划时的派生状态;装柜计划持久化状态只能单向推进:`EDITING` -> `LOADING` -> `COMPLETED`,没有撤回状态。`COMPLETED` 后不允许编辑或删除装柜明细。 ## 文件、导出和审计 diff --git a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformContainerController.java b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformContainerController.java index 2b6b81b73..303515cf5 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformContainerController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformContainerController.java @@ -43,7 +43,7 @@ public class PlatformContainerController { } @PutMapping("/{id}") @PreAuthorize("hasAuthority('platform:firstleg:container:edit')") @BusinessAudit(event="CONTAINER_UPDATE", resourceType="CONTAINER", resourceId="#id", description="完整编辑货柜基础资料") - @Operation(summary="完整编辑货柜", description="仅无装柜计划或计划为EDITING时允许") + @Operation(summary="完整编辑货柜", description="仅待装柜或预装柜中时允许") public ApiResponse updateDraft(@AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long id, @Valid @RequestBody FullUpdateRequest request) { @@ -53,7 +53,7 @@ public class PlatformContainerController { @PatchMapping("/{id}/transport") @PreAuthorize("hasAuthority('platform:firstleg:container:edit')") @BusinessAudit(event="CONTAINER_TRANSPORT_UPDATE", resourceType="CONTAINER", resourceId="#id", description="修改货柜集装箱号和航次") - @Operation(summary="修改集装箱号和航次", description="LOADING仅开放此白名单;COMPLETED全部只读") + @Operation(summary="修改集装箱号和航次", description="PDA拣货中仅开放此白名单;装柜完成后全部只读") public ApiResponse updateTransport(@AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long id, @Valid @RequestBody TransportUpdateRequest request) { diff --git a/firstleg/src/main/java/com/baiyue/firstleg/domain/SmartLoadingStatus.java b/firstleg/src/main/java/com/baiyue/firstleg/domain/SmartLoadingStatus.java index 8c90af1af..ed7edf37b 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/domain/SmartLoadingStatus.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/domain/SmartLoadingStatus.java @@ -2,9 +2,11 @@ package com.baiyue.firstleg.domain; /** 智能装柜状态,只允许沿此方向推进。 */ public enum SmartLoadingStatus { - /** 编辑中:可以维护货柜信息并增删未拣货明细。 */ + /** 待装柜:货柜已创建但尚未创建装柜计划,仅作为货柜聚合查询的派生状态,不写入装柜计划表。 */ + WAIT_LOADING, + /** 预装柜中:可以维护货柜信息并增删未拣货明细。 */ EDITING, - /** 装柜中:已生成 PDA 拣货任务,仍可追加或调整未拣货明细。 */ + /** 拣货中:已生成拣货任务,仍可追加或调整未拣货明细。 */ LOADING, /** 装柜完成:PDA 拣货完成后自动完成,计划、明细和货柜信息只读。 */ COMPLETED; @@ -12,7 +14,7 @@ public enum SmartLoadingStatus { /** 装柜完成前可维护集装箱号和航次。 */ public boolean allowsTransportUpdate() { return this != COMPLETED; } - /** 编辑中和装柜中均允许维护尚未拣货的明细。 */ + /** 待装柜、预装柜中和拣货中均允许维护尚未拣货的明细。 */ public boolean mutable() { return this != COMPLETED; } public boolean canAdvanceTo(SmartLoadingStatus next) { diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/ContainerDtos.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/ContainerDtos.java index 497edc6ac..eef938937 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/dto/ContainerDtos.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/ContainerDtos.java @@ -73,14 +73,14 @@ public final class ContainerDtos { LocalDateTime actualWarehouseArrivalAt ) {} - @Schema(name = "ContainerFullUpdateRequest", description = "智能装柜 EDITING 阶段完整编辑") + @Schema(name = "ContainerFullUpdateRequest", description = "待装柜或预装柜中阶段完整编辑") public record FullUpdateRequest( @NotNull @PositiveOrZero Integer version, @Valid @NotNull SaveRequest data ) {} @Schema(name = "ContainerTransportUpdateRequest", - description = "LOADING 阶段只允许修改集装箱号和航次") + description = "拣货中阶段只允许修改集装箱号和航次") public record TransportUpdateRequest( @Size(max = 64) String containerNo, @Size(max = 64) String voyageNo, 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 ba8be9441..2371d34dd 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java @@ -13,7 +13,13 @@ import org.apache.ibatis.annotations.Update; public interface ContainerBookingMapper extends BaseMapper { @Select("""