From 868b4be356d0618aa7e7c0602353d5e21c00159e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Thu, 15 Jan 2026 15:22:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DgenerateInitialSchedul?= =?UTF-8?q?eResult=E6=96=B9=E6=B3=95=EF=BC=8C=E6=A0=B9=E6=8D=AEmaxParticip?= =?UTF-8?q?ants=E6=8B=86=E5=88=86=E5=8D=95=E4=BA=BA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 当单人项目参赛人数超过maxParticipants时,自动拆分成多个分组 - 添加createSingleGroup辅助方法 - 修复Issue #1: 编排分组算法使用错误字段导致分组数计算不准确 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --- .../buckets/.bloomcycle.bin/xl.meta | Bin 743 -> 743 bytes .../buckets/.usage-cache.bin.bkp/xl.meta | Bin 630 -> 637 bytes .../buckets/.usage-cache.bin/xl.meta | Bin 630 -> 637 bytes .../.minio.sys/buckets/.usage.json/xl.meta | Bin 2360 -> 2360 bytes .../.usage-cache.bin.bkp/xl.meta | Bin 636 -> 636 bytes .../000000-assets/.usage-cache.bin/xl.meta | Bin 636 -> 636 bytes .../assets/.usage-cache.bin.bkp/xl.meta | Bin 575 -> 575 bytes .../buckets/assets/.usage-cache.bin/xl.meta | Bin 575 -> 575 bytes .../martial/pojo/dto/ParticipantDTO.java | 8 + .../MartialScheduleArrangeServiceImpl.java | 36 ++++- .../impl/MartialScheduleServiceImpl.java | 148 +++++++++++++----- 11 files changed, 151 insertions(+), 41 deletions(-) diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index 3af0a8cc09e4996900fe47d0883a0eaaadd3d9af..fa0923f91f464b8b31c5aa12e3a833d69d877e56 100644 GIT binary patch delta 462 zcmaFP`kZxwI&astY5G@6JC3kCOxX8eqKUD1AcBrC> ze@rJwFsjurNi9iCzp0Rtl4xXNZf0s?Xq1v@oSJNDVrpb!XlQ6;nv`alXkf9h>|A=% zX@+xxsp(3LjZ5-Mb8?O{1`B5QJoOUFa@o6&S0m7fC&QuMEX}A}WNu&jT%U;sy5c;! z3}Dc*Jh`-}C^fHyVM$(UMakJ*p5?_QiA5!;DfP#BSV2lMGp26fshgX%F1a!}C)GJW zw;(4KD1C=P0Ipz?4zFjMEP|WCdur!h1a}EgxGLuU{E__#r# zI)DKTT9zl578RxDl`t&HORXq58&JKxxFoTtBsJwY4=YGTX5!=Zs#e7}1`-$ao>Zeu( zBo>u824_~K7Eip$aB2yN1*DhyhGgcZUY39wGVzb8`jXU=#PpjA2Bv1Irb%fQiKdCh zX=Z7OmX^tuX^Ez$#>S~esRpJ=lMNZwoEMgzOHVq@aPIx4W_!lQC3&SeIY(Y)boKlW z{CM7{@6Dg3*Jf6E>+CDY+I?iX#`P--iP5@jIUE{W_5Zpsh%#JdWnkf&e2`JHK9_ry zPhxRNXhBM1N$PPPRt6x*%$T}?cS5cD>fr3m0*}rr%UZOiD8}OEI-f zHBGimPE0g1OENbzHZU_zG)^)zOHMOfSavQw=`_Q+Td&1$F*YvAE6vF{@_4ywu<UHPx@t?bXo}3cvbm5|&*$?aD5|p|Mr}uM2}H!(3K|6wb*9871ojs#f_V z7MFw;q$HN49_L|Y0D{cK$LkFx=UJ}~&dx0GNKMSi%u7GC)HyLZBei*1VsUY5NpZ)b zwIvD5o6gE@sEvyfvH)lX;PX+qG_UWnps++rDd{Z zTB50`v2m(Vs)1?J$-ysix?Z1+9C?+|)$=>><9VOHH-DC1n_1;LGV{_8Ep<*z&PZ)uYXAniiN(dKCB+?!k~1bODz3W3*c$7x zD8E>4QCTs=;*?wjOlV91_Q&wP%X1|h}R-WlB+(D)b7sLYqUF3sZ delta 345 zcmey%@{MJJI&Y_Y^KPD6nIkM=w^$=4nivb*UzX^Y7vbPPr!T@QwWiHxVtJhU;Z*^N zMJ0~GnN_L96E89xUIJnP>7~9QnYpQ#C7^~({9~h#n3QH{mSSp|YMN}BoS0~2mSk>b zY+z=bXq;qbmYildIf7BoT3WcLhOu!;UTIFwk;ltbgN<+bY~1)^=dlY>s;PdBZm*7> zQ25nfld$a4X;*du4vnq)e_a?v8RoJwq;O6?$S7GKP_@b@vA86(ASJOR^*9eJ0}x~; zK3;DqInR1^aCT;aM`~hDW?uTCrOt`T8L7?75{rvdONu)dC1*@nR9wZdD8HCtQCTs= z;*?wCr5C~1Wx5GJvHa=NdCNT@c{r-2Zsp& diff --git a/minio_data/.minio.sys/buckets/.usage.json/xl.meta b/minio_data/.minio.sys/buckets/.usage.json/xl.meta index 93bd447783ea82f4f1e36dd2212f5c23467005e3..0f3fd3cf1e7c5346080ed91ad0eb4f7c662928d5 100644 GIT binary patch delta 182 zcmdlXv_oiuI&astY5Lcm+&IGW_Cd7QL=$6yXAf>)`ntknivb5OU~JsV(;y~M&Vk=*NeeH6U*z^p^7H{ zF`XR2C>OgVwInh9rb3E^vAJn-nt^4Cfk}#SO0s2|VN!BpnsKT@lBuzUk;%fcbLmN^ z8P18nYdy`_xFoMMC+8^pn(aMIlTIz&tg+{A)5cXQ8!yUgt8aEt{+!L*kvA>pvAXZ% hHH;F%1|bHfRz{XqhL(C3M#ko5Mkbb#1 g7NjJWq#oyCWdMTAjHw%VHe}tM#8kl|P$6jo02y3Nx&QzG delta 181 zcmeyv@`q)DI&Y_Y^RD~bOpmYx=HCmPXksjI;@w}9M^WCrJNeTkC+)e^KC!%x9ja*J zpQO+vBLg#IBa@`0#3aL1i=@=#WD9ePL<7S_LnHGP1Jl%nW#`h9PBWalVAuPHv2jUW zX->|Omx`+*H$|W5e>f$wJ#==A^m3_9$?JG`wy(%4E_7ZS)>u7xGoztQK-DUr#Nv|B gf|SIP)Z;v?3_y^X_;|g+<~0G6m?~Ii9dUXK0B>TmS$7 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 a0b15a9a72ae38893a0256e449c3038c8d8b8af6..9e259be9cae5f9c95f59a987160974294ab35ba2 100644 GIT binary patch delta 178 zcmeyv@`q)DI&astX?h#Cc^+Y5e|7roL=$6y$th*2Qe~d`bN-9j<$gA6m{?xN4plVq zkBx$9Qd*)(vV}>Ck)gSzg+WSUs*$CMMVd*nahjz`Vv70X2u3~KcUsx|85@`6mFDCe zdHM5cKdbMbJ3-(0rr$B;c{lAHHqCFc{8J-OfL5-pTy#l(1Mi2 clGNiotPDVqnK5+(&xWkKlb9-41S%v=0BluBhyVZp delta 178 zcmeyv@`q)DI&Y_Y^RA_TZI7@_D15{^(ZpCl<(rp&REMKt@9MZNB}eh~6U*z^p^7H{ zu~A4eGB7hXGD%8GOfpQhNJ>pkwlKFyG%!pwG%`;yFio8t!KkO(^55euW8;#%(wv+l zFBMlsZi+t9|8PoVd+6*K>E%+JlGpL>Y+sR8TUbb*kOLNr+=ZWQY>`+A$ z|Cp*TNi9iCzo}qpZjhK_YLb{@X`X6mX=G?(X`GyBl$K~|Vw##_VPP`akWtNaVcEI# zq|*%Nx@XUw&)B#muQVs;$eP}mJM3ngcgbye_d36Ba{0D%bBpJAF+09JtA9RlyIRlm u$(tFqWOBJz`6L#XgchVEmZTo%VPyb<%#5iUcum&!PX5X0#B%BXn4VXksj|npd;f?7g4U@~Jl`2$bqvm{?xN4plVq zkLlzHMzxqFsU?Z&Hx(=mjZ+Ox%uG#^)6CP%EmD(AQ&JPn5)%#0O-xdZ%qSla$DZL&aazXzU|!H;yGT-j&INEpAX!w)-!$b tW=1WUT<%pqiNz(M1u2OosmFO(8Gs-&W9kN8leN8*e=<6;T>Aee2>_NQQHlTn delta 194 zcmdnbvY%ywI&Y_Y^Ln2v|BkRUD~Ya~Xksj2YTKD{A;Y0){|~)NS=MvkCYIN+LlsT@ zW2(L+wInh9rh=uRajKz-nW;%~nt7VJMQW01N@}86VxpnBiAjo)x#eU-Mm5ugW#`h9 zPBWbQGVlF6#>ORir8zlA)^LjcymsYi>`fMX<9mA u@@7UYnSiQQK8eL8p#>?4C8@`GSQ&sIGx70y)u?@sCjVq~VhL9DY61ZAomA)m 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; + } + /** * 保存编排草稿 *