|
@@ -2,13 +2,7 @@ package cn.com.qmth.stmms.biz.mark.service.Impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.text.DecimalFormat;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Iterator;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.Map.Entry;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
@@ -20,64 +14,19 @@ 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.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.exam.dao.*;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.*;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.*;
|
|
|
import cn.com.qmth.stmms.biz.lock.LockService;
|
|
|
-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.dao.*;
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.*;
|
|
|
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.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.HistoryStatus;
|
|
|
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
|
|
|
-import cn.com.qmth.stmms.common.enums.LockType;
|
|
|
-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.*;
|
|
|
import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
|
|
|
|
|
|
/**
|
|
@@ -240,8 +189,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
return trialLibraryDao.countByMarkerId(marker.getId());
|
|
|
} else {
|
|
|
- return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED,
|
|
|
- LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED);
|
|
|
+ return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED,
|
|
|
+ LibraryStatus.INSPECTED);
|
|
|
}
|
|
|
}
|
|
|
return 0;
|
|
@@ -305,8 +254,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
|
// 小题数据
|
|
|
- questionService.resetByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(),
|
|
|
- group.getSubjectCode(), false, group.getNumber());
|
|
|
+ questionService.resetByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ false, group.getNumber());
|
|
|
// 考生分组状态与得分明细
|
|
|
groupStudentDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
@@ -345,12 +294,13 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third,
|
|
|
- boolean selective) {
|
|
|
+ public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy,
|
|
|
+ ArbitrateType arbitrateType, ThirdPolicy third, boolean selective) {
|
|
|
List<ExamQuestion> old = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
|
|
|
group.getSubjectCode(), false, group.getNumber());
|
|
|
for (ExamQuestion question : old) {
|
|
|
question.setGroupNumber(null);
|
|
|
+ question.setArbitrateThreshold(null);
|
|
|
questionService.saveAndFlush(question);
|
|
|
}
|
|
|
BigDecimal totalScore = BigDecimal.ZERO;
|
|
@@ -362,6 +312,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
totalScore.doubleValue());
|
|
|
groupDao.updateScorePolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), policy);
|
|
|
+ groupDao.updateArbitrateType(group.getExamId(), group.getSubjectCode(), group.getNumber(), arbitrateType);
|
|
|
groupDao.updateThirdPolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), third);
|
|
|
groupDao.updateSelective(group.getExamId(), group.getSubjectCode(), group.getNumber(), selective);
|
|
|
|
|
@@ -538,7 +489,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
updateMarkedCount(group);
|
|
|
releaseByMarker(marker);
|
|
|
-// inspectHistoryService.deleteByExamIdAndSubjectCode(marker.getExamId(), marker.getSubjectCode());
|
|
|
+ // inspectHistoryService.deleteByExamIdAndSubjectCode(marker.getExamId(),
|
|
|
+ // marker.getSubjectCode());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -703,8 +655,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
return false;
|
|
|
}
|
|
|
// 是否多评情况下已处理过该考生评卷任务
|
|
|
- if (libraryDao
|
|
|
- .countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(), library.getId()) > 0) {
|
|
|
+ if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(),
|
|
|
+ library.getId()) > 0) {
|
|
|
return false;
|
|
|
}
|
|
|
// 未选做
|
|
@@ -761,7 +713,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
// 其中一个有分另一个未选做 直接进入仲裁
|
|
|
if ((other.getMarkerScore() != UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE)
|
|
|
- || (other.getMarkerScore() == UN_SELECTIVE_SCORE && result.getMarkerScore() != UN_SELECTIVE_SCORE)) {
|
|
|
+ || (other.getMarkerScore() == UN_SELECTIVE_SCORE
|
|
|
+ && result.getMarkerScore() != UN_SELECTIVE_SCORE)) {
|
|
|
history = buildArbitrateHistory(library, now);
|
|
|
break;
|
|
|
}
|
|
@@ -769,12 +722,13 @@ public class MarkServiceImpl implements MarkService {
|
|
|
if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
|
|
|
// 开启三评
|
|
|
if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
|
|
|
- if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber()) == 2) {
|
|
|
+ if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(),
|
|
|
+ library.getGroupNumber()) == 2) {
|
|
|
buildThirdLibrary(library, group);
|
|
|
} else {
|
|
|
// 两两比较,触发仲裁
|
|
|
- List<MarkLibrary> libraries = libraryDao.findByStudentIdAndGroupNumber(
|
|
|
- library.getStudentId(), library.getGroupNumber());
|
|
|
+ List<MarkLibrary> libraries = libraryDao
|
|
|
+ .findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
|
|
|
history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
|
|
|
}
|
|
|
} else {
|
|
@@ -869,8 +823,9 @@ public class MarkServiceImpl implements MarkService {
|
|
|
history.setUserId(userId);
|
|
|
history.setReason(reason);
|
|
|
Date now = new Date();
|
|
|
- if (libraryDao.resetById(library.getId(), null, reason, userId, now, isRest ? LibraryStatus.WAITING
|
|
|
- : LibraryStatus.REJECTED, LibraryStatus.MARKED, LibraryStatus.PROBLEM, LibraryStatus.INSPECTED) > 0) {
|
|
|
+ if (libraryDao.resetById(library.getId(), null, reason, userId, now,
|
|
|
+ isRest ? LibraryStatus.WAITING : LibraryStatus.REJECTED, LibraryStatus.MARKED, LibraryStatus.PROBLEM,
|
|
|
+ LibraryStatus.INSPECTED) > 0) {
|
|
|
if (!isRest) {
|
|
|
markerService.updateRejectCountById(library.getMarkerId());
|
|
|
rejectHistoryDao.save(history);
|
|
@@ -1173,8 +1128,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 有非完成状态的评卷任务,直接返回
|
|
|
return false;
|
|
|
}
|
|
|
- double markerScore = library.getStatus() == LibraryStatus.ARBITRATED ? library.getHeaderScore() : library
|
|
|
- .getMarkerScore();
|
|
|
+ double markerScore = library.getStatus() == LibraryStatus.ARBITRATED ? library.getHeaderScore()
|
|
|
+ : library.getMarkerScore();
|
|
|
if (markerScore == UN_SELECTIVE_SCORE) {
|
|
|
selectiveAll = true;
|
|
|
}
|
|
@@ -1194,12 +1149,12 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
return -1;
|
|
|
});
|
|
|
- Double score1 = list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore() : list.get(0)
|
|
|
- .getMarkerScore();
|
|
|
- Double score2 = list.get(1).getHeaderScore() != null ? list.get(1).getHeaderScore() : list.get(1)
|
|
|
- .getMarkerScore();
|
|
|
- Double score3 = list.get(2).getHeaderScore() != null ? list.get(2).getHeaderScore() : list.get(2)
|
|
|
- .getMarkerScore();
|
|
|
+ Double score1 = list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore()
|
|
|
+ : list.get(0).getMarkerScore();
|
|
|
+ Double score2 = list.get(1).getHeaderScore() != null ? list.get(1).getHeaderScore()
|
|
|
+ : list.get(1).getMarkerScore();
|
|
|
+ Double score3 = list.get(2).getHeaderScore() != null ? list.get(2).getHeaderScore()
|
|
|
+ : list.get(2).getMarkerScore();
|
|
|
if ((score3 - score2) <= (score2 - score1)) {
|
|
|
list.remove(0);
|
|
|
} else {
|
|
@@ -1278,9 +1233,10 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Transactional
|
|
|
public void updateMarkedCount(MarkGroup group) {
|
|
|
if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
|
|
|
- groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), (int) libraryDao
|
|
|
- .countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED));
|
|
|
+ groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
+ (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(),
|
|
|
+ group.getSubjectCode(), group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED,
|
|
|
+ LibraryStatus.INSPECTED));
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
(int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
|
|
@@ -1334,7 +1290,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
private String getGroupKey(Marker marker) {
|
|
|
return marker.getExamId() + "_" + marker.getSubjectCode() + "_" + marker.getGroupNumber();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private String getGroupKey(MarkLibrary library) {
|
|
|
return library.getExamId() + "_" + library.getSubjectCode() + "_" + library.getGroupNumber();
|
|
|
}
|
|
@@ -1399,8 +1355,9 @@ public class MarkServiceImpl implements MarkService {
|
|
|
if (library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED) {
|
|
|
validCount++;
|
|
|
}
|
|
|
- double score = library.getMarkerScore() != null && library.getMarkerScore() != UN_SELECTIVE_SCORE ? library
|
|
|
- .getMarkerScore() : 0;
|
|
|
+ double score = library.getMarkerScore() != null && library.getMarkerScore() != UN_SELECTIVE_SCORE
|
|
|
+ ? library.getMarkerScore()
|
|
|
+ : 0;
|
|
|
int spent = library.getMarkerSpent() != null ? library.getMarkerSpent() : 0;
|
|
|
|
|
|
sumScore += score;
|
|
@@ -1690,8 +1647,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
|| library.getStatus().equals(LibraryStatus.INSPECTED)) {
|
|
|
List<ScoreItem> sList = library.getMarkerScoreItem();
|
|
|
for (MarkStepDTO markStepDTO : qList) {
|
|
|
- trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
|
|
|
- + markStepDTO.getSubNumber());
|
|
|
+ trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
|
|
|
+ markStepDTO.getMainNumber() + "." + markStepDTO.getSubNumber());
|
|
|
scoreDao.updateRejected(library.getStudentId(), markStepDTO.getMainNumber(),
|
|
|
markStepDTO.getSubNumber(), true);
|
|
|
for (int i = 0; i < questions.size(); i++) {
|
|
@@ -1807,8 +1764,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
Date now = new Date();
|
|
|
List<ScoreItem> sList = library.getMarkerScoreItem();
|
|
|
for (MarkStepDTO markStepDTO : questionList) {
|
|
|
- trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
|
|
|
- + markStepDTO.getSubNumber());
|
|
|
+ trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(),
|
|
|
+ markStepDTO.getMainNumber() + "." + markStepDTO.getSubNumber());
|
|
|
scoreDao.updateRejected(library.getStudentId(), markStepDTO.getMainNumber(), markStepDTO.getSubNumber(),
|
|
|
true);
|
|
|
for (int i = 0; i < questions.size(); i++) {
|
|
@@ -1871,10 +1828,10 @@ public class MarkServiceImpl implements MarkService {
|
|
|
reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void releaseByLibrary(MarkLibrary library) {
|
|
|
- TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(library));
|
|
|
- taskLock.remove(library.getStudentId(), library.getTaskNumber(),library.getMarkerId());
|
|
|
+ @Override
|
|
|
+ public void releaseByLibrary(MarkLibrary library) {
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(library));
|
|
|
+ taskLock.remove(library.getStudentId(), library.getTaskNumber(), library.getMarkerId());
|
|
|
taskLock.refresh(library.getMarkerId());
|
|
|
- }
|
|
|
+ }
|
|
|
}
|