@ -1,11 +1,8 @@
package com.project.task.domain.service.impl ;
import cn.hutool.core.collection.CollUtil ;
import cn.hutool.core.date.DateUtil ;
import cn.hutool.core.util.BooleanUtil ;
import cn.hutool.core.util.EnumUtil ;
import cn.hutool.core.util.ObjectUtil ;
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 ;
@ -34,9 +31,7 @@ import com.project.task.mapper.TaskUserMapper;
import io.vavr.control.Try ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import java.text.NumberFormat ;
import java.util.Date ;
import java.util.List ;
import java.util.Objects ;
@Service
@ -63,85 +58,12 @@ public class CandidateSearchTaskDomainServiceImpl implements CandidateSearchTask
@Override
public Result < PageResult < TaskDTO > > candidateSearch ( TaskParam param ) throws Exception {
LambdaQueryWrapper < TaskEntity > queryWrapper = new LambdaQueryWrapper < > ( ) ;
queryWrapper . exists ( String . format (
"SELECT 1 FROM evaluator_task_user tu WHERE tu.task_id = evaluator_task.id AND tu.user_id = '%s' and tu.deleted = 0 " ,
SecurityUtils . getUserId ( )
) ) ;
String name = param . getName ( ) ;
if ( name ! = null & & StrUtil . isNotBlank ( name . trim ( ) ) ) {
queryWrapper . like ( TaskEntity : : getName , name . trim ( ) ) ;
}
if ( Objects . nonNull ( param . getLineId ( ) ) ) {
queryWrapper . eq ( TaskEntity : : getLineId , param . getLineId ( ) ) ;
}
if ( Objects . nonNull ( param . getSubLineId ( ) ) ) {
queryWrapper . eq ( TaskEntity : : getSubLineId , param . getSubLineId ( ) ) ;
}
String userId = SecurityUtils . getUserId ( ) ;
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 ( BooleanUtil . isTrue ( param . getExcludeEnd ( ) ) ) {
// 强制要求:结束时间必须 >= 今天 00:00:00
// 这样,截止时间是今天的任务会被【保留】,只有昨天及以前截止的任务会被【排除】
queryWrapper . ge ( 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 and deleted = 0 " , 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) and deleted = 0 " ,
SecurityUtils . getUserId ( ) , CollUtil . join ( List . of ( TaskUserStatusEnum . Fail . getValue ( ) , TaskUserStatusEnum . Pass . getValue ( ) )
, "," ) ) ) ;
}
// 评分中:在有效期内,用户状态为评分中
if ( StrUtil . equals ( param . getCandidateTaskStatus ( ) , CandidateTaskStatusEnum . Scoring . 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 and deleted = 0 " ,
SecurityUtils . getUserId ( ) , TaskUserStatusEnum . Scoring . getValue ( ) ) ) ;
}
// 排序
if ( Objects . nonNull ( param . getSortType ( ) ) ) {
switch ( param . getSortType ( ) ) {
case 1 : // 截止时间从近到远
queryWrapper . orderByAsc ( TaskEntity : : getEndTime ) ;
break ;
case 2 : // 截止时间从远到近
queryWrapper . orderByDesc ( TaskEntity : : getEndTime ) ;
break ;
case 3 : // 开考时间从近到远
queryWrapper . orderByAsc ( TaskEntity : : getStartTime ) ;
break ;
case 4 : // 开考时间从远到近
queryWrapper . orderByDesc ( TaskEntity : : getStartTime ) ;
break ;
default : // 默认排序(兜底)
defaultSort ( queryWrapper ) ;
}
} else {
defaultSort ( queryWrapper ) ;
}
IPage < TaskEntity > entityPage = taskMapper . selectPage ( PageConverter . toMpPage ( param ) , queryWrapper ) ;
IPage < TaskEntity > entityPage = taskMapper . selectCandidatePage (
PageConverter . toMpPage ( param ) , userId , param , beginOfToday , endOfToday ) ;
return Result . page ( entityPage . convert ( this : : buildDTO ) ) ;
}
@ -231,22 +153,4 @@ public class CandidateSearchTaskDomainServiceImpl implements CandidateSearchTask
}
return dto ;
}
private void defaultSort ( LambdaQueryWrapper < TaskEntity > queryWrapper ) {
String userId = SecurityUtils . getUserId ( ) ;
// 单次子查询,内部组合状态+时间判断,避免重复扫描
String sortSql = "ORDER BY (" +
"SELECT CASE " +
"WHEN tu.status = 1 THEN 1 " + // 已考未通过
"WHEN tu.status = 0 AND evaluator_task.start_time <= NOW() AND evaluator_task.end_time >= NOW() THEN 2 " + // 未考
"WHEN tu.status = 3 THEN 3 " + // 评分中
"WHEN tu.status = 0 AND evaluator_task.start_time > NOW() THEN 4 " + // 未开考
"WHEN tu.status = 2 THEN 5 " + // 已考已过
"WHEN evaluator_task.end_time < NOW() THEN 6 " + // 已截止
"ELSE 99 END " +
"FROM evaluator_task_user tu " +
"WHERE tu.task_id = evaluator_task.id AND tu.user_id = '" + userId + "' AND tu.deleted = 0" +
") ASC, create_time DESC" ;
queryWrapper . last ( sortSql ) ;
}
}