|
@@ -194,7 +194,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
subjectService.updateScore(group.getExamId(), group.getSubjectCode());
|
|
|
resetGroup(group);
|
|
|
} catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ e.printStackTrace();
|
|
|
throw e;
|
|
|
} finally {
|
|
|
lockService.unlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
@@ -300,57 +300,81 @@ public class MarkServiceImpl implements MarkService {
|
|
|
lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
// 等待考生释放锁定
|
|
|
lockService.waitUnlockStudent(library.getStudentId());
|
|
|
- // 若该评卷任务已被删除,则直接返回
|
|
|
- if (!libraryDao.exists(library.getId())) {
|
|
|
- return;
|
|
|
- }
|
|
|
- // 保存阅卷轨迹
|
|
|
- if (trackList != null) {
|
|
|
- trackDao.deleteByLibraryId(library.getId());
|
|
|
- trackDao.save(trackList);
|
|
|
- }
|
|
|
- // 保存特殊标记
|
|
|
- if (tagList != null) {
|
|
|
- specialTagDao.deleteByLibraryId(library.getId());
|
|
|
- specialTagDao.save(tagList);
|
|
|
- }
|
|
|
|
|
|
- ArbitrateHistory history = null;
|
|
|
- if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
|
|
|
- // 多评模式
|
|
|
- List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(library.getStudentId(),
|
|
|
- library.getGroupNumber());
|
|
|
- for (MarkLibrary other : list) {
|
|
|
- if (other.getId().equals(library.getId()) || other.getStatus() != LibraryStatus.MARKED
|
|
|
- || other.getMarkerScore() == null || other.getHeaderScore() != null) {
|
|
|
- // 未评卷或组长已打分,则跳过该任务
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (Math.abs(other.getMarkerScore() - library.getMarkerScore()) > group.getArbitrateThreshold()) {
|
|
|
- // 分差超过阀值,触发仲裁
|
|
|
- history = new ArbitrateHistory();
|
|
|
- history.setExamId(library.getExamId());
|
|
|
- history.setSubjectCode(library.getSubjectCode());
|
|
|
- history.setGroupNumber(library.getGroupNumber());
|
|
|
- history.setStudentId(library.getStudentId());
|
|
|
- history.setExamNumber(library.getExamNumber());
|
|
|
- history.setStatus(HistoryStatus.WAITING);
|
|
|
- history.setCreateTime(new Date());
|
|
|
- arbitrateDao.save(history);
|
|
|
-
|
|
|
- library.setStatus(LibraryStatus.WAIT_ARBITRATE);
|
|
|
- break;
|
|
|
+ try {
|
|
|
+ // 尝试锁定评卷员
|
|
|
+ lockService.lockMarker(library.getMarkerId());
|
|
|
+ // 锁定该评卷任务
|
|
|
+ MarkLibrary previous = libraryDao.findByIdForLock(library.getId());
|
|
|
+ // 若该评卷任务已被删除,则直接返回
|
|
|
+ if (previous == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 该评卷任务已被别人评过,也直接返回
|
|
|
+ if (previous.getMarkerId() != null && !previous.getMarkerId().equals(library.getMarkerId())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 该评卷任务状态不是已评或未评,也直接返回
|
|
|
+ if (previous.getStatus() != LibraryStatus.WAITING && previous.getStatus() != LibraryStatus.MARKED) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 已经评过该考生的其他评卷任务,则直接返回
|
|
|
+ if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), library.getMarkerId(),
|
|
|
+ library.getId()) > 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 保存阅卷轨迹
|
|
|
+ if (trackList != null) {
|
|
|
+ trackDao.deleteByLibraryId(library.getId());
|
|
|
+ trackDao.save(trackList);
|
|
|
+ }
|
|
|
+ // 保存特殊标记
|
|
|
+ if (tagList != null) {
|
|
|
+ specialTagDao.deleteByLibraryId(library.getId());
|
|
|
+ specialTagDao.save(tagList);
|
|
|
+ }
|
|
|
+ // 判断多评模式下是否需要仲裁
|
|
|
+ ArbitrateHistory history = null;
|
|
|
+ if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
|
|
|
+ // 多评模式
|
|
|
+ List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(library.getStudentId(),
|
|
|
+ library.getGroupNumber());
|
|
|
+ for (MarkLibrary other : list) {
|
|
|
+ if (other.getId().equals(library.getId()) || other.getStatus() != LibraryStatus.MARKED
|
|
|
+ || other.getMarkerScore() == null || other.getHeaderScore() != null) {
|
|
|
+ // 未评卷或组长已打分,则跳过该任务
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (Math.abs(other.getMarkerScore() - library.getMarkerScore()) > group.getArbitrateThreshold()) {
|
|
|
+ // 分差超过阀值,触发仲裁
|
|
|
+ history = new ArbitrateHistory();
|
|
|
+ history.setExamId(library.getExamId());
|
|
|
+ history.setSubjectCode(library.getSubjectCode());
|
|
|
+ history.setGroupNumber(library.getGroupNumber());
|
|
|
+ history.setStudentId(library.getStudentId());
|
|
|
+ history.setExamNumber(library.getExamNumber());
|
|
|
+ history.setStatus(HistoryStatus.WAITING);
|
|
|
+ history.setCreateTime(new Date());
|
|
|
+ arbitrateDao.save(history);
|
|
|
+
|
|
|
+ library.setStatus(LibraryStatus.WAIT_ARBITRATE);
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- library = libraryDao.saveAndFlush(library);
|
|
|
- // 触发仲裁后续处理
|
|
|
- if (history != null) {
|
|
|
- libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
|
|
|
- LibraryStatus.WAIT_ARBITRATE);
|
|
|
- } else if (library.getStatus() == LibraryStatus.MARKED) {
|
|
|
- // 评卷正常完成才尝试统分
|
|
|
- scoreCalculate(library.getExamId(), library.getSubjectCode(), library.getStudentId());
|
|
|
+ library = libraryDao.saveAndFlush(library);
|
|
|
+ // 触发仲裁后续处理
|
|
|
+ if (history != null) {
|
|
|
+ libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
|
|
|
+ LibraryStatus.WAIT_ARBITRATE);
|
|
|
+ } else if (library.getStatus() == LibraryStatus.MARKED) {
|
|
|
+ // 评卷正常完成才尝试统分
|
|
|
+ scoreCalculate(library.getExamId(), library.getSubjectCode(), library.getStudentId());
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw e;
|
|
|
+ } finally {
|
|
|
+ lockService.unlockMarker(library.getMarkerId());
|
|
|
}
|
|
|
}
|
|
|
|