|
@@ -1,401 +1,416 @@
|
|
|
-package com.qmth.teachcloud.mark.service.impl;
|
|
|
-
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
-import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
|
|
|
-import com.qmth.teachcloud.common.entity.MarkQuestion;
|
|
|
-import com.qmth.teachcloud.common.entity.SysUser;
|
|
|
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
|
-import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
|
|
|
-import com.qmth.teachcloud.common.service.SysUserService;
|
|
|
-import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
-import com.qmth.teachcloud.mark.bean.marker.MarkerAddParam;
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityChartDto;
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
|
|
|
-import com.qmth.teachcloud.mark.entity.*;
|
|
|
-import com.qmth.teachcloud.mark.enums.LockType;
|
|
|
-import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
|
|
|
-import com.qmth.teachcloud.mark.lock.LockService;
|
|
|
-import com.qmth.teachcloud.mark.mapper.MarkUserQuestionMapper;
|
|
|
-import com.qmth.teachcloud.mark.service.*;
|
|
|
-import com.qmth.teachcloud.mark.utils.Calculator;
|
|
|
-import org.apache.commons.collections4.CollectionUtils;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-
|
|
|
-import javax.annotation.Resource;
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.math.RoundingMode;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.List;
|
|
|
-import java.util.stream.Collectors;
|
|
|
-
|
|
|
-/**
|
|
|
- * <p>
|
|
|
- * 评卷员表 服务实现类
|
|
|
- * </p>
|
|
|
- *
|
|
|
- * @author xf
|
|
|
- * @since 2023-09-22
|
|
|
- */
|
|
|
-@Service
|
|
|
-public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMapper, MarkUserQuestion> implements MarkUserQuestionService {
|
|
|
-
|
|
|
- @Resource
|
|
|
- private MarkQuestionService markQuestionService;
|
|
|
- @Resource
|
|
|
- private MarkTaskService markTaskService;
|
|
|
- @Resource
|
|
|
- private MarkPaperService markPaperService;
|
|
|
- @Resource
|
|
|
- private MarkUserClassService markUserClassService;
|
|
|
- @Resource
|
|
|
- private MarkUserPaperService markUserPaperService;
|
|
|
- @Resource
|
|
|
- private MarkSyncService markSyncService;
|
|
|
- @Resource
|
|
|
- private SysUserService sysUserService;
|
|
|
- @Resource
|
|
|
- private MarkService markService;
|
|
|
- @Resource
|
|
|
- private LockService lockService;
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<MarkEntranceDto> listEntranceGroup(Long examId, Long openCollegeId, Long courseId, String paperNumber, Integer pageNumber, Integer pageSize) {
|
|
|
- SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
- Page<MarkUserQuestion> page = new Page<>(pageNumber, pageSize);
|
|
|
- IPage<MarkEntranceDto> markEntranceDtoIPage = this.baseMapper.listEntranceGroup(page, examId, openCollegeId, courseId, paperNumber, sysUser.getId(), MarkPaperStatus.FORMAL.name());
|
|
|
- for (MarkEntranceDto record : markEntranceDtoIPage.getRecords()) {
|
|
|
- MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(record.getExamId(), record.getPaperNumber());
|
|
|
- // 分班阅
|
|
|
- List<String> classNames = null;
|
|
|
- if (markPaper != null && markPaper.getClassMark() != null && markPaper.getClassMark()) {
|
|
|
- List<MarkUserClass> markUserClassList = markUserClassService.listByExamIdAndPaperNumberAndUserId(record.getExamId(), record.getPaperNumber(), sysUser.getId());
|
|
|
- if (CollectionUtils.isNotEmpty(markUserClassList)) {
|
|
|
- classNames = markUserClassList.stream().map(MarkUserClass::getClassName).collect(Collectors.toList());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- List<MarkQuestion> markQuestionList = this.listSubjectiveQuestionByUserId(record.getExamId(), record.getPaperNumber(), sysUser.getId());
|
|
|
- List<Long> questionIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
|
|
|
-
|
|
|
- int taskCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), null, classNames, questionIds);
|
|
|
- record.setTaskCount(taskCount);
|
|
|
- int unMarkedCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), null, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.REJECTED, MarkTaskStatus.PROBLEM);
|
|
|
- record.setLeftCount(unMarkedCount);
|
|
|
- record.setMarkedCount(taskCount == 0 ? 0 : taskCount - unMarkedCount);
|
|
|
- // 评卷进度
|
|
|
- if (taskCount == 0) {
|
|
|
- record.setPercent(0D);
|
|
|
- } else {
|
|
|
- BigDecimal bigDecimal = new BigDecimal(record.getMarkedCount() * 100).divide(new BigDecimal(taskCount), 2, RoundingMode.HALF_UP);
|
|
|
- record.setPercent(bigDecimal.doubleValue());
|
|
|
- }
|
|
|
- // 分组题目
|
|
|
- record.setQuestionNumber(markQuestionList.stream().map(m -> m.getMainNumber() + "-" + m.getSubNumber()).collect(Collectors.joining(",")));
|
|
|
- }
|
|
|
-
|
|
|
- return markEntranceDtoIPage;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className) {
|
|
|
- return this.baseMapper.listGroupUserByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId, className);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId, String loginName, String className, Boolean marked, Integer pageNumber, Integer pageSize) {
|
|
|
- Page<MarkUserGroupProgressDto> page = new Page<>(pageNumber, pageSize);
|
|
|
- IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndQuestionId(page, examId, paperNumber, questionId, loginName, className, marked);
|
|
|
- for (MarkUserGroupProgressDto record : markUserGroupProgressDtoIPage.getRecords()) {
|
|
|
- MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
|
|
|
- record.setQuestionNumber(markQuestion.getQuestionNumber());
|
|
|
- List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, record.getQuestionId(), record.getUserId(), null);
|
|
|
- record.setResetting(lockService.isLocked(LockType.MARKER_RESET, record.getMarkUserQuestionId()));
|
|
|
- record.setMarkedCount(markTaskService.markedCount(markTaskList));
|
|
|
- record.setCurrentCount(markService.applyCurrentCount(markQuestion, record.getMarkUserQuestionId()));
|
|
|
- }
|
|
|
- return markUserGroupProgressDtoIPage;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void addMarkUserQuestion(MarkerAddParam markerAddParam) {
|
|
|
- if (CollectionUtils.isNotEmpty(markerAddParam.getUserIds())) {
|
|
|
- // 根据是否合并设置评卷员参数,做合并
|
|
|
- List<Long> questionIds = listMergeQuestionId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), markerAddParam.getQuestionId());
|
|
|
-
|
|
|
- List<MarkUserQuestion> markUserGroups = new ArrayList<>();
|
|
|
- for (Long userId : markerAddParam.getUserIds()) {
|
|
|
- for (Long questionId : questionIds) {
|
|
|
- MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndQuestionIdAndUserId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, userId);
|
|
|
- if (markUserGroup == null) {
|
|
|
- markUserGroups.add(new MarkUserQuestion(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, userId));
|
|
|
- } else if (!markUserGroup.getEnable()) {
|
|
|
- markUserGroup.setEnable(true);
|
|
|
- markUserGroups.add(markUserGroup);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (CollectionUtils.isNotEmpty(markUserGroups)) {
|
|
|
- this.saveOrUpdateBatch(markUserGroups);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private List<Long> listMergeQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
- MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
-
|
|
|
- MarkQuestion markQuestion = markQuestionService.getById(questionId);
|
|
|
- if (markQuestion == null) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("题目不存在");
|
|
|
- }
|
|
|
- List<Long> questionIds = new ArrayList<>();
|
|
|
- if (markQuestion.getQuestionType() == 4 && markPaper != null && markPaper.getMergeMarker() != null && markPaper.getMergeMarker()) {
|
|
|
- List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
|
|
|
- // 填空题,整个大题一起解绑
|
|
|
- return markQuestionList.stream().filter(m -> markQuestion.getMainNumber().equals(m.getMainNumber()) && m.getQuestionType() == 4).map(MarkQuestion::getId).collect(Collectors.toList());
|
|
|
- } else {
|
|
|
- questionIds.add(questionId);
|
|
|
- }
|
|
|
- return questionIds;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void setTopCount(List<Long> markUserQuestionIds, Integer topCount) {
|
|
|
- for (Long markUserQuestionId : markUserQuestionIds) {
|
|
|
- MarkUserQuestion markUserQuestion = this.getById(markUserQuestionId);
|
|
|
- if (markUserQuestion != null) {
|
|
|
- markUserQuestion.setTopCount(topCount);
|
|
|
- this.updateById(markUserQuestion);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public MarkUserQuestion getByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
|
|
|
- QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
- .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkUserQuestion::getQuestionId, questionId)
|
|
|
- .eq(MarkUserQuestion::getUserId, userId);
|
|
|
- return this.getOne(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void deleteMarker(MarkUserQuestion markUserQuestion) {
|
|
|
- // 先回收,再删除
|
|
|
- releaseMarker(Arrays.asList(markUserQuestion.getId()));
|
|
|
- // 逻辑解绑
|
|
|
- List<Long> ids = listMergeQuestionId(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(), markUserQuestion.getQuestionId());
|
|
|
- UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkUserQuestion::getEnable, false)
|
|
|
- .eq(MarkUserQuestion::getUserId, markUserQuestion.getUserId())
|
|
|
- .in(MarkUserQuestion::getQuestionId, ids);
|
|
|
- this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void releaseMarker(List<Long> markUserGroupIds) {
|
|
|
- for (Long markUserGroupId : markUserGroupIds) {
|
|
|
- MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
|
|
|
- if (markUserGroup != null) {
|
|
|
- try {
|
|
|
- lockService.waitlock(LockType.MARK_USER_QUESTION, markUserGroupId);
|
|
|
- markService.releaseByMarkUserGroup(markUserGroup);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("release marker error", e);
|
|
|
- } finally {
|
|
|
- lockService.unlock(LockType.MARK_USER_QUESTION, markUserGroupId);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean resetMarker(MarkUserQuestion markUserQuestion) {
|
|
|
- if (markUserQuestion != null) {
|
|
|
- if (lockService.trylock(LockType.MARKER_RESET, markUserQuestion.getId())) {
|
|
|
- markSyncService.markerResetSync(markUserQuestion);
|
|
|
- return true;
|
|
|
- } else {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("评卷员正在重置");
|
|
|
- }
|
|
|
- }
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void resetById(Long id) {
|
|
|
- UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkUserQuestion::getFinishCount, null)
|
|
|
- .set(MarkUserQuestion::getHeaderFinishCount, null)
|
|
|
- .set(MarkUserQuestion::getValidCount, null)
|
|
|
- .set(MarkUserQuestion::getAvgScore, null)
|
|
|
- .set(MarkUserQuestion::getAvgSpeed, null)
|
|
|
- .set(MarkUserQuestion::getStdevScore, null)
|
|
|
- .set(MarkUserQuestion::getMaxScore, null)
|
|
|
- .set(MarkUserQuestion::getMinScore, null)
|
|
|
- .eq(MarkUserQuestion::getId, id);
|
|
|
- this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<MarkQualityDto> pageQuality(Long examId, String paperNumber, Long questionId, String loginName, Integer pageNumber, Integer pageSize) {
|
|
|
- Page<MarkQualityDto> page = new Page<>(pageNumber, pageSize);
|
|
|
- IPage<MarkQualityDto> markQualityDtoIPage = this.baseMapper.pageQuality(page, examId, paperNumber, questionId, loginName);
|
|
|
- for (MarkQualityDto qualityDto : markQualityDtoIPage.getRecords()) {
|
|
|
- MarkQuestion markQuestion = markQuestionService.getById(qualityDto.getQuestionId());
|
|
|
- qualityDto.setQuestionNumber(markQuestion.getQuestionNumber());
|
|
|
- if (qualityDto.getUserId() != null) {
|
|
|
- SysUser sysUser = sysUserService.getByUserId(qualityDto.getUserId());
|
|
|
- qualityDto.setLoginName(sysUser.getLoginName());
|
|
|
- qualityDto.setName(sysUser.getRealName());
|
|
|
- qualityDto.setOrgName(sysUser.getOrgName());
|
|
|
- qualityDto.setAdoptionRate(Calculator.divide2String(Calculator.multiply(qualityDto.getValidCount(), 100), Double.valueOf(qualityDto.getFinishCount()), 2));
|
|
|
- qualityDto.setAvgScore(Calculator.round(qualityDto.getAvgScore(), 2));
|
|
|
- }
|
|
|
- }
|
|
|
- return markQualityDtoIPage;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void updateQuality(Long examId, String paperNumber, Long questionId) {
|
|
|
- if (questionId == null) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("请选择评阅题目");
|
|
|
- }
|
|
|
- MarkQuestion markQuestion = markQuestionService.getById(questionId);
|
|
|
- if (markQuestion != null) {
|
|
|
- String lockKey = markService.getGroupKey(markQuestion);
|
|
|
- if (lockService.trylock(LockType.BATCH_QUALITY, lockKey)) {
|
|
|
- markSyncService.updateQuality(this.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId), lockKey);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkUserQuestion> listByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
- QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
- .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkUserQuestion::getQuestionId, questionId)
|
|
|
- .orderByAsc(MarkUserQuestion::getId);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void updateQualityById(Long markUserGroupId, int finishCount, int headerFinishCount, int validCount, double avgSpeed, double avgScore, double stdevScore, double maxScore, double minScore) {
|
|
|
- UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkUserQuestion::getFinishCount, finishCount)
|
|
|
- .set(MarkUserQuestion::getHeaderFinishCount, headerFinishCount)
|
|
|
- .set(MarkUserQuestion::getValidCount, validCount)
|
|
|
- .set(MarkUserQuestion::getAvgSpeed, avgSpeed)
|
|
|
- .set(MarkUserQuestion::getAvgScore, avgScore)
|
|
|
- .set(MarkUserQuestion::getStdevScore, stdevScore)
|
|
|
- .set(MarkUserQuestion::getMaxScore, maxScore)
|
|
|
- .set(MarkUserQuestion::getMinScore, minScore)
|
|
|
- .eq(MarkUserQuestion::getId, markUserGroupId);
|
|
|
- this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Long questionId) {
|
|
|
- if (questionId == null) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("请选择对应的科目及题目,再查看给分曲线");
|
|
|
- }
|
|
|
- List<MarkQualityChartDto> markQualityChartDtoList = new ArrayList<>();
|
|
|
- List<MarkUserQuestion> markUserQuestionList = this.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
|
|
|
- Double totalAvgScore = markUserQuestionList.stream().filter(m -> m.getAvgScore() != null).collect(Collectors.averagingDouble(MarkUserQuestion::getAvgScore));
|
|
|
- for (MarkUserQuestion markUserQuestion : markUserQuestionList) {
|
|
|
- MarkQualityChartDto markQualityChartDto = new MarkQualityChartDto();
|
|
|
- markQualityChartDto.setUserId(markUserQuestion.getUserId());
|
|
|
- SysUser sysUser = sysUserService.getById(markUserQuestion.getUserId());
|
|
|
- markQualityChartDto.setLoginName(sysUser.getLoginName());
|
|
|
- markQualityChartDto.setName(sysUser.getRealName());
|
|
|
- markQualityChartDto.setTotalAvgScore(Calculator.round(totalAvgScore, 2));
|
|
|
- markQualityChartDto.setAvgScore(markUserQuestion.getAvgScore() == null ? null : Calculator.round(markUserQuestion.getAvgScore(), 2));
|
|
|
- markQualityChartDto.setMaxScore(markUserQuestion.getMaxScore() == null ? null : Calculator.round(markUserQuestion.getMaxScore(), 2));
|
|
|
- markQualityChartDto.setMinScore(markUserQuestion.getMinScore() == null ? null : Calculator.round(markUserQuestion.getMinScore(), 2));
|
|
|
- markQualityChartDtoList.add(markQualityChartDto);
|
|
|
- }
|
|
|
- return markQualityChartDtoList;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserIdAndEnableTure(Long examId, String paperNumber, Long userId) {
|
|
|
- QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
- .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkUserQuestion::getUserId, userId)
|
|
|
- .eq(MarkUserQuestion::getEnable, true);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
- UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
- LambdaUpdateWrapper<MarkUserQuestion> lambda = updateWrapper.lambda();
|
|
|
- lambda.eq(MarkUserQuestion::getExamId, examId)
|
|
|
- .eq(MarkUserQuestion::getPaperNumber, paperNumber);
|
|
|
- if (questionId != null) {
|
|
|
- lambda.eq(MarkUserQuestion::getQuestionId, questionId);
|
|
|
- }
|
|
|
- this.remove(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<String> listBindMarkers(Long examId, String paperNumber, Long questionId) {
|
|
|
- List<MarkUserQuestion> markUserQuestions = listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
|
|
|
- List<String> userIds = new ArrayList<>();
|
|
|
- if (CollectionUtils.isNotEmpty(markUserQuestions)) {
|
|
|
- userIds = markUserQuestions.stream().filter(m -> m.getEnable()).map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
|
|
|
- }
|
|
|
- return userIds;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByMarkTask(Long userId, MarkPaperStatus status) {
|
|
|
- return this.baseMapper.countByMarkTask(userId, status.name());
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
|
|
|
- this.baseMapper.updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, questionId, userId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void saveDefaultMarker(Long examId, String paperNumber, List<MarkQuestion> markQuestions) {
|
|
|
- List<SysUser> sysUserList = this.baseMapper.listDefaultMarkerByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
- List<MarkUserQuestion> markUserQuestions = new ArrayList<>();
|
|
|
- for (SysUser sysUser : sysUserList) {
|
|
|
- for (MarkQuestion markQuestion : markQuestions) {
|
|
|
- markUserQuestions.add(new MarkUserQuestion(examId, paperNumber, markQuestion.getId(), sysUser.getId()));
|
|
|
- }
|
|
|
- }
|
|
|
- this.saveBatch(markUserQuestions);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<String> countClassByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
- return this.baseMapper.countClassByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkQuestion> listSubjectiveQuestionByUserId(Long examId, String paperNumber, Long userId) {
|
|
|
- return this.baseMapper.listSubjectiveQuestionByUserId(examId, paperNumber, userId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndAndUserId(Long examId, String paperNumber, Long userId) {
|
|
|
- QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
- .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkUserQuestion::getUserId, userId);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-}
|
|
|
+package com.qmth.teachcloud.mark.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.qmth.teachcloud.common.bean.dto.MarkTaskSmsDto;
|
|
|
+import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
|
|
|
+import com.qmth.teachcloud.common.entity.MarkQuestion;
|
|
|
+import com.qmth.teachcloud.common.entity.SysUser;
|
|
|
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
|
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
|
|
|
+import com.qmth.teachcloud.common.service.SysUserService;
|
|
|
+import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
+import com.qmth.teachcloud.mark.bean.marker.MarkerAddParam;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.entrance.MarkEntranceDto;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityChartDto;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkQualityDto;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.manage.MarkUserGroupProgressDto;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkTask;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkUserClass;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkUserQuestion;
|
|
|
+import com.qmth.teachcloud.mark.enums.LockType;
|
|
|
+import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
|
|
|
+import com.qmth.teachcloud.mark.lock.LockService;
|
|
|
+import com.qmth.teachcloud.mark.mapper.MarkUserQuestionMapper;
|
|
|
+import com.qmth.teachcloud.mark.service.*;
|
|
|
+import com.qmth.teachcloud.mark.utils.Calculator;
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 评卷员表 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author xf
|
|
|
+ * @since 2023-09-22
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class MarkUserQuestionServiceImpl extends ServiceImpl<MarkUserQuestionMapper, MarkUserQuestion> implements MarkUserQuestionService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private MarkQuestionService markQuestionService;
|
|
|
+ @Resource
|
|
|
+ private MarkTaskService markTaskService;
|
|
|
+ @Resource
|
|
|
+ private MarkPaperService markPaperService;
|
|
|
+ @Resource
|
|
|
+ private MarkUserClassService markUserClassService;
|
|
|
+ @Resource
|
|
|
+ private MarkSyncService markSyncService;
|
|
|
+ @Resource
|
|
|
+ private SysUserService sysUserService;
|
|
|
+ @Resource
|
|
|
+ private MarkService markService;
|
|
|
+ @Resource
|
|
|
+ private LockService lockService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<MarkEntranceDto> listEntranceGroup(Long examId, Long openCollegeId, Long courseId, String paperNumber, Integer pageNumber, Integer pageSize) {
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ Page<MarkUserQuestion> page = new Page<>(pageNumber, pageSize);
|
|
|
+ IPage<MarkEntranceDto> markEntranceDtoIPage = this.baseMapper.listEntranceGroup(page, examId, openCollegeId, courseId, paperNumber, sysUser.getId(), MarkPaperStatus.FORMAL.name());
|
|
|
+ for (MarkEntranceDto record : markEntranceDtoIPage.getRecords()) {
|
|
|
+ MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(record.getExamId(), record.getPaperNumber());
|
|
|
+ // 分班阅
|
|
|
+ List<String> classNames = null;
|
|
|
+ if (markPaper != null && markPaper.getClassMark() != null && markPaper.getClassMark()) {
|
|
|
+ List<MarkUserClass> markUserClassList = markUserClassService.listByExamIdAndPaperNumberAndUserId(record.getExamId(), record.getPaperNumber(), sysUser.getId());
|
|
|
+ if (CollectionUtils.isNotEmpty(markUserClassList)) {
|
|
|
+ classNames = markUserClassList.stream().map(MarkUserClass::getClassName).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ List<MarkQuestion> markQuestionList = this.listSubjectiveQuestionByUserId(record.getExamId(), record.getPaperNumber(), sysUser.getId());
|
|
|
+ List<Long> questionIds = markQuestionList.stream().map(MarkQuestion::getId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ int taskCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), null, classNames, questionIds);
|
|
|
+ record.setTaskCount(taskCount);
|
|
|
+ int unMarkedCount = markTaskService.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(record.getExamId(), record.getPaperNumber(), null, classNames, questionIds, MarkTaskStatus.WAITING, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.REJECTED, MarkTaskStatus.PROBLEM);
|
|
|
+ record.setLeftCount(unMarkedCount);
|
|
|
+ record.setMarkedCount(taskCount == 0 ? 0 : taskCount - unMarkedCount);
|
|
|
+ // 评卷进度
|
|
|
+ if (taskCount == 0) {
|
|
|
+ record.setPercent(0D);
|
|
|
+ } else {
|
|
|
+ BigDecimal bigDecimal = new BigDecimal(record.getMarkedCount() * 100).divide(new BigDecimal(taskCount), 2, RoundingMode.HALF_UP);
|
|
|
+ record.setPercent(bigDecimal.doubleValue());
|
|
|
+ }
|
|
|
+ // 分组题目
|
|
|
+ record.setQuestionNumber(markQuestionList.stream().map(m -> m.getMainNumber() + "-" + m.getSubNumber()).collect(Collectors.joining(",")));
|
|
|
+ }
|
|
|
+
|
|
|
+ return markEntranceDtoIPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkUser> listGroupUserByExamIdAndPaperNumberAndQuestionIdAndClassName(Long examId, String paperNumber, Long questionId, String className) {
|
|
|
+ return this.baseMapper.listGroupUserByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId, className);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<MarkUserGroupProgressDto> pageGroupUserByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId, String loginName, String className, Boolean marked, Integer pageNumber, Integer pageSize) {
|
|
|
+ Page<MarkUserGroupProgressDto> page = new Page<>(pageNumber, pageSize);
|
|
|
+ IPage<MarkUserGroupProgressDto> markUserGroupProgressDtoIPage = this.baseMapper.pageGroupUserByExamIdAndPaperNumberAndQuestionId(page, examId, paperNumber, questionId, loginName, className, marked);
|
|
|
+ for (MarkUserGroupProgressDto record : markUserGroupProgressDtoIPage.getRecords()) {
|
|
|
+ MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
|
|
|
+ record.setQuestionNumber(markQuestion.getQuestionNumber());
|
|
|
+ List<MarkTask> markTaskList = markTaskService.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, record.getQuestionId(), record.getUserId(), null);
|
|
|
+ record.setResetting(lockService.isLocked(LockType.MARKER_RESET, record.getMarkUserQuestionId()));
|
|
|
+ record.setMarkedCount(markTaskService.markedCount(markTaskList));
|
|
|
+ record.setCurrentCount(markService.applyCurrentCount(markQuestion, record.getMarkUserQuestionId()));
|
|
|
+ }
|
|
|
+ return markUserGroupProgressDtoIPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void addMarkUserQuestion(MarkerAddParam markerAddParam) {
|
|
|
+ if (CollectionUtils.isNotEmpty(markerAddParam.getUserIds())) {
|
|
|
+ // 根据是否合并设置评卷员参数,做合并
|
|
|
+ List<Long> questionIds = listMergeQuestionId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), markerAddParam.getQuestionId());
|
|
|
+
|
|
|
+ List<MarkUserQuestion> markUserGroups = new ArrayList<>();
|
|
|
+ for (Long userId : markerAddParam.getUserIds()) {
|
|
|
+ for (Long questionId : questionIds) {
|
|
|
+ MarkUserQuestion markUserGroup = this.getByExamIdAndPaperNumberAndQuestionIdAndUserId(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, userId);
|
|
|
+ if (markUserGroup == null) {
|
|
|
+ markUserGroups.add(new MarkUserQuestion(markerAddParam.getExamId(), markerAddParam.getPaperNumber(), questionId, userId));
|
|
|
+ } else if (!markUserGroup.getEnable()) {
|
|
|
+ markUserGroup.setEnable(true);
|
|
|
+ markUserGroups.add(markUserGroup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(markUserGroups)) {
|
|
|
+ this.saveOrUpdateBatch(markUserGroups);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Long> listMergeQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
+ MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
+
|
|
|
+ MarkQuestion markQuestion = markQuestionService.getById(questionId);
|
|
|
+ if (markQuestion == null) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("题目不存在");
|
|
|
+ }
|
|
|
+ List<Long> questionIds = new ArrayList<>();
|
|
|
+ if (markQuestion.getQuestionType() == 4 && markPaper != null && markPaper.getMergeMarker() != null && markPaper.getMergeMarker()) {
|
|
|
+ List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, false);
|
|
|
+ // 填空题,整个大题一起解绑
|
|
|
+ return markQuestionList.stream().filter(m -> markQuestion.getMainNumber().equals(m.getMainNumber()) && m.getQuestionType() == 4).map(MarkQuestion::getId).collect(Collectors.toList());
|
|
|
+ } else {
|
|
|
+ questionIds.add(questionId);
|
|
|
+ }
|
|
|
+ return questionIds;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setTopCount(List<Long> markUserQuestionIds, Integer topCount) {
|
|
|
+ for (Long markUserQuestionId : markUserQuestionIds) {
|
|
|
+ MarkUserQuestion markUserQuestion = this.getById(markUserQuestionId);
|
|
|
+ if (markUserQuestion != null) {
|
|
|
+ markUserQuestion.setTopCount(topCount);
|
|
|
+ this.updateById(markUserQuestion);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public MarkUserQuestion getByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
|
|
|
+ QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
+ .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkUserQuestion::getQuestionId, questionId)
|
|
|
+ .eq(MarkUserQuestion::getUserId, userId);
|
|
|
+ return this.getOne(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteMarker(MarkUserQuestion markUserQuestion) {
|
|
|
+ // 先回收,再删除
|
|
|
+ releaseMarker(Arrays.asList(markUserQuestion.getId()));
|
|
|
+ // 逻辑解绑
|
|
|
+ List<Long> ids = listMergeQuestionId(markUserQuestion.getExamId(), markUserQuestion.getPaperNumber(), markUserQuestion.getQuestionId());
|
|
|
+ UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkUserQuestion::getEnable, false)
|
|
|
+ .eq(MarkUserQuestion::getUserId, markUserQuestion.getUserId())
|
|
|
+ .in(MarkUserQuestion::getQuestionId, ids);
|
|
|
+ this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void releaseMarker(List<Long> markUserGroupIds) {
|
|
|
+ for (Long markUserGroupId : markUserGroupIds) {
|
|
|
+ MarkUserQuestion markUserGroup = this.getById(markUserGroupId);
|
|
|
+ if (markUserGroup != null) {
|
|
|
+ try {
|
|
|
+ lockService.waitlock(LockType.MARK_USER_QUESTION, markUserGroupId);
|
|
|
+ markService.releaseByMarkUserGroup(markUserGroup);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("release marker error", e);
|
|
|
+ } finally {
|
|
|
+ lockService.unlock(LockType.MARK_USER_QUESTION, markUserGroupId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean resetMarker(MarkUserQuestion markUserQuestion) {
|
|
|
+ if (markUserQuestion != null) {
|
|
|
+ if (lockService.trylock(LockType.MARKER_RESET, markUserQuestion.getId())) {
|
|
|
+ markSyncService.markerResetSync(markUserQuestion);
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("评卷员正在重置");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void resetById(Long id) {
|
|
|
+ UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkUserQuestion::getFinishCount, null)
|
|
|
+ .set(MarkUserQuestion::getHeaderFinishCount, null)
|
|
|
+ .set(MarkUserQuestion::getValidCount, null)
|
|
|
+ .set(MarkUserQuestion::getAvgScore, null)
|
|
|
+ .set(MarkUserQuestion::getAvgSpeed, null)
|
|
|
+ .set(MarkUserQuestion::getStdevScore, null)
|
|
|
+ .set(MarkUserQuestion::getMaxScore, null)
|
|
|
+ .set(MarkUserQuestion::getMinScore, null)
|
|
|
+ .eq(MarkUserQuestion::getId, id);
|
|
|
+ this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<MarkQualityDto> pageQuality(Long examId, String paperNumber, Long questionId, String loginName, Integer pageNumber, Integer pageSize) {
|
|
|
+ Page<MarkQualityDto> page = new Page<>(pageNumber, pageSize);
|
|
|
+ IPage<MarkQualityDto> markQualityDtoIPage = this.baseMapper.pageQuality(page, examId, paperNumber, questionId, loginName);
|
|
|
+ for (MarkQualityDto qualityDto : markQualityDtoIPage.getRecords()) {
|
|
|
+ MarkQuestion markQuestion = markQuestionService.getById(qualityDto.getQuestionId());
|
|
|
+ qualityDto.setQuestionNumber(markQuestion.getQuestionNumber());
|
|
|
+ if (qualityDto.getUserId() != null) {
|
|
|
+ SysUser sysUser = sysUserService.getByUserId(qualityDto.getUserId());
|
|
|
+ qualityDto.setLoginName(sysUser.getLoginName());
|
|
|
+ qualityDto.setName(sysUser.getRealName());
|
|
|
+ qualityDto.setOrgName(sysUser.getOrgName());
|
|
|
+ qualityDto.setAdoptionRate(Calculator.divide2String(Calculator.multiply(qualityDto.getValidCount(), 100), Double.valueOf(qualityDto.getFinishCount()), 2));
|
|
|
+ qualityDto.setAvgScore(Calculator.round(qualityDto.getAvgScore(), 2));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return markQualityDtoIPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateQuality(Long examId, String paperNumber, Long questionId) {
|
|
|
+ if (questionId == null) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("请选择评阅题目");
|
|
|
+ }
|
|
|
+ MarkQuestion markQuestion = markQuestionService.getById(questionId);
|
|
|
+ if (markQuestion != null) {
|
|
|
+ String lockKey = markService.getGroupKey(markQuestion);
|
|
|
+ if (lockService.trylock(LockType.BATCH_QUALITY, lockKey)) {
|
|
|
+ markSyncService.updateQuality(this.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId), lockKey);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkUserQuestion> listByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
+ QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
+ .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkUserQuestion::getQuestionId, questionId)
|
|
|
+ .orderByAsc(MarkUserQuestion::getId);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateQualityById(Long markUserGroupId, int finishCount, int headerFinishCount, int validCount, double avgSpeed, double avgScore, double stdevScore, double maxScore, double minScore) {
|
|
|
+ UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkUserQuestion::getFinishCount, finishCount)
|
|
|
+ .set(MarkUserQuestion::getHeaderFinishCount, headerFinishCount)
|
|
|
+ .set(MarkUserQuestion::getValidCount, validCount)
|
|
|
+ .set(MarkUserQuestion::getAvgSpeed, avgSpeed)
|
|
|
+ .set(MarkUserQuestion::getAvgScore, avgScore)
|
|
|
+ .set(MarkUserQuestion::getStdevScore, stdevScore)
|
|
|
+ .set(MarkUserQuestion::getMaxScore, maxScore)
|
|
|
+ .set(MarkUserQuestion::getMinScore, minScore)
|
|
|
+ .eq(MarkUserQuestion::getId, markUserGroupId);
|
|
|
+ this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkQualityChartDto> listQualityChart(Long examId, String paperNumber, Long questionId) {
|
|
|
+ if (questionId == null) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("请选择对应的科目及题目,再查看给分曲线");
|
|
|
+ }
|
|
|
+ List<MarkQualityChartDto> markQualityChartDtoList = new ArrayList<>();
|
|
|
+ List<MarkUserQuestion> markUserQuestionList = this.listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
|
|
|
+ Double totalAvgScore = markUserQuestionList.stream().filter(m -> m.getAvgScore() != null).collect(Collectors.averagingDouble(MarkUserQuestion::getAvgScore));
|
|
|
+ for (MarkUserQuestion markUserQuestion : markUserQuestionList) {
|
|
|
+ MarkQualityChartDto markQualityChartDto = new MarkQualityChartDto();
|
|
|
+ markQualityChartDto.setUserId(markUserQuestion.getUserId());
|
|
|
+ SysUser sysUser = sysUserService.getById(markUserQuestion.getUserId());
|
|
|
+ markQualityChartDto.setLoginName(sysUser.getLoginName());
|
|
|
+ markQualityChartDto.setName(sysUser.getRealName());
|
|
|
+ markQualityChartDto.setTotalAvgScore(Calculator.round(totalAvgScore, 2));
|
|
|
+ markQualityChartDto.setAvgScore(markUserQuestion.getAvgScore() == null ? null : Calculator.round(markUserQuestion.getAvgScore(), 2));
|
|
|
+ markQualityChartDto.setMaxScore(markUserQuestion.getMaxScore() == null ? null : Calculator.round(markUserQuestion.getMaxScore(), 2));
|
|
|
+ markQualityChartDto.setMinScore(markUserQuestion.getMinScore() == null ? null : Calculator.round(markUserQuestion.getMinScore(), 2));
|
|
|
+ markQualityChartDtoList.add(markQualityChartDto);
|
|
|
+ }
|
|
|
+ return markQualityChartDtoList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkUserQuestion> listByExamIdAndPaperNumberAndUserIdAndEnableTure(Long examId, String paperNumber, Long userId) {
|
|
|
+ QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
+ .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkUserQuestion::getUserId, userId)
|
|
|
+ .eq(MarkUserQuestion::getEnable, true);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
+ UpdateWrapper<MarkUserQuestion> updateWrapper = new UpdateWrapper<>();
|
|
|
+ LambdaUpdateWrapper<MarkUserQuestion> lambda = updateWrapper.lambda();
|
|
|
+ lambda.eq(MarkUserQuestion::getExamId, examId)
|
|
|
+ .eq(MarkUserQuestion::getPaperNumber, paperNumber);
|
|
|
+ if (questionId != null) {
|
|
|
+ lambda.eq(MarkUserQuestion::getQuestionId, questionId);
|
|
|
+ }
|
|
|
+ this.remove(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<String> listBindMarkers(Long examId, String paperNumber, Long questionId) {
|
|
|
+ List<MarkUserQuestion> markUserQuestions = listByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
|
|
|
+ List<String> userIds = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(markUserQuestions)) {
|
|
|
+ userIds = markUserQuestions.stream().filter(m -> m.getEnable()).map(m -> String.valueOf(m.getUserId())).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ return userIds;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByMarkTask(Long userId, MarkPaperStatus status) {
|
|
|
+ return this.baseMapper.countByMarkTask(userId, status.name());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
|
|
|
+ this.baseMapper.updateRejectCountByExamIdAndPaperNumberAndQuestionIdAndUserId(examId, paperNumber, questionId, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveDefaultMarker(Long examId, String paperNumber, List<MarkQuestion> markQuestions) {
|
|
|
+ List<SysUser> sysUserList = this.baseMapper.listDefaultMarkerByExamIdAndPaperNumber(examId, paperNumber);
|
|
|
+ List<MarkUserQuestion> markUserQuestions = new ArrayList<>();
|
|
|
+ for (SysUser sysUser : sysUserList) {
|
|
|
+ for (MarkQuestion markQuestion : markQuestions) {
|
|
|
+ markUserQuestions.add(new MarkUserQuestion(examId, paperNumber, markQuestion.getId(), sysUser.getId()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.saveBatch(markUserQuestions);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<String> countClassByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
+ return this.baseMapper.countClassByExamIdAndPaperNumberAndQuestionId(examId, paperNumber, questionId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkQuestion> listSubjectiveQuestionByUserId(Long examId, String paperNumber, Long userId) {
|
|
|
+ return this.baseMapper.listSubjectiveQuestionByUserId(examId, paperNumber, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndAndUserId(Long examId, String paperNumber, Long userId) {
|
|
|
+ QueryWrapper<MarkUserQuestion> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkUserQuestion::getExamId, examId)
|
|
|
+ .eq(MarkUserQuestion::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkUserQuestion::getUserId, userId);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据考试id&课程id&试卷编码查询待发送阅卷待办任务
|
|
|
+ *
|
|
|
+ * @param examId
|
|
|
+ * @param courseId
|
|
|
+ * @param paperNumber
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<MarkTaskSmsDto> findMarkTaskSms(Long examId, Long courseId, String paperNumber) {
|
|
|
+ return this.baseMapper.findMarkTaskSms(examId, courseId, paperNumber);
|
|
|
+ }
|
|
|
+}
|