From 432ccb606cfaf5a5930df5738a6e6c8d64864842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Wed, 24 Dec 2025 14:10:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=87=BA=E8=B5=9B?= =?UTF-8?q?=E7=A8=8B=E8=A1=A8=EF=BC=9A=E4=BD=BF=E7=94=A8=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从 martial_schedule_group 表获取编排数据 - 使用与 getScheduleResult 相同的数据源 - 按分组顺序和出场顺序导出 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../impl/MartialScheduleServiceImpl.java | 118 ++++++++---------- 1 file changed, 55 insertions(+), 63 deletions(-) diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImpl.java index 97de80c..aec9683 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImpl.java @@ -60,77 +60,69 @@ public class MartialScheduleServiceImpl extends ServiceImpl exportSchedule(Long competitionId) { - // 1. 查询该赛事的所有赛程 - List schedules = this.list( - new QueryWrapper() - .eq("competition_id", competitionId) - .eq("is_deleted", 0) - .orderByAsc("schedule_date", "start_time") - ); - List exportList = new ArrayList<>(); - DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - // 2. 遍历每个赛程 - for (MartialSchedule schedule : schedules) { - // 3. 获取该赛程的所有运动员 - List scheduleAthletes = scheduleAthleteService.list( - new QueryWrapper() - .eq("schedule_id", schedule.getId()) - .eq("is_deleted", 0) - .orderByAsc("order_num") - ); + // 使用与 getScheduleResult 相同的数据源 + List details = scheduleGroupMapper.selectScheduleGroupDetails(competitionId); - // 4. 获取项目和场地信息(一次查询,避免重复) - MartialProject project = schedule.getProjectId() != null - ? projectService.getById(schedule.getProjectId()) - : null; - MartialVenue venue = schedule.getVenueId() != null - ? venueService.getById(schedule.getVenueId()) - : null; + if (details.isEmpty()) { + return exportList; + } - // 5. 如果没有运动员,创建一条基础记录 - if (scheduleAthletes.isEmpty()) { + // 按分组ID分组,然后按 displayOrder 排序 + Map> groupMap = details.stream() + .collect(Collectors.groupingBy(ScheduleGroupDetailVO::getGroupId)); + + // 获取分组的排序顺序 + List sortedGroupIds = details.stream() + .collect(Collectors.toMap( + ScheduleGroupDetailVO::getGroupId, + d -> d.getDisplayOrder() != null ? d.getDisplayOrder() : 999, + (a, b) -> a + )) + .entrySet().stream() + .sorted(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + // 按排序顺序遍历分组 + for (Long groupId : sortedGroupIds) { + List groupDetails = groupMap.get(groupId); + if (groupDetails == null || groupDetails.isEmpty()) { + continue; + } + + ScheduleGroupDetailVO firstDetail = groupDetails.get(0); + + // 过滤出有参赛者的记录,并按出场顺序排序 + List participants = groupDetails.stream() + .filter(d -> d.getParticipantId() != null) + .sorted(Comparator.comparing(d -> d.getPerformanceOrder() != null ? d.getPerformanceOrder() : 999)) + .collect(Collectors.toList()); + + if (participants.isEmpty()) { + // 没有参赛者,创建一条基础记录 ScheduleExportExcel excel = new ScheduleExportExcel(); - excel.setScheduleDate(schedule.getScheduleDate() != null - ? schedule.getScheduleDate().format(dateFormatter) - : ""); - excel.setTimeSlot(schedule.getTimeSlot()); - excel.setVenueName(venue != null ? venue.getVenueName() : ""); - excel.setProjectName(project != null ? project.getProjectName() : ""); - excel.setCategory(schedule.getGroupTitle()); - excel.setStatus(schedule.getIsConfirmed() != null && schedule.getIsConfirmed() == 1 - ? "已确认" : "未确认"); + excel.setScheduleDate(""); + excel.setTimeSlot(firstDetail.getTimeSlot()); + excel.setVenueName(firstDetail.getVenueName()); + excel.setProjectName(firstDetail.getGroupName()); + excel.setCategory(firstDetail.getCategory()); + excel.setStatus("completed".equals(firstDetail.getScheduleStatus()) ? "已完成" : "草稿"); exportList.add(excel); } else { - // 6. 为每个运动员创建导出记录 - for (MartialScheduleAthlete scheduleAthlete : scheduleAthletes) { - MartialAthlete athlete = athleteService.getById(scheduleAthlete.getAthleteId()); - if (athlete == null) { - continue; - } - + // 为每个参赛者创建导出记录 + for (ScheduleGroupDetailVO detail : participants) { ScheduleExportExcel excel = new ScheduleExportExcel(); - excel.setScheduleDate(schedule.getScheduleDate() != null - ? schedule.getScheduleDate().format(dateFormatter) - : ""); - excel.setTimeSlot(schedule.getTimeSlot()); - excel.setVenueName(venue != null ? venue.getVenueName() : ""); - excel.setProjectName(project != null ? project.getProjectName() : ""); - excel.setCategory(schedule.getGroupTitle()); - excel.setAthleteName(athlete.getPlayerName()); - excel.setTeamName(athlete.getTeamName()); - excel.setSortOrder(scheduleAthlete.getOrderNum()); - - // 状态转换 - if (scheduleAthlete.getIsCompleted() != null && scheduleAthlete.getIsCompleted() == 1) { - excel.setStatus("已完赛"); - } else if (schedule.getIsConfirmed() != null && schedule.getIsConfirmed() == 1) { - excel.setStatus("已确认"); - } else { - excel.setStatus("待确认"); - } - + excel.setScheduleDate(""); + excel.setTimeSlot(detail.getTimeSlot()); + excel.setVenueName(detail.getVenueName()); + excel.setProjectName(detail.getGroupName()); + excel.setCategory(detail.getCategory()); + excel.setAthleteName(detail.getPlayerName()); + excel.setTeamName(detail.getOrganization()); + excel.setSortOrder(detail.getPerformanceOrder()); + excel.setStatus(detail.getCheckInStatus() != null ? detail.getCheckInStatus() : "未签到"); exportList.add(excel); } }