|
@@ -1,495 +1,513 @@
|
|
|
-package com.qmth.teachcloud.mark.service.impl;
|
|
|
-
|
|
|
-import com.alibaba.fastjson.JSON;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-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.DataPermissionRule;
|
|
|
-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.MarkProblemStatus;
|
|
|
-import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
|
|
|
-import com.qmth.teachcloud.common.util.ExcelUtil;
|
|
|
-import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
|
|
|
-import com.qmth.teachcloud.mark.dto.mark.manage.*;
|
|
|
-import com.qmth.teachcloud.mark.entity.MarkTask;
|
|
|
-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.MarkTaskMapper;
|
|
|
-import com.qmth.teachcloud.mark.params.MarkResultQuestion;
|
|
|
-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 javax.servlet.http.HttpServletResponse;
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.List;
|
|
|
-
|
|
|
-/**
|
|
|
- * <p>
|
|
|
- * 评卷任务表 服务实现类
|
|
|
- * </p>
|
|
|
- *
|
|
|
- * @author xf
|
|
|
- * @since 2023-09-22
|
|
|
- */
|
|
|
-@Service
|
|
|
-public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> implements MarkTaskService {
|
|
|
-
|
|
|
- @Resource
|
|
|
- private MarkQuestionService markQuestionService;
|
|
|
- @Resource
|
|
|
- private MarkProblemHistoryService markProblemHistoryService;
|
|
|
- @Resource
|
|
|
- private MarkService markService;
|
|
|
- @Resource
|
|
|
- private LockService lockService;
|
|
|
- @Resource
|
|
|
- private TaskService taskService;
|
|
|
- @Resource
|
|
|
- private BasicRoleDataPermissionService basicRoleDataPermissionService;
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<MarkManageDto> listPaperManage(Long examId, Long openCollegeId, Long courseId, String paperNumber, Boolean progressStatus, Integer pageNumber, Integer pageSize) {
|
|
|
- Page<MarkManageDto> page = new Page<>(pageNumber, pageSize);
|
|
|
- SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
- DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
|
|
|
- IPage<MarkManageDto> markManageDtoIPage = this.baseMapper.listPaperManage(page, examId, openCollegeId, courseId,
|
|
|
- paperNumber, progressStatus, dpr);
|
|
|
- for (MarkManageDto record : markManageDtoIPage.getRecords()) {
|
|
|
- record.setStatusDisplay(record.getStatus() == null ? null : record.getStatus().getName());
|
|
|
- MarkManageDto markManageDto = this.selectMarkedCountAndTotalCount(record.getExamId(), record.getPaperNumber());
|
|
|
- if (markManageDto != null) {
|
|
|
- record.setMarkedCount(markManageDto.getMarkedCount());
|
|
|
- record.setTotalCount(markManageDto.getTotalCount());
|
|
|
- record.setPercent(markManageDto.getTotalCount() != null && markManageDto.getTotalCount() != 0 ? Calculator.divide2String(Calculator.multiply(markManageDto.getMarkedCount(), 100), Double.valueOf(markManageDto.getTotalCount()), 2) : "0");
|
|
|
- } else {
|
|
|
- record.setMarkedCount(0);
|
|
|
- record.setTotalCount(0);
|
|
|
- record.setPercent("0");
|
|
|
- }
|
|
|
- // 问题卷数量
|
|
|
- record.setProblemCount(markProblemHistoryService.countByExamIdAndPaperNumberAndStatusAndClassNameIn(examId, record.getPaperNumber(), MarkProblemStatus.WAITING, null));
|
|
|
- // 正在评卷数量
|
|
|
- record.setCurrentCount(markQuestionService.countCurrentCountByExamIdAndPaperNumber(examId, record.getPaperNumber()));
|
|
|
- }
|
|
|
- return markManageDtoIPage;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void exportMarker(Long examId, Long courseId, String paperNumber, HttpServletResponse response) {
|
|
|
- SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
- DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
|
|
|
- List<MarkerInfoDto> markerInfoDtoList = this.baseMapper.listUserMarkedCount(examId, courseId, paperNumber, dpr);
|
|
|
- for (MarkerInfoDto markerInfoDto : markerInfoDtoList) {
|
|
|
- if (markerInfoDto.getQuestionId() != null) {
|
|
|
- MarkQuestion markQuestion = markQuestionService.getById(markerInfoDto.getQuestionId());
|
|
|
- markerInfoDto.setQuestionName(markQuestion.getMainTitle());
|
|
|
- markerInfoDto.setMainNumber(markQuestion.getMainNumber());
|
|
|
- markerInfoDto.setSubNumber(markQuestion.getSubNumber());
|
|
|
- markerInfoDto.setTotalScore(markQuestion.getTotalScore());
|
|
|
- }
|
|
|
- }
|
|
|
- try {
|
|
|
- ExcelUtil.excelExport("评卷员工作量", MarkerInfoDto.class, markerInfoDtoList, response);
|
|
|
- } catch (Exception e) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("导出评卷员工作量失败");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(Long examId, String paperNumber, Long questionId, Long userId, String className) {
|
|
|
- return this.baseMapper.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, questionId, userId, className);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Integer markedCount(List<MarkTask> markTask) {
|
|
|
- if (CollectionUtils.isEmpty(markTask)) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- long count = markTask.stream().filter(m -> m.getStatus().equals(MarkTaskStatus.MARKED) || m.getStatus().equals(MarkTaskStatus.ARBITRATED) || m.getStatus().equals(MarkTaskStatus.WAIT_ARBITRATE)).count();
|
|
|
- return (int) count;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- LambdaQueryWrapper<MarkTask> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
- lambdaQueryWrapper.eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId);
|
|
|
- if (userId != null) {
|
|
|
- lambdaQueryWrapper.eq(MarkTask::getUserId, userId);
|
|
|
- }
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndStatusNotIn(Long examId, String paperNumber, Long questionId, Long userId, List<MarkTaskStatus> statusList) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .eq(MarkTask::getUserId, userId)
|
|
|
- .notIn(MarkTask::getStatus, statusList);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean resetById(Long markTaskId, Long userId, String rejectReason, Long rejectId, Long date, MarkTaskStatus newStatus) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkTask::getStatus, newStatus)
|
|
|
- .set(MarkTask::getUserId, userId)
|
|
|
- .set(MarkTask::getMarkerTime, null)
|
|
|
- .set(MarkTask::getMarkerScore, null)
|
|
|
- .set(MarkTask::getMarkerTrackList, null)
|
|
|
- .set(MarkTask::getMarkerTagList, null)
|
|
|
- .set(MarkTask::getMarkerSpent, null)
|
|
|
- .set(MarkTask::getHeaderId, rejectId)
|
|
|
- .set(MarkTask::getHeaderTime, date)
|
|
|
- .set(MarkTask::getHeaderScore, null)
|
|
|
- .set(MarkTask::getHeaderTrackList, null)
|
|
|
- .set(MarkTask::getHeaderTagList, null)
|
|
|
- .set(MarkTask::getRejectReason, rejectReason)
|
|
|
- .eq(MarkTask::getId, markTaskId);
|
|
|
- return this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndQuestionIdAndStatusIn(Long examId, String paperNumber, Long questionId, List<MarkTaskStatus> statusList) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .in(MarkTask::getStatus, statusList);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndStatusIn(Long examId, String paperNumber, List<MarkTaskStatus> statusList) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .in(MarkTask::getStatus, statusList);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public MarkTask getLastOneByUserIdAndStatus(Long examId, String paperNumber, Long questionId, Long userId, MarkTaskStatus status) {
|
|
|
- return this.baseMapper.getLastOneByUserIdAndStatus(examId, paperNumber, questionId, userId, status.name());
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndStudentId(Long examId, String paperNumber, Long questionId, Long studentId) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .eq(MarkTask::getStudentId, studentId);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByStudentIdAndQuestionId(Long studentId, Long questionId) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getQuestionId, questionId);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void updateHeaderResult(Long examId, String paperNumber, Long questionId, Long studentId, Long updateUserId, Double markerScore, TrackDTO[] tracks, SpecialTagDTO[] specialTags, Long updateTime, MarkTaskStatus arbitrated) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkTask::getHeaderId, updateUserId)
|
|
|
- .set(MarkTask::getHeaderScore, markerScore)
|
|
|
- .set(MarkTask::getHeaderTrackList, JSON.toJSONString(tracks))
|
|
|
- .set(MarkTask::getHeaderTagList, JSON.toJSONString(specialTags))
|
|
|
- .set(MarkTask::getHeaderTime, updateTime)
|
|
|
- .set(MarkTask::getStatus, arbitrated)
|
|
|
- .eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .eq(MarkTask::getStudentId, studentId);
|
|
|
- this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void deleteByStudentId(Long studentId) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().eq(MarkTask::getStudentId, studentId);
|
|
|
- this.remove(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId);
|
|
|
- this.remove(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, List<String> className, MarkTaskStatus... status) {
|
|
|
- return this.baseMapper.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId, paperNumber, questionId, className, status);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, Long userId, List<String> className, List<Long> questionIds, MarkTaskStatus... status) {
|
|
|
- return this.baseMapper.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, className, questionIds, status, CollectionUtils.size(questionIds));
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<MarkTask> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore, MarkTaskStatus...statuses) {
|
|
|
- return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore, statuses);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId) {
|
|
|
- return this.baseMapper.findUnMarked(page, examId, paperNumber, userId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Long questionId, List<String> classNames) {
|
|
|
- return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, questionId, classNames);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> findAiUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long questionId) {
|
|
|
- return this.baseMapper.findAiUnMarked(page, examId, paperNumber, questionId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByIdAndStatus(Long studentId, MarkTaskStatus status) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getStatus, status);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByStatusAndIdIn(List<Long> ids, MarkTaskStatus... status) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().in(MarkTask::getId, ids)
|
|
|
- .in(MarkTask::getStatus, status)
|
|
|
- .isNull(MarkTask::getUserId);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .in(MarkTask::getStatus, Arrays.asList(status));
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean updateProblemResult(Long taskId, Long userId, Long now, int spent) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().eq(MarkTask::getId, taskId)
|
|
|
- .in(MarkTask::getStatus, Arrays.asList(MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED, MarkTaskStatus.MARKED, MarkTaskStatus.PROBLEM))
|
|
|
- .set(MarkTask::getStatus, MarkTaskStatus.PROBLEM)
|
|
|
- .set(MarkTask::getUserId, userId)
|
|
|
- .set(MarkTask::getMarkerScore, null)
|
|
|
- .set(MarkTask::getMarkerTrackList, null)
|
|
|
- .set(MarkTask::getMarkerTagList, null)
|
|
|
- .set(MarkTask::getHeaderTime, null)
|
|
|
- .set(MarkTask::getHeaderId, null)
|
|
|
- .set(MarkTask::getHeaderScore, null)
|
|
|
- .set(MarkTask::getHeaderTrackList, null)
|
|
|
- .set(MarkTask::getHeaderTagList, null)
|
|
|
- .set(MarkTask::getMarkerTime, now)
|
|
|
- .set(MarkTask::getMarkerSpent, spent);
|
|
|
- return this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean updateStatusByStudentIdAndQuestionId(Long studentId, Long questionId, MarkTaskStatus status) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .set(MarkTask::getStatus, status);
|
|
|
- return this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long examId, String paperNumber, Long questionId, Long userId, Long taskId) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .eq(MarkTask::getUserId, userId)
|
|
|
- .ne(MarkTask::getId, taskId);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean updateMarkerResult(Long taskId, MarkTaskStatus status, Long userId,
|
|
|
- MarkResultQuestion result, Long now, MarkTaskStatus... inStatus) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().eq(MarkTask::getId, taskId)
|
|
|
- .in(MarkTask::getStatus, Arrays.asList(inStatus))
|
|
|
- .set(MarkTask::getStatus, status)
|
|
|
- .set(MarkTask::getUserId, userId)
|
|
|
- .set(MarkTask::getMarkerScore, result.getMarkerScore())
|
|
|
- .set(MarkTask::getMarkerTrackList, JSON.toJSONString(result.getMarkerTrackList()))
|
|
|
- .set(MarkTask::getMarkerTagList, JSON.toJSONString(result.getMarkerTagList()))
|
|
|
- .set(MarkTask::getMarkerTime, now)
|
|
|
- .set(MarkTask::getMarkerSpent, result.getSpent())
|
|
|
- .set(MarkTask::getHeaderId, null)
|
|
|
- .set(MarkTask::getHeaderTime, null)
|
|
|
- .set(MarkTask::getRejectReason, null);
|
|
|
- return this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumberAndQuestionIdAndTaskNumber(Long examId, String paperNumber, Long questionId, int taskNumber) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .eq(MarkTask::getTaskNumber, taskNumber);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByStudentId(Long studentId) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public int countByExamIdAndPaperNumber(Long examId, String paperNumber) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
- .eq(MarkTask::getPaperNumber, paperNumber);
|
|
|
- return this.count(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize) {
|
|
|
- IPage<MarkTaskDto> markTaskDtoIPage = this.baseMapper.pageMarkTask(new Page<>(pageNumber, pageSize), examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore);
|
|
|
- for (MarkTaskDto record : markTaskDtoIPage.getRecords()) {
|
|
|
- record.setStatusDisplay(record.getStatus().getName());
|
|
|
- // 分组题目
|
|
|
- MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
|
|
|
- record.setQuestionNumber(markQuestion.getQuestionNumber());
|
|
|
- record.setQuestionScore(markQuestion.getTotalScore());
|
|
|
- }
|
|
|
- return markTaskDtoIPage;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void rejectMarkTask(Long id, String rejectReason) {
|
|
|
- SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
- MarkTask markTask = this.getById(id);
|
|
|
- if (markTask == null) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("任务不存在");
|
|
|
- }
|
|
|
- try {
|
|
|
- lockService.watch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
|
|
|
- lockService.watch(LockType.QUESTION, markTask.getQuestionId());
|
|
|
- lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
|
|
|
- if (!markTask.getStatus().equals(MarkTaskStatus.MARKED)) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("当前任务不允许打回");
|
|
|
- }
|
|
|
- markService.rejectMarkTask(markTask, sysUser.getId(), rejectReason);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("打回失败", e);
|
|
|
- } finally {
|
|
|
- lockService.unlock(LockType.STUDENT, markTask.getStudentId());
|
|
|
- lockService.unwatch(LockType.QUESTION, markTask.getQuestionId());
|
|
|
- lockService.unwatch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Task getMarkTrack(Long id) {
|
|
|
- SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
- MarkTask markTask = this.getById(id);
|
|
|
- if (markTask == null) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("任务不存在,请刷新列表");
|
|
|
- }
|
|
|
- if (!MarkTaskStatus.MARKED.equals(markTask.getStatus())) {
|
|
|
- throw ExceptionResultEnum.ERROR.exception("已评任务才允许打回");
|
|
|
- }
|
|
|
- Task dto = taskService.build(sysUser.getId(), Arrays.asList(markTask));
|
|
|
- return dto;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public MarkManageDto selectMarkedCountAndTotalCount(Long examId, String paperNumber) {
|
|
|
- return this.baseMapper.selectMarkedCountAndTotalCount(examId, paperNumber);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByStudentId(Long studentId) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .orderByAsc(MarkTask::getMainNumber)
|
|
|
- .orderByAsc(MarkTask::getSubNumber);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Long minQuestionIdByExamIdAndPaperNumber(Long examId, String paperNumber, MarkTaskStatus... statusList) {
|
|
|
- return this.baseMapper.minQuestionIdByExamIdAndPaperNumber(examId, paperNumber, statusList);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByStudentIdAndUserId(Long studentId, Long userId) {
|
|
|
- return baseMapper.listByStudentIdAndUserId(studentId, userId);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<MarkTask> listByStudentIdAndMarkerId(Long studentId, Long markerId, List<MarkTaskStatus> markTaskStatuses) {
|
|
|
- QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
- queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getUserId, markerId)
|
|
|
- .in(MarkTask::getStatus, markTaskStatuses)
|
|
|
- .orderByAsc(MarkTask::getMainNumber)
|
|
|
- .orderByAsc(MarkTask::getSubNumber);
|
|
|
- return this.list(queryWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void resetHeaderByStudentIdAndQuestionId(Long studentId, Long questionId) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkTask::getHeaderId, null)
|
|
|
- .set(MarkTask::getHeaderTime, null)
|
|
|
- .set(MarkTask::getHeaderScore, null)
|
|
|
- .set(MarkTask::getHeaderTrackList, null)
|
|
|
- .set(MarkTask::getHeaderTagList, null)
|
|
|
- .eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getQuestionId, questionId);
|
|
|
- this.update(updateWrapper);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void resetArbitrateStatusByStudentIdAndQuestionIdAndTaskNumber(Long studentId, Long questionId, Integer taskNumber) {
|
|
|
- UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
- updateWrapper.lambda().set(MarkTask::getStatus, MarkTaskStatus.MARKED)
|
|
|
- .set(MarkTask::getHeaderId, null)
|
|
|
- .set(MarkTask::getHeaderTime, null)
|
|
|
- .set(MarkTask::getHeaderScore, null)
|
|
|
- .set(MarkTask::getHeaderTrackList, null)
|
|
|
- .set(MarkTask::getHeaderTagList, null)
|
|
|
- .eq(MarkTask::getStudentId, studentId)
|
|
|
- .eq(MarkTask::getQuestionId, questionId)
|
|
|
- .ne(MarkTask::getTaskNumber, taskNumber)
|
|
|
- .in(MarkTask::getStatus, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.ARBITRATED);
|
|
|
- this.update(updateWrapper);
|
|
|
- }
|
|
|
-}
|
|
|
+package com.qmth.teachcloud.mark.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+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.DataPermissionRule;
|
|
|
+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.MarkProblemStatus;
|
|
|
+import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
|
|
|
+import com.qmth.teachcloud.common.util.ExcelUtil;
|
|
|
+import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.SpecialTagDTO;
|
|
|
+import com.qmth.teachcloud.mark.dto.mark.manage.*;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkTask;
|
|
|
+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.MarkTaskMapper;
|
|
|
+import com.qmth.teachcloud.mark.params.MarkResultQuestion;
|
|
|
+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 javax.servlet.http.HttpServletResponse;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 评卷任务表 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author xf
|
|
|
+ * @since 2023-09-22
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> implements MarkTaskService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private MarkQuestionService markQuestionService;
|
|
|
+ @Resource
|
|
|
+ private MarkProblemHistoryService markProblemHistoryService;
|
|
|
+ @Resource
|
|
|
+ private MarkService markService;
|
|
|
+ @Resource
|
|
|
+ private LockService lockService;
|
|
|
+ @Resource
|
|
|
+ private TaskService taskService;
|
|
|
+ @Resource
|
|
|
+ private BasicRoleDataPermissionService basicRoleDataPermissionService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<MarkManageDto> listPaperManage(Long examId, Long openCollegeId, Long courseId, String paperNumber, Boolean progressStatus, Integer pageNumber, Integer pageSize) {
|
|
|
+ Page<MarkManageDto> page = new Page<>(pageNumber, pageSize);
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
|
|
|
+ IPage<MarkManageDto> markManageDtoIPage = this.baseMapper.listPaperManage(page, examId, openCollegeId, courseId,
|
|
|
+ paperNumber, progressStatus, dpr);
|
|
|
+ for (MarkManageDto record : markManageDtoIPage.getRecords()) {
|
|
|
+ record.setStatusDisplay(record.getStatus() == null ? null : record.getStatus().getName());
|
|
|
+ MarkManageDto markManageDto = this.selectMarkedCountAndTotalCount(record.getExamId(), record.getPaperNumber());
|
|
|
+ if (markManageDto != null) {
|
|
|
+ record.setMarkedCount(markManageDto.getMarkedCount());
|
|
|
+ record.setTotalCount(markManageDto.getTotalCount());
|
|
|
+ record.setPercent(markManageDto.getTotalCount() != null && markManageDto.getTotalCount() != 0 ? Calculator.divide2String(Calculator.multiply(markManageDto.getMarkedCount(), 100), Double.valueOf(markManageDto.getTotalCount()), 2) : "0");
|
|
|
+ } else {
|
|
|
+ record.setMarkedCount(0);
|
|
|
+ record.setTotalCount(0);
|
|
|
+ record.setPercent("0");
|
|
|
+ }
|
|
|
+ // 问题卷数量
|
|
|
+ record.setProblemCount(markProblemHistoryService.countByExamIdAndPaperNumberAndStatusAndClassNameIn(examId, record.getPaperNumber(), MarkProblemStatus.WAITING, null));
|
|
|
+ // 正在评卷数量
|
|
|
+ record.setCurrentCount(markQuestionService.countCurrentCountByExamIdAndPaperNumber(examId, record.getPaperNumber()));
|
|
|
+ }
|
|
|
+ return markManageDtoIPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void exportMarker(Long examId, Long courseId, String paperNumber, HttpServletResponse response) {
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
|
|
|
+ List<MarkerInfoDto> markerInfoDtoList = this.baseMapper.listUserMarkedCount(examId, courseId, paperNumber, dpr);
|
|
|
+ for (MarkerInfoDto markerInfoDto : markerInfoDtoList) {
|
|
|
+ if (markerInfoDto.getQuestionId() != null) {
|
|
|
+ MarkQuestion markQuestion = markQuestionService.getById(markerInfoDto.getQuestionId());
|
|
|
+ markerInfoDto.setQuestionName(markQuestion.getMainTitle());
|
|
|
+ markerInfoDto.setMainNumber(markQuestion.getMainNumber());
|
|
|
+ markerInfoDto.setSubNumber(markQuestion.getSubNumber());
|
|
|
+ markerInfoDto.setTotalScore(markQuestion.getTotalScore());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ ExcelUtil.excelExport("评卷员工作量", MarkerInfoDto.class, markerInfoDtoList, response);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("导出评卷员工作量失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(Long examId, String paperNumber, Long questionId, Long userId, String className) {
|
|
|
+ return this.baseMapper.listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndClassName(examId, paperNumber, questionId, userId, className);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Integer markedCount(List<MarkTask> markTask) {
|
|
|
+ if (CollectionUtils.isEmpty(markTask)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ long count = markTask.stream().filter(m -> m.getStatus().equals(MarkTaskStatus.MARKED) || m.getStatus().equals(MarkTaskStatus.ARBITRATED) || m.getStatus().equals(MarkTaskStatus.WAIT_ARBITRATE)).count();
|
|
|
+ return (int) count;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndQuestionIdAndUserId(Long examId, String paperNumber, Long questionId, Long userId) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ LambdaQueryWrapper<MarkTask> lambdaQueryWrapper = queryWrapper.lambda();
|
|
|
+ lambdaQueryWrapper.eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId);
|
|
|
+ if (userId != null) {
|
|
|
+ lambdaQueryWrapper.eq(MarkTask::getUserId, userId);
|
|
|
+ }
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndUserIdAndStatusNotIn(Long examId, String paperNumber, Long questionId, Long userId, List<MarkTaskStatus> statusList) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .eq(MarkTask::getUserId, userId)
|
|
|
+ .notIn(MarkTask::getStatus, statusList);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean resetById(Long markTaskId, Long userId, String rejectReason, Long rejectId, Long date, MarkTaskStatus newStatus) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkTask::getStatus, newStatus)
|
|
|
+ .set(MarkTask::getUserId, userId)
|
|
|
+ .set(MarkTask::getMarkerTime, null)
|
|
|
+ .set(MarkTask::getMarkerScore, null)
|
|
|
+ .set(MarkTask::getMarkerTrackList, null)
|
|
|
+ .set(MarkTask::getMarkerTagList, null)
|
|
|
+ .set(MarkTask::getMarkerSpent, null)
|
|
|
+ .set(MarkTask::getHeaderId, rejectId)
|
|
|
+ .set(MarkTask::getHeaderTime, date)
|
|
|
+ .set(MarkTask::getHeaderScore, null)
|
|
|
+ .set(MarkTask::getHeaderTrackList, null)
|
|
|
+ .set(MarkTask::getHeaderTagList, null)
|
|
|
+ .set(MarkTask::getRejectReason, rejectReason)
|
|
|
+ .eq(MarkTask::getId, markTaskId);
|
|
|
+ return this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndQuestionIdAndStatusIn(Long examId, String paperNumber, Long questionId, List<MarkTaskStatus> statusList) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .in(MarkTask::getStatus, statusList);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndStatusIn(Long examId, String paperNumber, List<MarkTaskStatus> statusList) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .in(MarkTask::getStatus, statusList);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public MarkTask getLastOneByUserIdAndStatus(Long examId, String paperNumber, Long questionId, Long userId, MarkTaskStatus status) {
|
|
|
+ return this.baseMapper.getLastOneByUserIdAndStatus(examId, paperNumber, questionId, userId, status.name());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByExamIdAndPaperNumberAndQuestionIdAndStudentId(Long examId, String paperNumber, Long questionId, Long studentId) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .eq(MarkTask::getStudentId, studentId);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByStudentIdAndQuestionId(Long studentId, Long questionId) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateHeaderResult(Long examId, String paperNumber, Long questionId, Long studentId, Long updateUserId, Double markerScore, TrackDTO[] tracks, SpecialTagDTO[] specialTags, Long updateTime, MarkTaskStatus arbitrated) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkTask::getHeaderId, updateUserId)
|
|
|
+ .set(MarkTask::getHeaderScore, markerScore)
|
|
|
+ .set(MarkTask::getHeaderTrackList, JSON.toJSONString(tracks))
|
|
|
+ .set(MarkTask::getHeaderTagList, JSON.toJSONString(specialTags))
|
|
|
+ .set(MarkTask::getHeaderTime, updateTime)
|
|
|
+ .set(MarkTask::getStatus, arbitrated)
|
|
|
+ .eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .eq(MarkTask::getStudentId, studentId);
|
|
|
+ this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteByStudentId(Long studentId) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().eq(MarkTask::getStudentId, studentId);
|
|
|
+ this.remove(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteByExamIdAndPaperNumberAndQuestionId(Long examId, String paperNumber, Long questionId) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId);
|
|
|
+ this.remove(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(Long examId, String paperNumber, Long questionId, List<String> className, MarkTaskStatus... status) {
|
|
|
+ return this.baseMapper.countByExamIdAndPaperNumberAndQuestionIdAndAndClassNameStatusIn(examId, paperNumber, questionId, className, status);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(Long examId, String paperNumber, Long userId, List<String> className, List<Long> questionIds, MarkTaskStatus... status) {
|
|
|
+ return this.baseMapper.countByExamIdAndPaperNumberAndUserIdAndAndClassNameAndQuestionIdIn(examId, paperNumber, userId, className, questionIds, status, CollectionUtils.size(questionIds));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<MarkTask> listPageHistory(Page<Long> page, Long userId, Long examId, String paperNumber, String secretNumber, Double markerScore, MarkTaskStatus... statuses) {
|
|
|
+ return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, secretNumber, markerScore, statuses);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long userId) {
|
|
|
+ return this.baseMapper.findUnMarked(page, examId, paperNumber, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber, Long userId, Long questionId, List<String> classNames) {
|
|
|
+ return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, userId, questionId, classNames);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> findAiUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Long questionId) {
|
|
|
+ return this.baseMapper.findAiUnMarked(page, examId, paperNumber, questionId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByIdAndStatus(Long studentId, MarkTaskStatus status) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getStatus, status);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByStatusAndIdIn(List<Long> ids, MarkTaskStatus... status) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().in(MarkTask::getId, ids)
|
|
|
+ .in(MarkTask::getStatus, status)
|
|
|
+ .isNull(MarkTask::getUserId);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> findByStudentIdAndQuestionIdAndStatus(Long studentId, Long questionId, MarkTaskStatus... status) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .in(MarkTask::getStatus, Arrays.asList(status));
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean updateProblemResult(Long taskId, Long userId, Long now, int spent) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().eq(MarkTask::getId, taskId)
|
|
|
+ .in(MarkTask::getStatus, Arrays.asList(MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED, MarkTaskStatus.MARKED, MarkTaskStatus.PROBLEM))
|
|
|
+ .set(MarkTask::getStatus, MarkTaskStatus.PROBLEM)
|
|
|
+ .set(MarkTask::getUserId, userId)
|
|
|
+ .set(MarkTask::getMarkerScore, null)
|
|
|
+ .set(MarkTask::getMarkerTrackList, null)
|
|
|
+ .set(MarkTask::getMarkerTagList, null)
|
|
|
+ .set(MarkTask::getHeaderTime, null)
|
|
|
+ .set(MarkTask::getHeaderId, null)
|
|
|
+ .set(MarkTask::getHeaderScore, null)
|
|
|
+ .set(MarkTask::getHeaderTrackList, null)
|
|
|
+ .set(MarkTask::getHeaderTagList, null)
|
|
|
+ .set(MarkTask::getMarkerTime, now)
|
|
|
+ .set(MarkTask::getMarkerSpent, spent);
|
|
|
+ return this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean updateStatusByStudentIdAndQuestionId(Long studentId, Long questionId, MarkTaskStatus status) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .set(MarkTask::getStatus, status);
|
|
|
+ return this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long examId, String paperNumber, Long questionId, Long userId, Long taskId) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .eq(MarkTask::getUserId, userId)
|
|
|
+ .ne(MarkTask::getId, taskId);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean updateMarkerResult(Long taskId, MarkTaskStatus status, Long userId,
|
|
|
+ MarkResultQuestion result, Long now, MarkTaskStatus... inStatus) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().eq(MarkTask::getId, taskId)
|
|
|
+ .in(MarkTask::getStatus, Arrays.asList(inStatus))
|
|
|
+ .set(MarkTask::getStatus, status)
|
|
|
+ .set(MarkTask::getUserId, userId)
|
|
|
+ .set(MarkTask::getMarkerScore, result.getMarkerScore())
|
|
|
+ .set(MarkTask::getMarkerTrackList, JSON.toJSONString(result.getMarkerTrackList()))
|
|
|
+ .set(MarkTask::getMarkerTagList, JSON.toJSONString(result.getMarkerTagList()))
|
|
|
+ .set(MarkTask::getMarkerTime, now)
|
|
|
+ .set(MarkTask::getMarkerSpent, result.getSpent())
|
|
|
+ .set(MarkTask::getHeaderId, null)
|
|
|
+ .set(MarkTask::getHeaderTime, null)
|
|
|
+ .set(MarkTask::getRejectReason, null);
|
|
|
+ return this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumberAndQuestionIdAndTaskNumber(Long examId, String paperNumber, Long questionId, int taskNumber) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .eq(MarkTask::getTaskNumber, taskNumber);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByStudentId(Long studentId) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int countByExamIdAndPaperNumber(Long examId, String paperNumber) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getExamId, examId)
|
|
|
+ .eq(MarkTask::getPaperNumber, paperNumber);
|
|
|
+ return this.count(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<MarkTaskDto> pageMarkTask(Long examId, String paperNumber, Long questionId, String loginName, MarkTaskStatus status, String studentCode, String secretNumber, String teachClassName, Double subScore, Integer pageNumber, Integer pageSize) {
|
|
|
+ IPage<MarkTaskDto> markTaskDtoIPage = this.baseMapper.pageMarkTask(new Page<>(pageNumber, pageSize), examId, paperNumber, questionId, loginName, status, studentCode, secretNumber, teachClassName, subScore);
|
|
|
+ for (MarkTaskDto record : markTaskDtoIPage.getRecords()) {
|
|
|
+ record.setStatusDisplay(record.getStatus().getName());
|
|
|
+ // 分组题目
|
|
|
+ MarkQuestion markQuestion = markQuestionService.getById(record.getQuestionId());
|
|
|
+ record.setQuestionNumber(markQuestion.getQuestionNumber());
|
|
|
+ record.setQuestionScore(markQuestion.getTotalScore());
|
|
|
+ }
|
|
|
+ return markTaskDtoIPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void rejectMarkTask(Long id, String rejectReason) {
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ MarkTask markTask = this.getById(id);
|
|
|
+ if (markTask == null) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("任务不存在");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ lockService.watch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
|
|
|
+ lockService.watch(LockType.QUESTION, markTask.getQuestionId());
|
|
|
+ lockService.waitlock(LockType.STUDENT, markTask.getStudentId());
|
|
|
+ if (!markTask.getStatus().equals(MarkTaskStatus.MARKED)) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("当前任务不允许打回");
|
|
|
+ }
|
|
|
+ markService.rejectMarkTask(markTask, sysUser.getId(), rejectReason);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("打回失败", e);
|
|
|
+ } finally {
|
|
|
+ lockService.unlock(LockType.STUDENT, markTask.getStudentId());
|
|
|
+ lockService.unwatch(LockType.QUESTION, markTask.getQuestionId());
|
|
|
+ lockService.unwatch(LockType.EXAM_SUBJECT, markTask.getExamId(), markTask.getPaperNumber());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Task getMarkTrack(Long id) {
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ MarkTask markTask = this.getById(id);
|
|
|
+ if (markTask == null) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("任务不存在,请刷新列表");
|
|
|
+ }
|
|
|
+ if (!MarkTaskStatus.MARKED.equals(markTask.getStatus())) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("已评任务才允许打回");
|
|
|
+ }
|
|
|
+ Task dto = taskService.build(sysUser.getId(), Arrays.asList(markTask));
|
|
|
+ return dto;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public MarkManageDto selectMarkedCountAndTotalCount(Long examId, String paperNumber) {
|
|
|
+ return this.baseMapper.selectMarkedCountAndTotalCount(examId, paperNumber);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByStudentId(Long studentId) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .orderByAsc(MarkTask::getMainNumber)
|
|
|
+ .orderByAsc(MarkTask::getSubNumber);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Long minQuestionIdByExamIdAndPaperNumber(Long examId, String paperNumber, MarkTaskStatus... statusList) {
|
|
|
+ return this.baseMapper.minQuestionIdByExamIdAndPaperNumber(examId, paperNumber, statusList);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByStudentIdAndUserId(Long studentId, Long userId) {
|
|
|
+ return baseMapper.listByStudentIdAndUserId(studentId, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<MarkTask> listByStudentIdAndMarkerId(Long studentId, Long markerId, List<MarkTaskStatus> markTaskStatuses) {
|
|
|
+ QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getUserId, markerId)
|
|
|
+ .in(MarkTask::getStatus, markTaskStatuses)
|
|
|
+ .orderByAsc(MarkTask::getMainNumber)
|
|
|
+ .orderByAsc(MarkTask::getSubNumber);
|
|
|
+ return this.list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void resetHeaderByStudentIdAndQuestionId(Long studentId, Long questionId) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkTask::getHeaderId, null)
|
|
|
+ .set(MarkTask::getHeaderTime, null)
|
|
|
+ .set(MarkTask::getHeaderScore, null)
|
|
|
+ .set(MarkTask::getHeaderTrackList, null)
|
|
|
+ .set(MarkTask::getHeaderTagList, null)
|
|
|
+ .eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId);
|
|
|
+ this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void resetArbitrateStatusByStudentIdAndQuestionIdAndTaskNumber(Long studentId, Long questionId, Integer taskNumber) {
|
|
|
+ UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
|
|
|
+ updateWrapper.lambda().set(MarkTask::getStatus, MarkTaskStatus.MARKED)
|
|
|
+ .set(MarkTask::getHeaderId, null)
|
|
|
+ .set(MarkTask::getHeaderTime, null)
|
|
|
+ .set(MarkTask::getHeaderScore, null)
|
|
|
+ .set(MarkTask::getHeaderTrackList, null)
|
|
|
+ .set(MarkTask::getHeaderTagList, null)
|
|
|
+ .eq(MarkTask::getStudentId, studentId)
|
|
|
+ .eq(MarkTask::getQuestionId, questionId)
|
|
|
+ .ne(MarkTask::getTaskNumber, taskNumber)
|
|
|
+ .in(MarkTask::getStatus, MarkTaskStatus.WAIT_ARBITRATE, MarkTaskStatus.ARBITRATED);
|
|
|
+ this.update(updateWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * AI智能评卷导出
|
|
|
+ *
|
|
|
+ * @param semesterId
|
|
|
+ * @param examId
|
|
|
+ * @param courseId
|
|
|
+ * @param paperNumber
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void exportAiMark(Long semesterId, Long examId, Long courseId, String paperNumber) throws Exception {
|
|
|
+ HttpServletResponse response = ServletUtil.getResponse();
|
|
|
+ SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
|
|
|
+ List<MarkAiExport> markAiExportList = this.baseMapper.exportAiMark(semesterId, examId, courseId, paperNumber, dpr);
|
|
|
+ ExcelUtil.excelExport("AI智能评卷导出", MarkAiExport.class, markAiExportList, response);
|
|
|
+ }
|
|
|
+}
|