fix(firstleg): reuse source manifest within work fact batches
This commit is contained in:
+7
-2
@@ -40,7 +40,10 @@ public class AppointmentWorkSourceService {
|
||||
return new SourcePage(selected.stream().map(this::source).toList(),complete?null:scope+":"+selected.get(selected.size()-1).id(),complete,scope);
|
||||
}
|
||||
public ContainerSource container(long id) {
|
||||
return mapper.sources().stream().filter(row->row.id()==id).findFirst().map(this::source)
|
||||
return container(id,mapper.sources());
|
||||
}
|
||||
private ContainerSource container(long id,List<AppointmentWorkSourceMapper.Source> rows) {
|
||||
return rows.stream().filter(row->row.id()==id).findFirst().map(this::source)
|
||||
.orElseThrow(()->new ResponseStatusException(HttpStatus.NOT_FOUND,"未找到有效已开船柜次"));
|
||||
}
|
||||
private ContainerSource source(AppointmentWorkSourceMapper.Source row) {
|
||||
@@ -57,12 +60,14 @@ public class AppointmentWorkSourceService {
|
||||
public List<Fact> facts(List<FactRequest> requests) {
|
||||
if(requests==null || requests.isEmpty() || requests.size()>200) throw bad("事实请求须包含1至200项");
|
||||
Set<String> keys=new HashSet<>(); Map<Long,ContainerSource> sources=new HashMap<>();
|
||||
// A fact batch shares one authoritative manifest, instead of scanning every sailed container per item.
|
||||
var rows=mapper.sources();
|
||||
return requests.stream().map(request->{
|
||||
if(request==null || request.workItemKey()==null || request.workItemKey().isBlank() || !keys.add(request.workItemKey())
|
||||
|| !("PICKUP".equals(request.type()) || "EMPTY_RETURN".equals(request.type()) || "DELIVERY".equals(request.type()) && "DIRECT".equals(request.flow())))
|
||||
throw bad("事项身份或事实类型无效");
|
||||
long id=id(request.containerBookingId());
|
||||
return original.read(request,sources.computeIfAbsent(id,this::container));
|
||||
return original.read(request,sources.computeIfAbsent(id,key->container(key,rows)));
|
||||
}).toList();
|
||||
}
|
||||
public String hash(Object value) {
|
||||
|
||||
Reference in New Issue
Block a user