diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 2544a3a4e..19a57649a 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -4768,6 +4768,8 @@ CREATE TABLE IF NOT EXISTS fl_container_booking ( channel_name VARCHAR(128) NULL COMMENT '订舱渠道名称快照', ocean_booking_id BIGINT UNSIGNED NULL COMMENT '来源订舱ID', ocean_booking_requirement_id BIGINT UNSIGNED NULL COMMENT '来源订舱箱型需求ID', + customer_id BIGINT UNSIGNED NULL COMMENT '已关联真实订舱指定的客户范围', + customer_name VARCHAR(128) NULL COMMENT '已关联真实订舱客户名称快照', warehouse_id BIGINT UNSIGNED NOT NULL COMMENT '装柜仓库ID;平台公共资源', warehouse_name VARCHAR(128) NOT NULL COMMENT '装柜仓库名称快照', bill_of_lading_no VARCHAR(128) NULL COMMENT '提单号', 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 d061d5204..0decb1063 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformContainerController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformContainerController.java @@ -6,8 +6,10 @@ import com.baiyue.common.core.api.PageResult; import com.baiyue.common.security.AuthenticatedUser; import com.baiyue.firstleg.dto.ContainerDtos.FullUpdateRequest; import com.baiyue.firstleg.dto.ContainerDtos.Query; -import com.baiyue.firstleg.dto.ContainerDtos.SaveRequest; import com.baiyue.firstleg.dto.ContainerDtos.TransportUpdateRequest; +import com.baiyue.firstleg.dto.ContainerDtos.SimulationCreateRequest; +import com.baiyue.firstleg.dto.ContainerDtos.OceanBookingLinkRequest; +import com.baiyue.firstleg.dto.ContainerDtos.OceanBookingUnlinkRequest; import com.baiyue.firstleg.entity.ContainerBookingEntity; import com.baiyue.firstleg.service.ContainerService; import com.baiyue.firstleg.service.FirstlegScopeGuard; @@ -88,9 +90,15 @@ public class PlatformContainerController { @PostMapping @PreAuthorize("hasAuthority('platform:firstleg:container:create')") @BusinessAudit(event="CONTAINER_CREATE", resourceType="CONTAINER", description="新增货柜基础资料", captureBefore=false) public ApiResponse create(@AuthenticationPrincipal AuthenticatedUser user, - @Valid @RequestBody SaveRequest request) { - FirstlegScopeGuard.platform(user); return ApiResponse.success(service.create(user.userId(), user.username(), request)); + @Valid @RequestBody SimulationCreateRequest request) { + FirstlegScopeGuard.platform(user); return ApiResponse.success(service.createSimulation(user.userId(), user.username(), request)); } + @PostMapping("/{id}/ocean-booking-link") @PreAuthorize("hasAuthority('platform:firstleg:container:edit')") + @BusinessAudit(event="CONTAINER_OCEAN_BOOKING_LINK", resourceType="CONTAINER", resourceId="#id", description="关联真实订舱柜") + public ApiResponse linkOceanBooking(@AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long id, @Valid @RequestBody OceanBookingLinkRequest request) { FirstlegScopeGuard.platform(user); return ApiResponse.success(service.linkOceanBooking(id, user.userId(), user.username(), request)); } + @DeleteMapping("/{id}/ocean-booking-link") @PreAuthorize("hasAuthority('platform:firstleg:container:edit')") + @BusinessAudit(event="CONTAINER_OCEAN_BOOKING_UNLINK", resourceType="CONTAINER", resourceId="#id", description="解除真实订舱柜关联") + public ApiResponse unlinkOceanBooking(@AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long id, @Valid @RequestBody OceanBookingUnlinkRequest request) { FirstlegScopeGuard.platform(user); return ApiResponse.success(service.unlinkOceanBooking(id, user.userId(), user.username(), request)); } @PutMapping("/{id}") @PreAuthorize("hasAuthority('platform:firstleg:container:edit')") @BusinessAudit(event="CONTAINER_UPDATE", resourceType="CONTAINER", resourceId="#id", description="完整编辑货柜基础资料") @Operation(summary="完整编辑货柜", description="仅待装柜或预装柜中时允许") 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 1c6b42a8a..c0eef66de 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/dto/ContainerDtos.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/ContainerDtos.java @@ -92,4 +92,18 @@ public final class ContainerDtos { this(containerNo, voyageNo, version, "运输信息更新"); } } + + @Schema(name = "ContainerSimulationCreateRequest", description = "新增内部模拟柜;内部柜号由服务端生成") + public record SimulationCreateRequest(@NotBlank @Size(max = 64) String channelCode, + @NotNull @Positive Long warehouseId, @NotBlank @Size(max = 32) String containerType, + @NotNull @DecimalMin(value = "0", inclusive = false) BigDecimal capacityCbm, + @NotNull @DecimalMin(value = "0", inclusive = false) BigDecimal maxWeightKg) {} + + @Schema(name = "ContainerOceanBookingLinkRequest", description = "将内部模拟柜关联到真实订舱箱型分配") + public record OceanBookingLinkRequest(@NotNull @Positive Long oceanBookingId, + @NotNull @Positive Long requirementId, @NotNull @PositiveOrZero Integer expectedVersion) {} + + @Schema(name = "ContainerOceanBookingUnlinkRequest", description = "解除空模拟柜的真实订舱关联") + public record OceanBookingUnlinkRequest(@NotNull @PositiveOrZero Integer expectedVersion, + @NotBlank @Size(max = 500) String reason) {} } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/entity/ContainerBookingEntity.java b/firstleg/src/main/java/com/baiyue/firstleg/entity/ContainerBookingEntity.java index 85ac199e2..48f09634e 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/entity/ContainerBookingEntity.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/entity/ContainerBookingEntity.java @@ -24,6 +24,8 @@ public class ContainerBookingEntity { private String channelName; private Long oceanBookingId; private Long oceanBookingRequirementId; + private Long customerId; + private String customerName; private Long warehouseId; private String warehouseName; private String billOfLadingNo; 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 77c8874d6..623a54195 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/mapper/ContainerBookingMapper.java @@ -24,7 +24,7 @@ public interface ContainerBookingMapper extends BaseMapper failChange(@AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long oceanBookingId, @RequestHeader("Idempotency-Key") String key, @Valid @RequestBody ActionRequest request) { FirstlegScopeGuard.platform(user); return ApiResponse.success(service.failChange(oceanBookingId, user.userId(), user.username(), key, request)); } - @PostMapping("/{oceanBookingId}/allocations") @PreAuthorize("hasAuthority('platform:firstleg:ocean-booking:allocate')") - @BusinessAudit(event="OCEAN_BOOKING_ALLOCATE_CONTAINER", resourceType="OCEAN_BOOKING", resourceId="#oceanBookingId", description="分配订舱柜次") - public ApiResponse allocate(@AuthenticationPrincipal AuthenticatedUser user, @PathVariable @Positive long oceanBookingId, @RequestHeader("Idempotency-Key") String key, @Valid @RequestBody AllocationRequest request) { FirstlegScopeGuard.platform(user); return ApiResponse.success(service.allocate(oceanBookingId, user.userId(), user.username(), key, request)); } private static void validateOptionalCustomer(AuthenticatedUser user, Long customerId) { FirstlegScopeGuard.platform(user); if (customerId != null) FirstlegScopeGuard.platform(user, customerId); } } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/dto/OceanBookingDtos.java b/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/dto/OceanBookingDtos.java index c7d480efc..18caf303a 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/dto/OceanBookingDtos.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/dto/OceanBookingDtos.java @@ -83,9 +83,6 @@ public final class OceanBookingDtos { LocalDateTime estimatedSailingAt, LocalDateTime estimatedArrivalAt, @NotBlank @Size(max = 1000) String reason) {} - public record AllocationRequest(@NotNull @Positive Long requirementId, - @NotNull @Positive Long containerBookingId, - @NotNull @Min(0) Integer expectedVersion) {} public record Detail(OceanBookingEntity oceanBooking, List parties, List containerRequirements, diff --git a/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/mapper/OceanBookingMapper.java b/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/mapper/OceanBookingMapper.java index aa235e6ab..da0e9ff79 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/mapper/OceanBookingMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/oceanbooking/mapper/OceanBookingMapper.java @@ -17,6 +17,7 @@ public interface OceanBookingMapper extends BaseMapper {