From ef7134e915d29b2e41a6843c0f072af8175a08ab Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Wed, 4 Feb 2026 17:22:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E7=94=9F=E7=AB=AF=E8=80=83=E8=AF=95?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/TaskApplicationService.java | 3 + .../impl/TaskApplicationServiceImpl.java | 8 + .../controller/CandidateTaskController.java | 25 +++ .../com/project/task/domain/dto/TaskDTO.java | 9 ++ .../domain/enums/CandidateExamResultEnum.java | 13 ++ .../domain/enums/CandidateTaskSortEnum.java | 17 +++ .../domain/enums/CandidateTaskStatusEnum.java | 17 +++ .../project/task/domain/param/TaskParam.java | 5 + .../CandidateSearchTaskDomainService.java | 11 ++ .../CandidateSearchTaskDomainServiceImpl.java | 142 ++++++++++++++++++ .../impl/NotifyTaskDomainServiceImpl.java | 6 +- 11 files changed, 253 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/project/task/controller/CandidateTaskController.java create mode 100644 src/main/java/com/project/task/domain/enums/CandidateExamResultEnum.java create mode 100644 src/main/java/com/project/task/domain/enums/CandidateTaskSortEnum.java create mode 100644 src/main/java/com/project/task/domain/enums/CandidateTaskStatusEnum.java create mode 100644 src/main/java/com/project/task/domain/service/CandidateSearchTaskDomainService.java create mode 100644 src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java diff --git a/src/main/java/com/project/task/application/TaskApplicationService.java b/src/main/java/com/project/task/application/TaskApplicationService.java index b3cf3d7..0078fb7 100644 --- a/src/main/java/com/project/task/application/TaskApplicationService.java +++ b/src/main/java/com/project/task/application/TaskApplicationService.java @@ -17,4 +17,7 @@ public interface TaskApplicationService { Result getDetail(Long id) throws Exception; List selectBatchIds(List taskIdList); + + Result> candidateSearch(TaskParam param) throws Exception; + } diff --git a/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java b/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java index e67d8de..178b526 100644 --- a/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java +++ b/src/main/java/com/project/task/application/impl/TaskApplicationServiceImpl.java @@ -5,6 +5,7 @@ import com.project.base.domain.result.Result; import com.project.task.application.TaskApplicationService; import com.project.task.domain.dto.TaskDTO; import com.project.task.domain.param.TaskParam; +import com.project.task.domain.service.CandidateSearchTaskDomainService; import com.project.task.domain.service.DeleteTaskDomainService; import com.project.task.domain.service.SaveOrUpdateTaskDomainService; import com.project.task.domain.service.SearchTaskDomainService; @@ -25,11 +26,18 @@ public class TaskApplicationServiceImpl implements TaskApplicationService { @Autowired private SearchTaskDomainService searchTaskDomainService; + @Autowired + private CandidateSearchTaskDomainService candidateSearchTaskDomainService; + @Override public Result saveOrUpdate(TaskDTO dto) throws Exception { return saveOrUpdateTaskDomainService.saveOrUpdate(dto); } + @Override + public Result> candidateSearch(TaskParam param) throws Exception { + return candidateSearchTaskDomainService.candidateSearch(param); + } @Override public Result batchDelete(String ids) throws Exception { diff --git a/src/main/java/com/project/task/controller/CandidateTaskController.java b/src/main/java/com/project/task/controller/CandidateTaskController.java new file mode 100644 index 0000000..6228975 --- /dev/null +++ b/src/main/java/com/project/task/controller/CandidateTaskController.java @@ -0,0 +1,25 @@ +package com.project.task.controller; + + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.task.application.TaskApplicationService; +import com.project.task.domain.dto.TaskDTO; +import com.project.task.domain.param.TaskParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Slf4j +@RequestMapping("/api/task") +public class CandidateTaskController { + @Autowired + private TaskApplicationService taskApplicationService; + @GetMapping("/candidateSearch") + public Result> candidateSearch(TaskParam param) throws Exception { + return taskApplicationService.candidateSearch(param); + } +} diff --git a/src/main/java/com/project/task/domain/dto/TaskDTO.java b/src/main/java/com/project/task/domain/dto/TaskDTO.java index 7bc127d..c3d541b 100644 --- a/src/main/java/com/project/task/domain/dto/TaskDTO.java +++ b/src/main/java/com/project/task/domain/dto/TaskDTO.java @@ -38,4 +38,13 @@ public class TaskDTO extends BaseDTO { private String statusText; + + private String candidateTaskStatus; + + private String candidateTaskStatusText; + + private String examResult; + + private String examResultText; + } diff --git a/src/main/java/com/project/task/domain/enums/CandidateExamResultEnum.java b/src/main/java/com/project/task/domain/enums/CandidateExamResultEnum.java new file mode 100644 index 0000000..34203c4 --- /dev/null +++ b/src/main/java/com/project/task/domain/enums/CandidateExamResultEnum.java @@ -0,0 +1,13 @@ +package com.project.task.domain.enums; + +import com.project.base.domain.enums.HasValueEnum; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum CandidateExamResultEnum implements HasValueEnum { + Pass("已通过") , + Fail("未通过"); + private final String value; +} diff --git a/src/main/java/com/project/task/domain/enums/CandidateTaskSortEnum.java b/src/main/java/com/project/task/domain/enums/CandidateTaskSortEnum.java new file mode 100644 index 0000000..f140006 --- /dev/null +++ b/src/main/java/com/project/task/domain/enums/CandidateTaskSortEnum.java @@ -0,0 +1,17 @@ +package com.project.task.domain.enums; + +import com.project.base.domain.enums.HasValueEnum; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum CandidateTaskSortEnum implements HasValueEnum { + End_Time_Near(1, "截止时间从近到远"), + End_Time_Far(2, "截止时间从远到近"), + Start_Time_Near(3, "开考时间从近到远"), + Start_Time_Far(4, "开考时间从远到近"); + + private final Integer value; + private final String desc; +} diff --git a/src/main/java/com/project/task/domain/enums/CandidateTaskStatusEnum.java b/src/main/java/com/project/task/domain/enums/CandidateTaskStatusEnum.java new file mode 100644 index 0000000..287bca3 --- /dev/null +++ b/src/main/java/com/project/task/domain/enums/CandidateTaskStatusEnum.java @@ -0,0 +1,17 @@ +package com.project.task.domain.enums; + +import com.project.base.domain.enums.HasValueEnum; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum CandidateTaskStatusEnum implements HasValueEnum { + All("全部") , + Pending_Exam("待开考") , + Not_Exam("未考试") , + Has_Exam("已考试") , + End("已截止") + ; + private final String value; +} diff --git a/src/main/java/com/project/task/domain/param/TaskParam.java b/src/main/java/com/project/task/domain/param/TaskParam.java index 1aa9b50..10416c6 100644 --- a/src/main/java/com/project/task/domain/param/TaskParam.java +++ b/src/main/java/com/project/task/domain/param/TaskParam.java @@ -10,4 +10,9 @@ public class TaskParam extends BaseParam { private Long lineId; private Long subLineId; + + private String candidateTaskStatus; + + private Integer sortType; + } diff --git a/src/main/java/com/project/task/domain/service/CandidateSearchTaskDomainService.java b/src/main/java/com/project/task/domain/service/CandidateSearchTaskDomainService.java new file mode 100644 index 0000000..cdcae92 --- /dev/null +++ b/src/main/java/com/project/task/domain/service/CandidateSearchTaskDomainService.java @@ -0,0 +1,11 @@ +package com.project.task.domain.service; + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.task.domain.dto.TaskDTO; +import com.project.task.domain.param.TaskParam; + +public interface CandidateSearchTaskDomainService { + + Result> candidateSearch(TaskParam param) throws Exception; +} diff --git a/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java b/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java new file mode 100644 index 0000000..866fd1d --- /dev/null +++ b/src/main/java/com/project/task/domain/service/impl/CandidateSearchTaskDomainServiceImpl.java @@ -0,0 +1,142 @@ +package com.project.task.domain.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.base.domain.utils.PageConverter; +import com.project.ding.utils.SecurityUtils; +import com.project.task.domain.dto.TaskDTO; +import com.project.task.domain.entity.TaskEntity; +import com.project.task.domain.entity.TaskUserEntity; +import com.project.task.domain.enums.CandidateExamResultEnum; +import com.project.task.domain.enums.CandidateTaskStatusEnum; +import com.project.task.domain.enums.TaskStatusEnum; +import com.project.task.domain.enums.TaskUserStatusEnum; +import com.project.task.domain.param.TaskParam; +import com.project.task.domain.service.CandidateSearchTaskDomainService; +import com.project.task.mapper.TaskMapper; +import com.project.task.mapper.TaskUserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +@Service +public class CandidateSearchTaskDomainServiceImpl implements CandidateSearchTaskDomainService { + + @Autowired + private TaskMapper taskMapper; + + @Autowired + private TaskUserMapper taskUserMapper; + + @Override + public Result> candidateSearch(TaskParam param) throws Exception { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(param.getName())) { + queryWrapper.like(TaskEntity::getName , param.getName()); + } + if (Objects.nonNull(param.getLineId())) { + queryWrapper.eq(TaskEntity::getLineId , param.getLineId()); + } + if (Objects.nonNull(param.getSubLineId())) { + queryWrapper.eq(TaskEntity::getSubLineId , param.getSubLineId()); + } + Date endOfToday = DateUtil.endOfDay(new Date()); + Date beginOfToday = DateUtil.beginOfDay(new Date()); + + // 待开考:开始时间大于当前 + if (StrUtil.equals(param.getCandidateTaskStatus() , CandidateTaskStatusEnum.Pending_Exam.name())) { + queryWrapper.gt(TaskEntity::getStartTime , endOfToday); + } + // 已截止:结束时间小于当前 + if (StrUtil.equals(param.getCandidateTaskStatus() , CandidateTaskStatusEnum.End.name())) { + queryWrapper.lt(TaskEntity::getEndTime , beginOfToday); + } + // 未考试:在有效期内,且用户状态为未参加考试 + if (StrUtil.equals(param.getCandidateTaskStatus() , CandidateTaskStatusEnum.Not_Exam.name())) { + queryWrapper.le(TaskEntity::getStartTime, endOfToday); + queryWrapper.ge(TaskEntity::getEndTime, beginOfToday); + queryWrapper.inSql(TaskEntity::getId, + String.format("SELECT task_id FROM evaluator_task_user WHERE user_id = '%s' AND status = %s", SecurityUtils.getUserId() , TaskUserStatusEnum.Not_Start.getValue())); + } + // 已考试:在有效期内,用户状态为已通过或未通过 + if (StrUtil.equals(param.getCandidateTaskStatus() , CandidateTaskStatusEnum.Has_Exam.name())) { + queryWrapper.le(TaskEntity::getStartTime, endOfToday); + queryWrapper.ge(TaskEntity::getEndTime, beginOfToday); + queryWrapper.inSql(TaskEntity::getId, + String.format("SELECT task_id FROM evaluator_task_user WHERE user_id = '%s' AND status in (%s)", + SecurityUtils.getUserId() , CollUtil.join(List.of(TaskUserStatusEnum.Fail.getValue() , TaskUserStatusEnum.Pass.getValue()) + , ","))); + } + // 排序 + if (Objects.nonNull(param.getSortType())) { + switch (param.getSortType()) { + case 1: // 截止时间从近到远 (ASC) + queryWrapper.orderByAsc(TaskEntity::getEndTime); + break; + case 2: // 截止时间从远到近 (DESC) + queryWrapper.orderByDesc(TaskEntity::getEndTime); + break; + case 3: // 开考时间从近到远 (ASC) + queryWrapper.orderByAsc(TaskEntity::getStartTime); + break; + case 4: // 开考时间从远到近 (DESC) + queryWrapper.orderByDesc(TaskEntity::getStartTime); + break; + default: + queryWrapper.orderByDesc(TaskEntity::getStartTime); // 默认排序 + } + } else { + // 默认按开始时间倒序 + queryWrapper.orderByDesc(TaskEntity::getStartTime); + } + + IPage entityPage = taskMapper.selectPage(PageConverter.toMpPage(param), queryWrapper); + return Result.page(entityPage.convert(this::buildDTO)); + } + + private TaskDTO buildDTO(TaskEntity entity) { + TaskDTO dto = entity.toDTO(TaskDTO::new); + Date endOfToday = DateUtil.endOfDay(new Date()); + Date beginOfToday = DateUtil.beginOfDay(new Date()); + TaskUserEntity taskUserEntity = taskUserMapper.selectOne(new LambdaQueryWrapper() + .eq(TaskUserEntity::getTaskId, entity.getId()) + .eq(TaskUserEntity::getUserId, SecurityUtils.getUserId())); + if (endOfToday.before(entity.getStartTime())) { + dto.setCandidateTaskStatus(CandidateTaskStatusEnum.Pending_Exam.name()); + dto.setCandidateTaskStatusText(CandidateTaskStatusEnum.Pending_Exam.getValue()); + } else if (beginOfToday.after(entity.getEndTime())) { + dto.setCandidateTaskStatus(CandidateTaskStatusEnum.End.name()); + dto.setCandidateTaskStatusText(CandidateTaskStatusEnum.End.getValue()); + } else { + + if (TaskUserStatusEnum.Not_Start.getValue().equals(taskUserEntity.getStatus())) { + dto.setCandidateTaskStatus(CandidateTaskStatusEnum.Not_Exam.name()); + dto.setCandidateTaskStatusText(CandidateTaskStatusEnum.Not_Exam.getValue()); + } + + if (TaskUserStatusEnum.Pass.getValue().equals(taskUserEntity.getStatus()) || + TaskUserStatusEnum.Fail.getValue().equals(taskUserEntity.getStatus())) { + dto.setCandidateTaskStatus(CandidateTaskStatusEnum.Has_Exam.name()); + dto.setCandidateTaskStatusText(CandidateTaskStatusEnum.Has_Exam.getValue()); + } + } + if (TaskUserStatusEnum.Pass.getValue().equals(taskUserEntity.getStatus())) { + dto.setExamResult(CandidateExamResultEnum.Pass.name()); + dto.setExamResultText(CandidateExamResultEnum.Pass.getValue()); + } + if (TaskUserStatusEnum.Fail.getValue().equals(taskUserEntity.getStatus())) { + dto.setExamResult(CandidateExamResultEnum.Fail.name()); + dto.setExamResultText(CandidateExamResultEnum.Fail.getValue()); + } + return dto; + } +} diff --git a/src/main/java/com/project/task/domain/service/impl/NotifyTaskDomainServiceImpl.java b/src/main/java/com/project/task/domain/service/impl/NotifyTaskDomainServiceImpl.java index 95a24ef..3b3a657 100644 --- a/src/main/java/com/project/task/domain/service/impl/NotifyTaskDomainServiceImpl.java +++ b/src/main/java/com/project/task/domain/service/impl/NotifyTaskDomainServiceImpl.java @@ -61,10 +61,10 @@ public class NotifyTaskDomainServiceImpl implements NotifyTaskDomainService { } @Override public void notifyDeadlineTasks(Date today) { - Date startOfDay = DateUtil.beginOfDay(DateUtil.offsetDay(today , -6)); - Date endOfDay = DateUtil.endOfDay(DateUtil.offsetDay(today , -6)); + Date startOfDay = DateUtil.beginOfDay(DateUtil.offsetDay(today , 6)); + Date endOfDay = DateUtil.endOfDay(DateUtil.offsetDay(today , 6)); List startTasks = taskMapper.selectList(new LambdaQueryWrapper() - .between(TaskEntity::getStartTime, startOfDay, endOfDay)) + .between(TaskEntity::getEndTime, startOfDay, endOfDay)) .stream().map(entity -> entity.toDTO(TaskDTO::new)).toList(); for (TaskDTO task : startTasks) { // 获取该任务下所有未通过考生