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