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; /** 装配日历只读仓储查询。 */ public WarehouseCalendarService(WarehouseCalendarRepository repository) { this.repository = repository; } /** 明确权限、版本与计划冻结资格;不以默认计划改写真实到仓时间。 */ 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, "到仓记录过多,请缩小日期范围"); return rows.stream().map(row -> new WarehouseCalendarModels.Entry(row.sourceContainerBookingId(), row.containerNo(), row.warehouseName(), row.warehouseCode(), row.plannedAt(), row.actualAt(), row.version(), row.planCount(), canEdit && row.version() >= 0 && row.planCount() == 0 && row.actualAt() == null)).toList(); } }