diff --git a/reading-platform-frontend/src/views/teacher/classes/ClassStudentsView.vue b/reading-platform-frontend/src/views/teacher/classes/ClassStudentsView.vue index 5901fe3..9e3ed64 100644 --- a/reading-platform-frontend/src/views/teacher/classes/ClassStudentsView.vue +++ b/reading-platform-frontend/src/views/teacher/classes/ClassStudentsView.vue @@ -51,12 +51,13 @@ placeholder="搜索学生" style="width: 200px;" allow-clear + @search="handleSearch" /> @@ -167,7 +168,7 @@ ") + List> selectStudentStats(@Param("studentIds") List studentIds); + /** * 统计指定时间段内有上课记录的去重学生数 * @param startTime 开始时间 diff --git a/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskServiceImpl.java b/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskServiceImpl.java index 68e5070..50e27b4 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskServiceImpl.java +++ b/reading-platform-java/src/main/java/com/reading/platform/service/impl/TaskServiceImpl.java @@ -712,19 +712,45 @@ public class TaskServiceImpl extends ServiceImpl wrapper.eq(Task::getStatus, status); } - // TODO: 实现更多筛选条件 - // - classIds: 班级筛选(需要关联 task_target 表) - // - teacherIds: 教师筛选 - // - dateType/startDate/endDate: 时间筛选 - // - completionRate: 完成率筛选 - // - sortBy/sortOrder: 排序 + // 时间筛选:任务的 startDate~dueDate 与查询范围有交集的纳入结果 + // 交集条件:task.startDate <= endDate AND task.dueDate >= startDate + if (StringUtils.hasText(startDate) && StringUtils.hasText(endDate)) { + try { + LocalDate rangeStart = LocalDate.parse(startDate); + LocalDate rangeEnd = LocalDate.parse(endDate); + // 任务开始日期 <= 查询结束日期(任务不能完全在查询范围之后) + wrapper.le(Task::getStartDate, rangeEnd); + // 任务截止日期 >= 查询开始日期(任务不能完全在查询范围之前) + wrapper.and(w -> w.ge(Task::getDueDate, rangeStart).or().isNull(Task::getDueDate)); + } catch (Exception e) { + log.warn("解析日期参数失败 startDate={}, endDate={}", startDate, endDate, e); + } + } else if (StringUtils.hasText(startDate)) { + try { + LocalDate rangeStart = LocalDate.parse(startDate); + wrapper.ge(Task::getDueDate, rangeStart); + } catch (Exception e) { + log.warn("解析 startDate 参数失败: {}", startDate, e); + } + } else if (StringUtils.hasText(endDate)) { + try { + LocalDate rangeEnd = LocalDate.parse(endDate); + wrapper.le(Task::getStartDate, rangeEnd); + } catch (Exception e) { + log.warn("解析 endDate 参数失败: {}", endDate, e); + } + } - // 默认排序 - if ("completionRate".equals(sortBy)) { - // 完成率排序需要特殊处理,暂时使用创建时间 - wrapper.orderByDesc(Task::getCreatedAt); + // TODO: classIds、teacherIds、completionRate 筛选待实现 + + // 排序 + boolean asc = "asc".equalsIgnoreCase(sortOrder); + if ("startDate".equals(sortBy)) { + wrapper.orderBy(true, asc, Task::getStartDate); + } else if ("endDate".equals(sortBy) || "dueDate".equals(sortBy)) { + wrapper.orderBy(true, asc, Task::getDueDate); } else { - wrapper.orderByDesc(Task::getCreatedAt); + wrapper.orderBy(true, asc, Task::getCreatedAt); } Page taskPage = taskMapper.selectPage(page, wrapper);