diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index 3af0a8c..fa0923f 100644 Binary files a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta and b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta index fabd9a1..1b0f159 100644 Binary files a/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta and b/minio_data/.minio.sys/buckets/.usage-cache.bin.bkp/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta index 3f815bf..f67d231 100644 Binary files a/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta and b/minio_data/.minio.sys/buckets/.usage-cache.bin/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/.usage.json/xl.meta b/minio_data/.minio.sys/buckets/.usage.json/xl.meta index 93bd447..0f3fd3c 100644 Binary files a/minio_data/.minio.sys/buckets/.usage.json/xl.meta and b/minio_data/.minio.sys/buckets/.usage.json/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta index 067cbdf..bce8682 100644 Binary files a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta and b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin.bkp/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta index a0b15a9..9e259be 100644 Binary files a/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta and b/minio_data/.minio.sys/buckets/000000-assets/.usage-cache.bin/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta index 361cdf3..4540932 100644 Binary files a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta and b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin.bkp/xl.meta differ diff --git a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta index 07950d7..0c21905 100644 Binary files a/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta and b/minio_data/.minio.sys/buckets/assets/.usage-cache.bin/xl.meta differ diff --git a/src/main/java/org/springblade/modules/martial/pojo/dto/ParticipantDTO.java b/src/main/java/org/springblade/modules/martial/pojo/dto/ParticipantDTO.java index 2d2f44e..dde3a77 100644 --- a/src/main/java/org/springblade/modules/martial/pojo/dto/ParticipantDTO.java +++ b/src/main/java/org/springblade/modules/martial/pojo/dto/ParticipantDTO.java @@ -4,6 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; +import java.util.List; +import java.util.Map; /** * 参赛人员DTO @@ -52,4 +54,10 @@ public class ParticipantDTO implements Serializable { @Schema(description = "选手姓名") private String playerName; + /** + * 队员列表(集体项目) + */ + @Schema(description = "队员列表(集体项目)") + private List> members; + } diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java index 4f1b553..db2c79b 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java @@ -49,6 +49,8 @@ public class MartialScheduleArrangeServiceImpl implements IMartialScheduleArrang private final MartialScheduleDetailMapper scheduleDetailMapper; private final MartialScheduleParticipantMapper scheduleParticipantMapper; private final MartialAthleteMapper athleteMapper; + private final MartialTeamMapper teamMapper; + private final MartialTeamMemberMapper teamMemberMapper; private final MartialCompetitionMapper competitionMapper; private final MartialVenueMapper venueMapper; private final MartialProjectMapper projectMapper; @@ -213,7 +215,7 @@ public class MartialScheduleArrangeServiceImpl implements IMartialScheduleArrang List participants = scheduleParticipantMapper.selectList(participantWrapper); if (group.getProjectType() == 2) { - // 集体项目:按单位分组 + // 集体项目:按单位分组,并获取队员列表 Map> orgGroupMap = participants.stream() .collect(Collectors.groupingBy(MartialScheduleParticipant::getOrganization)); @@ -225,7 +227,39 @@ public class MartialScheduleArrangeServiceImpl implements IMartialScheduleArrang List> orgParticipants = new ArrayList<>(); for (MartialScheduleParticipant p : entry.getValue()) { Map pData = new HashMap<>(); + pData.put("id", p.getParticipantId()); pData.put("playerName", p.getPlayerName()); + pData.put("schoolUnit", p.getOrganization()); + + // 查询队伍信息和队员列表 + String teamName = p.getPlayerName(); + LambdaQueryWrapper teamWrapper = new LambdaQueryWrapper<>(); + teamWrapper.eq(MartialTeam::getTeamName, teamName) + .eq(MartialTeam::getIsDeleted, 0) + .last("LIMIT 1"); + MartialTeam team = teamMapper.selectOne(teamWrapper); + + List> memberList = new ArrayList<>(); + if (team != null) { + // 获取队员列表 + LambdaQueryWrapper memberWrapper = new LambdaQueryWrapper<>(); + memberWrapper.eq(MartialTeamMember::getTeamId, team.getId()) + .eq(MartialTeamMember::getIsDeleted, 0); + List members = teamMemberMapper.selectList(memberWrapper); + + for (MartialTeamMember member : members) { + // 获取队员详情 + MartialAthlete athlete = athleteMapper.selectById(member.getAthleteId()); + if (athlete != null) { + Map memberData = new HashMap<>(); + memberData.put("id", athlete.getId()); + memberData.put("playerName", athlete.getPlayerName()); + memberData.put("organization", athlete.getOrganization()); + memberList.add(memberData); + } + } + } + pData.put("members", memberList); orgParticipants.add(pData); } orgGroup.put("participants", orgParticipants); 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 26de138..99cd6a9 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 @@ -322,9 +322,10 @@ public class MartialScheduleServiceImpl extends ServiceImpl groupDTOs = new ArrayList<>(); int displayOrder = 0; + long tempIdCounter = 1; // Counter for generating unique negative IDs for sub-groups for (MartialProject project : projects) { List projectAthletes = athletesByProject.getOrDefault(project.getId(), new ArrayList<>()); @@ -334,66 +335,133 @@ public class MartialScheduleServiceImpl extends ServiceImpl participantDTOs = new ArrayList<>(); - int sortOrder = 1; - for (MartialAthlete athlete : projectAthletes) { - ParticipantDTO dto = new ParticipantDTO(); - dto.setId(athlete.getId()); - dto.setPlayerName(athlete.getPlayerName()); - dto.setSchoolUnit(athlete.getOrganization()); - dto.setTeamName(athlete.getTeamName()); - dto.setStatus("未签到"); - dto.setSortOrder(sortOrder++); - participantDTOs.add(dto); + // 单人项目:根据maxParticipants拆分 + if ("单人".equals(typeStr)) { + Integer maxParticipants = project.getMaxParticipants(); + int athleteCount = projectAthletes.size(); + + // 如果maxParticipants有效且人数超过限制,需要拆分 + if (maxParticipants != null && maxParticipants > 0 && athleteCount > maxParticipants) { + int numGroups = (int) Math.ceil((double) athleteCount / maxParticipants); + log.info("项目 '{}' 有{}人,maxParticipants={},将拆分成{}组", + project.getProjectName(), athleteCount, maxParticipants, numGroups); + + for (int i = 0; i < numGroups; i++) { + int startIdx = i * maxParticipants; + int endIdx = Math.min(startIdx + maxParticipants, athleteCount); + List subGroupAthletes = projectAthletes.subList(startIdx, endIdx); + + CompetitionGroupDTO groupDTO = new CompetitionGroupDTO(); + // 使用唯一的负数ID + groupDTO.setId(-project.getId() - tempIdCounter++); + groupDTO.setProjectId(project.getId()); + + // 如果只有一组,不加组号后缀 + if (numGroups == 1) { + groupDTO.setTitle(project.getProjectName() + " 未分组"); + } else { + groupDTO.setTitle(project.getProjectName() + " 第" + (i + 1) + "组"); + } + groupDTO.setCode("C" + competitionId + "-P" + String.format("%03d", displayOrder + 1)); + groupDTO.setType(typeStr); + groupDTO.setCount(subGroupAthletes.size() + "人"); + groupDTO.setVenueId(defaultVenueId); + groupDTO.setVenueName(defaultVenueName); + groupDTO.setTimeSlotIndex(0); + groupDTO.setTimeSlot(null); + + // 生成参赛者列表 + List participantDTOs = new ArrayList<>(); + int sortOrder = 1; + for (MartialAthlete athlete : subGroupAthletes) { + ParticipantDTO dto = new ParticipantDTO(); + dto.setId(athlete.getId()); + dto.setPlayerName(athlete.getPlayerName()); + dto.setSchoolUnit(athlete.getOrganization()); + dto.setTeamName(athlete.getTeamName()); + dto.setStatus("未签到"); + dto.setSortOrder(sortOrder++); + participantDTOs.add(dto); + } + + groupDTO.setParticipants(participantDTOs); + groupDTOs.add(groupDTO); + displayOrder++; + } + } else { + // 不需要拆分,生成单个分组 + CompetitionGroupDTO groupDTO = createSingleGroup(project, projectAthletes, typeStr, + defaultVenueId, defaultVenueName, competitionId, displayOrder); + groupDTOs.add(groupDTO); + displayOrder++; + } + } else { + // 集体项目:不拆分 + CompetitionGroupDTO groupDTO = createSingleGroup(project, projectAthletes, typeStr, + defaultVenueId, defaultVenueName, competitionId, displayOrder); + groupDTOs.add(groupDTO); + displayOrder++; } - - groupDTO.setParticipants(participantDTOs); - groupDTOs.add(groupDTO); - displayOrder++; } result.setCompetitionGroups(groupDTOs); return result; } + /** + * 创建单个分组DTO + */ + private CompetitionGroupDTO createSingleGroup(MartialProject project, List athletes, + String typeStr, Long venueId, String venueName, Long competitionId, int displayOrder) { + CompetitionGroupDTO groupDTO = new CompetitionGroupDTO(); + groupDTO.setId(-project.getId()); + groupDTO.setProjectId(project.getId()); + groupDTO.setTitle(project.getProjectName() + " 未分组"); + groupDTO.setCode("C" + competitionId + "-P" + String.format("%03d", displayOrder + 1)); + groupDTO.setType(typeStr); + groupDTO.setCount(athletes.size() + "人"); + groupDTO.setVenueId(venueId); + groupDTO.setVenueName(venueName); + groupDTO.setTimeSlotIndex(0); + groupDTO.setTimeSlot(null); + + List participantDTOs = new ArrayList<>(); + int sortOrder = 1; + for (MartialAthlete athlete : athletes) { + ParticipantDTO dto = new ParticipantDTO(); + dto.setId(athlete.getId()); + dto.setPlayerName(athlete.getPlayerName()); + dto.setSchoolUnit(athlete.getOrganization()); + dto.setTeamName(athlete.getTeamName()); + dto.setStatus("未签到"); + dto.setSortOrder(sortOrder++); + participantDTOs.add(dto); + } + + groupDTO.setParticipants(participantDTOs); + return groupDTO; + } + /** * 保存编排草稿 *