Jelajahi Sumber

获取本学期所有周次,应该获取自然周

大数据与最优化研究所 3 bulan lalu
induk
melakukan
825c87b65f

+ 60 - 29
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -45,11 +45,9 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.time.DayOfWeek;
-import java.time.Duration;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
@@ -215,7 +213,6 @@ public class ScheduleController {
         return RT.ok("ok");
     }
 
-
     @GetMapping(value = "/getCourseNames")
     @ApiOperation(value = "查询课程接口")
     @SaCheckPermission("schedule:detail")
@@ -249,7 +246,6 @@ public class ScheduleController {
         return RT.ok(result);
     }
 
-
     @GetMapping(value = "/getCourseInfo")
     @ApiOperation(value = "根据课程id获取课程相关信息")
     @SaCheckPermission("schedule:detail")
@@ -302,9 +298,6 @@ public class ScheduleController {
         return RT.ok(resultVo);
     }
 
-
-
-
     /**
      * 顶课预检查
      *
@@ -411,7 +404,6 @@ public class ScheduleController {
     @SaCheckPermission("schedule:detail")
     @XjrLog(value = "获取周次列表")
     public RT<List<ScheduleWeekVo>> weekList(@Valid ScheduleWeekDto dto) {
-
         BaseSemester baseSemester;
         if (dto.getSemesterId() != null) {
             baseSemester = semesterService.getById(dto.getSemesterId());
@@ -421,27 +413,66 @@ public class ScheduleController {
                 return RT.ok(new ArrayList<>());
             }
         }
-        LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
-        LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault());
-        Duration between = Duration.between(startDateTime, endDateTime);
-        long days = between.toDays();
-        int weeks = (int) Math.ceil((double) days / 7);
-        List<ScheduleWeekVo> result = new ArrayList<>();
-        for (int i = 0; i < weeks; i++) {
-            LocalDateTime startDate = startDateTime.plusDays(i * 7L).withHour(0).withMinute(0).withSecond(0).withNano(0);
-            LocalDateTime endDate = startDate.plusDays(6).withHour(23).withMinute(59).withSecond(59).withNano(9999);
-            int week = i + 1;
-            result.add(
-                    new ScheduleWeekVo() {{
-                        setWeek(week);
-                        setWeekCn("第" + week + "周");
-                        setStartDate(startDate.toLocalDate());
-                        setEndDate(endDate.toLocalDate());
-                    }}
-            );
+        LocalDate startDate = LocalDate.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
+        LocalDate endDate = LocalDate.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault());
+        List<ScheduleWeekVo> weeks = calculateSemesterWeeks(startDate, endDate);
+
+        return RT.ok(weeks);
+//        Duration between = Duration.between(startDateTime, endDateTime);
+//        long days = between.toDays();
+//        int weeks = (int) Math.ceil((double) days / 7);
+//        List<ScheduleWeekVo> result = new ArrayList<>();
+//        for (int i = 0; i < weeks; i++) {
+//            LocalDateTime startDate = startDateTime.plusDays(i * 7L).withHour(0).withMinute(0).withSecond(0).withNano(0);
+//            LocalDateTime endDate = startDate.plusDays(6).withHour(23).withMinute(59).withSecond(59).withNano(9999);
+//            int week = i + 1;
+//            result.add(
+//                    new ScheduleWeekVo() {{
+//                        setWeek(week);
+//                        setWeekCn("第" + week + "周");
+//                        setStartDate(startDate.toLocalDate());
+//                        setEndDate(endDate.toLocalDate());
+//                    }}
+//            );
+//        }
+//
+//        return RT.ok(result);
+    }
+
+    /**
+     * 计算学期的自然周列表
+     * @param semesterStart 学期开始日期
+     * @param semesterEnd 学期结束日期
+     * @return 周次信息列表
+     */
+    private List<ScheduleWeekVo> calculateSemesterWeeks(LocalDate semesterStart, LocalDate semesterEnd) {
+        List<ScheduleWeekVo> weekList = new ArrayList<>();
+
+        // 调整开始日期到本周星期一
+        LocalDate adjustedStart = semesterStart.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+
+        // 调整结束日期到本周星期日
+        LocalDate adjustedEnd = semesterEnd.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+
+        // 计算总周数
+        long totalDays = java.time.temporal.ChronoUnit.DAYS.between(adjustedStart, adjustedEnd) + 1;
+        int totalWeeks = (int) (totalDays / 7);
+
+        // 生成每一周的信息
+        for (int i = 0; i < totalWeeks; i++) {
+            LocalDate weekStart = adjustedStart.plusWeeks(i);
+            LocalDate weekEnd = weekStart.plusDays(6); // 一周结束是星期日
+
+            ScheduleWeekVo weekVo = new ScheduleWeekVo();
+            weekVo.setWeek(i + 1); // 周次从1开始
+            weekVo.setWeekCn("第" + (i + 1) + "周");
+            weekVo.setStartDate(weekStart);
+            weekVo.setEndDate(weekEnd);
+
+            weekList.add(weekVo);
         }
 
-        return RT.ok(result);
+        return weekList;
     }
 
     @GetMapping(value = "/class-list")