From b31405af430fe8773add3d9dfad6c421df22336b Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 24 Sep 2026 17:07:21 +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 | 1 + .../PlatformMojiaSkuSyncController.java | 7 ++-- .../baiyue/firstleg/dto/MojiaSkuSyncDtos.java | 5 +-- .../entity/MojiaMeasurementReceiptEntity.java | 1 + .../repository/MojiaSkuSyncRepository.java | 16 +++++++--- .../MojiaMeasurementOpenApiService.java | 32 ++++++++++++++++++- .../firstleg/service/MojiaSkuSyncService.java | 6 ++-- .../resources/db/phase2-inbound-schema.sql | 1 + .../db/recent-schema-incremental-20260923.sql | 13 ++++++++ 9 files changed, 70 insertions(+), 12 deletions(-) diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index a0a4f7989..c4c522c6d 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -3316,6 +3316,7 @@ CREATE TABLE fl_mojia_measurement_receipt ( tenant_id bigint unsigned NOT NULL COMMENT '客户ID和数据隔离键', subject_id bigint unsigned NOT NULL COMMENT '设备应用操作主体ID', box_code varchar(128) NOT NULL COMMENT '设备扫描的原始箱码或不带#的SKU', + inbound_code varchar(64) DEFAULT NULL COMMENT '箱码命中后的权威入仓码;SKU记录为空', measurement_kind varchar(16) NOT NULL DEFAULT 'BOX_LABEL' COMMENT '测量分流:BOX_LABEL箱唛;SKU一件代发SKU', scanned_shipment_id varchar(64) DEFAULT NULL COMMENT '设备从Amazon FBA箱标实扫的Shipment ID', length_cm decimal(12,3) NOT NULL COMMENT '设备实测长度cm', diff --git a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformMojiaSkuSyncController.java b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformMojiaSkuSyncController.java index 44675775d..3eae3921d 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformMojiaSkuSyncController.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/controller/PlatformMojiaSkuSyncController.java @@ -35,15 +35,16 @@ public class PlatformMojiaSkuSyncController { @GetMapping @PreAuthorize("hasAuthority('platform:mojia-sku-sync:list')") - @Operation(summary = "查询墨家一件代发SKU测量记录") + @Operation(summary = "查询墨家机器全部上传记录") public ApiResponse> page( @AuthenticationPrincipal AuthenticatedUser user, - @RequestParam(required = false) String skuCode, + @RequestParam(required = false) String code, + @RequestParam(required = false) String measurementKind, @RequestParam(required = false) String syncStatus, @RequestParam(defaultValue = "1") @Min(1) long page, @RequestParam(defaultValue = "20") @Min(1) @Max(200) long size) { FirstlegScopeGuard.platform(user); - return ApiResponse.success(service.page(new MojiaSkuSyncDtos.Query(skuCode, syncStatus, page, size))); + return ApiResponse.success(service.page(new MojiaSkuSyncDtos.Query(code, measurementKind, syncStatus, page, size))); } @GetMapping("/config") @PreAuthorize("hasAuthority('platform:mojia-sku-sync:list')") diff --git a/firstleg/src/main/java/com/baiyue/firstleg/dto/MojiaSkuSyncDtos.java b/firstleg/src/main/java/com/baiyue/firstleg/dto/MojiaSkuSyncDtos.java index 131000cab..88b6a8763 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/dto/MojiaSkuSyncDtos.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/dto/MojiaSkuSyncDtos.java @@ -10,7 +10,7 @@ import java.time.LocalDateTime; public final class MojiaSkuSyncDtos { private MojiaSkuSyncDtos() {} - public record Query(String skuCode, String syncStatus, long page, long size) {} + public record Query(String code, String measurementKind, String syncStatus, long page, long size) {} public record Config(boolean autoSyncEnabled) {} @@ -25,7 +25,8 @@ public final class MojiaSkuSyncDtos { public record RetryRequest(@NotNull Integer revision) {} public record Record( - Long id, String skuCode, BigDecimal lengthCm, BigDecimal widthCm, BigDecimal heightCm, + Long id, String measurementKind, String boxCode, String inboundCode, String skuCode, + BigDecimal lengthCm, BigDecimal widthCm, BigDecimal heightCm, BigDecimal weightKg, Long imageFileId, LocalDateTime measuredAt, LocalDateTime receivedAt, String syncStatus, String syncFailureCode, String syncFailureReason, String lingxingSkuId, Integer revision, LocalDateTime updatedAt) {} diff --git a/firstleg/src/main/java/com/baiyue/firstleg/entity/MojiaMeasurementReceiptEntity.java b/firstleg/src/main/java/com/baiyue/firstleg/entity/MojiaMeasurementReceiptEntity.java index 9df013eef..78e45cf5b 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/entity/MojiaMeasurementReceiptEntity.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/entity/MojiaMeasurementReceiptEntity.java @@ -19,6 +19,7 @@ public class MojiaMeasurementReceiptEntity { private Long tenantId; private Long subjectId; private String boxCode; + private String inboundCode; /** BOX_LABEL 表示现有箱唛链路;SKU 表示一件代发新品测量同步收件。 */ private String measurementKind; private String scannedShipmentId; diff --git a/firstleg/src/main/java/com/baiyue/firstleg/repository/MojiaSkuSyncRepository.java b/firstleg/src/main/java/com/baiyue/firstleg/repository/MojiaSkuSyncRepository.java index 7482ac209..8454e5f0a 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/repository/MojiaSkuSyncRepository.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/repository/MojiaSkuSyncRepository.java @@ -14,14 +14,22 @@ import org.springframework.util.StringUtils; public class MojiaSkuSyncRepository { @Resource private MojiaMeasurementReceiptMapper mapper; - public PageResult page(String skuCode, String syncStatus, + /** 保留仓储层旧测试/内部调用的四参数入口,统一查询改为全部上传记录。 */ + public PageResult page(String code, String syncStatus, long page, long size) { - String normalizedSkuCode = StringUtils.hasText(skuCode) ? skuCode.trim() : null; + return page(code, null, syncStatus, page, size); + } + + public PageResult page(String code, String measurementKind, String syncStatus, + long page, long size) { + String normalizedCode = StringUtils.hasText(code) ? code.trim() : null; return PageResult.from(mapper.selectPage(new Page<>(page, size), new LambdaQueryWrapper() - .eq(MojiaMeasurementReceiptEntity::getMeasurementKind, "SKU") + .eq(StringUtils.hasText(measurementKind), MojiaMeasurementReceiptEntity::getMeasurementKind, measurementKind) .eq(StringUtils.hasText(syncStatus), MojiaMeasurementReceiptEntity::getSyncStatus, syncStatus) - .like(normalizedSkuCode != null, MojiaMeasurementReceiptEntity::getBoxCode, normalizedSkuCode) + .and(normalizedCode != null, wrapper -> wrapper + .like(MojiaMeasurementReceiptEntity::getBoxCode, normalizedCode) + .or().like(MojiaMeasurementReceiptEntity::getInboundCode, normalizedCode)) .orderByDesc(MojiaMeasurementReceiptEntity::getMeasuredAt) .orderByDesc(MojiaMeasurementReceiptEntity::getId))); } diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaMeasurementOpenApiService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaMeasurementOpenApiService.java index 1de4e3153..9956d34c2 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaMeasurementOpenApiService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaMeasurementOpenApiService.java @@ -111,7 +111,8 @@ public class MojiaMeasurementOpenApiService { throw exception; } if (platformBinding.warehouseId() != machineWarehouseId) { - throw new BizException(ResultCode.FORBIDDEN, "箱号不属于当前设备绑定仓库"); + return saveUnmatched(app, request, image, + new BizException(ResultCode.FORBIDDEN, "箱号不属于当前设备绑定仓库")); } CartonMeasurementResult result; try { @@ -132,6 +133,7 @@ public class MojiaMeasurementOpenApiService { correlation("requestId"), correlation("traceId"), safe(request.boxCode()), safe(request.machineNo()), request.length(), request.width(), request.height(), image.getSize(), result.measurementId(), result.itemId(), result.created()); + saveMatchedReceipt(app, request, result, platformBinding.binding().inboundCode()); return new UploadResponse(true, true, null, result.measurementId(), result.itemId(), result.boxCode(), result.imageFileId(), result.created()); } catch (RuntimeException exception) { @@ -146,6 +148,33 @@ public class MojiaMeasurementOpenApiService { } } + /** 每次箱码上传都保留一条设备收件流水,正式测量成功后补上权威入仓码。 */ + private void saveMatchedReceipt(AuthenticatedMeasurementApp app, UploadRequest request, + CartonMeasurementResult result, String inboundCode) { + MojiaMeasurementReceiptEntity receipt = new MojiaMeasurementReceiptEntity(); + receipt.setId(IdWorker.getId()); + receipt.setTenantId(app.tenantId()); + receipt.setSubjectId(app.subjectId()); + receipt.setBoxCode(request.boxCode().trim()); + receipt.setInboundCode(inboundCode); + receipt.setMeasurementKind("BOX_LABEL"); + receipt.setScannedShipmentId(optionalTrim(request.shipmentId())); + receipt.setLengthCm(request.length()); + receipt.setWidthCm(request.width()); + receipt.setHeightCm(request.height()); + receipt.setWeightKg(request.weightKg()); + receipt.setMachineNo(request.machineNo().trim()); + receipt.setMeasuredAt(request.measuredAt() == null ? LocalDateTime.now() : request.measuredAt()); + receipt.setImageFileId(result.imageFileId()); + receipt.setStatus("MATCHED"); + receipt.setRevision(1); + receipt.setRequestId(correlation("requestId")); + receipt.setTraceId(correlation("traceId")); + receipt.setCreatedAt(LocalDateTime.now()); + receipt.setUpdatedAt(LocalDateTime.now()); + receipts.insert(receipt); + } + private UploadResponse saveSkuPending(AuthenticatedMeasurementApp app, UploadRequest request, MultipartFile image) { long receiptId = IdWorker.getId(); @@ -203,6 +232,7 @@ public class MojiaMeasurementOpenApiService { receipt.setTenantId(app.tenantId()); receipt.setSubjectId(app.subjectId()); receipt.setBoxCode(request.boxCode().trim()); + receipt.setMeasurementKind("BOX_LABEL"); receipt.setScannedShipmentId(optionalTrim(request.shipmentId())); receipt.setLengthCm(request.length()); receipt.setWidthCm(request.width()); diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaSkuSyncService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaSkuSyncService.java index ea51e2c90..47b2c9d97 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaSkuSyncService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/MojiaSkuSyncService.java @@ -42,7 +42,7 @@ public class MojiaSkuSyncService { public PageResult page(MojiaSkuSyncDtos.Query query) { PageResult source = repository.page( - query.skuCode(), query.syncStatus(), query.page(), query.size()); + query.code(), query.measurementKind(), query.syncStatus(), query.page(), query.size()); return new PageResult<>(source.records().stream().map(MojiaSkuSyncService::view).toList(), source.page(), source.size(), source.total(), source.pages()); } @@ -104,7 +104,9 @@ public class MojiaSkuSyncService { } private static MojiaSkuSyncDtos.Record view(MojiaMeasurementReceiptEntity value) { - return new MojiaSkuSyncDtos.Record(value.getId(), value.getBoxCode(), value.getLengthCm(), + return new MojiaSkuSyncDtos.Record(value.getId(), value.getMeasurementKind(), value.getBoxCode(), + value.getInboundCode(), "SKU".equals(value.getMeasurementKind()) ? value.getBoxCode() : null, + value.getLengthCm(), value.getWidthCm(), value.getHeightCm(), value.getWeightKg(), value.getImageFileId(), value.getMeasuredAt(), value.getCreatedAt(), value.getSyncStatus(), value.getSyncFailureCode(), value.getSyncFailureReason(), value.getLingxingSkuId(), value.getRevision(), value.getUpdatedAt()); diff --git a/firstleg/src/main/resources/db/phase2-inbound-schema.sql b/firstleg/src/main/resources/db/phase2-inbound-schema.sql index bd1f6b222..2afc054aa 100644 --- a/firstleg/src/main/resources/db/phase2-inbound-schema.sql +++ b/firstleg/src/main/resources/db/phase2-inbound-schema.sql @@ -329,6 +329,7 @@ CREATE TABLE IF NOT EXISTS fl_mojia_measurement_receipt ( tenant_id BIGINT UNSIGNED NOT NULL COMMENT '客户ID和数据隔离键', subject_id BIGINT UNSIGNED NOT NULL COMMENT '设备应用操作主体ID', box_code VARCHAR(128) NOT NULL COMMENT '设备扫描的原始箱码', + inbound_code VARCHAR(64) NULL COMMENT '箱码命中后的权威入仓码;SKU记录为空', measurement_kind VARCHAR(16) NOT NULL DEFAULT 'BOX_LABEL' COMMENT '测量分流:BOX_LABEL箱唛;SKU一件代发SKU', scanned_shipment_id VARCHAR(64) NULL COMMENT '设备从Amazon FBA箱标实扫的Shipment ID', length_cm DECIMAL(12,3) NOT NULL COMMENT '设备实测长度cm', diff --git a/scripts/db/recent-schema-incremental-20260923.sql b/scripts/db/recent-schema-incremental-20260923.sql index 95fb242b8..3763bbe85 100644 --- a/scripts/db/recent-schema-incremental-20260923.sql +++ b/scripts/db/recent-schema-incremental-20260923.sql @@ -108,6 +108,19 @@ DEALLOCATE PREPARE recent_schema_stmt; -- Firstleg:墨家测量收件箱扩展为箱唛/SKU 双分流 -- ============================================================================ +SET @ddl = IF( + NOT EXISTS ( + SELECT 1 FROM information_schema.columns + WHERE table_schema = DATABASE() AND table_name = 'fl_mojia_measurement_receipt' + AND column_name = 'inbound_code' + ), + 'ALTER TABLE fl_mojia_measurement_receipt ADD COLUMN inbound_code VARCHAR(64) NULL COMMENT ''箱码命中后的权威入仓码;SKU记录为空'' AFTER box_code', + 'SELECT 1' +); +PREPARE recent_schema_stmt FROM @ddl; +EXECUTE recent_schema_stmt; +DEALLOCATE PREPARE recent_schema_stmt; + SET @ddl = IF( NOT EXISTS ( SELECT 1 FROM information_schema.columns