package com.gkhy.exam.system.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gkhy.exam.common.api.CommonPage; import com.gkhy.exam.common.domain.entity.SysUser; import com.gkhy.exam.common.enums.QuestionTypeEnum; import com.gkhy.exam.common.enums.UserTypeEnum; import com.gkhy.exam.common.exception.ApiException; import com.gkhy.exam.common.utils.PageUtils; import com.gkhy.exam.common.utils.SecurityUtils; import com.gkhy.exam.system.domain.ExExamPaper; import com.gkhy.exam.system.domain.ExPaperStudent; import com.gkhy.exam.system.domain.ExStudent; import com.gkhy.exam.system.mapper.ExExamPaperMapper; import com.gkhy.exam.system.mapper.ExPaperStudentMapper; import com.gkhy.exam.system.mapper.ExStudentAnswerMapper; import com.gkhy.exam.system.mapper.ExStudentMapper; import com.gkhy.exam.system.service.ExPaperStudentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.List; import java.util.Objects; /** *

* 学员与考试题目关系表 服务实现类 *

* * @author kzy * @since 2024-06-06 13:53:17 */ @Service public class ExPaperStudentServiceImpl extends ServiceImpl implements ExPaperStudentService { @Autowired private ExExamPaperMapper examPaperMapper; @Autowired private ExStudentAnswerMapper studentAnswerMapper; @Autowired private ExStudentMapper studentMapper; @Override public CommonPage selectPaperStudentListForStudent(ExPaperStudent paperStudent) { SysUser user= SecurityUtils.getLoginUser().getUser(); if(!Objects.equals(user.getUserType(), UserTypeEnum.STUDENT.getCode())){ throw new ApiException("非学员用户,不能查看"); } paperStudent.setStudentId(user.getId()); PageUtils.startPage(); List paperList=baseMapper.selectPaperStudentList(paperStudent); return CommonPage.restPage(paperList); } @Override public ExPaperStudent selectPaperStudentById(Long paperStudentId) { return baseMapper.selectPaperStudentById(paperStudentId); } @Override public ExPaperStudent selectPaperStudentById(ExPaperStudent paperStudent) { return baseMapper.selectByPaperStudentId(paperStudent); } @Override public int addPaperStudent(ExPaperStudent paperStudent) { checkStudentUnique(Collections.singletonList(paperStudent)); paperStudent.setCreateId(SecurityUtils.getUserId()); int row=baseMapper.insert(paperStudent); if(row<1){ throw new ApiException("分配学员失败"); } return row; } @Override public int batchAddPaperStudent(List paperStudents) { checkStudentUnique(paperStudents); int row=baseMapper.batchInsert(paperStudents); if(row<1){ throw new ApiException("批量分配学员失败"); } return row; } @Override public void checkStudentUnique(List paperStudents){ for(ExPaperStudent paperStudent:paperStudents) { Integer existCount = baseMapper.selectCountByPaperStudentId(paperStudent.getPaperId(), paperStudent.getStudentId()); if (existCount > 0) { ExStudent student = studentMapper.selectById(paperStudent.getStudentId()); throw new ApiException(String.format("待分配学员<%s>已存在", student.getName())); } } } @Override public CommonPage selectPaperStudentList(ExPaperStudent paperStudent) { if(paperStudent.getPaperId()==null){ throw new ApiException("试卷id不能为空"); } PageUtils.startPage(); List paperStudentList=baseMapper.selectPaperStudentList(paperStudent); return CommonPage.restPage(paperStudentList); } @Override public int deletePaperStudent(Long paperStudentId) { ExPaperStudent paperStudent=baseMapper.selectPaperStudentById(paperStudentId); if(ObjectUtil.isNull(paperStudent)){ throw new ApiException(String.format("该试卷下不存在该学员<>",paperStudent.getStudentName())); } int studentAnswerCount=studentAnswerMapper.countByPaperId(paperStudent.getPaperId(),paperStudent.getStudentId()); if(studentAnswerCount>0){ throw new ApiException(String.format("学员<%s>已进行答题,不能删除",paperStudent.getStudentName())); } //删除学员与试卷关系 return baseMapper.deleteById(paperStudentId); } @Override @Transactional(rollbackFor = RuntimeException.class) public void batchDeletePaperStudent(List paperStudentIds) { for(Long paperStudentId:paperStudentIds){ deletePaperStudent(paperStudentId); } } @Override public void endExam(ExPaperStudent paperStudent) { Long endTime=System.currentTimeMillis(); //异步计算 //计算考试成绩 ExExamPaper paper=examPaperMapper.selectById(paperStudent.getPaperId()); int singleCount=studentAnswerMapper.selectPassCount(paperStudent.getPaperId(),paperStudent.getStudentId(), QuestionTypeEnum.SINGLE.getCode()); int multiCount=studentAnswerMapper.selectPassCount(paperStudent.getPaperId(),paperStudent.getStudentId(), QuestionTypeEnum.MULTI.getCode()); int judgeCount=studentAnswerMapper.selectPassCount(paperStudent.getPaperId(),paperStudent.getStudentId(), QuestionTypeEnum.JUDGE.getCode()); int score=singleCount*paper.getSingleScore()+multiCount*paper.getMultiScore()+judgeCount*paper.getJudgeScore(); ExPaperStudent exPaperStudent = new ExPaperStudent() .setPaperId(paperStudent.getPaperId()) .setStudentId(paperStudent.getStudentId()) .setCompleted(1) .setEndTime(endTime) .setScore(score); if(score>=paper.getPassScore()){ exPaperStudent.setPassed(1); }else{ exPaperStudent.setPassed(0); } int row=baseMapper.updateById(exPaperStudent); if(row<1){ throw new ApiException("提交考试失败"); } } }