|
@@ -25,16 +25,21 @@ 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.MarkLibraryDao;
|
|
import cn.com.qmth.stmms.biz.mark.dao.MarkSpecialTagDao;
|
|
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.MarkTrackDao;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.TrialHistoryDao;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.dao.TrialLibraryDao;
|
|
|
|
+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.ArbitrateHistory;
|
|
import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
|
|
import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
|
|
-import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
|
|
|
|
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
|
|
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkResult;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
|
|
import cn.com.qmth.stmms.biz.mark.service.MarkService;
|
|
import cn.com.qmth.stmms.biz.mark.service.MarkService;
|
|
-import cn.com.qmth.stmms.biz.user.model.User;
|
|
|
|
import cn.com.qmth.stmms.biz.utils.CurrentTaskUtil;
|
|
import cn.com.qmth.stmms.biz.utils.CurrentTaskUtil;
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
|
|
+import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
|
|
import cn.com.qmth.stmms.common.enums.HistoryStatus;
|
|
import cn.com.qmth.stmms.common.enums.HistoryStatus;
|
|
import cn.com.qmth.stmms.common.enums.LibraryStatus;
|
|
import cn.com.qmth.stmms.common.enums.LibraryStatus;
|
|
|
|
+import cn.com.qmth.stmms.common.enums.MarkStatus;
|
|
import cn.com.qmth.stmms.common.enums.ScorePolicy;
|
|
import cn.com.qmth.stmms.common.enums.ScorePolicy;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -75,6 +80,15 @@ public class MarkServiceImpl implements MarkService {
|
|
@Autowired
|
|
@Autowired
|
|
private MarkSpecialTagDao specialTagDao;
|
|
private MarkSpecialTagDao specialTagDao;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private TrialLibraryDao trialLibraryDao;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private TrialHistoryDao trialHistoryDao;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private TrialTrackDao trialTrackDao;
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private MarkLockService lockService;
|
|
private MarkLockService lockService;
|
|
|
|
|
|
@@ -86,7 +100,13 @@ public class MarkServiceImpl implements MarkService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public int applyCount(MarkGroup group) {
|
|
public int applyCount(MarkGroup group) {
|
|
- return CurrentTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
|
|
+ int count = 0;
|
|
|
|
+ if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
|
+ count = TrialTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+ } else if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
|
+ count = CurrentTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+ }
|
|
|
|
+ return count;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -107,7 +127,11 @@ public class MarkServiceImpl implements MarkService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void releaseByGroup(MarkGroup group) {
|
|
public void releaseByGroup(MarkGroup group) {
|
|
- CurrentTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
|
|
+ if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
|
+ TrialTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+ } else if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
|
+ CurrentTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -138,8 +162,13 @@ public class MarkServiceImpl implements MarkService {
|
|
public void deleteGroup(MarkGroup group) {
|
|
public void deleteGroup(MarkGroup group) {
|
|
try {
|
|
try {
|
|
lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+
|
|
questionDao.deleteByExamIdAndSubjectCodeAndPaperTypeAndObjectiveAndMainNumber(group.getExamId(),
|
|
questionDao.deleteByExamIdAndSubjectCodeAndPaperTypeAndObjectiveAndMainNumber(group.getExamId(),
|
|
group.getSubjectCode(), null, false, group.getNumber());
|
|
group.getSubjectCode(), null, false, group.getNumber());
|
|
|
|
+ trialLibraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
+ group.getNumber());
|
|
|
|
+ trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
+ group.getNumber());
|
|
libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
group.getNumber());
|
|
group.getNumber());
|
|
arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
@@ -201,7 +230,7 @@ public class MarkServiceImpl implements MarkService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 评卷员申请领取某个评卷任务
|
|
|
|
|
|
+ * 评卷员申请领取某个正式评卷任务
|
|
*
|
|
*
|
|
* @param library
|
|
* @param library
|
|
* @param marker
|
|
* @param marker
|
|
@@ -218,7 +247,18 @@ public class MarkServiceImpl implements MarkService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 评卷员是否已领取了某个评卷任务
|
|
|
|
|
|
+ * 评卷员申请领取某个试评评卷任务
|
|
|
|
+ *
|
|
|
|
+ * @param library
|
|
|
|
+ * @param marker
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public boolean applyLibrary(TrialLibrary library, Marker marker) {
|
|
|
|
+ return TrialTaskUtil.add(marker, getApplyTaskId(library, marker));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 评卷员是否已领取了某个正式评卷任务
|
|
*
|
|
*
|
|
* @param library
|
|
* @param library
|
|
* @param marker
|
|
* @param marker
|
|
@@ -230,7 +270,19 @@ public class MarkServiceImpl implements MarkService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 释放某个评卷员已领取的任务
|
|
|
|
|
|
+ * 评卷员是否已领取了某个试评评卷任务
|
|
|
|
+ *
|
|
|
|
+ * @param library
|
|
|
|
+ * @param marker
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public boolean hasApplied(TrialLibrary library, Marker marker) {
|
|
|
|
+ return TrialTaskUtil.exists(marker, getApplyTaskId(library, marker));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 释放某个评卷员已领取的正评任务
|
|
*
|
|
*
|
|
* @param library
|
|
* @param library
|
|
* @param marker
|
|
* @param marker
|
|
@@ -240,6 +292,17 @@ public class MarkServiceImpl implements MarkService {
|
|
CurrentTaskUtil.remove(marker, getApplyTaskId(library));
|
|
CurrentTaskUtil.remove(marker, getApplyTaskId(library));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 释放某个评卷员已领取的试评任务
|
|
|
|
+ *
|
|
|
|
+ * @param library
|
|
|
|
+ * @param marker
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public void releaseLibrary(TrialLibrary library, Marker marker) {
|
|
|
|
+ TrialTaskUtil.remove(marker, getApplyTaskId(library, marker));
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 释放某个评卷员的所有锁定任务
|
|
* 释放某个评卷员的所有锁定任务
|
|
*
|
|
*
|
|
@@ -248,6 +311,7 @@ public class MarkServiceImpl implements MarkService {
|
|
@Override
|
|
@Override
|
|
public void releaseByMarker(Marker marker) {
|
|
public void releaseByMarker(Marker marker) {
|
|
CurrentTaskUtil.clear(marker);
|
|
CurrentTaskUtil.clear(marker);
|
|
|
|
+ TrialTaskUtil.clear(marker);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -289,6 +353,8 @@ public class MarkServiceImpl implements MarkService {
|
|
specialTagDao.deleteByStudentId(student.getId());
|
|
specialTagDao.deleteByStudentId(student.getId());
|
|
libraryDao.deleteByStudentId(student.getId());
|
|
libraryDao.deleteByStudentId(student.getId());
|
|
arbitrateDao.deleteByStudentId(student.getId());
|
|
arbitrateDao.deleteByStudentId(student.getId());
|
|
|
|
+ trialLibraryDao.deleteByStudentId(student.getId());
|
|
|
|
+ trialHistoryDao.deleteByStudentId(student.getId());
|
|
updateLibraryCount(student.getExamId(), student.getSubjectCode());
|
|
updateLibraryCount(student.getExamId(), student.getSubjectCode());
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
throw e;
|
|
throw e;
|
|
@@ -298,105 +364,145 @@ public class MarkServiceImpl implements MarkService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 评卷员提交某个评卷任务
|
|
|
|
|
|
+ * 评卷员提交评卷任务
|
|
*
|
|
*
|
|
- * @param library
|
|
|
|
- * @param trackMap
|
|
|
|
- * @param tagList
|
|
|
|
|
|
+ * @param task
|
|
|
|
+ * @param marker
|
|
|
|
+ * @return
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
@Transactional
|
|
@Transactional
|
|
- public boolean submitLibrary(MarkLibrary library, Marker marker, List<MarkTrack> trackList,
|
|
|
|
- List<MarkSpecialTag> tagList) {
|
|
|
|
- // 判断评卷任务记录是否存在,以及评卷员是否有权限操作
|
|
|
|
- if (library == null || !library.getExamId().equals(marker.getExamId())
|
|
|
|
- || !library.getSubjectCode().equals(marker.getSubjectCode())
|
|
|
|
- || !library.getGroupNumber().equals(marker.getGroupNumber())) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- // 判断大题是否存在
|
|
|
|
- MarkGroup group = groupDao.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
|
|
|
|
- if (group == null) {
|
|
|
|
|
|
+ public boolean submitTask(MarkResult result, Marker marker) {
|
|
|
|
+ // 判断大题是否存在/评卷是否结束
|
|
|
|
+ MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
|
|
|
|
+ if (group == null || group.getStatus() == MarkStatus.FINISH) {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
// 等待大题释放锁定
|
|
// 等待大题释放锁定
|
|
lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
// 等待考生释放锁定
|
|
// 等待考生释放锁定
|
|
- lockService.waitUnlockStudent(library.getStudentId());
|
|
|
|
-
|
|
|
|
|
|
+ lockService.waitUnlockStudent(result.getStudentId());
|
|
try {
|
|
try {
|
|
- // 非本人领取的待评任务
|
|
|
|
- if (library.getStatus() == LibraryStatus.WAITING && !hasApplied(library, marker)) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- // 非本人的回评任务
|
|
|
|
- if (library.getStatus() == LibraryStatus.MARKED && !library.getMarkerId().equals(marker.getId())) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- // 校验总分是否超标
|
|
|
|
- if (library.getMarkerScore() > group.getTotalScore() || StringUtils.isBlank(library.getMarkerScoreList())) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- // 是否多评情况下已处理过该考生评卷任务
|
|
|
|
- if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), library.getMarkerId(),
|
|
|
|
- library.getId()) > 0) {
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- // 尝试提交评卷结果
|
|
|
|
- Date now = new Date();
|
|
|
|
- if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, library.getMarkerId(),
|
|
|
|
- library.getMarkerScore(), library.getMarkerScoreList(), now, library.getTags(),
|
|
|
|
- LibraryStatus.WAITING, LibraryStatus.MARKED) == 0) {
|
|
|
|
- // 条件不符更新失败,直接返回
|
|
|
|
- return false;
|
|
|
|
- }
|
|
|
|
- // 保存阅卷轨迹
|
|
|
|
- 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.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
|
|
|
|
- library.getGroupNumber(), LibraryStatus.MARKED);
|
|
|
|
- for (MarkLibrary other : list) {
|
|
|
|
- if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
|
|
|
|
- // 本评卷任务或组长已打分,则跳过该任务
|
|
|
|
- continue;
|
|
|
|
|
|
+ // 根据评卷状态选择读取不同的评卷任务
|
|
|
|
+ if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
|
+ MarkLibrary library = libraryDao.findOne(result.getLibraryId());
|
|
|
|
+ if (library != null && library.getExamId().equals(group.getExamId())
|
|
|
|
+ && library.getSubjectCode().equals(group.getSubjectCode())
|
|
|
|
+ && library.getGroupNumber().equals(group.getNumber())
|
|
|
|
+ && result.getTotalScore() <= group.getTotalScore()
|
|
|
|
+ && StringUtils.isNotBlank(result.getScoreList())) {
|
|
|
|
+ if (submitLibrary(library, marker, group, result)) {
|
|
|
|
+ updateLibraryCount(group);
|
|
|
|
+ releaseLibrary(library, marker);
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
- 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(now);
|
|
|
|
- break;
|
|
|
|
|
|
+ }
|
|
|
|
+ } else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
|
+ TrialLibrary library = trialLibraryDao.findOne(result.getLibraryId());
|
|
|
|
+ if (library != null && library.getExamId().equals(group.getExamId())
|
|
|
|
+ && library.getSubjectCode().equals(group.getSubjectCode())
|
|
|
|
+ && library.getGroupNumber().equals(group.getNumber())
|
|
|
|
+ && result.getTotalScore() <= 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.getTotalScore());
|
|
|
|
+ history.setMarkerScoreList(result.getScoreList());
|
|
|
|
+ history = trialHistoryDao.save(history);
|
|
|
|
+ if (history != null) {
|
|
|
|
+ if (result.getTrackList() != null) {
|
|
|
|
+ trialTrackDao.deleteByLibraryIdAndMarkerId(history.getLibraryId(), history.getMarkerId());
|
|
|
|
+ trialTrackDao.save(result.getTrackList(history));
|
|
|
|
+ }
|
|
|
|
+ releaseLibrary(library, marker);
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (history != null) {
|
|
|
|
- // 保存仲裁记录
|
|
|
|
- arbitrateDao.save(history);
|
|
|
|
- // 触发仲裁后续状态更新
|
|
|
|
- libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
|
|
|
|
- LibraryStatus.WAIT_ARBITRATE);
|
|
|
|
- }
|
|
|
|
- updateLibraryCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
|
|
|
|
- return true;
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- throw new RuntimeException("submit library error", e);
|
|
|
|
|
|
+ throw new RuntimeException("submit task error", e);
|
|
}
|
|
}
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 评卷员提交某个正评任务
|
|
|
|
+ *
|
|
|
|
+ * @param library
|
|
|
|
+ * @param marker
|
|
|
|
+ * @param trackMap
|
|
|
|
+ * @param tagList
|
|
|
|
+ */
|
|
|
|
+ private boolean submitLibrary(MarkLibrary library, Marker marker, MarkGroup group, MarkResult result) {
|
|
|
|
+ // 非本人领取的待评任务
|
|
|
|
+ if (library.getStatus() == LibraryStatus.WAITING && !hasApplied(library, marker)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ // 非本人的回评任务
|
|
|
|
+ if (library.getStatus() == LibraryStatus.MARKED && !library.getMarkerId().equals(marker.getId())) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ // 是否多评情况下已处理过该考生评卷任务
|
|
|
|
+ if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), library.getMarkerId(),
|
|
|
|
+ library.getId()) > 0) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ // 尝试提交评卷结果
|
|
|
|
+ Date now = new Date();
|
|
|
|
+ if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(), result.getTotalScore(),
|
|
|
|
+ result.getScoreList(), now, null, LibraryStatus.WAITING, LibraryStatus.MARKED) == 0) {
|
|
|
|
+ // 条件不符更新失败,直接返回
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+ // 保存阅卷轨迹
|
|
|
|
+ if (result.getTrackList() != null) {
|
|
|
|
+ trackDao.deleteByLibraryId(library.getId());
|
|
|
|
+ trackDao.save(result.getTrackList(library));
|
|
|
|
+ }
|
|
|
|
+ // 保存特殊标记
|
|
|
|
+ if (result.getTagList() != null) {
|
|
|
|
+ specialTagDao.deleteByLibraryId(library.getId());
|
|
|
|
+ specialTagDao.save(result.getSpecialTagList(library));
|
|
|
|
+ }
|
|
|
|
+ // 判断多评模式下是否需要仲裁
|
|
|
|
+ ArbitrateHistory history = null;
|
|
|
|
+ if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
|
|
|
|
+ // 多评模式
|
|
|
|
+ List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
|
|
|
|
+ library.getGroupNumber(), LibraryStatus.MARKED);
|
|
|
|
+ for (MarkLibrary other : list) {
|
|
|
|
+ if (other.getId().equals(library.getId()) || 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(now);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (history != null) {
|
|
|
|
+ // 保存仲裁记录
|
|
|
|
+ arbitrateDao.save(history);
|
|
|
|
+ // 触发仲裁后续状态更新
|
|
|
|
+ libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
|
|
|
|
+ LibraryStatus.WAIT_ARBITRATE);
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -419,18 +525,6 @@ public class MarkServiceImpl implements MarkService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * 管理员/组长直接对考生打分
|
|
|
|
- *
|
|
|
|
- * @param student
|
|
|
|
- * @param user
|
|
|
|
- */
|
|
|
|
- @Override
|
|
|
|
- @Transactional
|
|
|
|
- public void submitStudent(ExamStudent student, User user) {
|
|
|
|
- // TODO - 下个版本添加此功能
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* 管理员/组长处理仲裁卷
|
|
* 管理员/组长处理仲裁卷
|
|
*
|
|
*
|
|
@@ -550,10 +644,33 @@ public class MarkServiceImpl implements MarkService {
|
|
@Override
|
|
@Override
|
|
@Transactional
|
|
@Transactional
|
|
public void updateLibraryCount(Integer examId, String subjectCode, Integer groupNumber) {
|
|
public void updateLibraryCount(Integer examId, String subjectCode, Integer groupNumber) {
|
|
- groupDao.updateLibraryCount(examId, subjectCode, groupNumber,
|
|
|
|
- (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber),
|
|
|
|
- (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(examId, subjectCode, groupNumber,
|
|
|
|
- LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
|
|
|
|
|
|
+ MarkGroup group = groupDao.findOne(examId, subjectCode, groupNumber);
|
|
|
|
+ if (group != null) {
|
|
|
|
+ updateLibraryCount(group);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 更新某个大题评卷任务数量
|
|
|
|
+ *
|
|
|
|
+ * @param group
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional
|
|
|
|
+ public void updateLibraryCount(MarkGroup group) {
|
|
|
|
+ if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
|
+ groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
|
+ (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
|
|
|
|
+ group.getSubjectCode(), group.getNumber()),
|
|
|
|
+ (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(),
|
|
|
|
+ group.getSubjectCode(), group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
|
|
|
|
+ } else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
|
+ groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
|
+ (int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
|
|
|
|
+ group.getSubjectCode(), group.getNumber()),
|
|
|
|
+ (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -568,12 +685,12 @@ public class MarkServiceImpl implements MarkService {
|
|
public void updateLibraryCount(Integer examId, String subjectCode) {
|
|
public void updateLibraryCount(Integer examId, String subjectCode) {
|
|
List<MarkGroup> groups = groupDao.findByExamIdAndSubjectCode(examId, subjectCode);
|
|
List<MarkGroup> groups = groupDao.findByExamIdAndSubjectCode(examId, subjectCode);
|
|
for (MarkGroup group : groups) {
|
|
for (MarkGroup group : groups) {
|
|
- updateLibraryCount(examId, subjectCode, group.getNumber());
|
|
|
|
|
|
+ updateLibraryCount(group);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 根据考生、学习中心、大题构造评卷任务
|
|
|
|
|
|
+ * 根据考生、学习中心、大题构造正式评卷任务
|
|
*
|
|
*
|
|
* @param student
|
|
* @param student
|
|
* @param campus
|
|
* @param campus
|
|
@@ -581,7 +698,7 @@ public class MarkServiceImpl implements MarkService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
@Transactional
|
|
@Transactional
|
|
- public void buildLibrary(ExamStudent student, Campus campus, MarkGroup group) {
|
|
|
|
|
|
+ public void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group) {
|
|
// 等待大题释放锁定
|
|
// 等待大题释放锁定
|
|
lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
// 等待考生释放锁定
|
|
// 等待考生释放锁定
|
|
@@ -614,11 +731,40 @@ public class MarkServiceImpl implements MarkService {
|
|
}
|
|
}
|
|
group.setBuildTime(student.getUploadTime());
|
|
group.setBuildTime(student.getUploadTime());
|
|
groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(), student.getUploadTime());
|
|
groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(), student.getUploadTime());
|
|
- updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
|
|
+ updateLibraryCount(group);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据考生、学习中心、大题构造试评评卷任务
|
|
|
|
+ *
|
|
|
|
+ * @param student
|
|
|
|
+ * @param campus
|
|
|
|
+ * @param group
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional
|
|
|
|
+ public void buildTrialLibrary(ExamStudent student, Campus campus, MarkGroup group) {
|
|
|
|
+ // 等待大题释放锁定
|
|
|
|
+ lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+ // 等待考生释放锁定
|
|
|
|
+ lockService.waitUnlockStudent(student.getId());
|
|
|
|
+ // 查询是否已创建评卷任务
|
|
|
|
+ if (trialLibraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
|
|
|
|
+ TrialLibrary library = new TrialLibrary();
|
|
|
|
+ library.setExamId(student.getExamId());
|
|
|
|
+ library.setSubjectCode(student.getSubjectCode());
|
|
|
|
+ library.setGroupNumber(group.getNumber());
|
|
|
|
+ library.setCampusId(campus.getId());
|
|
|
|
+ library.setStudentId(student.getId());
|
|
|
|
+ library.setExamNumber(student.getExamNumber());
|
|
|
|
+ library.setMarkCount(0);
|
|
|
|
+ trialLibraryDao.save(library);
|
|
|
|
+ updateLibraryCount(group);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 领取评卷任务时,用来区分的唯一标识<br/>
|
|
|
|
|
|
+ * 领取正式评卷任务时,用来区分的唯一标识<br/>
|
|
* 多评时同一个考生的多份任务不能被同一位评卷员领取
|
|
* 多评时同一个考生的多份任务不能被同一位评卷员领取
|
|
*
|
|
*
|
|
* @param library
|
|
* @param library
|
|
@@ -628,6 +774,16 @@ public class MarkServiceImpl implements MarkService {
|
|
return library.getStudentId() + "_" + library.getGroupNumber();
|
|
return library.getStudentId() + "_" + library.getGroupNumber();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 领取试评评卷任务时,用来区分的唯一标识
|
|
|
|
+ *
|
|
|
|
+ * @param library
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private String getApplyTaskId(TrialLibrary library, Marker marker) {
|
|
|
|
+ return library.getId() + "_" + marker.getId();
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 重置评卷分组的连带操作
|
|
* 重置评卷分组的连带操作
|
|
*
|
|
*
|
|
@@ -635,13 +791,18 @@ public class MarkServiceImpl implements MarkService {
|
|
*/
|
|
*/
|
|
private void resetGroup(MarkGroup group) {
|
|
private void resetGroup(MarkGroup group) {
|
|
groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
- libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
- group.getNumber(), LibraryStatus.WAITING);
|
|
|
|
- arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
- group.getNumber());
|
|
|
|
- trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
- group.getNumber());
|
|
|
|
- specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
|
|
+ if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
|
+ libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
+ group.getNumber(), LibraryStatus.WAITING);
|
|
|
|
+ arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
+ group.getNumber());
|
|
|
|
+ trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
+ group.getNumber());
|
|
|
|
+ specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
|
+ } else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
|
+ trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
|
+ group.getNumber());
|
|
|
|
+ }
|
|
releaseByGroup(group);
|
|
releaseByGroup(group);
|
|
}
|
|
}
|
|
|
|
|