From 1e73b480a0f96332e0fcd7e697214b4c07019e4c Mon Sep 17 00:00:00 2001 From: zhonghua Date: Tue, 24 Mar 2026 10:05:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E5=AD=A6=E7=94=9F?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=A8=A1=E6=9D=BF=E6=8E=A5=E5=8F=A3=E5=8F=8A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=98=85=E8=AF=BB=E4=BB=BB=E5=8A=A1=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 GET /api/v1/school/students/import/template 接口,返回导入模板配置 - 实现阅读任务 startDate/endDate 日期范围查询(按任务日期交集筛选) - 支持阅读任务按 startDate/endDate 排序 Made-with: Cursor --- .../school/SchoolStudentController.java | 18 +++++++ .../StudentImportTemplateResponse.java | 27 +++++++++++ .../service/impl/TaskServiceImpl.java | 48 ++++++++++++++----- 3 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 reading-platform-java/src/main/java/com/reading/platform/dto/response/StudentImportTemplateResponse.java diff --git a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolStudentController.java b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolStudentController.java index 1862aa0..148c8a2 100644 --- a/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolStudentController.java +++ b/reading-platform-java/src/main/java/com/reading/platform/controller/school/SchoolStudentController.java @@ -13,6 +13,7 @@ import com.reading.platform.common.security.SecurityUtils; import com.reading.platform.dto.request.StudentCreateRequest; import com.reading.platform.dto.request.StudentUpdateRequest; import com.reading.platform.dto.request.TransferStudentRequest; +import com.reading.platform.dto.response.StudentImportTemplateResponse; import com.reading.platform.dto.response.StudentResponse; import com.reading.platform.dto.response.StudentTransferHistoryItemResponse; import com.reading.platform.entity.Student; @@ -24,6 +25,7 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -137,6 +139,22 @@ public class SchoolStudentController { return Result.success(); } + @Operation(summary = "Get student import template") + @GetMapping("/import/template") + public Result getImportTemplate() { + return Result.success(new StudentImportTemplateResponse( + Arrays.asList("姓名", "性别", "出生日期", "班级ID", "家长姓名", "家长电话"), + Arrays.asList("张小明", "男", "2020-01-15", "1", "张三", "13800138000"), + Arrays.asList( + "姓名为必填项", + "性别可选:男/女,默认为男", + "出生日期格式:YYYY-MM-DD", + "班级ID为必填项,可在班级管理中查看", + "家长姓名和家长电话为选填项" + ) + )); + } + @Operation(summary = "Get student class transfer history") @GetMapping("/{id}/history") public Result> getStudentClassHistory(@PathVariable Long id) { diff --git a/reading-platform-java/src/main/java/com/reading/platform/dto/response/StudentImportTemplateResponse.java b/reading-platform-java/src/main/java/com/reading/platform/dto/response/StudentImportTemplateResponse.java new file mode 100644 index 0000000..c75f013 --- /dev/null +++ b/reading-platform-java/src/main/java/com/reading/platform/dto/response/StudentImportTemplateResponse.java @@ -0,0 +1,27 @@ +package com.reading.platform.dto.response; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 学生导入模板响应 + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "学生导入模板") +public class StudentImportTemplateResponse { + + @Schema(description = "表头列表") + private List headers; + + @Schema(description = "示例行") + private List example; + + @Schema(description = "说明事项") + private List notes; +} 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);