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 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(); } }