From d1aafdae85bfeb25e893c45e372a1e368c9599e7 Mon Sep 17 00:00:00 2001 From: Hvemi_han Date: Fri, 20 Dec 2024 11:06:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 添加按部门查询课程任务接口,返回数据中包含用户名 2. 优化任务更新逻辑,只更新非空字段 3. 添加自动更新时间戳功能 4. 更新API文档,完善接口说明 --- .DS_Store | Bin 6148 -> 6148 bytes API文档.md | 90 ++++++++++ .../controller/LessonTaskController.java | 17 ++ .../jinduguanli/dto/LessonTaskDTO.java | 154 ++++++++++++++++++ .../repository/LessonTaskRepository.java | 52 ++++++ .../service/LessonTaskService.java | 88 +++++++++- 6 files changed, 394 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/huertian/jinduguanli/dto/LessonTaskDTO.java diff --git a/.DS_Store b/.DS_Store index c829731ce2c063998826b3c61da9a8a5b77cddc9..af3d05f71754568f6ad908b409e23b09f50288d2 100644 GIT binary patch delta 31 ncmZoMXfc@J&&atkU^g=(=VTrh> getTasksByDepartment( + @PathVariable Long departmentId, + @RequestParam(defaultValue = "1") Integer page, + @RequestParam(defaultValue = "10") Integer size) { + logger.info("收到部门课程任务查询请求,部门ID: {}", departmentId); + try { + PageRequest pageRequest = PageRequest.of(page - 1, size); + Page tasks = lessonTaskService.findByDepartmentIdAndNormalUser(departmentId, pageRequest); + return ApiResponse.success(tasks); + } catch (Exception e) { + logger.error("查询部门课程任务失败", e); + return new ApiResponse<>(ErrorCode.SYSTEM_ERROR, "获取部门课程任务失败", null); + } + } + @PostMapping public ApiResponse createTask(@Valid @RequestBody LessonTaskRequest request) { logger.info("收到创建课程任务请求"); diff --git a/src/main/java/com/huertian/jinduguanli/dto/LessonTaskDTO.java b/src/main/java/com/huertian/jinduguanli/dto/LessonTaskDTO.java new file mode 100644 index 0000000..dafd3fb --- /dev/null +++ b/src/main/java/com/huertian/jinduguanli/dto/LessonTaskDTO.java @@ -0,0 +1,154 @@ +package com.huertian.jinduguanli.dto; + +import com.huertian.jinduguanli.entity.LessonTask; +import lombok.Data; + +@Data +public class LessonTaskDTO { + private Long id; + private String courseName; + private String microLessonName; + private Long userId; + private String username; // 添加用户名字段 + private Integer progressStatus; + private Long scriptUploadTime; + private Long scriptConfirmTime; + private Long videoCaptureTime; + private Long videoConfirmTime; + private Long finishTime; + private String advise; + private Long createdAt; + private Long updatedAt; + + // 从 LessonTask 实体转换为 DTO + public static LessonTaskDTO fromEntity(LessonTask lessonTask, String username) { + LessonTaskDTO dto = new LessonTaskDTO(); + dto.setId(lessonTask.getId()); + dto.setCourseName(lessonTask.getCourseName()); + dto.setMicroLessonName(lessonTask.getMicroLessonName()); + dto.setUserId(lessonTask.getUserId()); + dto.setUsername(username); + dto.setProgressStatus(lessonTask.getProgressStatus()); + dto.setScriptUploadTime(lessonTask.getScriptUploadTime()); + dto.setScriptConfirmTime(lessonTask.getScriptConfirmTime()); + dto.setVideoCaptureTime(lessonTask.getVideoCaptureTime()); + dto.setVideoConfirmTime(lessonTask.getVideoConfirmTime()); + dto.setFinishTime(lessonTask.getFinishTime()); + dto.setAdvise(lessonTask.getAdvise()); + dto.setCreatedAt(lessonTask.getCreatedAt()); + dto.setUpdatedAt(lessonTask.getUpdatedAt()); + return dto; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getCourseName() { + return courseName; + } + + public void setCourseName(String courseName) { + this.courseName = courseName; + } + + public String getMicroLessonName() { + return microLessonName; + } + + public void setMicroLessonName(String microLessonName) { + this.microLessonName = microLessonName; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public Integer getProgressStatus() { + return progressStatus; + } + + public void setProgressStatus(Integer progressStatus) { + this.progressStatus = progressStatus; + } + + public Long getScriptUploadTime() { + return scriptUploadTime; + } + + public void setScriptUploadTime(Long scriptUploadTime) { + this.scriptUploadTime = scriptUploadTime; + } + + public Long getScriptConfirmTime() { + return scriptConfirmTime; + } + + public void setScriptConfirmTime(Long scriptConfirmTime) { + this.scriptConfirmTime = scriptConfirmTime; + } + + public Long getVideoCaptureTime() { + return videoCaptureTime; + } + + public void setVideoCaptureTime(Long videoCaptureTime) { + this.videoCaptureTime = videoCaptureTime; + } + + public Long getVideoConfirmTime() { + return videoConfirmTime; + } + + public void setVideoConfirmTime(Long videoConfirmTime) { + this.videoConfirmTime = videoConfirmTime; + } + + public Long getFinishTime() { + return finishTime; + } + + public void setFinishTime(Long finishTime) { + this.finishTime = finishTime; + } + + public String getAdvise() { + return advise; + } + + public void setAdvise(String advise) { + this.advise = advise; + } + + public Long getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(Long createdAt) { + this.createdAt = createdAt; + } + + public Long getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(Long updatedAt) { + this.updatedAt = updatedAt; + } +} diff --git a/src/main/java/com/huertian/jinduguanli/repository/LessonTaskRepository.java b/src/main/java/com/huertian/jinduguanli/repository/LessonTaskRepository.java index 1ee1c9b..b2e5075 100644 --- a/src/main/java/com/huertian/jinduguanli/repository/LessonTaskRepository.java +++ b/src/main/java/com/huertian/jinduguanli/repository/LessonTaskRepository.java @@ -4,9 +4,61 @@ import com.huertian.jinduguanli.entity.LessonTask; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; +import java.util.Map; + @Repository public interface LessonTaskRepository extends JpaRepository { Page findByUserId(Long userId, Pageable pageable); + + /** + * 查询指定部门的所有课程任务 + * 通过连接users表查询属于指定部门的所有用户的课程任务 + */ + @Query("SELECT lt FROM LessonTask lt JOIN User u ON lt.userId = u.id WHERE u.departmentId = :departmentId") + List findByDepartmentId(@Param("departmentId") Long departmentId); + + /** + * 分页查询指定部门的所有课程任务 + */ + @Query("SELECT lt FROM LessonTask lt JOIN User u ON lt.userId = u.id WHERE u.departmentId = :departmentId") + Page findByDepartmentId(@Param("departmentId") Long departmentId, Pageable pageable); + + /** + * 按部门ID和状态查询课程任务(分页) + */ + @Query("SELECT lt FROM LessonTask lt JOIN User u ON lt.userId = u.id WHERE u.departmentId = :departmentId AND (:status IS NULL OR lt.progressStatus = :status)") + Page findByDepartmentIdAndStatus( + @Param("departmentId") Long departmentId, + @Param("status") Integer status, + Pageable pageable); + + /** + * 按部门ID和用户状态查询课程任务(分页) + */ + @Query("SELECT lt FROM LessonTask lt JOIN User u ON lt.userId = u.id WHERE u.departmentId = :departmentId AND (:userStatus IS NULL OR u.status = :userStatus)") + Page findByDepartmentIdAndUserStatus( + @Param("departmentId") Long departmentId, + @Param("userStatus") Integer userStatus, + Pageable pageable); + + /** + * 按部门ID查询正常状态用户的课程任务(分页) + */ + @Query("SELECT lt FROM LessonTask lt JOIN User u ON lt.userId = u.id WHERE u.departmentId = :departmentId AND u.status = 1") + Page findByDepartmentIdAndNormalUser( + @Param("departmentId") Long departmentId, + Pageable pageable); + + /** + * 按部门ID查询正常状态用户的课程任务(分页),包含用户名 + */ + @Query("SELECT new map(lt as lessonTask, u.username as username) FROM LessonTask lt JOIN User u ON lt.userId = u.id WHERE u.departmentId = :departmentId AND u.status = 1") + Page> findByDepartmentIdAndNormalUserWithUsername( + @Param("departmentId") Long departmentId, + Pageable pageable); } diff --git a/src/main/java/com/huertian/jinduguanli/service/LessonTaskService.java b/src/main/java/com/huertian/jinduguanli/service/LessonTaskService.java index 48ce4f8..ff95a9b 100644 --- a/src/main/java/com/huertian/jinduguanli/service/LessonTaskService.java +++ b/src/main/java/com/huertian/jinduguanli/service/LessonTaskService.java @@ -1,5 +1,6 @@ package com.huertian.jinduguanli.service; +import com.huertian.jinduguanli.dto.LessonTaskDTO; import com.huertian.jinduguanli.dto.LessonTaskRequest; import com.huertian.jinduguanli.entity.LessonTask; import com.huertian.jinduguanli.repository.LessonTaskRepository; @@ -66,17 +67,46 @@ public class LessonTaskService { @Transactional @CacheEvict(value = { "lessonTasks", "lessonTask" }, allEntries = true) public LessonTask update(Long id, LessonTaskRequest request) { - logger.info("开始更新课程任务 - 任务ID: {}, 课程名称: {}, 小课名称: {}", - id, request.getCourseName(), request.getMicroLessonName()); + logger.info("开始更新课程任务 - 任务ID: {}, 进度状态: {}", id, request.getProgressStatus()); LessonTask task = findById(id); - // 保留原有的进度状态,如果请求中包含新的进度状态则更新 - Integer originalStatus = task.getProgressStatus(); - BeanUtils.copyProperties(request, task); - if (task.getProgressStatus() == null) { - task.setProgressStatus(originalStatus); + // 只更新非空字段 + if (request.getProgressStatus() != null) { + task.setProgressStatus(request.getProgressStatus()); + // 根据进度状态更新时间戳 + long currentTime = System.currentTimeMillis(); + switch (request.getProgressStatus()) { + case 1: // 脚本上传 + task.setScriptUploadTime(currentTime); + break; + case 2: // 脚本确认 + task.setScriptConfirmTime(currentTime); + break; + case 3: // 视频拍摄 + task.setVideoCaptureTime(currentTime); + break; + case 4: // 视频确认 + task.setVideoConfirmTime(currentTime); + break; + case 5: // 任务完成 + task.setFinishTime(currentTime); + break; + } + } + if (request.getAdvise() != null) { + task.setAdvise(request.getAdvise()); + } + if (request.getCourseName() != null) { + task.setCourseName(request.getCourseName()); + } + if (request.getMicroLessonName() != null) { + task.setMicroLessonName(request.getMicroLessonName()); + } + if (request.getUserId() != null) { + task.setUserId(request.getUserId()); } + task.setUpdatedAt(System.currentTimeMillis()); LessonTask updatedTask = lessonTaskRepository.save(task); logger.info("更新课程任务成功 - 任务ID: {}", updatedTask.getId()); return updatedTask; @@ -94,6 +124,50 @@ public class LessonTaskService { logger.info("删除课程任务成功 - 任务ID: {}", id); } + /** + * 根据部门ID查询正常状态用户的课程任务列表(分页),包含用户名 + * + * @param departmentId 部门ID + * @param pageable 分页参数 + * @return 课程任务分页数据 + */ + public Page findByDepartmentIdAndNormalUser(Long departmentId, Pageable pageable) { + logger.info("查询部门正常用户的课程任务,部门ID: {}", departmentId); + Page> result = lessonTaskRepository.findByDepartmentIdAndNormalUserWithUsername(departmentId, pageable); + + return result.map(map -> { + LessonTask lessonTask = (LessonTask) map.get("lessonTask"); + String username = (String) map.get("username"); + return LessonTaskDTO.fromEntity(lessonTask, username); + }); + } + + /** + * 根据部门ID和状态查询课程任务列表(分页) + * + * @param departmentId 部门ID + * @param status 任务状态(可选):0-脚本上传, 1-脚本确认, 2-视频拍摄, 3-后期制作, 4-任务完成 + * @param pageable 分页参数 + * @return 课程任务分页数据 + */ + public Page findByDepartmentIdAndStatus(Long departmentId, Integer status, Pageable pageable) { + logger.info("查询部门课程任务,部门ID: {}, 状态: {}", departmentId, status); + return lessonTaskRepository.findByDepartmentIdAndStatus(departmentId, status, pageable); + } + + /** + * 根据部门ID和用户状态查询课程任务列表(分页) + * + * @param departmentId 部门ID + * @param userStatus 用户状态(可选):1-正常, 0-禁用 + * @param pageable 分页参数 + * @return 课程任务分页数据 + */ + public Page findByDepartmentIdAndUserStatus(Long departmentId, Integer userStatus, Pageable pageable) { + logger.info("查询部门课程任务,部门ID: {}, 用户状态: {}", departmentId, userStatus); + return lessonTaskRepository.findByDepartmentIdAndUserStatus(departmentId, userStatus, pageable); + } + private void validateRequest(LessonTaskRequest request) { if (request.getCourseName() == null || request.getCourseName().trim().isEmpty()) { throw new IllegalArgumentException("课程名称不能为空");