refactor: Complete exportScheduleTemplate2 delegation to ScheduleExportService

Phase 2 Complete:
- Update MartialScheduleServiceImpl.exportScheduleTemplate2 to delegate
- Reduce method from 40 lines to 3 lines (delegation only)
- Add 4 comprehensive unit tests for exportScheduleTemplate2
- All tests passing (477 total)

Delegation Status:
 exportSchedule - FULLY DELEGATED
 exportScheduleTemplate2 - FULLY DELEGATED (NEW)

Remaining: 8 methods to delegate
Next: Phase 3 - Dispatch Service methods
This commit is contained in:
2026-01-18 12:53:49 +08:00
parent 4e0a8bdde1
commit 704c99942a
10 changed files with 84 additions and 39 deletions
@@ -101,37 +101,8 @@ public class MartialScheduleServiceImpl extends ServiceImpl<MartialScheduleMappe
}
@Override
public List<ScheduleExportExcel2> exportScheduleTemplate2(Long competitionId, Long venueId) {
List<ScheduleExportExcel2> exportList = new ArrayList<>();
List<ScheduleGroupDetailVO> 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<Long, List<ScheduleGroupDetailVO>> groupMap = details.stream()
.collect(Collectors.groupingBy(ScheduleGroupDetailVO::getGroupId));
List<Long> 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<ScheduleGroupDetailVO> 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);
}
/**
@@ -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<ScheduleExportExcel2> expectedResult = Arrays.asList(
new ScheduleExportExcel2(),
new ScheduleExportExcel2(),
new ScheduleExportExcel2()
);
when(scheduleExportService.exportScheduleTemplate2(competitionId, venueId))
.thenReturn(expectedResult);
// When
List<ScheduleExportExcel2> 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<ScheduleExportExcel2> expectedResult = Arrays.asList(
new ScheduleExportExcel2()
);
when(scheduleExportService.exportScheduleTemplate2(competitionId, null))
.thenReturn(expectedResult);
// When
List<ScheduleExportExcel2> 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<ScheduleExportExcel2> 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);
}
}