11 changed files with 253 additions and 3 deletions
@ -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<PageResult<TaskDTO>> candidateSearch(TaskParam param) throws Exception { |
||||
|
return taskApplicationService.candidateSearch(param); |
||||
|
} |
||||
|
} |
||||
@ -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<String> { |
||||
|
Pass("已通过") , |
||||
|
Fail("未通过"); |
||||
|
private final String value; |
||||
|
} |
||||
@ -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<Integer> { |
||||
|
End_Time_Near(1, "截止时间从近到远"), |
||||
|
End_Time_Far(2, "截止时间从远到近"), |
||||
|
Start_Time_Near(3, "开考时间从近到远"), |
||||
|
Start_Time_Far(4, "开考时间从远到近"); |
||||
|
|
||||
|
private final Integer value; |
||||
|
private final String desc; |
||||
|
} |
||||
@ -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<String> { |
||||
|
All("全部") , |
||||
|
Pending_Exam("待开考") , |
||||
|
Not_Exam("未考试") , |
||||
|
Has_Exam("已考试") , |
||||
|
End("已截止") |
||||
|
; |
||||
|
private final String value; |
||||
|
} |
||||
@ -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<PageResult<TaskDTO>> candidateSearch(TaskParam param) throws Exception; |
||||
|
} |
||||
@ -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<PageResult<TaskDTO>> candidateSearch(TaskParam param) throws Exception { |
||||
|
LambdaQueryWrapper<TaskEntity> 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<TaskEntity> 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<TaskUserEntity>() |
||||
|
.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; |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue