38 lines
2.5 KiB
Java
38 lines
2.5 KiB
Java
package com.baiyue.lastleg.calendar;
|
|
|
|
import org.springframework.http.HttpStatus;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.web.server.ResponseStatusException;
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.util.HashSet;
|
|
import java.util.List;
|
|
|
|
@Service
|
|
public class WarehouseCalendarService {
|
|
private final WarehouseCalendarRepository repository;
|
|
private final com.baiyue.lastleg.service.ContainerWarehouseArrivalService arrivals;
|
|
/** 装配日历只读仓储查询。 */
|
|
public WarehouseCalendarService(WarehouseCalendarRepository repository,
|
|
com.baiyue.lastleg.service.ContainerWarehouseArrivalService arrivals) { this.repository = repository; this.arrivals=arrivals; }
|
|
/** 明确权限、版本与计划冻结资格;不以默认计划改写真实到仓时间。 */
|
|
public List<WarehouseCalendarModels.Entry> calendar(WarehouseCalendarModels.Query query, boolean canEdit) {
|
|
if (query.from() == null || query.to() == null || !query.to().isAfter(query.from())
|
|
|| ChronoUnit.DAYS.between(query.from(), query.to()) > 42
|
|
|| new HashSet<>(query.sourceContainerBookingIds()).size() != query.sourceContainerBookingIds().size())
|
|
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "日历范围须为1至42天,来源柜不能重复");
|
|
var rows = repository.calendar(query);
|
|
if (rows.size() > 2000) throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "到仓记录过多,请缩小日期范围");
|
|
var resolved=arrivals.resolve(rows.stream().map(WarehouseCalendarModels.Entry::sourceContainerBookingId).toList())
|
|
.stream().collect(java.util.stream.Collectors.toMap(
|
|
com.baiyue.lastleg.dto.ContainerArrivalTimeView::sourceContainerBookingId,java.util.function.Function.identity()));
|
|
return rows.stream().map(row -> {
|
|
var arrival=resolved.get(row.sourceContainerBookingId());
|
|
if(arrival==null) throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE,"来源柜到仓日期读取不完整");
|
|
return new WarehouseCalendarModels.Entry(row.sourceContainerBookingId(), row.cabinetNo(), row.containerNo(),
|
|
row.warehouseName(), row.warehouseCode(), row.plannedAt(), row.actualAt(), row.version(), row.planCount(),
|
|
canEdit && row.version() >= 0 && row.planCount() == 0 && row.actualAt() == null,
|
|
arrival.plannedDate(),arrival.isDefault());
|
|
}).toList();
|
|
}
|
|
}
|