diff --git a/src/main/kotlin/dsm/pick2024/domain/attendance/enums/AttendanceStatus.kt b/src/main/kotlin/dsm/pick2024/domain/attendance/enums/AttendanceStatus.kt index c7ad48de..99bfc67e 100644 --- a/src/main/kotlin/dsm/pick2024/domain/attendance/enums/AttendanceStatus.kt +++ b/src/main/kotlin/dsm/pick2024/domain/attendance/enums/AttendanceStatus.kt @@ -7,5 +7,6 @@ enum class AttendanceStatus { DISALLOWED, // 무단 PICNIC, // 현체 EMPLOYMENT, // 취업 - GO_HOME //귀가 + GO_HOME, //귀가 + DROPOUT //자퇴 } diff --git a/src/main/kotlin/dsm/pick2024/domain/attendance/persistence/AttendancePersistenceAdapter.kt b/src/main/kotlin/dsm/pick2024/domain/attendance/persistence/AttendancePersistenceAdapter.kt index 90efef17..7db46ba5 100644 --- a/src/main/kotlin/dsm/pick2024/domain/attendance/persistence/AttendancePersistenceAdapter.kt +++ b/src/main/kotlin/dsm/pick2024/domain/attendance/persistence/AttendancePersistenceAdapter.kt @@ -3,6 +3,7 @@ package dsm.pick2024.domain.attendance.persistence import com.querydsl.jpa.impl.JPAQueryFactory import dsm.pick2024.domain.attendance.domain.Attendance import dsm.pick2024.domain.attendance.entity.QAttendanceJpaEntity +import dsm.pick2024.domain.attendance.enums.AttendanceStatus import dsm.pick2024.domain.attendance.mapper.AttendanceMapper import dsm.pick2024.domain.attendance.persistence.repository.AttendanceRepository import dsm.pick2024.domain.attendance.port.out.AttendancePort @@ -49,7 +50,8 @@ class AttendancePersistenceAdapter( jpaQueryFactory .selectFrom(QAttendanceJpaEntity.attendanceJpaEntity) .where( - QAttendanceJpaEntity.attendanceJpaEntity.club.eq(club) + QAttendanceJpaEntity.attendanceJpaEntity.club.eq(club), + QAttendanceJpaEntity.attendanceJpaEntity.period6.ne(AttendanceStatus.DROPOUT) ) .fetch() .map { attendanceMapper.toDomain(it) } diff --git a/src/main/kotlin/dsm/pick2024/domain/attendance/service/QueryClubAttendanceService.kt b/src/main/kotlin/dsm/pick2024/domain/attendance/service/QueryClubAttendanceService.kt index 74451754..1136e7bd 100644 --- a/src/main/kotlin/dsm/pick2024/domain/attendance/service/QueryClubAttendanceService.kt +++ b/src/main/kotlin/dsm/pick2024/domain/attendance/service/QueryClubAttendanceService.kt @@ -39,7 +39,7 @@ class QueryClubAttendanceService( classNum = it.classNum, num = it.num, status = returnStatus, - classroomName = classroomName!! + classroomName = classroomName ) }.sortedWith( compareBy({ it.grade }, { it.classNum }, { it.num }) @@ -47,11 +47,11 @@ class QueryClubAttendanceService( } private fun returnStatus(period: Int, attendance: Attendance): AttendanceStatus { return when (period) { - 6 -> attendance!!.period6 - 7 -> attendance!!.period7 - 8 -> attendance!!.period8 - 9 -> attendance!!.period9 - 10 -> attendance!!.period10 + 6 -> attendance.period6 + 7 -> attendance.period7 + 8 -> attendance.period8 + 9 -> attendance.period9 + 10 -> attendance.period10 else -> throw InvalidPeriodException } } diff --git a/src/main/kotlin/dsm/pick2024/domain/attendance/service/ResetAttendanceService.kt b/src/main/kotlin/dsm/pick2024/domain/attendance/service/ResetAttendanceService.kt index 7d2d0160..2c6846fc 100644 --- a/src/main/kotlin/dsm/pick2024/domain/attendance/service/ResetAttendanceService.kt +++ b/src/main/kotlin/dsm/pick2024/domain/attendance/service/ResetAttendanceService.kt @@ -35,7 +35,7 @@ class ResetAttendanceService( private fun getStatus(currentStatus: AttendanceStatus) = when (currentStatus) { - AttendanceStatus.PICNIC, AttendanceStatus.EMPLOYMENT -> currentStatus + AttendanceStatus.DROPOUT, AttendanceStatus.PICNIC, AttendanceStatus.EMPLOYMENT -> currentStatus else -> AttendanceStatus.ATTENDANCE } } diff --git a/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/SchedulePersistenceAdapter.kt b/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/SchedulePersistenceAdapter.kt index c1591197..2832bc3b 100644 --- a/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/SchedulePersistenceAdapter.kt +++ b/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/SchedulePersistenceAdapter.kt @@ -56,4 +56,8 @@ class SchedulePersistenceAdapter( val entities = schedule.map { scheduleMapper.toEntity(it) } scheduleRepository.saveAll(entities) } + + override fun deleteAll() { + scheduleRepository.deleteAll() + } } diff --git a/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/repository/ScheduleRepository.kt b/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/repository/ScheduleRepository.kt index b134ddad..bf7fbfa1 100644 --- a/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/repository/ScheduleRepository.kt +++ b/src/main/kotlin/dsm/pick2024/domain/schedule/persistence/repository/ScheduleRepository.kt @@ -15,4 +15,6 @@ interface ScheduleRepository : Repository { fun saveAll(entity: Iterable) fun findAllByDate(date: LocalDate): List? + + fun deleteAll() } diff --git a/src/main/kotlin/dsm/pick2024/domain/schedule/port/in/SaveScheduleUseCase.kt b/src/main/kotlin/dsm/pick2024/domain/schedule/port/in/SaveScheduleUseCase.kt index f8388fc4..4b9f1c1a 100644 --- a/src/main/kotlin/dsm/pick2024/domain/schedule/port/in/SaveScheduleUseCase.kt +++ b/src/main/kotlin/dsm/pick2024/domain/schedule/port/in/SaveScheduleUseCase.kt @@ -1,5 +1,5 @@ package dsm.pick2024.domain.schedule.port.`in` interface SaveScheduleUseCase { - fun saveNeisInfoToDatabase(start: String, end: String) + fun saveNeisInfoToDatabase() } diff --git a/src/main/kotlin/dsm/pick2024/domain/schedule/port/out/DeleteSchedulePort.kt b/src/main/kotlin/dsm/pick2024/domain/schedule/port/out/DeleteSchedulePort.kt index 1d7e1b4d..0533ed17 100644 --- a/src/main/kotlin/dsm/pick2024/domain/schedule/port/out/DeleteSchedulePort.kt +++ b/src/main/kotlin/dsm/pick2024/domain/schedule/port/out/DeleteSchedulePort.kt @@ -4,4 +4,6 @@ import java.util.UUID interface DeleteSchedulePort { fun deleteById(id: UUID) + + fun deleteAll() } diff --git a/src/main/kotlin/dsm/pick2024/domain/schedule/presentation/ScheduleController.kt b/src/main/kotlin/dsm/pick2024/domain/schedule/presentation/ScheduleController.kt index c80b438c..af4242cb 100644 --- a/src/main/kotlin/dsm/pick2024/domain/schedule/presentation/ScheduleController.kt +++ b/src/main/kotlin/dsm/pick2024/domain/schedule/presentation/ScheduleController.kt @@ -68,10 +68,7 @@ class ScheduleController( @Operation(summary = "나이스 학사일정 저장 api") @PostMapping("/save") - fun saveSchedule( - @RequestParam(name = "start") start: String, - @RequestParam(name = "end") end: String - ) = scheduleUseCase.saveNeisInfoToDatabase(start, end) + fun saveSchedule() = scheduleUseCase.saveNeisInfoToDatabase() @Operation(summary = "일 별 학사일정조회 api") @GetMapping("/date") diff --git a/src/main/kotlin/dsm/pick2024/domain/schedule/service/SaveScheduleService.kt b/src/main/kotlin/dsm/pick2024/domain/schedule/service/SaveScheduleService.kt index 022ad2be..70629981 100644 --- a/src/main/kotlin/dsm/pick2024/domain/schedule/service/SaveScheduleService.kt +++ b/src/main/kotlin/dsm/pick2024/domain/schedule/service/SaveScheduleService.kt @@ -1,22 +1,43 @@ package dsm.pick2024.domain.schedule.service import dsm.pick2024.domain.schedule.port.`in`.SaveScheduleUseCase +import dsm.pick2024.domain.schedule.port.out.DeleteSchedulePort import dsm.pick2024.domain.schedule.port.out.SaveSchedulePort +import dsm.pick2024.global.config.cache.CacheName import dsm.pick2024.infrastructure.feign.NeisScheduleFeignClientService +import org.springframework.cache.annotation.CacheEvict import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import java.time.LocalDate +import java.time.format.DateTimeFormatter @Service class SaveScheduleService( private val saveSchedulePort: SaveSchedulePort, + private val deleteSchedulePort: DeleteSchedulePort, private val neisScheduleFeignClientService: NeisScheduleFeignClientService ) : SaveScheduleUseCase { + @CacheEvict(value = [CacheName.SCHEDULES], allEntries = true) @Transactional - override fun saveNeisInfoToDatabase(start: String, end: String) { + override fun saveNeisInfoToDatabase() { + val (start, end) = formatDate() + deleteSchedulePort.deleteAll() val scheduleForSave = neisScheduleFeignClientService.getNeisInfoToEntity(start, end) scheduleForSave?.let { saveSchedulePort.saveFeignSchedule(it) } } + + private fun formatDate(): Pair { + val today = LocalDate.now() + + val start = LocalDate.of(today.year - 1, 1, 1) + + val end = LocalDate.of(today.year + 1, 3, 1) + + val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") + + return start.format(formatter) to end.format(formatter) + } } diff --git a/src/main/kotlin/dsm/pick2024/domain/status/service/ChangeStatusService.kt b/src/main/kotlin/dsm/pick2024/domain/status/service/ChangeStatusService.kt index 05710664..f92046d6 100644 --- a/src/main/kotlin/dsm/pick2024/domain/status/service/ChangeStatusService.kt +++ b/src/main/kotlin/dsm/pick2024/domain/status/service/ChangeStatusService.kt @@ -56,6 +56,7 @@ class ChangeStatusService( private fun updatePeriodStatus(statusType: StatusType): AttendanceStatus { return when (statusType) { PICNIC -> AttendanceStatus.PICNIC + DROPOUT -> AttendanceStatus.DROPOUT EMPLOYMENT -> AttendanceStatus.EMPLOYMENT else -> AttendanceStatus.ATTENDANCE } diff --git a/src/main/kotlin/dsm/pick2024/domain/status/service/ResetStatusService.kt b/src/main/kotlin/dsm/pick2024/domain/status/service/ResetStatusService.kt index e0dbdb67..60842eda 100644 --- a/src/main/kotlin/dsm/pick2024/domain/status/service/ResetStatusService.kt +++ b/src/main/kotlin/dsm/pick2024/domain/status/service/ResetStatusService.kt @@ -10,13 +10,13 @@ import org.springframework.transaction.annotation.Transactional @Service class ResetStatusService( - private val querystatusPort: QueryStatusPort, + private val queryStatusPort: QueryStatusPort, private val saveStatusPort: SaveStatusPort ) : ResetStatusUseCase { @Transactional(readOnly = true) override fun reset() { - val allStudent = querystatusPort.findAll() + val allStudent = queryStatusPort.findAll() val update = mutableListOf() allStudent.map { it -> diff --git a/src/main/kotlin/dsm/pick2024/infrastructure/schedule/ScheduleService.kt b/src/main/kotlin/dsm/pick2024/infrastructure/schedule/ScheduleService.kt index 28e78cf7..c24e4599 100644 --- a/src/main/kotlin/dsm/pick2024/infrastructure/schedule/ScheduleService.kt +++ b/src/main/kotlin/dsm/pick2024/infrastructure/schedule/ScheduleService.kt @@ -5,6 +5,7 @@ import dsm.pick2024.domain.application.port.out.DeleteApplicationPort import dsm.pick2024.domain.attendance.port.`in`.ResetAttendanceUseCase import dsm.pick2024.domain.classroom.port.out.DeleteClassRoomPort import dsm.pick2024.domain.meal.port.`in`.MealUseCase +import dsm.pick2024.domain.schedule.port.`in`.SaveScheduleUseCase import dsm.pick2024.domain.status.port.`in`.ResetStatusUseCase import dsm.pick2024.domain.timetable.port.`in`.SaveTimetableUseCase import dsm.pick2024.domain.timetable.port.out.DeleteTimeTablePort @@ -20,7 +21,8 @@ class ScheduleService( private val mealUseCase: MealUseCase, private val resetAttendanceUseCase: ResetAttendanceUseCase, private val resetStatusUseCase: ResetStatusUseCase, - private val saveTimetableUseCase: SaveTimetableUseCase + private val saveTimetableUseCase: SaveTimetableUseCase, + private val saveScheduleUseCase: SaveScheduleUseCase ) { @Scheduled(cron = "0 30 20 * * ?", zone = "Asia/Seoul") fun deleteTable() { @@ -36,8 +38,8 @@ class ScheduleService( @Scheduled(cron = "0 00 21 * * ?", zone = "Asia/Seoul") fun resetTable() { - resetAttendanceUseCase.resetAttendance() resetStatusUseCase.reset() + resetAttendanceUseCase.resetAttendance() } @Scheduled(cron = "0 0 14 * * SUN") @@ -45,4 +47,9 @@ class ScheduleService( deleteTimetablePort.deleteAll() saveTimetableUseCase.saveTimetable() } + + @Scheduled(cron = "0 0 8 * * ?") + fun saveSchedule() { + saveScheduleUseCase.saveNeisInfoToDatabase() + } }