diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialSchedulePlanServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialSchedulePlanServiceImpl.java index 27f466a..cd1132f 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialSchedulePlanServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialSchedulePlanServiceImpl.java @@ -415,19 +415,38 @@ public class MartialSchedulePlanServiceImpl extends ServiceImpl allAthleteSlots = athleteSlotMapper.selectList( + new QueryWrapper().in("athlete_id", moveDTO.getAthleteIds()) + ); + + // Extract all slot IDs and batch query + List slotIds = allAthleteSlots.stream() + .map(MartialScheduleAthleteSlot::getSlotId) + .distinct() + .collect(Collectors.toList()); + + List slots = slotMapper.selectBatchIds(slotIds); + Map slotMap = slots.stream() + .collect(Collectors.toMap(MartialScheduleSlot::getId, s -> s)); + + // Group athlete slots by athlete ID + Map> athleteSlotMap = allAthleteSlots.stream() + .collect(Collectors.groupingBy(MartialScheduleAthleteSlot::getAthleteId)); + + // Check conflicts for each athlete for (Long athleteId : moveDTO.getAthleteIds()) { - // 查询该运动员的所有时间槽 - List athleteSlots = athleteSlotMapper.selectList( - new QueryWrapper().eq("athlete_id", athleteId) - ); + List athleteSlots = athleteSlotMap.get(athleteId); + if (athleteSlots == null) { + continue; + } for (MartialScheduleAthleteSlot as : athleteSlots) { if (as.getSlotId().equals(moveDTO.getFromSlotId())) { continue; // 跳过源时间槽 } - MartialScheduleSlot existingSlot = slotMapper.selectById(as.getSlotId()); + MartialScheduleSlot existingSlot = slotMap.get(as.getSlotId()); if (existingSlot != null && existingSlot.getSlotDate().equals(toSlot.getSlotDate()) && timeOverlaps(existingSlot.getStartTime(), existingSlot.getEndTime(), @@ -450,6 +469,7 @@ public class MartialSchedulePlanServiceImpl extends ServiceImpl