|
@@ -8,11 +8,11 @@ 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.utils.FormalTaskUtil;
|
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
|
-import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
|
|
|
+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.utils.BigDecimalUtils;
|
|
|
import org.apache.commons.lang.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -21,11 +21,7 @@ import org.springframework.data.domain.Sort;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
/**
|
|
@@ -99,9 +95,11 @@ public class MarkServiceImpl implements MarkService {
|
|
|
public int applyCount(MarkGroup group) {
|
|
|
int count = 0;
|
|
|
if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
- count = TrialTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(group));
|
|
|
+ count = taskLock.count();
|
|
|
} else if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
- count = FormalTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(group));
|
|
|
+ count = taskLock.count();
|
|
|
}
|
|
|
return count;
|
|
|
}
|
|
@@ -121,9 +119,11 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
if (group != null) {
|
|
|
if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
- return FormalTaskUtil.count(marker);
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
|
|
|
+ return taskLock.count(marker.getId());
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
- return TrialTaskUtil.count(marker);
|
|
|
+ TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
|
|
|
+ return taskLock.count(marker.getId());
|
|
|
}
|
|
|
}
|
|
|
return 0;
|
|
@@ -162,9 +162,11 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
public void releaseByGroup(MarkGroup group) {
|
|
|
if (group.getStatus() == MarkStatus.TRIAL) {
|
|
|
- TrialTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(group));
|
|
|
+ taskLock.clear();
|
|
|
} else if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
- FormalTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(group));
|
|
|
+ taskLock.clear();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -275,12 +277,19 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
public boolean applyLibrary(MarkLibrary library, Marker marker) {
|
|
|
// 查询待领取任务时,已经做了多评同一studentId互斥处理
|
|
|
- // 首先判断多评情况下,同一个studentId是否已被该评卷员处理过
|
|
|
- // if (libraryDao.countByStudentIdAndMarkerId(library.getStudentId(),
|
|
|
- // marker.getId()) > 0) {
|
|
|
- // return false;
|
|
|
- // }
|
|
|
- return FormalTaskUtil.add(marker, getApplyTaskId(library));
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
|
|
|
+ boolean lock = taskLock.add(library.getStudentId(), library.getTaskNumber(), marker.getId());
|
|
|
+ // 上锁失败直接返回
|
|
|
+ if (!lock) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 重复校验任务状态
|
|
|
+ if (libraryDao.countByIdAndStatus(library.getId(), library.getStatus()) == 1) {
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ taskLock.remove(library.getStudentId(), library.getTaskNumber(), marker.getId());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -294,7 +303,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
public boolean applyLibrary(TrialLibrary library, Marker marker) {
|
|
|
- return TrialTaskUtil.add(marker, getApplyTaskId(library, marker));
|
|
|
+ TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
|
|
|
+ return taskLock.add(getApplyTaskId(library, marker), 1, marker.getId());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -308,7 +318,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
public boolean hasApplied(MarkLibrary library, Marker marker) {
|
|
|
- return FormalTaskUtil.exists(marker, getApplyTaskId(library));
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
|
|
|
+ return taskLock.exist(library.getStudentId(), library.getTaskNumber(), marker.getId());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -322,33 +333,29 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
public boolean hasApplied(TrialLibrary library, Marker marker) {
|
|
|
- return TrialTaskUtil.exists(marker, getApplyTaskId(library, marker));
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 释放某个评卷员已领取的正评任务
|
|
|
- *
|
|
|
- * @param library
|
|
|
- * - 正评任务
|
|
|
- * @param marker
|
|
|
- * - 评卷员
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void releaseLibrary(MarkLibrary library, Marker marker) {
|
|
|
- FormalTaskUtil.remove(marker, getApplyTaskId(library));
|
|
|
+ TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
|
|
|
+ return taskLock.exist(getApplyTaskId(library, marker), 1, marker.getId());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 释放某个评卷员已领取的试评任务
|
|
|
+ * 释放某个评卷员已完成的评卷任务
|
|
|
*
|
|
|
- * @param library
|
|
|
- * - 试评任务
|
|
|
+ * @param result
|
|
|
+ * - 评卷结果
|
|
|
* @param marker
|
|
|
* - 评卷员
|
|
|
*/
|
|
|
@Override
|
|
|
- public void releaseLibrary(TrialLibrary library, Marker marker) {
|
|
|
- TrialTaskUtil.remove(marker, getApplyTaskId(library, marker));
|
|
|
+ public void releaseTask(SubmitResult result, Marker marker) {
|
|
|
+ if (result.getMarkLibrary() != null) {
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
|
|
|
+ taskLock.remove(result.getMarkLibrary().getStudentId(), result.getMarkLibrary().getTaskNumber(),
|
|
|
+ marker.getId());
|
|
|
+ taskLock.refresh(marker.getId());
|
|
|
+ } else if (result.getTrialLibrary() != null) {
|
|
|
+ TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
|
|
|
+ taskLock.remove(getApplyTaskId(result.getTrialLibrary(), marker), 1, marker.getId());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -359,8 +366,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
public void releaseByMarker(Marker marker) {
|
|
|
- FormalTaskUtil.clear(marker);
|
|
|
- TrialTaskUtil.clear(marker);
|
|
|
+ TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
|
|
|
+ taskLock.clear(marker.getId());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -463,12 +470,12 @@ public class MarkServiceImpl implements MarkService {
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public boolean submitTask(MarkResult result, Marker marker) {
|
|
|
+ public SubmitResult submitTask(MarkResult result, Marker marker) {
|
|
|
// 判断评卷分组是否存在/评卷是否结束
|
|
|
MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
|
|
|
if (group == null || group.getStatus() == MarkStatus.FINISH
|
|
|
|| group.getStatus().getValue() != result.getStatusValue()) {
|
|
|
- return false;
|
|
|
+ return SubmitResult.faile();
|
|
|
}
|
|
|
|
|
|
// 根据评卷状态选择读取不同的评卷任务
|
|
@@ -481,8 +488,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED) != 0) {
|
|
|
saveProblemHistory(result, library);
|
|
|
updateMarkedCount(group);
|
|
|
- releaseLibrary(library, marker);
|
|
|
- return true;
|
|
|
+ // releaseLibrary(library, marker);
|
|
|
+ return SubmitResult.success(library);
|
|
|
}
|
|
|
}
|
|
|
if (library != null && library.getExamId().equals(group.getExamId())
|
|
@@ -491,8 +498,8 @@ public class MarkServiceImpl implements MarkService {
|
|
|
&& result.getTotalScore() <= group.getTotalScore() && StringUtils.isNotBlank(result.getScoreList())) {
|
|
|
if (submitLibrary(library, marker, group, result)) {
|
|
|
updateMarkedCount(group);
|
|
|
- releaseLibrary(library, marker);
|
|
|
- return true;
|
|
|
+ // releaseLibrary(library, marker);
|
|
|
+ return SubmitResult.success(library);
|
|
|
}
|
|
|
}
|
|
|
} else if (group.getStatus() == MarkStatus.TRIAL) {
|
|
@@ -523,12 +530,12 @@ public class MarkServiceImpl implements MarkService {
|
|
|
trialTagDao.save(result.getTagList(history));
|
|
|
}
|
|
|
updateMarkedCount(group);
|
|
|
- releaseLibrary(library, marker);
|
|
|
- return true;
|
|
|
+ // releaseLibrary(library, marker);
|
|
|
+ return SubmitResult.success(library);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return false;
|
|
|
+ return SubmitResult.faile();
|
|
|
}
|
|
|
|
|
|
private void saveProblemHistory(MarkResult result, MarkLibrary library) {
|
|
@@ -814,7 +821,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
// 循环所有主观得分明细
|
|
|
List<SubjectiveScore> list = scoreDao.findByStudentId(studentId);
|
|
|
for (SubjectiveScore ss : list) {
|
|
|
- totalScore += ss.getScore();
|
|
|
+ totalScore = BigDecimalUtils.add(totalScore, ss.getScore());
|
|
|
scoreList.add(new ScoreItem(ss));
|
|
|
List<SubjectiveScore> mainScoreList = map.get(ss.getMainNumber());
|
|
|
if (mainScoreList == null) {
|
|
@@ -828,7 +835,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
List<SubjectiveScore> mainScoreList = map.get(mainNumber);
|
|
|
double mainScore = 0.0;
|
|
|
for (SubjectiveScore subjectiveScore : mainScoreList) {
|
|
|
- mainScore += subjectiveScore.getScore();
|
|
|
+ mainScore = BigDecimalUtils.add(mainScore, subjectiveScore.getScore());
|
|
|
}
|
|
|
for (SubjectiveScore subjectiveScore : mainScoreList) {
|
|
|
subjectiveScore.setMainScore(mainScore);
|
|
@@ -898,7 +905,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
try {
|
|
|
ScoreItem item = detail.get(i);
|
|
|
ScoreItem other = scores.get(i);
|
|
|
- item.setScore(item.getScore() + other.getScore());
|
|
|
+ item.setScore(BigDecimalUtils.add(item.getScore(), other.getScore()));
|
|
|
} catch (Exception e) {
|
|
|
continue;
|
|
|
}
|
|
@@ -1088,17 +1095,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 领取正式评卷任务时,用来区分的唯一标识<br/>
|
|
|
- * 多评时同一个考生的多份任务不能被同一位评卷员领取
|
|
|
- *
|
|
|
- * @param library
|
|
|
- * - 正评任务
|
|
|
- */
|
|
|
- private String getApplyTaskId(MarkLibrary library) {
|
|
|
- return library.getStudentId() + "_" + library.getGroupNumber();
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 领取试评评卷任务时,用来区分的唯一标识
|
|
|
*
|
|
@@ -1109,6 +1105,14 @@ public class MarkServiceImpl implements MarkService {
|
|
|
return library.getId() + "_" + marker.getId();
|
|
|
}
|
|
|
|
|
|
+ private String getGroupKey(MarkGroup group) {
|
|
|
+ return group.getExamId() + "_" + group.getSubjectCode() + "_" + group.getNumber();
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getGroupKey(Marker marker) {
|
|
|
+ return marker.getExamId() + "_" + marker.getSubjectCode() + "_" + marker.getGroupNumber();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 重置评卷分组的连带操作
|
|
|
*
|