From 62a9371bcf57f4c5080a755a96af96a521d9269b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=85=E6=88=BF?= Date: Sun, 18 Jan 2026 13:28:58 +0800 Subject: [PATCH] refactor: Complete getScheduleResult delegation to ScheduleQueryService MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 7 Complete - FINAL PHASE: - Delegate getScheduleResult to ScheduleQueryService (132 lines → 7 lines) - Delete unused generateInitialScheduleResult helper method (150 lines) - Add @Cacheable import - Implementation already exists in ScheduleQueryServiceImpl File size: 564 lines → 290 lines (-274 lines, -48.6%) Total reduction: 996 lines → 290 lines (-706 lines, -70.9%) 🎉 ALL 10 METHODS FULLY DELEGATED 🎉 Delegation Status: ✅ exportSchedule - FULLY DELEGATED ✅ exportScheduleTemplate2 - FULLY DELEGATED ✅ updateParticipantCheckInStatus - FULLY DELEGATED ✅ getDispatchData - FULLY DELEGATED ✅ adjustOrder - FULLY DELEGATED ✅ saveDispatch - FULLY DELEGATED ✅ moveScheduleGroup - FULLY DELEGATED ✅ saveAndLockSchedule - FULLY DELEGATED ✅ saveDraftSchedule - FULLY DELEGATED ✅ getScheduleResult - FULLY DELEGATED (NEW) Progress: 10/10 methods (100% COMPLETE!) Tests passing --- .../buckets/.bloomcycle.bin/xl.meta | Bin 743 -> 743 bytes .../buckets/.usage-cache.bin.bkp/xl.meta | Bin 637 -> 628 bytes .../buckets/.usage-cache.bin/xl.meta | Bin 637 -> 628 bytes .../.minio.sys/buckets/.usage.json/xl.meta | Bin 2360 -> 2360 bytes .../.usage-cache.bin.bkp/xl.meta | Bin 636 -> 627 bytes .../000000-assets/.usage-cache.bin/xl.meta | Bin 636 -> 627 bytes .../assets/.usage-cache.bin.bkp/xl.meta | Bin 575 -> 575 bytes .../buckets/assets/.usage-cache.bin/xl.meta | Bin 575 -> 575 bytes .../impl/MartialScheduleServiceImpl.java | 282 +----------------- 9 files changed, 4 insertions(+), 278 deletions(-) diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index 90163f5acda61769e3d9e0bd964f2a3556fadb61..ee4af40ef240a15f1ed357c277d11cf27df3ec44 100644 GIT binary patch delta 311 zcmaFP`kZxw2G1Uam6-|BM_6|E3Ot%MoO~U(t)3^HqUyVtG9qM9suM zw(=$^sfk90W=V#|W|roOrb))eW=57NhDk}OCT3=429qNg_39@(>*g>vF3Bs+$vMgx zoNo7FtN7I4k3QS|F=DE#>#M1_-)+UNT_D1_^P$Oy)A}pQ8Ni@rd2(q{QEFZZ!;-wz zijuSCE0!0RBo>vVrX1&C1*yo)$?s?9c=&oA8EG!aJQcaQ*P0Uj)jg!;NlME9L(+rZ$OpVjbjV4Dh>ecU@n7xUyaY!r zU_)-k4&CDZn`#Oc&psHt|GF$;p%G$urg-HJe!Glx0oz683}Dc*Jh`-}C^fHyVM$(U zMakLnMazpz5{pVwQ;zenf>dPYYSfjkdq3Oy~7{?SCF-s{Q{#; tCW3#TgFi+A&dru)f3WsDf*a2MGbsnboy@@?wGzQS&;GR6Z1Q);X#nGmYUuy~ 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 f9240aff9d0223d64b1d652e3b885db45a035aa0..6bcae2ca6f5620ab2010d9733bd915765366c1a3 100644 GIT binary patch delta 325 zcmey%@`YuB2G1Ual^$;WM_7V(v@D%yVl2?>&-?REsJHSyX^;IsT0~1HmdB|dTosU5 zRN@$%S(REm@gl>)B_I}%Ug{f?nVWi9q8nn!#6PC$OHxY`({C!ICYhU>o2D5VrWmCf zBv~X`8YNjITcntz85kL*8JiePHe^(DT3B{2J?S*VIqQ7mYR1MTd8IiyM;=yAoW8() z|AS}U9FnGTGdu(z_3ey%Xk0P>BnwaAyotQ4IW)HF|8-#yW$0yPNSSDxbvS zlF)*b#FEtGJgf{rkeQR;&mnmsd3A7hW`Rd)VoqjW`k|%HiOCtM&C3#ti&IOAI~FBp zOqi_3q-3+!01R|5F}B8fEXpsIV`AdwU|^S9s1H&ziIX8f$LW|618b&3yn>g|UCkyR P-5K|c)7j)#UNQs#XRv%? delta 333 zcmeyu@|R_T2G8y@*H_PPBbtvv9w4@URZW6J?S*Vxl1bXj~N@6+9C_vDa%5-u z{i5E~e^S2=PyK%@<7jCoQ*N^N#@t^?EdT2CIW)HF|8-#yWw^@9@MZD=MrrSbt9%lR zOF|1$5=&B#^RO}iL1s>#I)|KY;OgM)%mR zIJKmBtpOP5LU@zKn3POG(i0XHS6yOkjrCZRUo6MO#LdCLF2~6rc&0&sU+Ng+1@R7} U&OAoPNn$?#XBsoVKe2f(08xI5%K!iX 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 bf1b9ef6d187bd1f81f10a0a558404cd99d4d703..6d1cddaba75e12cba9b8edafd942ef3ae8da10e8 100644 GIT binary patch delta 309 zcmey%@`YuB2G1Uam0FH0M_A53W&S?V#8}|{3J1+o!H(-U&96yskxX=&SRSW-a8*EJ zQHf)4W>sqO#ET3Emw;G6dZ}+nW^U?biEfA?6aU!CCz+d?o2D5VrWmCfBv~X`8YNjI zTcntz85kL*8JiePj$qWY3U_)W&)B#muQVs;$ivEs(-*k!fAFlEL()`khKJyzzMXLo zjVtD#WZ?;%H<5QWhsIX@zb*`-485!jDU%N{N?R{q<&#)k5?YXwSdx02hm`>cGIR3# zIV3M6uMW=6EbvH8%*o74KeW_2F*zf(d0Ap{acW6%$D-tn36s^Blx)@-fPwBM#@1Mm yMft^YOibJy4D50X^+9STaWVwxI2|)$V9j)hSMU2Uos&HaBp_#PT@xQ>y|J zi%J}WGpkaICthSYwFJZh(o20qGILWeOLRjFnfS+6J~hoE+1SLwFv-Zs*dQ%6F(uK^ z*uua#(ZIyS(jp~!as;EE)wIJGVi+5j+9C_vDa%5-u{i5E~e^S2=PyK%@<7jCo zQ*N^N#@t^?EdT2CIW)HF|8-#yWw^@9@MZD=MrrSbt9%lROF|1$5=&B#^RO}iL1s># zI)|KY;OgM)%mRIJKmBtpOP5LU@zKn3POG z(i0XHS6yOkjrCZRUo6MO#LdCLF2~6rc&0&sU+Ng+1@R7}&OAoPNn$?#XBsoVKe2f( E04JY;kN^Mx diff --git a/minio_data/.minio.sys/buckets/.usage.json/xl.meta b/minio_data/.minio.sys/buckets/.usage.json/xl.meta index 67db226fe999e48ecb69de0e5489d39474928ff2..f6a7de5e1dcaf51d99bf42829e78cc3953c937e8 100644 GIT binary patch delta 163 zcmV;U09^mL61WnOC=9$HscK=+#02F60CjW@a@qVPa)4F)(H_W??WlW->T4HaRslp?1z^V#@%|e+;%wf|5^<4te+IkE z*WQ@8k^EX#I5c4}H#lNBW@9!tH!?P4Vm3K9Vq{}5G%#f}G&Eykp?1z^V#@%|6su;= z0fD4$b!=?K2dsz}tS`Yh)~k$pu3x|5cvpEm+@wThsIX@zbp(>Ss9jaPTtR`CcS)>PhxRNXhBM1N$PPPRt6x*%*pR( z517U}iAf~BV^MO(#4Y-z1v&YNDT|7$7#8IhGb}1AW>}n(3nYrGif0448PgdSCLaQ+ zod8sGiLo`-1E@}piHVzofnDw}2SWpgf|tgw(iZyz7ap0V7l#}@af9c$x$|EDt7UkM delta 320 zcmey&@`q)D2G8y@*P|AxA7MFAklZ`b#8}{e;PF#?qJ4MFD$PIXXtZ|K#PT@xldA#} zi%J}WGpkaICthSYxdg-l(o20qGILWeOLRjFnfS*>!NkzqDA~-&G|kA=$SBze2$BrU zQjAQDjSLMe(u_+w1B=tBCD+3T@=H#if zA3Oea5|c>A7X8wKoczR;jz!5C6BZR$U1DsF^;nc&EVrnvm|<~BE|4g$DxS^2#Kg_P zzz)*As4Qc;9EicdurT>BNZ&-DJ_ev328KiI3=JFt5lIYDB{e<%^~X{+%ut@gDBPlX F5deL|eE|Rf 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 0cbb604005db217a97462fb830e46187ecbbf078..92ce0b63700be4303f19e0e27c01294864758500 100644 GIT binary patch delta 311 zcmeyv@|k6V2G1Ua6^RF{kFe~`%340r#8_Z$VX^3kD3AL~&Of{Ss{hiyiRE$X2UZ0n z7L_;#XI7;aPrS%*U6B7OY%x{a*jNRJt|x%A)4yqxhjuynwgJfSoM-< zwO<}tFBCHl#BC2;!=bTN|1S%}R91#1oRjx6s!1cGIR3# z*#oArPGS;??^u+aF>#B2X+chYV#=c8DuzY*#SDweiWwHCBS*OPu$=+ZtnaS0Q|0f AXaE2J delta 320 zcmey&@`q)D2G8y@*LCC{9brk({xo}{iLt<)C#}aWtN1qU@>AU>#C%GBVtJhU$yEV~ zMJ0~GnN_L96E8BHTmoVN>7~9QnYpQ#CAuMoO#EY`U}9))lx${Xnr38bWRz?K1W5*F zDMlv7Mur9!X+|cKBN+88xwR%eXKY-OSDKS^Qzjs_iA$=bwzsc?h2&g7b- z-pN~HWe!Fk6H8dfp|Mr}FAKw6Rt6WY$@>}Aq!+I8Nh~f2El5c$Nj=WP$^ZnJIeF^r z$BuuU#3YijMZdHlCqFTzV^MO(ghj}n(3nYrGif1!0F>!M+ zu!D3jD$AHI2VyWVEKEKO(l-&Pj{&HMf#DE4Lj#9EL=r<(NllM`{jrn{GnD5r3b$xp F1OQXQdcXhx 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 183f6a9c916beac52e96f165c3d0fa219e333252..02b5cf32861e73be2d2ea7b59a4f0e6a5bd56657 100644 GIT binary patch delta 176 zcmdnbvY%yw2G1Uam28g}9bs9iq+iLt_u(?n)vAmuQqGsYB z8--M}L`x$h%3PdKl_+r)no$M>(YcVDiu;6z&yIs&G{;XHD&O;o7oIYnSYFQtQ8V$6 zjY6tfqNS0MadMiOd0LW5idnLmk%@_kp<$|pVVb3pN$TVXMm=2@##4QajZ5-Mb8?QX zQ9Bk^e@jz+wNJj!4gOVKl?dVfyqA^omgJDMr{WG>^$q|iRJZd5H%D3 z*eE0$CM8*>CK{V3C7Bwfn3-4@7#O4)o13N@n5UT~nww0HVARw7xMi|0W8;#%(wv+l zYt+>`z9lmB{t4$*c$@f7;`shm_U_A77My4+V%(CvdUf^W&5YX83s?Ch7MFw;q$HN4 c9_L|Y0D{b%Jau;QGCHx83LKOK04P01NdN!< 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 e2d24ef..8cfe23a 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 @@ -31,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.cache.annotation.Cacheable; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -112,288 +113,13 @@ public class MartialScheduleServiceImpl extends ServiceImpl details = scheduleGroupMapper.selectScheduleGroupDetails(competitionId); - - if (details.isEmpty()) { - // 没有编排数据时,从项目和选手表生成初始分组 - return generateInitialScheduleResult(competitionId); - } - - // 按分组ID分组数据 - Map> groupMap = details.stream() - .collect(Collectors.groupingBy(ScheduleGroupDetailVO::getGroupId)); - - // 检查编排状态 - boolean isCompleted = details.stream() - .anyMatch(d -> "completed".equals(d.getScheduleStatus())); - boolean isDraft = !isCompleted; - - result.setIsDraft(isDraft); - result.setIsCompleted(isCompleted); - - // 组装数据 - List groupDTOs = new ArrayList<>(); - for (Map.Entry> entry : groupMap.entrySet()) { - List groupDetails = entry.getValue(); - if (groupDetails.isEmpty()) { - continue; - } - - // 获取第一条记录作为分组信息 - ScheduleGroupDetailVO firstDetail = groupDetails.get(0); - - CompetitionGroupDTO groupDTO = new CompetitionGroupDTO(); - groupDTO.setId(firstDetail.getGroupId()); - groupDTO.setTitle(firstDetail.getGroupName()); - groupDTO.setCode(firstDetail.getCategory()); - - // 设置类型 - if (firstDetail.getProjectType() != null) { - switch (firstDetail.getProjectType()) { - case 1: - groupDTO.setType("单人"); - break; - case 2: - groupDTO.setType("集体"); - break; - default: - groupDTO.setType("其他"); - break; - } - } - - // 设置队伍数量 - if (firstDetail.getTotalTeams() != null && firstDetail.getTotalTeams() > 0) { - groupDTO.setCount(firstDetail.getTotalTeams() + "队"); - } else if (firstDetail.getTotalParticipants() != null) { - groupDTO.setCount(firstDetail.getTotalParticipants() + "人"); - } - - // 设置场地和时间段信息 - groupDTO.setVenueId(firstDetail.getVenueId()); - groupDTO.setVenueName(firstDetail.getVenueName()); - groupDTO.setTimeSlot(firstDetail.getTimeSlot()); - groupDTO.setTimeSlotIndex(firstDetail.getTimeSlotIndex() != null ? firstDetail.getTimeSlotIndex() : 0); - groupDTO.setEstimatedDuration(firstDetail.getEstimatedDuration()); - - // 获取参赛者列表 - boolean isCollective = firstDetail.getProjectType() != null && firstDetail.getProjectType() == 2; - List participantDTOs = new ArrayList<>(); - for (ScheduleGroupDetailVO d : groupDetails) { - if (d.getParticipantId() == null) continue; - - ParticipantDTO dto = new ParticipantDTO(); - dto.setId(d.getParticipantId()); - dto.setSchoolUnit(d.getOrganization()); - dto.setStatus(d.getCheckInStatus() != null ? d.getCheckInStatus() : "未签到"); - dto.setSortOrder(d.getPerformanceOrder()); - dto.setPlayerName(d.getPlayerName()); - - // For collective projects, query team members - if (isCollective) { - List> memberList = new ArrayList<>(); - // Step 1: Get athlete record to find team_name - MartialAthlete participantAthlete = athleteMapper.selectById(d.getParticipantId()); - if (participantAthlete != null && participantAthlete.getTeamName() != null) { - // Step 2: Find team by team_name - QueryWrapper teamWrapper = new QueryWrapper<>(); - teamWrapper.eq("team_name", participantAthlete.getTeamName()); - teamWrapper.eq("is_deleted", 0); - MartialTeam team = teamMapper.selectOne(teamWrapper); - if (team != null) { - // Step 3: Query team members - QueryWrapper memberWrapper = new QueryWrapper<>(); - memberWrapper.eq("team_id", team.getId()); - memberWrapper.eq("is_deleted", 0); - List members = teamMemberMapper.selectList(memberWrapper); - // Step 4: Get member athlete info - for (MartialTeamMember member : members) { - Map memberData = new HashMap<>(); - memberData.put("id", member.getId()); - MartialAthlete athlete = athleteMapper.selectById(member.getAthleteId()); - memberData.put("name", athlete != null ? athlete.getPlayerName() : ""); - memberData.put("gender", athlete != null ? athlete.getGender() : ""); - memberList.add(memberData); - } - } - } - dto.setMembers(memberList); - } - - participantDTOs.add(dto); - } - groupDTO.setParticipants(participantDTOs); - groupDTO.setStatus(calculateGroupStatus(participantDTOs)); - groupDTOs.add(groupDTO); - } - - // 按 displayOrder 排序 - groupDTOs.sort(Comparator.comparing(g -> { - ScheduleGroupDetailVO detail = details.stream() - .filter(d -> d.getGroupId().equals(g.getId())) - .findFirst() - .orElse(null); - return detail != null ? detail.getDisplayOrder() : 999; - })); - - result.setCompetitionGroups(groupDTOs); - return result; + // Delegated to ScheduleQueryService + return scheduleQueryService.getScheduleResult(competitionId); } - /** - * 没有编排数据时,从项目和选手表生成初始分组 - */ - private ScheduleResultDTO generateInitialScheduleResult(Long competitionId) { - ScheduleResultDTO result = new ScheduleResultDTO(); - result.setIsDraft(true); - result.setIsCompleted(false); - // 1. 获取该赛事的所有项目 - List projects = projectService.list( - new QueryWrapper() - .eq("competition_id", competitionId) - .eq("is_deleted", 0) - .orderByAsc("id") - ); - - if (projects.isEmpty()) { - result.setCompetitionGroups(new ArrayList<>()); - return result; - } - - // 2. 获取该赛事的所有选手 - List athletes = athleteService.list( - new QueryWrapper() - .eq("competition_id", competitionId) - .eq("is_deleted", 0) - ); - - // 按项目ID分组选手 - Map> athletesByProject = athletes.stream() - .collect(Collectors.groupingBy(MartialAthlete::getProjectId)); - - // 3. 获取该赛事的第一个场地作为默认场地 - List venues = venueService.list( - new QueryWrapper() - .eq("competition_id", competitionId) - .eq("is_deleted", 0) - .orderByAsc("id") - .last("LIMIT 1") - ); - - Long defaultVenueId = venues.isEmpty() ? null : venues.get(0).getId(); - String defaultVenueName = venues.isEmpty() ? "未分配" : venues.get(0).getVenueName(); - - // 4. 为每个项目生成分组(单人项目根据maxParticipants拆分) - List 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<>()); - - // 跳过没有选手的项目 - if (projectAthletes.isEmpty()) { - continue; - } - - // 判断项目类型 - Integer projectType = project.getType(); - String typeStr; - if (projectType != null) { - switch (projectType) { - case 1: - typeStr = "单人"; - break; - case 2: - case 3: - typeStr = "集体"; - break; - default: - typeStr = "其他"; - break; - } - } else { - typeStr = "单人"; - } - - // 单人项目:根据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); - groupDTO.setStatus(calculateGroupStatus(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++; - } - } - - result.setCompetitionGroups(groupDTOs); - return result; - } /** * 创建单个分组DTO