|
@@ -1,30 +1,68 @@
|
|
|
package cn.com.qmth.stmms.biz.mark.service.Impl;
|
|
|
|
|
|
-import cn.com.qmth.stmms.biz.exam.dao.*;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+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.ExamQuestionDao;
|
|
|
+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.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.ExamSubject;
|
|
|
+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.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.mark.dao.*;
|
|
|
-import cn.com.qmth.stmms.biz.mark.model.*;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.ArbitrateHistoryDao;
|
|
|
+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.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.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.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.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.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.utils.BigDecimalUtils;
|
|
|
-import org.apache.commons.lang.StringUtils;
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.data.domain.Sort;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
-
|
|
|
-import java.util.*;
|
|
|
-import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
/**
|
|
|
* 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
|
|
@@ -36,6 +74,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
|
|
|
protected static final Logger log = LoggerFactory.getLogger(MarkServiceImpl.class);
|
|
|
|
|
|
+ public static final int UN_SELECTIVE_SCORE = -1;
|
|
|
+
|
|
|
@Autowired
|
|
|
private ExamStudentService studentService;
|
|
|
|
|
@@ -72,9 +112,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Autowired
|
|
|
private TrialLibraryDao trialLibraryDao;
|
|
|
|
|
|
- @Autowired
|
|
|
- private TrialHistoryDao trialHistoryDao;
|
|
|
-
|
|
|
@Autowired
|
|
|
private TrialTrackDao trialTrackDao;
|
|
|
|
|
@@ -90,6 +127,9 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Autowired
|
|
|
private ExamQuestionService questionService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private SelectiveGroupService selectiveGroupService;
|
|
|
+
|
|
|
private Map<Integer, Long> markerLastUpdateTime = new ConcurrentHashMap<>();
|
|
|
|
|
|
/**
|
|
@@ -152,7 +192,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
if (group != null) {
|
|
|
if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
- return trialHistoryDao.countByMarkerId(marker.getId());
|
|
|
+ return trialLibraryDao.countByMarkerId(marker.getId());
|
|
|
} else {
|
|
|
return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED,
|
|
|
LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED);
|
|
@@ -203,8 +243,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
|
trialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
- trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
trialLibraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
|
// 正评相关数据
|
|
@@ -257,7 +295,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third) {
|
|
|
+ public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third,
|
|
|
+ boolean selective) {
|
|
|
List<ExamQuestion> old = questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(),
|
|
|
group.getSubjectCode(), false, group.getNumber());
|
|
|
for (ExamQuestion question : old) {
|
|
@@ -273,6 +312,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(), totalScore);
|
|
|
groupDao.updateScorePolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), policy);
|
|
|
groupDao.updateThirdPolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), third);
|
|
|
+ groupDao.updateSelective(group.getExamId(), group.getSubjectCode(), group.getNumber(), selective);
|
|
|
+
|
|
|
subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
|
|
|
sumTotalScore(group.getExamId(), group.getSubjectCode()));
|
|
|
resetGroup(group);
|
|
@@ -451,7 +492,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
trialTagDao.deleteByMarkerId(marker.getId());
|
|
|
trialTrackDao.deleteByMarkerId(marker.getId());
|
|
|
- trialHistoryDao.deleteByMarkerId(marker.getId());
|
|
|
+ trialLibraryDao.resetByMarkerId(marker.getId());
|
|
|
}
|
|
|
updateMarkedCount(group);
|
|
|
releaseByMarker(marker);
|
|
@@ -475,7 +516,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 试评相关数据
|
|
|
trialTrackDao.deleteByStudentId(student.getId());
|
|
|
trialTagDao.deleteByStudentId(student.getId());
|
|
|
- trialHistoryDao.deleteByStudentId(student.getId());
|
|
|
trialLibraryDao.deleteByStudentId(student.getId());
|
|
|
// 主观状态与得分明细
|
|
|
groupStudentDao.deleteByStudentId(student.getId());
|
|
@@ -502,12 +542,13 @@ public class MarkServiceImpl implements MarkService {
|
|
|
return SubmitResult.faile();
|
|
|
}
|
|
|
|
|
|
+ Date now = new Date();
|
|
|
// 根据评卷状态选择读取不同的评卷任务
|
|
|
if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
MarkLibrary library = libraryDao.findOne(result.getLibraryId());
|
|
|
+ // 问题卷
|
|
|
if (library != null && result.isProblem()) {
|
|
|
// 状态更新
|
|
|
- Date now = new Date();
|
|
|
if (libraryDao.updateProblemResult(library.getId(), LibraryStatus.PROBLEM, marker.getId(), now,
|
|
|
result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED,
|
|
|
LibraryStatus.REJECTED) != 0) {
|
|
@@ -524,8 +565,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
if (library != null && library.getExamId().equals(group.getExamId())
|
|
|
&& library.getSubjectCode().equals(group.getSubjectCode())
|
|
|
&& library.getGroupNumber().equals(group.getNumber())
|
|
|
- && result.getMarkerScore() <= group.getTotalScore()
|
|
|
- && StringUtils.isNotBlank(result.getScoreList())) {
|
|
|
+ && result.getMarkerScore() <= group.getTotalScore()) {
|
|
|
if (submitLibrary(library, marker, group, result)) {
|
|
|
updateMarkedCount(group);
|
|
|
return SubmitResult.success(library);
|
|
@@ -533,36 +573,27 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
TrialLibrary library = trialLibraryDao.findOne(result.getLibraryId());
|
|
|
- if (library != null && library.getExamId().equals(group.getExamId())
|
|
|
+ if (library != null && hasApplied(library, marker) && library.getExamId().equals(group.getExamId())
|
|
|
&& library.getSubjectCode().equals(group.getSubjectCode())
|
|
|
&& library.getGroupNumber().equals(group.getNumber())
|
|
|
&& result.getMarkerScore() <= group.getTotalScore()
|
|
|
&& StringUtils.isNotBlank(result.getScoreList())) {
|
|
|
- TrialHistory history = new TrialHistory();
|
|
|
- history.setExamId(library.getExamId());
|
|
|
- history.setSubjectCode(library.getSubjectCode());
|
|
|
- history.setGroupNumber(library.getGroupNumber());
|
|
|
- history.setLibraryId(library.getId());
|
|
|
- history.setStudentId(library.getStudentId());
|
|
|
- history.setMarkerId(marker.getId());
|
|
|
- history.setMarkerTime(new Date());
|
|
|
- history.setMarkerScore(result.getMarkerScore());
|
|
|
- history.setMarkerScoreList(result.getScoreList());
|
|
|
- history.setSecretNumber(library.getSecretNumber());
|
|
|
- history = trialHistoryDao.save(history);
|
|
|
- if (history != null) {
|
|
|
- if (result.getTrackList() != null) {
|
|
|
- trialTrackDao.deleteByLibraryIdAndMarkerId(history.getLibraryId(), history.getMarkerId());
|
|
|
- trialTrackDao.save(result.getTrackList(history));
|
|
|
- }
|
|
|
- if (result.getSpecialTagList() != null) {
|
|
|
- trialTagDao.deleteByLibraryIdAndMarkerId(history.getLibraryId(), history.getMarkerId());
|
|
|
- trialTagDao.save(result.getTagList(history));
|
|
|
- }
|
|
|
- updateMarkedCount(group);
|
|
|
- // releaseLibrary(library, marker);
|
|
|
- return SubmitResult.success(library);
|
|
|
+ library.setMarkerId(marker.getId());
|
|
|
+ library.setMarkerTime(new Date());
|
|
|
+ library.setMarkerScore(result.getMarkerScore());
|
|
|
+ library.setMarkerScoreList(result.getScoreList());
|
|
|
+ library = trialLibraryDao.save(library);
|
|
|
+ if (result.getTrackList() != null) {
|
|
|
+ trialTrackDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
|
|
|
+ trialTrackDao.save(result.getTrackList(library));
|
|
|
+ }
|
|
|
+ if (result.getSpecialTagList() != null) {
|
|
|
+ trialTagDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
|
|
|
+ trialTagDao.save(result.getTagList(library));
|
|
|
}
|
|
|
+ checkStudentTrial(library, group);
|
|
|
+ updateMarkedCount(group);
|
|
|
+ return SubmitResult.success(library);
|
|
|
}
|
|
|
}
|
|
|
return SubmitResult.faile();
|
|
@@ -614,6 +645,11 @@ public class MarkServiceImpl implements MarkService {
|
|
|
.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), marker.getId(), library.getId()) > 0) {
|
|
|
return false;
|
|
|
}
|
|
|
+ // 未选做
|
|
|
+ if (result.isUnselective()) {
|
|
|
+ result.setMarkerScore(UN_SELECTIVE_SCORE);
|
|
|
+ result.setScoreList(null);
|
|
|
+ }
|
|
|
// 尝试提交评卷结果
|
|
|
Date now = new Date();
|
|
|
if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
|
|
@@ -623,7 +659,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
return false;
|
|
|
}
|
|
|
// 保存阅卷轨迹
|
|
|
- if (result.getTrackList() != null) {
|
|
|
+ if (result.getTrackList() != null && !result.isUnselective()) {
|
|
|
trackDao.deleteByLibraryId(library.getId());
|
|
|
List<MarkTrack> tracks = result.getTrackList(library, marker);
|
|
|
for (MarkTrack markTrack : tracks) {
|
|
@@ -631,7 +667,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
}
|
|
|
// 保存特殊标记
|
|
|
- if (result.getSpecialTagList() != null) {
|
|
|
+ if (result.getSpecialTagList() != null && !result.isUnselective()) {
|
|
|
specialTagDao.deleteByLibraryId(library.getId());
|
|
|
specialTagDao.save(result.getSpecialTagList(library, marker));
|
|
|
}
|
|
@@ -642,11 +678,21 @@ public class MarkServiceImpl implements MarkService {
|
|
|
List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
|
|
|
library.getGroupNumber(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
|
|
|
for (MarkLibrary other : list) {
|
|
|
+ // 本评卷任务或组长已打分,则跳过该任务
|
|
|
if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
|
|
|
- // 本评卷任务或组长已打分,则跳过该任务
|
|
|
continue;
|
|
|
}
|
|
|
- // 分差超过阀值,
|
|
|
+ // 均为未选做,跳过该任务
|
|
|
+ if (other.getMarkerScore() == UN_SELECTIVE_SCORE && result.getMarkerScore() == UN_SELECTIVE_SCORE) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 其中一个有分另一个未选做 直接进入仲裁
|
|
|
+ if ((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;
|
|
|
+ }
|
|
|
+ // 分差超过阀值
|
|
|
if (Math.abs(other.getMarkerScore() - result.getMarkerScore()) > group.getArbitrateThreshold()) {
|
|
|
// 开启三评
|
|
|
if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
|
|
@@ -782,7 +828,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Transactional
|
|
|
public boolean resetLibrary(TrialLibrary library) {
|
|
|
if (library != null) {
|
|
|
- trialHistoryDao.deleteByLibraryId(library.getId());
|
|
|
+ trialLibraryDao.resetById(library.getId());
|
|
|
trialTrackDao.deleteByLibraryId(library.getId());
|
|
|
trialTagDao.deleteByLibraryId(library.getId());
|
|
|
return true;
|
|
@@ -847,23 +893,23 @@ public class MarkServiceImpl implements MarkService {
|
|
|
|
|
|
private void scoreCalculate(Integer studentId) {
|
|
|
List<ScoreItem> scoreList = new ArrayList<>();
|
|
|
- Map<Integer, List<SubjectiveScore>> map = new HashMap<Integer, List<SubjectiveScore>>();
|
|
|
- double totalScore = 0.0;
|
|
|
+ Map<Integer, List<SubjectiveScore>> mainScoreMap = new HashMap<Integer, List<SubjectiveScore>>();
|
|
|
+ Map<Integer, Double> scoreMap = new HashMap<Integer, Double>();
|
|
|
+
|
|
|
// 循环所有主观得分明细
|
|
|
List<SubjectiveScore> list = scoreDao.findByStudentId(studentId);
|
|
|
for (SubjectiveScore ss : list) {
|
|
|
- totalScore = BigDecimalUtils.add(totalScore, ss.getScore());
|
|
|
- scoreList.add(new ScoreItem(ss));
|
|
|
- List<SubjectiveScore> mainScoreList = map.get(ss.getMainNumber());
|
|
|
+ List<SubjectiveScore> mainScoreList = mainScoreMap.get(ss.getMainNumber());
|
|
|
if (mainScoreList == null) {
|
|
|
mainScoreList = new ArrayList<SubjectiveScore>();
|
|
|
}
|
|
|
mainScoreList.add(ss);
|
|
|
- map.put(ss.getMainNumber(), mainScoreList);
|
|
|
+ mainScoreMap.put(ss.getMainNumber(), mainScoreList);
|
|
|
+ scoreList.add(new ScoreItem(ss));
|
|
|
}
|
|
|
// 计算大题分
|
|
|
- for (Integer mainNumber : map.keySet()) {
|
|
|
- List<SubjectiveScore> mainScoreList = map.get(mainNumber);
|
|
|
+ for (Integer mainNumber : mainScoreMap.keySet()) {
|
|
|
+ List<SubjectiveScore> mainScoreList = mainScoreMap.get(mainNumber);
|
|
|
double mainScore = 0.0;
|
|
|
for (SubjectiveScore subjectiveScore : mainScoreList) {
|
|
|
mainScore = BigDecimalUtils.add(mainScore, subjectiveScore.getScore());
|
|
@@ -872,6 +918,34 @@ public class MarkServiceImpl implements MarkService {
|
|
|
subjectiveScore.setMainScore(mainScore);
|
|
|
scoreDao.saveAndFlush(subjectiveScore);
|
|
|
}
|
|
|
+ scoreMap.put(mainNumber, mainScore);
|
|
|
+ }
|
|
|
+ // 计算选做题分数
|
|
|
+ ExamStudent student = studentService.findById(studentId);
|
|
|
+ List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(student.getExamId(),
|
|
|
+ student.getSubjectCode());
|
|
|
+
|
|
|
+ List<Double> selectiveList = new ArrayList<Double>();
|
|
|
+ Integer selectiveCount = 0;
|
|
|
+ for (SelectiveGroup selectiveGroup : selectiveGroups) {
|
|
|
+ double mainScore = scoreMap.get(selectiveGroup.getMainNumber());
|
|
|
+ scoreMap.remove(selectiveGroup.getMainNumber());
|
|
|
+ selectiveList.add(mainScore);
|
|
|
+ if (selectiveCount == 0) {
|
|
|
+ selectiveCount = selectiveGroup.getSelectiveCount();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Collections.sort(selectiveList);
|
|
|
+ Collections.reverse(selectiveList);
|
|
|
+ // 计算总分
|
|
|
+ double totalScore = 0.0;
|
|
|
+ for (Integer mainNumber : scoreMap.keySet()) {
|
|
|
+ totalScore = BigDecimalUtils.add(totalScore, scoreMap.get(mainNumber));
|
|
|
+ }
|
|
|
+ for (int i = 0; i < selectiveList.size(); i++) {
|
|
|
+ if (i < selectiveCount) {
|
|
|
+ totalScore = BigDecimalUtils.add(totalScore, selectiveList.get(i));
|
|
|
+ }
|
|
|
}
|
|
|
// 全部评完,更新考生主观题得分
|
|
|
studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore,
|
|
@@ -888,12 +962,22 @@ public class MarkServiceImpl implements MarkService {
|
|
|
if (list.isEmpty()) {
|
|
|
return false;
|
|
|
}
|
|
|
+ boolean selectiveAll = false;
|
|
|
for (MarkLibrary library : list) {
|
|
|
if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED
|
|
|
&& library.getStatus() != LibraryStatus.INSPECTED) {
|
|
|
// 有非完成状态的评卷任务,直接返回
|
|
|
return false;
|
|
|
}
|
|
|
+ double markerScore = library.getStatus() == LibraryStatus.ARBITRATED ? library.getHeaderScore() : library
|
|
|
+ .getMarkerScore();
|
|
|
+ if (markerScore == UN_SELECTIVE_SCORE) {
|
|
|
+ selectiveAll = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (selectiveAll) {
|
|
|
+ group.setMarkScore(UN_SELECTIVE_SCORE);
|
|
|
+ return true;
|
|
|
}
|
|
|
// 开启三评
|
|
|
if (ThirdPolicy.LOW_DIFF_HIGH_AVG.equals(group.getThirdPolicy()) && list.size() == 3) {
|
|
@@ -921,7 +1005,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
for (MarkLibrary library : list) {
|
|
|
count++;
|
|
|
- Double current = (library.getHeaderScore() != null ? library.getHeaderScore() : library.getMarkerScore());
|
|
|
+ Double current = library.getHeaderScore() != null ? library.getHeaderScore() : library.getMarkerScore();
|
|
|
List<ScoreItem> scores = library.getScoreList();
|
|
|
if (count == 1) {
|
|
|
// 首份评卷任务,直接取总分与明细
|
|
@@ -1160,8 +1244,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
|
trialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
- trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
}
|
|
|
updateLibraryCount(group);
|
|
|
groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
@@ -1250,6 +1332,24 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 考生分组判断是否评卷完成,以及后续的统一处理动作
|
|
|
+ *
|
|
|
+ * @param studentId
|
|
|
+ * @param group
|
|
|
+ */
|
|
|
+ private void checkStudentTrial(TrialLibrary library, MarkGroup group) {
|
|
|
+ updateStudentGroupStatus(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
+ SubjectiveStatus.MARKED);
|
|
|
+ updateStudentGroupScore(library.getStudentId(), group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
+ library.getMarkerScore(), library.getScoreList());
|
|
|
+ // 未分组的题目
|
|
|
+ long unGroupQuestionCount = questionDao.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(
|
|
|
+ group.getExamId(), group.getSubjectCode(), false);
|
|
|
+ long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
|
|
|
+ checkStudentSubjective(library.getStudentId(), groupCount, unGroupQuestionCount);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 考生分组判断是否评卷完成,以及后续的统一处理动作
|
|
|
*
|
|
@@ -1319,8 +1419,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
|
|
|
List<ExamQuestion> questions = questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId,
|
|
|
subjectCode, false, groupNumber);
|
|
|
- for (int i = 0; i < scoreList.size(); i++) {
|
|
|
- ScoreItem item = scoreList.get(i);
|
|
|
+ for (int i = 0; i < questions.size(); i++) {
|
|
|
ExamQuestion question = questions.get(i);
|
|
|
SubjectiveScore ss = new SubjectiveScore();
|
|
|
ss.setStudentId(studentId);
|
|
@@ -1328,10 +1427,16 @@ public class MarkServiceImpl implements MarkService {
|
|
|
ss.setSubjectCode(subjectCode);
|
|
|
ss.setGroupNumber(groupNumber);
|
|
|
ss.setGroupScore(score);
|
|
|
- ss.setMainScore(0.0);
|
|
|
ss.setMainNumber(question.getMainNumber());
|
|
|
ss.setSubNumber(question.getSubNumber());
|
|
|
- ss.setScore(item.getScore());
|
|
|
+ if (score != UN_SELECTIVE_SCORE) {
|
|
|
+ ScoreItem item = scoreList.get(i);
|
|
|
+ ss.setScore(item.getScore());
|
|
|
+ ss.setMainScore(0.0);
|
|
|
+ } else {
|
|
|
+ ss.setScore(score);
|
|
|
+ ss.setMainScore(score);
|
|
|
+ }
|
|
|
scoreDao.saveAndFlush(ss);
|
|
|
}
|
|
|
}
|