|
@@ -31,9 +31,8 @@ import cn.com.qmth.stmms.common.enums.MarkStatus;
|
|
|
|
|
|
/**
|
|
|
* 与评卷相关的所有定时任务
|
|
|
- *
|
|
|
- * @author luoshi
|
|
|
*
|
|
|
+ * @author luoshi
|
|
|
*/
|
|
|
@Component
|
|
|
public class MarkCronService {
|
|
@@ -96,7 +95,7 @@ public class MarkCronService {
|
|
|
public void buildLibrary() {
|
|
|
log.info("start auto-create library");
|
|
|
try {
|
|
|
- Map<String, Campus> campusMap = new HashMap<String, Campus>();
|
|
|
+ Map<String, Campus> campusMap = new HashMap<>();
|
|
|
List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.TRIAL, MarkStatus.FORMAL);
|
|
|
for (Integer examId : examIds) {
|
|
|
buildLibraryByExam(examId, campusMap);
|
|
@@ -130,11 +129,9 @@ public class MarkCronService {
|
|
|
// 获取主观题总分大于0的科目
|
|
|
List<ExamSubject> subjects = subjectService.list(examId, 0);
|
|
|
for (ExamSubject subject : subjects) {
|
|
|
- List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(),
|
|
|
- MarkStatus.FORMAL);
|
|
|
+ List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(), MarkStatus.FORMAL);
|
|
|
for (MarkGroup markGroup : groups) {
|
|
|
- List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(),
|
|
|
- markGroup.getNumber());
|
|
|
+ List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
|
|
|
for (Marker marker : markers) {
|
|
|
try {
|
|
|
markService.updateQuality(marker);
|
|
@@ -151,8 +148,7 @@ public class MarkCronService {
|
|
|
List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
|
|
|
for (ExamSubject subject : subjects) {
|
|
|
// 清除缺考考生和违纪考生
|
|
|
- List<ExamStudent> list = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(),
|
|
|
- subject.getCode());
|
|
|
+ List<ExamStudent> list = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(), subject.getCode());
|
|
|
if (list != null) {
|
|
|
for (ExamStudent student : list) {
|
|
|
try {
|
|
@@ -166,25 +162,26 @@ public class MarkCronService {
|
|
|
}
|
|
|
}
|
|
|
// 处理正常考生
|
|
|
- // 生成正评任务
|
|
|
- List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
|
|
|
- MarkStatus.FORMAL);
|
|
|
- for (MarkGroup group : groups) {
|
|
|
- buildFormalLibrary(subject, campusMap, group);
|
|
|
- }
|
|
|
// 生成试评任务
|
|
|
- groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
|
|
|
- MarkStatus.TRIAL);
|
|
|
+ List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.TRIAL);
|
|
|
for (MarkGroup group : groups) {
|
|
|
buildTrialLibrary(campusMap, group);
|
|
|
}
|
|
|
+ // 生成正评任务
|
|
|
+ // 试评状态的分组也提前生成
|
|
|
+ groups = groupService
|
|
|
+ .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.FORMAL, MarkStatus.TRIAL);
|
|
|
+ for (MarkGroup group : groups) {
|
|
|
+ buildFormalLibrary(subject, campusMap, group);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void buildFormalLibrary(ExamSubject subject, Map<String, Campus> campusMap, MarkGroup group) {
|
|
|
Date lastBuildTime = group.getBuildTime();
|
|
|
- ExamStudent student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber(), lastBuildTime);
|
|
|
+ int count = 0;
|
|
|
+ ExamStudent student = studentService
|
|
|
+ .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
|
|
|
while (student != null) {
|
|
|
// 补充学习中心集合
|
|
|
Campus campus = getCampus(student, campusMap);
|
|
@@ -196,35 +193,40 @@ public class MarkCronService {
|
|
|
try {
|
|
|
lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
lockService.watch(LockType.STUDENT, student.getId());
|
|
|
- // 上锁后重新验证状态
|
|
|
- if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
- MarkStatus.FORMAL)) {
|
|
|
- return;
|
|
|
+ // 上锁后重复验证分组状态
|
|
|
+ if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.FORMAL,
|
|
|
+ MarkStatus.TRIAL)) {
|
|
|
+ break;
|
|
|
}
|
|
|
+ // 上锁后重复验证考生状态
|
|
|
if (studentService.validateStatus(student.getId())) {
|
|
|
markService.buildFormalLibrary(student, campus, group, subject);
|
|
|
- markService.updateLibraryCount(group);
|
|
|
- markService.updateMarkedCount(group);
|
|
|
lastBuildTime = student.getUploadTime();
|
|
|
+ count++;
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
- log.error("build formal library error for studentId=" + student.getId() + ", groupNumber="
|
|
|
- + group.getNumber(), e);
|
|
|
+ log.error("build formal library error for studentId=" + student.getId() + ", groupNumber=" + group.getNumber(), e);
|
|
|
} finally {
|
|
|
lockService.unwatch(LockType.STUDENT, student.getId());
|
|
|
lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
}
|
|
|
// 取下一个考生
|
|
|
- student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
- lastBuildTime);
|
|
|
+ student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
|
|
|
+ }
|
|
|
+ // 有新任务创建,同时正评状态,此时才需要更新任务数量
|
|
|
+ if (count > 0) {
|
|
|
+ group = groupService.findOne(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ if (group.getStatus() == MarkStatus.FORMAL) {
|
|
|
+ markService.updateLibraryCount(group);
|
|
|
+ markService.updateMarkedCount(group);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void buildTrialLibrary(Map<String, Campus> campusMap, MarkGroup group) {
|
|
|
while (group.getTrialCount() > group.getLibraryCount()) {
|
|
|
// 随机取一个未生成试评任务的考生
|
|
|
- ExamStudent student = studentService.randomUnTrialStudent(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
+ ExamStudent student = studentService.randomUnTrialStudent(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
if (student == null) {
|
|
|
return;
|
|
|
}
|
|
@@ -238,19 +240,18 @@ public class MarkCronService {
|
|
|
try {
|
|
|
lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
lockService.watch(LockType.STUDENT, student.getId());
|
|
|
- // 上锁后重新验证状态
|
|
|
- if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
- MarkStatus.TRIAL)) {
|
|
|
- return;
|
|
|
+ // 上锁后重新验证分组状态
|
|
|
+ if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.TRIAL)) {
|
|
|
+ break;
|
|
|
}
|
|
|
+ // 上锁后重复验证考生状态
|
|
|
if (studentService.validateStatus(student.getId())) {
|
|
|
markService.buildTrialLibrary(student, campus, group);
|
|
|
markService.updateLibraryCount(group);
|
|
|
markService.updateMarkedCount(group);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
- log.error("build trial library error for studentId=" + student.getId() + ", groupNumber="
|
|
|
- + group.getNumber(), e);
|
|
|
+ log.error("build trial library error for studentId=" + student.getId() + ", groupNumber=" + group.getNumber(), e);
|
|
|
} finally {
|
|
|
lockService.unwatch(LockType.STUDENT, student.getId());
|
|
|
lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
|