fix: isolate invalid container progress snapshots
This commit is contained in:
@@ -86,7 +86,7 @@ public class LastlegOrderService {
|
||||
long total = orderMapper.countContainerProgress(query);
|
||||
List<ContainerPlanProgressSummary> records = total == 0 ? List.of()
|
||||
: orderMapper.pageContainerProgress(query, (query.page() - 1) * query.size(), query.size())
|
||||
.stream().map(this::requireFrozenContainer).toList();
|
||||
.stream().map(this::containerSummaryForRead).toList();
|
||||
long pages = total == 0 ? 0 : (total + query.size() - 1) / query.size();
|
||||
return new PageResult<>(records, query.page(), query.size(), total, pages);
|
||||
}
|
||||
@@ -101,7 +101,7 @@ public class LastlegOrderService {
|
||||
if (summary == null) {
|
||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "来源柜不存在");
|
||||
}
|
||||
return new ContainerPlanProgressDetail(requireFrozenContainer(summary),
|
||||
return new ContainerPlanProgressDetail(containerSummaryForRead(summary),
|
||||
orderMapper.findContainerProgressItems(bookingId));
|
||||
}
|
||||
|
||||
@@ -150,17 +150,42 @@ public class LastlegOrderService {
|
||||
|
||||
private ContainerPlanProgressSummary requireFrozenContainer(ContainerPlanProgressSummary summary) {
|
||||
if (summary == null) throw new ResponseStatusException(HttpStatus.NOT_FOUND, "来源柜不存在");
|
||||
String issue = containerSnapshotIssue(summary);
|
||||
if (issue != null) throw new ResponseStatusException(HttpStatus.CONFLICT, issue);
|
||||
return summary;
|
||||
}
|
||||
|
||||
private ContainerPlanProgressSummary containerSummaryForRead(ContainerPlanProgressSummary summary) {
|
||||
String issue = containerSnapshotIssue(summary);
|
||||
if (issue == null) return summary;
|
||||
boolean invalidContainer = !hasCanonicalContainerNo(summary.containerNo());
|
||||
return new ContainerPlanProgressSummary(summary.sourceContainerBookingId(), summary.containerNo(),
|
||||
summary.overseasWarehouseId(), summary.overseasWarehouseCode(), summary.overseasWarehouseName(),
|
||||
summary.assignmentVersion(), invalidContainer ? false : summary.canChangeReceivingWarehouse(),
|
||||
invalidContainer ? issue : summary.receivingWarehouseLockReason(), summary.totalOrderCount(),
|
||||
summary.inboundCodeCount(), summary.missingInboundCodeCount(), summary.planCount(),
|
||||
summary.plannedInboundCodeCount(), summary.pendingPlanCount(), summary.plannedArrivalAt(),
|
||||
false, issue);
|
||||
}
|
||||
|
||||
private String containerSnapshotIssue(ContainerPlanProgressSummary summary) {
|
||||
if (!hasCanonicalContainerNo(summary.containerNo())) {
|
||||
return "来源柜真实集装箱号缺失、格式无效或存在漂移";
|
||||
}
|
||||
if (!StringUtils.hasText(summary.overseasWarehouseId())
|
||||
|| !StringUtils.hasText(summary.overseasWarehouseCode())
|
||||
|| !StringUtils.hasText(summary.overseasWarehouseName()) || summary.assignmentVersion() < 0) {
|
||||
return "柜内接柜仓业务快照不一致";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean hasCanonicalContainerNo(String containerNo) {
|
||||
try {
|
||||
ContainerNumbers.requireCanonical(summary.containerNo());
|
||||
if (!StringUtils.hasText(summary.overseasWarehouseId())
|
||||
|| !StringUtils.hasText(summary.overseasWarehouseCode())
|
||||
|| !StringUtils.hasText(summary.overseasWarehouseName()) || summary.assignmentVersion() < 0) {
|
||||
throw new IllegalArgumentException("receiving warehouse assignment drift");
|
||||
}
|
||||
return summary;
|
||||
ContainerNumbers.requireCanonical(containerNo);
|
||||
return true;
|
||||
} catch (IllegalArgumentException exception) {
|
||||
throw new ResponseStatusException(HttpStatus.CONFLICT,
|
||||
"来源柜真实集装箱号缺失、格式无效或存在漂移", exception);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user