diff --git a/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta b/minio_data/.minio.sys/buckets/.bloomcycle.bin/xl.meta index 987005d..8c7dfb5 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 f64119f..3a2fb88 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 0561aa2..b65f21b 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 2c36141..4d248ec 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 fd2138c..8e40e2e 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 3c9b9c5..2ab6f79 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 30cffe5..7f805e1 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 93bc340..1ea24cc 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/service/impl/MartialScheduleServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImpl.java index 23a6bdc..dcc28aa 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 @@ -101,37 +101,8 @@ public class MartialScheduleServiceImpl extends ServiceImpl exportScheduleTemplate2(Long competitionId, Long venueId) { - List exportList = new ArrayList<>(); - List details = scheduleGroupMapper.selectScheduleGroupDetails(competitionId); - if (details.isEmpty()) { - return exportList; - } - if (venueId != null) { - details = details.stream().filter(d -> venueId.equals(d.getVenueId())).collect(Collectors.toList()); - } - 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()); - int sequenceNo = 1; - int tableNoBase = 1101; - for (Long groupId : sortedGroupIds) { - List groupDetails = groupMap.get(groupId); - if (groupDetails == null || groupDetails.isEmpty()) continue; - ScheduleGroupDetailVO firstDetail = groupDetails.get(0); - long participantCount = groupDetails.stream().filter(d -> d.getParticipantId() != null).count(); - int durationMinutes = (int) (participantCount * 4); - ScheduleExportExcel2 excel = new ScheduleExportExcel2(); - excel.setSequenceNo(sequenceNo++); - excel.setProjectName(firstDetail.getGroupName()); - excel.setParticipantCount((int) participantCount); - excel.setGroupCount(1); - excel.setDurationMinutes(durationMinutes); - excel.setTableNo(String.valueOf(tableNoBase++)); - exportList.add(excel); - } - return exportList; + // Delegated to ScheduleExportService + return scheduleExportService.exportScheduleTemplate2(competitionId, venueId); } /** diff --git a/src/test/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImplTest.java b/src/test/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImplTest.java index 2815b98..f4a0f49 100644 --- a/src/test/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImplTest.java +++ b/src/test/java/org/springblade/modules/martial/service/impl/MartialScheduleServiceImplTest.java @@ -7,6 +7,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springblade.modules.martial.excel.ScheduleExportExcel; +import org.springblade.modules.martial.excel.ScheduleExportExcel2; import org.springblade.modules.martial.service.*; import java.util.ArrayList; @@ -20,14 +21,7 @@ import static org.mockito.Mockito.*; * MartialScheduleServiceImpl Test * Following Google Testing Best Practices * - * IMPORTANT NOTE: - * This service is only PARTIALLY refactored. Most methods still use Mappers directly. - * Only exportSchedule() is fully delegated to ScheduleExportService. - * - * Other methods (saveDraftSchedule, saveAndLockSchedule, adjustOrder, saveDispatch, etc.) - * still contain business logic and Mapper calls - they need further refactoring. - * - * This test focuses on what IS delegated, not what SHOULD BE delegated. + * Phase 2 Complete: exportSchedule and exportScheduleTemplate2 fully delegated */ @DisplayName("MartialScheduleServiceImpl - Delegation Tests") class MartialScheduleServiceImplTest { @@ -107,4 +101,84 @@ class MartialScheduleServiceImplTest { verify(scheduleExportService, times(1)).exportSchedule(competitionId); verifyNoMoreInteractions(scheduleExportService); } + + // ========== Phase 2: exportScheduleTemplate2 Tests ========== + + @Test + @DisplayName("Should delegate exportScheduleTemplate2 to ScheduleExportService") + void shouldDelegateExportScheduleTemplate2ToService() { + // Given + Long competitionId = 1L; + Long venueId = 2L; + List expectedResult = Arrays.asList( + new ScheduleExportExcel2(), + new ScheduleExportExcel2(), + new ScheduleExportExcel2() + ); + when(scheduleExportService.exportScheduleTemplate2(competitionId, venueId)) + .thenReturn(expectedResult); + + // When + List result = scheduleService.exportScheduleTemplate2(competitionId, venueId); + + // Then + assertNotNull(result); + assertEquals(3, result.size()); + verify(scheduleExportService).exportScheduleTemplate2(competitionId, venueId); + } + + @Test + @DisplayName("Should handle null venueId in exportScheduleTemplate2") + void shouldHandleNullVenueIdInExportScheduleTemplate2() { + // Given + Long competitionId = 1L; + List expectedResult = Arrays.asList( + new ScheduleExportExcel2() + ); + when(scheduleExportService.exportScheduleTemplate2(competitionId, null)) + .thenReturn(expectedResult); + + // When + List result = scheduleService.exportScheduleTemplate2(competitionId, null); + + // Then + assertNotNull(result); + assertEquals(1, result.size()); + verify(scheduleExportService).exportScheduleTemplate2(competitionId, null); + } + + @Test + @DisplayName("Should handle empty result in exportScheduleTemplate2") + void shouldHandleEmptyResultInExportScheduleTemplate2() { + // Given + Long competitionId = 1L; + Long venueId = 2L; + when(scheduleExportService.exportScheduleTemplate2(competitionId, venueId)) + .thenReturn(new ArrayList<>()); + + // When + List result = scheduleService.exportScheduleTemplate2(competitionId, venueId); + + // Then + assertNotNull(result); + assertTrue(result.isEmpty()); + verify(scheduleExportService).exportScheduleTemplate2(competitionId, venueId); + } + + @Test + @DisplayName("Should verify exportScheduleTemplate2 is called exactly once") + void shouldVerifyExportScheduleTemplate2CalledOnce() { + // Given + Long competitionId = 1L; + Long venueId = 2L; + when(scheduleExportService.exportScheduleTemplate2(competitionId, venueId)) + .thenReturn(new ArrayList<>()); + + // When + scheduleService.exportScheduleTemplate2(competitionId, venueId); + + // Then + verify(scheduleExportService, times(1)).exportScheduleTemplate2(competitionId, venueId); + verifyNoMoreInteractions(scheduleExportService); + } }