|
@@ -1,8 +1,6 @@
|
|
|
package cn.com.qmth.stmms.biz.mark.service.Impl;
|
|
|
|
|
|
-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.MarkerDao;
|
|
|
+import cn.com.qmth.stmms.biz.exam.dao.*;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.*;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
@@ -23,7 +21,10 @@ import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
/**
|
|
@@ -45,6 +46,12 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Autowired
|
|
|
private MarkGroupDao groupDao;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private MarkGroupStudentDao groupStudentDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SubjectiveScoreDao scoreDao;
|
|
|
+
|
|
|
@Autowired
|
|
|
private ExamQuestionDao questionDao;
|
|
|
|
|
@@ -202,14 +209,25 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 小题数据
|
|
|
questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
false, group.getNumber());
|
|
|
-
|
|
|
+ // 考生分组状态与得分明细
|
|
|
+ groupStudentDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ scoreDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ // 删除分组
|
|
|
releaseByGroup(group);
|
|
|
groupDao.delete(group);
|
|
|
// 科目总分
|
|
|
subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
|
|
|
sumTotalScore(group.getExamId(), group.getSubjectCode()));
|
|
|
- // 需要重新统分
|
|
|
- subjectService.updateNeedCalculate(group.getExamId(), group.getSubjectCode(), true);
|
|
|
+ // 考生整体状态与总分更新
|
|
|
+ long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
|
|
|
+ List<Integer> studentList = studentService
|
|
|
+ .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(group.getExamId(), group.getSubjectCode(),
|
|
|
+ SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
|
|
|
+ for (Integer studentId : studentList) {
|
|
|
+ checkStudentSubjective(studentId, groupCount);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -342,6 +360,13 @@ public class MarkServiceImpl implements MarkService {
|
|
|
LibraryStatus.PROBLEM);
|
|
|
libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING, LibraryStatus.ARBITRATED,
|
|
|
LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
|
|
|
+ // 只选取评卷完成状态的记录重新检查
|
|
|
+ List<Integer> studentIdList = groupStudentDao
|
|
|
+ .findStudentIdByGroupNumberAndStatus(marker.getExamId(), marker.getSubjectCode(),
|
|
|
+ marker.getGroupNumber(), SubjectiveStatus.MARKED);
|
|
|
+ for (Integer studentId : studentIdList) {
|
|
|
+ checkStudentGroup(studentId, group);
|
|
|
+ }
|
|
|
markerDao.resetById(marker.getId());
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
trialTagDao.deleteByMarkerId(marker.getId());
|
|
@@ -371,7 +396,9 @@ public class MarkServiceImpl implements MarkService {
|
|
|
trialTagDao.deleteByStudentId(student.getId());
|
|
|
trialHistoryDao.deleteByStudentId(student.getId());
|
|
|
trialLibraryDao.deleteByStudentId(student.getId());
|
|
|
-
|
|
|
+ //主观状态与得分明细
|
|
|
+ groupStudentDao.deleteByStudentId(student.getId());
|
|
|
+ scoreDao.deleteByStudentId(student.getId());
|
|
|
updateAllCount(student.getExamId(), student.getSubjectCode());
|
|
|
}
|
|
|
|
|
@@ -503,9 +530,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 保存阅卷轨迹
|
|
|
if (result.getTrackList() != null) {
|
|
|
trackDao.deleteByLibraryId(library.getId());
|
|
|
- for (MarkTrack t : result.getTrackList(library, marker)) {
|
|
|
- trackDao.saveAndFlush(t);
|
|
|
- }
|
|
|
+ trackDao.save(result.getTrackList(library, marker));
|
|
|
}
|
|
|
// 保存特殊标记
|
|
|
if (result.getTagList() != null) {
|
|
@@ -535,11 +560,11 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 两两比较,触发仲裁
|
|
|
List<MarkLibrary> libraries = libraryDao
|
|
|
.findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
|
|
|
- history = getArbitrate(libraries, group.getArbitrateThreshold(), now);
|
|
|
+ history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
|
|
|
}
|
|
|
} else {
|
|
|
// 未开启三评,触发仲裁
|
|
|
- history = getArbitrate(library, now);
|
|
|
+ history = buildArbitrateHistory(library, now);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -551,11 +576,14 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 触发仲裁后续状态更新
|
|
|
libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
|
|
|
LibraryStatus.WAIT_ARBITRATE);
|
|
|
+ } else {
|
|
|
+ // 判断当前分组是否已完成评卷
|
|
|
+ checkStudentGroup(library.getStudentId(), group);
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- private ArbitrateHistory getArbitrate(List<MarkLibrary> list, Double arbitrateThreshold, Date now) {
|
|
|
+ private ArbitrateHistory buildArbitrateHistory(List<MarkLibrary> list, Double arbitrateThreshold, Date now) {
|
|
|
for (MarkLibrary library : list) {
|
|
|
if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.INSPECTED
|
|
|
&& library.getStatus() != LibraryStatus.ARBITRATED) {
|
|
@@ -573,12 +601,12 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
}
|
|
|
if (count == list.size()) {
|
|
|
- return getArbitrate(list.get(0), now);
|
|
|
+ return buildArbitrateHistory(list.get(0), now);
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- private ArbitrateHistory getArbitrate(MarkLibrary library, Date now) {
|
|
|
+ private ArbitrateHistory buildArbitrateHistory(MarkLibrary library, Date now) {
|
|
|
ArbitrateHistory history = new ArbitrateHistory();
|
|
|
history.setExamId(library.getExamId());
|
|
|
history.setSubjectCode(library.getSubjectCode());
|
|
@@ -622,6 +650,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
LibraryStatus.PROBLEM) > 0) {
|
|
|
trackDao.deleteByLibraryId(library.getId());
|
|
|
specialTagDao.deleteByLibraryId(library.getId());
|
|
|
+ resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
|
|
|
+ library.getGroupNumber());
|
|
|
updateMarkedCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
|
|
|
problemHistoryService.resetByLibraryId(library.getId(), userId);
|
|
|
return true;
|
|
@@ -661,43 +691,57 @@ public class MarkServiceImpl implements MarkService {
|
|
|
libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
|
|
|
history.getTotalScore(), history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
|
|
|
updateMarkedCount(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
|
|
|
- scoreCalculate(studentService.findById(history.getStudentId()),
|
|
|
- groupDao.findByExamIdAndSubjectCode(history.getExamId(), history.getSubjectCode()));
|
|
|
+ checkStudentGroup(history.getStudentId(),
|
|
|
+ groupDao.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber()));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 对某个考生某个科目进行主观题统分
|
|
|
- *
|
|
|
- * @param student - 考生
|
|
|
- * @param groups - 所有评卷分组
|
|
|
- */
|
|
|
- @Override
|
|
|
- @Transactional
|
|
|
- public void scoreCalculate(ExamStudent student, List<MarkGroup> groups) {
|
|
|
- if (student == null || groups == null || groups.isEmpty()) {
|
|
|
- return;
|
|
|
- }
|
|
|
+ // /**
|
|
|
+ // * 对某个考生某个科目进行主观题统分
|
|
|
+ // *
|
|
|
+ // * @param student - 考生
|
|
|
+ // * @param groups - 所有评卷分组
|
|
|
+ // */
|
|
|
+ // @Override
|
|
|
+ // @Transactional
|
|
|
+ // public void scoreCalculate(ExamStudent student, List<MarkGroup> groups) {
|
|
|
+ // if (student == null || groups == null || groups.isEmpty()) {
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // List<ScoreItem> scoreList = new ArrayList<>();
|
|
|
+ // double totalScore = 0.0;
|
|
|
+ // // 循环所有评卷分组
|
|
|
+ // for (MarkGroup group : groups) {
|
|
|
+ // if (group.getStatus().equals(MarkStatus.TRIAL)) {
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // if (calculateGroup(group, student.getId())) {
|
|
|
+ // totalScore += group.getMarkScore();
|
|
|
+ // scoreList.addAll(group.getMarkScoreDetail());
|
|
|
+ // } else {
|
|
|
+ // // 未评完直接返回
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // // 全部评完,更新考生主观题得分
|
|
|
+ // student.setSubjectiveScore(totalScore);
|
|
|
+ // student.setScoreList(scoreList, false);
|
|
|
+ // studentService
|
|
|
+ // .updateSubjectiveScore(student.getId(), student.getSubjectiveScore(), student.getSubjectiveScoreList());
|
|
|
+ // }
|
|
|
+
|
|
|
+ private void scoreCalculate(Integer studentId) {
|
|
|
List<ScoreItem> scoreList = new ArrayList<>();
|
|
|
double totalScore = 0.0;
|
|
|
- // 循环所有评卷分组
|
|
|
- for (MarkGroup group : groups) {
|
|
|
- if (group.getStatus().equals(MarkStatus.TRIAL)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (calculateGroup(group, student.getId())) {
|
|
|
- totalScore += group.getMarkScore();
|
|
|
- scoreList.addAll(group.getMarkScoreDetail());
|
|
|
- } else {
|
|
|
- // 未评完直接返回
|
|
|
- return;
|
|
|
- }
|
|
|
+ // 循环所有主观得分明细
|
|
|
+ List<SubjectiveScore> list = scoreDao.findByStudentId(studentId);
|
|
|
+ for (SubjectiveScore ss : list) {
|
|
|
+ totalScore += ss.getScore();
|
|
|
+ scoreList.add(new ScoreItem(ss));
|
|
|
}
|
|
|
// 全部评完,更新考生主观题得分
|
|
|
- student.setSubjectiveScore(totalScore);
|
|
|
- student.setScoreList(scoreList, false);
|
|
|
- studentService
|
|
|
- .updateSubjectiveScore(student.getId(), student.getSubjectiveScore(), student.getSubjectiveScoreList());
|
|
|
+ studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore,
|
|
|
+ ExamStudent.buildScoreList(scoreList));
|
|
|
}
|
|
|
|
|
|
private boolean calculateGroup(MarkGroup group, Integer studentId) {
|
|
@@ -722,15 +766,11 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// Collections.sort(list,
|
|
|
// Comparator.comparing(MarkLibrary::getMarkerScore));
|
|
|
// 从小到大排序
|
|
|
- list.sort(new Comparator<MarkLibrary>() {
|
|
|
-
|
|
|
- @Override
|
|
|
- public int compare(MarkLibrary o1, MarkLibrary o2) {
|
|
|
- if (o1.getMarkerScore() - o2.getMarkerScore() > 0) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
- return -1;
|
|
|
+ list.sort((o1, o2) -> {
|
|
|
+ if (o1.getMarkerScore() - o2.getMarkerScore() > 0) {
|
|
|
+ return 1;
|
|
|
}
|
|
|
+ return -1;
|
|
|
});
|
|
|
Double score1 =
|
|
|
list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore() : list.get(0).getMarkerScore();
|
|
@@ -987,6 +1027,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
group.getNumber(), 3);
|
|
|
markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
|
+ resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
group.getNumber());
|
|
@@ -1066,4 +1107,96 @@ public class MarkServiceImpl implements MarkService {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 考生判断是否主观题全部评卷完成
|
|
|
+ *
|
|
|
+ * @param studentId
|
|
|
+ */
|
|
|
+ private void checkStudentSubjective(Integer studentId, long groupCount) {
|
|
|
+ if (groupStudentDao.countByStudentIdAndStatus(studentId, SubjectiveStatus.MARKED) == groupCount) {
|
|
|
+ scoreCalculate(studentId);
|
|
|
+ } else {
|
|
|
+ studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, 0, null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 考生分组判断是否评卷完成,以及后续的统一处理动作
|
|
|
+ *
|
|
|
+ * @param studentId
|
|
|
+ * @param group
|
|
|
+ */
|
|
|
+ private void checkStudentGroup(Integer studentId, MarkGroup group) {
|
|
|
+ if (calculateGroup(group, studentId)) {
|
|
|
+ updateStudentGroupStatus(studentId, group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
+ SubjectiveStatus.MARKED);
|
|
|
+ updateStudentGroupScore(studentId, group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
+ group.getMarkScore(), group.getMarkScoreDetail());
|
|
|
+ checkStudentSubjective(studentId,
|
|
|
+ groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode()));
|
|
|
+ } else {
|
|
|
+ updateStudentGroupStatus(studentId, group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
+ SubjectiveStatus.UNMARK);
|
|
|
+ studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, 0, null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置考生某个分组的评卷状态,以及整体的主观题状态
|
|
|
+ *
|
|
|
+ * @param studentId
|
|
|
+ * @param examId
|
|
|
+ * @param subjectCode
|
|
|
+ * @param groupNumber
|
|
|
+ */
|
|
|
+ private void resetStudentGroup(Integer studentId, Integer examId, String subjectCode, Integer groupNumber) {
|
|
|
+ updateStudentGroupStatus(studentId, examId, subjectCode, groupNumber, SubjectiveStatus.UNMARK);
|
|
|
+ scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
|
|
|
+ studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.UNMARK, 0, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置某个分组所有考生的评卷状态,以及这些考生的主观题状态
|
|
|
+ *
|
|
|
+ * @param examId
|
|
|
+ * @param subjectCode
|
|
|
+ * @param groupNumber
|
|
|
+ */
|
|
|
+ private void resetStudentGroup(Integer examId, String subjectCode, Integer groupNumber) {
|
|
|
+ groupStudentDao.updateStatusByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber,
|
|
|
+ SubjectiveStatus.UNMARK);
|
|
|
+ scoreDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber);
|
|
|
+ studentService.updateSubjectiveStatusAndScore(examId, subjectCode, SubjectiveStatus.UNMARK, 0, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateStudentGroupStatus(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
|
|
|
+ SubjectiveStatus status) {
|
|
|
+ MarkGroupStudent gs = new MarkGroupStudent();
|
|
|
+ gs.setStudentId(studentId);
|
|
|
+ gs.setExamId(examId);
|
|
|
+ gs.setSubjectCode(subjectCode);
|
|
|
+ gs.setGroupNumber(groupNumber);
|
|
|
+ gs.setStatus(status);
|
|
|
+ groupStudentDao.save(gs);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void updateStudentGroupScore(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
|
|
|
+ double score, List<ScoreItem> scoreList) {
|
|
|
+ //scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
|
|
|
+ List<SubjectiveScore> list = new ArrayList<>();
|
|
|
+ for (ScoreItem item : scoreList) {
|
|
|
+ SubjectiveScore ss = new SubjectiveScore();
|
|
|
+ ss.setStudentId(studentId);
|
|
|
+ ss.setExamId(examId);
|
|
|
+ ss.setSubjectCode(subjectCode);
|
|
|
+ ss.setGroupNumber(groupNumber);
|
|
|
+ ss.setGroupScore(score);
|
|
|
+ ss.setMainNumber(item.getMainNumber());
|
|
|
+ ss.setSubNumber(item.getSubNumber());
|
|
|
+ ss.setScore(item.getScore());
|
|
|
+ list.add(ss);
|
|
|
+ }
|
|
|
+ scoreDao.save(list);
|
|
|
+ }
|
|
|
+
|
|
|
}
|