|
@@ -2,14 +2,20 @@ package cn.com.qmth.stmms.biz.mark.service.Impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.text.DecimalFormat;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.Iterator;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Map.Entry;
|
|
|
+import java.util.Set;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
-import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
|
|
|
-import cn.com.qmth.stmms.biz.user.model.User;
|
|
|
-import cn.com.qmth.stmms.biz.user.service.UserService;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -18,19 +24,68 @@ import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import cn.com.qmth.stmms.biz.exam.dao.*;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.*;
|
|
|
-import cn.com.qmth.stmms.biz.exam.service.*;
|
|
|
+import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
|
|
|
+import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
|
|
|
+import cn.com.qmth.stmms.biz.exam.dao.MarkGroupStudentDao;
|
|
|
+import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
|
|
|
+import cn.com.qmth.stmms.biz.exam.dao.SelectiveStudentDao;
|
|
|
+import cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.MarkGroupStudent;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.Marker;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.SelectiveStudent;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
|
|
|
import cn.com.qmth.stmms.biz.lock.LockService;
|
|
|
-import cn.com.qmth.stmms.biz.mark.dao.*;
|
|
|
-import cn.com.qmth.stmms.biz.mark.model.*;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.ArbitrateHistoryDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.HeaderTagDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.HeaderTrackDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.MarkSpecialTagDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.MarkTrackDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.ProblemHistoryDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.RejectHistoryDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.TrialLibraryDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.TrialTagDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.TrialTrackDao;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.HeaderTrack;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkResult;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkStepDTO;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.RejectHistory;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.SubmitResult;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
|
|
|
import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
|
|
|
import cn.com.qmth.stmms.biz.mark.service.MarkService;
|
|
|
import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
|
|
|
+import cn.com.qmth.stmms.biz.user.model.User;
|
|
|
+import cn.com.qmth.stmms.biz.user.service.UserService;
|
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
|
import cn.com.qmth.stmms.biz.utils.TaskLock;
|
|
|
import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
|
|
|
-import cn.com.qmth.stmms.common.enums.*;
|
|
|
+import cn.com.qmth.stmms.common.enums.ArbitrateType;
|
|
|
+import cn.com.qmth.stmms.common.enums.HistoryStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.MarkStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
|
|
|
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
|
|
|
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
|
|
|
+import cn.com.qmth.stmms.common.enums.TrialMode;
|
|
|
import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
|
|
|
|
|
|
/**
|
|
@@ -414,7 +469,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
public boolean hasApplied(TrialLibrary library, Marker marker) {
|
|
|
TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
|
|
|
if (TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
|
|
|
- return taskLock.exist(library.getId(), 1, marker.getId());
|
|
|
+ return taskLock.exist(library.getId(), 1, marker.getId());
|
|
|
} else {
|
|
|
return taskLock.exist(library.getStudentId(), 1, marker.getId());
|
|
|
}
|
|
@@ -439,7 +494,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
|
|
|
if (TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
|
|
|
taskLock.remove(result.getTrialLibrary().getId(), 1, marker.getId());
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
taskLock.remove(result.getTrialLibrary().getStudentId(), 1, marker.getId());
|
|
|
}
|
|
|
}
|
|
@@ -512,6 +567,89 @@ public class MarkServiceImpl implements MarkService {
|
|
|
markerService.deleteById(marker.getId());
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void backArbitrate(Integer historyId, Integer userId, String reason) {
|
|
|
+ ArbitrateHistory history = arbitrateDao.findOne(historyId);
|
|
|
+ List<Integer> questionIndexList = history.getQuestionIndexList();
|
|
|
+ List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
|
|
|
+ history.getExamId(), history.getSubjectCode(), false, history.getGroupNumber());
|
|
|
+ MarkGroup group = groupDao.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
|
|
|
+ Date now = new Date();
|
|
|
+ List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(history.getStudentId(),
|
|
|
+ history.getGroupNumber());
|
|
|
+ int count = 0;
|
|
|
+ for (MarkLibrary library : list) {
|
|
|
+ if (library.getTaskNumber() == 3) {
|
|
|
+ // 出现三评时删除第三条任务
|
|
|
+ problemHistoryDao.deleteByLibraryId(library.getId());
|
|
|
+ trackDao.deleteByLibraryId(library.getId());
|
|
|
+ specialTagDao.deleteByLibraryId(library.getId());
|
|
|
+ headerTagDao.deleteByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
|
|
|
+ headerTrackDao.deleteByPkStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
|
|
|
+ libraryDao.delete(library);
|
|
|
+ updateLibraryCount(group);
|
|
|
+ count++;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ RejectHistory rejectHistory = new RejectHistory(library);
|
|
|
+ rejectHistory.setUserId(userId);
|
|
|
+ rejectHistory.setReason(reason);
|
|
|
+
|
|
|
+ if (questionIndexList.isEmpty() || questionIndexList.size() == questions.size()) {
|
|
|
+ // 仲裁任务直接重置该分组下所有分数被打回也重置
|
|
|
+ markerService.updateRejectCountById(library.getMarkerId());
|
|
|
+ libraryDao.resetById(library.getId(), null, reason, userId, now, LibraryStatus.REJECTED,
|
|
|
+ LibraryStatus.MARKED, LibraryStatus.PROBLEM, LibraryStatus.INSPECTED, LibraryStatus.ARBITRATED,LibraryStatus.WAIT_ARBITRATE);
|
|
|
+ rejectHistoryDao.save(rejectHistory);
|
|
|
+ trackDao.deleteByLibraryId(library.getId());
|
|
|
+ specialTagDao.deleteByLibraryId(library.getId());
|
|
|
+ count++;
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ List<ScoreItem> sList = library.getMarkerScoreItem();
|
|
|
+ for (Integer questionIndex : questionIndexList) {
|
|
|
+ ExamQuestion question = questions.get(questionIndex-1);
|
|
|
+ trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
|
|
|
+ question.getMainNumber() + "." + question.getSubNumber());
|
|
|
+ scoreDao.updateRejected(library.getStudentId(), question.getMainNumber(), question.getSubNumber(),
|
|
|
+ true);
|
|
|
+ ScoreItem si = sList.get(questionIndex-1);
|
|
|
+ si.setScore(null);
|
|
|
+ }
|
|
|
+ List<Object> markerScoreList = new ArrayList<Object>();
|
|
|
+ for (int i = 0; i < sList.size(); i++) {
|
|
|
+ ScoreItem scoreItem = sList.get(i);
|
|
|
+ if (scoreItem.getScore() != null) {
|
|
|
+ markerScoreList.add(new DecimalFormat("####.###").format(scoreItem.getScore()));
|
|
|
+ } else {
|
|
|
+ markerScoreList.add("#");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(), null,
|
|
|
+ StringUtils.join(markerScoreList, ","), null, null, reason, userId, now, LibraryStatus.MARKED,
|
|
|
+ LibraryStatus.INSPECTED,LibraryStatus.ARBITRATED,LibraryStatus.WAIT_ARBITRATE) == 1) {
|
|
|
+ markerService.updateRejectCountById(library.getMarkerId());
|
|
|
+ rejectHistory.setRejectScoreList(StringUtils.join(markerScoreList, ","));
|
|
|
+ rejectHistoryDao.save(rejectHistory);
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (count > 0) {
|
|
|
+ updateMarkedCount(group);
|
|
|
+ resetStudentGroup(history.getStudentId(), history.getExamId(), history.getSubjectCode(),
|
|
|
+ history.getGroupNumber());
|
|
|
+ studentService.updateSubjectiveStatusAndTimeAndInspectorId(history.getStudentId(), SubjectiveStatus.UNMARK,
|
|
|
+ null, null);
|
|
|
+ inspectedService.cancelByStudent(history.getStudentId());
|
|
|
+ }
|
|
|
+ headerTagDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
|
|
|
+ headerTrackDao.deleteByPkStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
|
|
|
+ arbitrateDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 根据考生删除评卷任务
|
|
|
*
|
|
@@ -1123,11 +1261,12 @@ public class MarkServiceImpl implements MarkService {
|
|
|
Collections.reverse(partScoreList);
|
|
|
}
|
|
|
if (ScorePolicy.MIN_WITHOUT_ZERO.equals(policy)) {
|
|
|
- //已排序后,去除0分
|
|
|
+ // 已排序后,去除0分
|
|
|
while (partScoreList.size() > selectiveCount && partScoreList.get(0) == 0) {
|
|
|
partScoreList.remove(0);
|
|
|
}
|
|
|
- // partScoreList = partScoreList.stream().filter(s -> s.doubleValue() >
|
|
|
+ // partScoreList = partScoreList.stream().filter(s ->
|
|
|
+ // s.doubleValue() >
|
|
|
// 0).collect(Collectors.toList());
|
|
|
}
|
|
|
// 计算一个选做题分组得分
|
|
@@ -1564,24 +1703,25 @@ public class MarkServiceImpl implements MarkService {
|
|
|
MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
|
|
|
query.setPageNumber(1);
|
|
|
query.setPageSize(1);
|
|
|
- query.setSort(new Sort(Sort.Direction.DESC,"markerTime", "examNumber"));
|
|
|
+ query.setSort(new Sort(Sort.Direction.DESC, "markerTime", "examNumber"));
|
|
|
Set<LibraryStatus> statusSet = new HashSet<>();
|
|
|
statusSet.add(LibraryStatus.MARKED);
|
|
|
- List<MarkLibrary> list = libraryDao.findByMarkerIdAndStatus(marker.getId(),statusSet, query);
|
|
|
+ List<MarkLibrary> list = libraryDao.findByMarkerIdAndStatus(marker.getId(), statusSet, query);
|
|
|
|
|
|
MarkLibrarySearchQuery queryH = new MarkLibrarySearchQuery();
|
|
|
queryH.setPageNumber(1);
|
|
|
queryH.setPageSize(1);
|
|
|
- queryH.setSort(new Sort(Sort.Direction.DESC,"headerTime", "examNumber"));
|
|
|
+ queryH.setSort(new Sort(Sort.Direction.DESC, "headerTime", "examNumber"));
|
|
|
Set<LibraryStatus> statusSetH = new HashSet<>();
|
|
|
statusSetH.add(LibraryStatus.ARBITRATED);
|
|
|
- List<MarkLibrary> listH = libraryDao.findByMarkerIdAndStatus(marker.getId(),statusSetH, query);
|
|
|
+ List<MarkLibrary> listH = libraryDao.findByMarkerIdAndStatus(marker.getId(), statusSetH, query);
|
|
|
|
|
|
MarkLibrary library = list.isEmpty() ? null : list.get(0);
|
|
|
MarkLibrary libraryH = listH.isEmpty() ? null : listH.get(0);
|
|
|
if (library != null && library.getMarkerTime() != null) {
|
|
|
long lastMarkTime = library.getMarkerTime().getTime();
|
|
|
- if (libraryH != null && libraryH.getHeaderTime() != null && libraryH.getHeaderTime().getTime()>lastMarkTime) {
|
|
|
+ if (libraryH != null && libraryH.getHeaderTime() != null
|
|
|
+ && libraryH.getHeaderTime().getTime() > lastMarkTime) {
|
|
|
lastMarkTime = libraryH.getHeaderTime().getTime();
|
|
|
}
|
|
|
if (lastUpdateTime != null && lastUpdateTime > lastMarkTime) {
|