This commit is contained in:
2026-09-24 17:07:21 +08:00
parent 0e62b2f45b
commit b31405af43
9 changed files with 70 additions and 12 deletions
@@ -35,15 +35,16 @@ public class PlatformMojiaSkuSyncController {
@GetMapping
@PreAuthorize("hasAuthority('platform:mojia-sku-sync:list')")
@Operation(summary = "查询墨家一件代发SKU测量记录")
@Operation(summary = "查询墨家机器全部上传记录")
public ApiResponse<PageResult<MojiaSkuSyncDtos.Record>> 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')")
@@ -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) {}
@@ -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;
@@ -14,14 +14,22 @@ import org.springframework.util.StringUtils;
public class MojiaSkuSyncRepository {
@Resource private MojiaMeasurementReceiptMapper mapper;
public PageResult<MojiaMeasurementReceiptEntity> page(String skuCode, String syncStatus,
/** 保留仓储层旧测试/内部调用的四参数入口,统一查询改为全部上传记录。 */
public PageResult<MojiaMeasurementReceiptEntity> 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<MojiaMeasurementReceiptEntity> 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<MojiaMeasurementReceiptEntity>()
.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)));
}
@@ -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());
@@ -42,7 +42,7 @@ public class MojiaSkuSyncService {
public PageResult<MojiaSkuSyncDtos.Record> page(MojiaSkuSyncDtos.Query query) {
PageResult<MojiaMeasurementReceiptEntity> 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());