feat: enforce canonical container identity across regions

This commit is contained in:
2026-08-31 12:13:20 +08:00
parent b386f35ab4
commit 942dbace19
78 changed files with 1203 additions and 730 deletions
@@ -1,5 +1,6 @@
package com.baiyue.integration.service;
import com.baiyue.common.event.ContainerNumbers;
import com.baiyue.integration.dto.CarrierScheduleDtos.QueryRequest;
import com.baiyue.integration.dto.CarrierScheduleDtos.QueryResult;
import com.baiyue.integration.provider.CarrierScheduleProviderAdapter;
@@ -21,10 +22,20 @@ public class CarrierScheduleProviderService {
}
public QueryResult query(QueryRequest request) {
QueryResult result = adapters.stream().filter(adapter -> adapter.supports(request.carrierCode())).findFirst()
if (!"CONTAINER_NO".equals(request.trackingType())) {
throw new IllegalArgumentException("trackingType仅支持CONTAINER_NO");
}
String containerNo;
try {
containerNo = ContainerNumbers.requireCanonical(request.trackingNo());
} catch (IllegalArgumentException exception) {
throw new IllegalArgumentException("trackingNo必须是规范化真实集装箱号");
}
QueryRequest normalized = new QueryRequest(request.carrierCode(), "CONTAINER_NO", containerNo);
QueryResult result = adapters.stream().filter(adapter -> adapter.supports(normalized.carrierCode())).findFirst()
.orElseThrow(() -> new IllegalArgumentException(
"没有支持该船司的轨迹供应商适配器:" + request.carrierCode()))
.query(request);
"没有支持该船司的轨迹供应商适配器:" + normalized.carrierCode()))
.query(normalized);
if (result == null || result.observations() == null || result.exceptions() == null
|| !OUTCOMES.contains(result.outcome())) {
throw new IllegalStateException("轨迹供应商返回空结果");