diff --git a/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java b/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java index 296382585..a32a8cdbb 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java @@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestHeader; import java.math.BigDecimal; +import java.util.List; @FeignClient(name = "order-service", contextId = "firstlegOrderCargoClient", url = "${baiyue.clients.order.url:}", path = "/internal/order/v1/cargoes") @@ -17,8 +18,19 @@ public interface OrderCargoClient { @PathVariable long orderId, @PathVariable long cargoId); + @GetMapping("/{tenantId}/{orderId}") + ApiResponse> listForCartonLabels( + @RequestHeader("X-Internal-Service-Token") String token, + @PathVariable long tenantId, + @PathVariable long orderId); + record CargoBinding(Long cargoId, Long orderId, Integer itemNo, String cargoName, Integer originalPackageCount, BigDecimal originalGrossWeightKg, BigDecimal originalVolumeCbm) { } + + record CargoLabelBinding(Long cargoId, Long orderId, Integer itemNo, String cargoName, + Integer packageCount, BigDecimal lengthCm, BigDecimal widthCm, + BigDecimal heightCm) { + } } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java index 6a5721959..af28042cc 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformInboundMeasurementController.java @@ -9,6 +9,8 @@ import com.baiyue.common.core.exception.BizException; import com.baiyue.common.security.AuthenticatedUser; import com.baiyue.firstleg.dto.InboundMeasurementRequests; import com.baiyue.firstleg.dto.InboundMeasurementResponses; +import com.baiyue.firstleg.dto.CartonMeasurementResult; +import com.baiyue.firstleg.service.CartonMeasurementService; import com.baiyue.firstleg.service.FirstlegScopeGuard; import com.baiyue.firstleg.service.InboundMeasurementService; import com.baiyue.firstleg.service.MeasurementSubmissionService; @@ -33,6 +35,7 @@ import org.springframework.web.bind.annotation.RestController; public class PlatformInboundMeasurementController { @Resource private InboundMeasurementService service; @Resource private MeasurementSubmissionService submission; + @Resource private CartonMeasurementService cartonMeasurements; @Operation(summary = "查询入库测量详情", description = "返回原单、实测箱规、审核快照和 OCR 重量结果。") @GetMapping("/measurement") @@ -74,6 +77,24 @@ public class PlatformInboundMeasurementController { return ApiResponse.success(submission.submit(tenantId, inboundId, user.userId(), request)); } + @BusinessAudit(event = "INBOUND_CARTON_MEASUREMENT_COUNT_CONFIRM", + resourceType = "INBOUND_MEASUREMENT_ITEM", resourceId = "#itemId", + description = "确认单箱测量记录代表箱数") + @Operation(summary = "确认单箱测量记录代表箱数", + description = "只修改人工确认箱数并由服务端重算当前测量批次汇总。") + @PutMapping("/measurement/items/{itemId}/confirmed-package-count") + @PreAuthorize("hasAuthority('platform:firstleg:inbound:measure:edit')") + public ApiResponse updateConfirmedPackageCount( + @AuthenticationPrincipal AuthenticatedUser user, + @RequestParam long tenantId, + @PathVariable long inboundId, + @PathVariable long itemId, + @Valid @RequestBody InboundMeasurementRequests.ConfirmedPackageCountRequest request) { + requirePlatformTenant(user, tenantId); + return ApiResponse.success(cartonMeasurements.updateConfirmedPackageCount( + tenantId, inboundId, itemId, request.measurementVersion(), request.confirmedPackageCount())); + } + @BusinessAudit(event = "INBOUND_WEIGHT_OCR_RECORD", resourceType = "INBOUND", resourceId = "#inboundId", description = "登记称重图片 OCR 原值") @Operation(summary = "登记 OCR 重量结果", description = "按图片文件 ID 保存不可覆盖的 OCR 原值。") diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/CartonMeasurementCommand.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/CartonMeasurementCommand.java new file mode 100644 index 000000000..d15d0dd24 --- /dev/null +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/CartonMeasurementCommand.java @@ -0,0 +1,19 @@ +package com.baiyue.firstleg.dto; + +import org.springframework.web.multipart.MultipartFile; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** 已完成外部协议转换后的单箱设备测量命令。 */ +public record CartonMeasurementCommand( + String boxCode, + BigDecimal lengthCm, + BigDecimal widthCm, + BigDecimal heightCm, + BigDecimal unitWeightKg, + String machineNo, + LocalDateTime measuredAt, + MultipartFile image +) { +} diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/CartonMeasurementResult.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/CartonMeasurementResult.java new file mode 100644 index 000000000..49404e3cd --- /dev/null +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/CartonMeasurementResult.java @@ -0,0 +1,22 @@ +package com.baiyue.firstleg.dto; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** 单箱当前测量结果;confirmedPackageCount 为平台人工确认的代表箱数。 */ +public record CartonMeasurementResult( + Long measurementId, + Integer measurementVersion, + Long itemId, + String boxCode, + Integer confirmedPackageCount, + BigDecimal lengthCm, + BigDecimal widthCm, + BigDecimal heightCm, + BigDecimal unitWeightKg, + Long imageFileId, + String machineNo, + LocalDateTime measuredAt, + boolean created +) { +} diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundCartonLabels.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundCartonLabels.java new file mode 100644 index 000000000..8a0d67afb --- /dev/null +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/InboundCartonLabels.java @@ -0,0 +1,26 @@ +package com.baiyue.firstleg.dto; + +import java.math.BigDecimal; +import java.util.List; + +/** 稳定箱号分配、补打和测量解析契约。 */ +public final class InboundCartonLabels { + private InboundCartonLabels() { + } + + public record Batch(Long inboundId, Long orderId, String inboundCode, Integer totalCount, + List