|
@@ -1,6 +1,5 @@
|
|
|
package cn.com.qmth.stmms.ms.marking.service;
|
|
|
|
|
|
-import cn.com.qmth.stmms.ms.commons.utils.RandomUtil;
|
|
|
import cn.com.qmth.stmms.ms.commons.utils.SqlUtil;
|
|
|
import cn.com.qmth.stmms.ms.core.cache.ParamCache;
|
|
|
import cn.com.qmth.stmms.ms.core.domain.*;
|
|
@@ -11,6 +10,7 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
|
|
|
import cn.com.qmth.stmms.ms.core.domain.user.MarkerGroup;
|
|
|
import cn.com.qmth.stmms.ms.core.domain.user.Role;
|
|
|
import cn.com.qmth.stmms.ms.core.repository.*;
|
|
|
+import cn.com.qmth.stmms.ms.marking.utils.RandomUtil;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -70,9 +70,6 @@ public class AssignTaskService {
|
|
|
long currentTime = System.currentTimeMillis();
|
|
|
List<MarkTaskRoughLevel> markTaskLevelList = new ArrayList<>();
|
|
|
List<Paper> paperList = new ArrayList<>();
|
|
|
- List<Object[]> markTasks = markTaskRoughLevelRepo.findAllByWorkId(markSubject.getWorkId());
|
|
|
- Map<Long, Object> randomMap = new HashMap<>();
|
|
|
- markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
|
|
|
// 解析粗档位
|
|
|
List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
List<RoughLevel> roughLevels = DetermineRoughLevelService.parseRoughLevels(levels);
|
|
@@ -81,14 +78,18 @@ public class AssignTaskService {
|
|
|
for (Map.Entry<Long, List<Paper>> entry : groupPaperMap.entrySet()) {
|
|
|
Long groupId = entry.getKey();
|
|
|
List<Paper> papers = entry.getValue();
|
|
|
-
|
|
|
- for (Paper paper : papers) {
|
|
|
+ papers.forEach(paper -> {
|
|
|
int markerCount = 0;
|
|
|
Set<MarkUser> markUsers = groupMap.get(groupId).getMarkers();
|
|
|
markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
|
|
|
for (MarkUser marker : markUsers) {
|
|
|
markerCount++;
|
|
|
- Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
|
|
|
+ Long random = null;
|
|
|
+ try {
|
|
|
+ random = randomUtil.randomRoughLevel(marker.getWorkId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
MarkTaskRoughLevel markTask;
|
|
|
if (paper.isRoughSample() && paper.getRoughLevel() != null) {
|
|
|
Optional<RoughLevel> optional = roughLevels.stream().filter(m -> m.getRoughCode().equals(paper.getRoughLevel())).findFirst();
|
|
@@ -108,14 +109,12 @@ public class AssignTaskService {
|
|
|
markTask.setBatchNo(currentTime);
|
|
|
|
|
|
markTaskLevelList.add(markTask);
|
|
|
- randomMap.put(random, markTask);
|
|
|
}
|
|
|
paper.setRoughBatchNo(currentTime);
|
|
|
paperList.add(paper);
|
|
|
- }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
-
|
|
|
List<MarkTaskRoughLevel> data = new ArrayList<>();
|
|
|
//5000条提交一次
|
|
|
for (MarkTaskRoughLevel markTask : markTaskLevelList) {
|
|
@@ -129,6 +128,7 @@ public class AssignTaskService {
|
|
|
if (!data.isEmpty()) {
|
|
|
markTaskRoughLevelRepo.save(data);
|
|
|
}
|
|
|
+
|
|
|
paperRepo.save(paperList);
|
|
|
}
|
|
|
|
|
@@ -161,7 +161,7 @@ public class AssignTaskService {
|
|
|
markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
|
|
|
for (MarkUser marker : markUsers) {
|
|
|
markerCount++;
|
|
|
- Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
|
|
|
+ Long random = randomUtil.randomLevel(marker.getWorkId());
|
|
|
MarkTaskLevel markTask;
|
|
|
if (paper.isSample() && paper.getLevel() != null) {
|
|
|
Level level = levels.stream().filter(m -> m.getCode().equals(paper.getLevel())).findFirst().orElseGet(null);
|
|
@@ -222,9 +222,6 @@ public class AssignTaskService {
|
|
|
Iterator<Paper> iterator = papers.iterator();
|
|
|
List<MarkTaskScore> markTaskScoreList = new ArrayList<>(papers.size() * sum);
|
|
|
List<Paper> paperList = new ArrayList<>(papers.size());
|
|
|
- List<Object[]> markTasks = markTaskScoreRepo.findAllByWorkId(markSubject.getWorkId());
|
|
|
- Map<Long, Object> randomMap = new HashMap<>();
|
|
|
- markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
|
|
|
List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
|
|
|
//定序序号记录
|
|
@@ -263,7 +260,7 @@ public class AssignTaskService {
|
|
|
Set<MarkUser> markUsers = markerGroups.get(idx).getMarkers();
|
|
|
markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
|
|
|
for (MarkUser marker : markUsers) {
|
|
|
- Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
|
|
|
+ Long random = randomUtil.randomScore(marker.getWorkId());
|
|
|
MarkTaskScore markTask = new MarkTaskScore(marker, paper, markSubject.getStage(), random, markSubject.getTest());
|
|
|
String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
|
|
|
if (Objects.nonNull(serialNumber)) {
|
|
@@ -279,7 +276,6 @@ public class AssignTaskService {
|
|
|
markTask.setLevel(paper.getLevel());
|
|
|
|
|
|
markTaskScoreList.add(markTask);
|
|
|
- randomMap.put(random, markTask);
|
|
|
}
|
|
|
paper.setScoreBatchNo(currentTime);
|
|
|
paperList.add(paper);
|
|
@@ -302,163 +298,6 @@ public class AssignTaskService {
|
|
|
paperRepo.save(paperList);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 分组任务模式,将该科目的评卷员分成N组,将该科目试卷平均分给这些组,每组内的评卷员每人将这些试卷打分
|
|
|
- * 比如:6个评卷员分2组,有1000份试卷,每组评500份,每个评卷员评500份
|
|
|
- *
|
|
|
- * @param papers 试卷
|
|
|
- * @param markerGroups 分组
|
|
|
- * @param markSubject 科目
|
|
|
- * @param taskList 打分任务
|
|
|
- */
|
|
|
- @Transactional
|
|
|
- public void assignForGrouping(List<Paper> papers, List<MarkerGroup> markerGroups, MarkSubject markSubject, List<TaskPublishSetting> taskList) throws Exception {
|
|
|
- markerGroups = markerGroups.stream().filter(m -> m.getMarkers() != null && !m.getMarkers().isEmpty()).collect(Collectors.toList());
|
|
|
- int sum = markerGroups.stream().mapToInt(m -> m.getMarkers().size()).sum();
|
|
|
- int groupSize = markerGroups.size();
|
|
|
- int idx = 0;
|
|
|
- long currentTime = System.currentTimeMillis();
|
|
|
- Iterator<Paper> iterator = papers.iterator();
|
|
|
- List<MarkTaskLevel> markTaskLevelList = new ArrayList<>(papers.size() * sum);
|
|
|
- List<MarkTaskScore> markTaskScoreList = new ArrayList<>(papers.size() * sum);
|
|
|
- List<Paper> paperList = new ArrayList<>(papers.size());
|
|
|
- List<Object[]> markTasks = new ArrayList<>();
|
|
|
- if (MarkStage.ROUGH_LEVEL.equals(markSubject.getStage())) {
|
|
|
- markTasks = markTaskRoughLevelRepo.findAllByWorkId(markSubject.getWorkId());
|
|
|
- } else if (MarkStage.LEVEL.equals(markSubject.getStage())) {
|
|
|
- markTasks = markTaskLevelRepo.findAllByWorkId(markSubject.getWorkId());
|
|
|
- } else if (MarkStage.SCORE.equals(markSubject.getStage())) {
|
|
|
- markTasks = markTaskScoreRepo.findAllByWorkId(markSubject.getWorkId());
|
|
|
- }
|
|
|
- Map<Long, Object> randomMap = new HashMap<>();
|
|
|
- markTasks.forEach(m -> randomMap.put(Long.valueOf(m[1].toString()), m[0]));
|
|
|
- List<Level> levels = levelRepo.findByWorkId(markSubject.getWorkId());
|
|
|
- Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, l -> l));
|
|
|
- //定序序号记录
|
|
|
- Map<String, Integer> map = new HashMap();
|
|
|
- Map<String, Integer> seqNewMap = new HashMap();
|
|
|
- while (iterator.hasNext()) {
|
|
|
- if (idx >= groupSize) {
|
|
|
- idx = 0;
|
|
|
- }
|
|
|
- Paper paper = iterator.next();
|
|
|
- String serialNumber = null;
|
|
|
- Integer displayNumber = null;
|
|
|
- Integer seqNewNumber = null;
|
|
|
- if (Objects.equals(MarkStage.SCORE, markSubject.getStage())) {
|
|
|
- //是否定序
|
|
|
- int seq = 0;
|
|
|
- long sortRule = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getSortRule() == 1).count();
|
|
|
- if (sortRule != 0) {
|
|
|
- if (map.containsKey(paper.getLevel() + idx)) {
|
|
|
- seq = map.get(paper.getLevel() + idx);
|
|
|
- }
|
|
|
- ++seq;
|
|
|
- serialNumber = paper.getLevel() + seq;
|
|
|
- //是否显示序号
|
|
|
- long display = taskList.stream().filter(m -> Objects.equals(m.getCode(), paper.getLevel()) && m.getDisplayNumber() == 1).count();
|
|
|
- displayNumber = (int) display;
|
|
|
- //设置新值
|
|
|
- map.put(paper.getLevel() + idx, seq);
|
|
|
-
|
|
|
- int seqNew = 0;
|
|
|
- if (seqNewMap.containsKey(paper.getLevel())) {
|
|
|
- seqNew = seqNewMap.get(paper.getLevel());
|
|
|
- }
|
|
|
- seqNewNumber = ++seqNew;
|
|
|
- seqNewMap.put(paper.getLevel(), seqNew);
|
|
|
- }
|
|
|
- }
|
|
|
- int markerCount = 0;
|
|
|
- Set<MarkUser> markUsers = markerGroups.get(idx).getMarkers();
|
|
|
- markUsers = markUsers.stream().filter(m -> Role.MARKER.equals(m.getRole())).collect(Collectors.toSet());
|
|
|
- for (MarkUser marker : markUsers) {
|
|
|
- markerCount++;
|
|
|
- Long random = randomUtil.getRandom(marker.getWorkId(), randomMap);
|
|
|
- if (Objects.equals(MarkStage.LEVEL, markSubject.getStage())) {
|
|
|
- MarkTaskLevel markTask = null;
|
|
|
- if (paper.isSample() && paper.getLevel() != null) {
|
|
|
- Level level = levelRepo.findByWorkIdAndCode(markSubject.getWorkId(), paper.getLevel());
|
|
|
- markTask = new MarkTaskLevel(marker, paper, level, markSubject.getStage(), random, markSubject.getTest());
|
|
|
-
|
|
|
- // 初始化排序值
|
|
|
- if (markerCount == markerGroups.get(idx).getMarkers().size()) {
|
|
|
- paper.setSortNum(level.getWeight() * markerCount);
|
|
|
- }
|
|
|
- } else {
|
|
|
- markTask = new MarkTaskLevel(marker, paper, markSubject.getStage(), random, markSubject.getTest());
|
|
|
- }
|
|
|
- markTask.setBatchNo(currentTime);
|
|
|
-
|
|
|
- markTaskLevelList.add(markTask);
|
|
|
- randomMap.put(random, markTask);
|
|
|
- } else {
|
|
|
- MarkTaskScore markTask = new MarkTaskScore(marker, paper, markSubject.getStage(), random, markSubject.getTest());
|
|
|
- String levelValue = String.valueOf(levelMap.get(paper.getLevel()).getLevelValue() + 1);
|
|
|
- if (Objects.nonNull(serialNumber)) {
|
|
|
- //和随机数位数保持一致(8位)
|
|
|
- String randomSeqNew = String.format("%08d", seqNewNumber);
|
|
|
- markTask.setRandomSeqNew(Long.valueOf(levelValue + randomSeqNew));
|
|
|
- } else {
|
|
|
- markTask.setRandomSeqNew(Long.valueOf(levelValue + markTask.getRandomSeqNew()));
|
|
|
- }
|
|
|
- markTask.setBatchNo(currentTime);
|
|
|
- markTask.setSerialNumber(serialNumber);
|
|
|
- markTask.setDisplayNumber(displayNumber);
|
|
|
- markTask.setLevel(paper.getLevel());
|
|
|
-
|
|
|
- markTaskScoreList.add(markTask);
|
|
|
- randomMap.put(random, markTask);
|
|
|
- }
|
|
|
- }
|
|
|
- if (markSubject.getTest() != 1) {
|
|
|
- if (MarkStage.LEVEL.equals(markSubject.getStage())) {
|
|
|
- paper.setBatchNo(currentTime);
|
|
|
- paperList.add(paper);
|
|
|
- }
|
|
|
- if (MarkStage.SCORE.equals(markSubject.getStage())) {
|
|
|
- paper.setScoreBatchNo(currentTime);
|
|
|
- paperList.add(paper);
|
|
|
- }
|
|
|
- } else {
|
|
|
- paper.setBatchNo(currentTime);
|
|
|
- paperList.add(paper);
|
|
|
- }
|
|
|
- idx++;
|
|
|
- }
|
|
|
-
|
|
|
- if (MarkStage.LEVEL.equals(markSubject.getStage())) {
|
|
|
- List<MarkTaskLevel> data = new ArrayList<>();
|
|
|
- //5000条提交一次
|
|
|
- for (MarkTaskLevel markTask : markTaskLevelList) {
|
|
|
- if (data.size() == 2000) {
|
|
|
- markTaskLevelRepo.save(data);
|
|
|
- data.clear();
|
|
|
- }
|
|
|
- data.add(markTask);
|
|
|
- }
|
|
|
- //将剩下的数据也导入
|
|
|
- if (!data.isEmpty()) {
|
|
|
- markTaskLevelRepo.save(data);
|
|
|
- }
|
|
|
- } else if (MarkStage.SCORE.equals(markSubject.getStage())) {
|
|
|
- List<MarkTaskScore> data = new ArrayList<>();
|
|
|
- //5000条提交一次
|
|
|
- for (MarkTaskScore markTask : markTaskScoreList) {
|
|
|
- if (data.size() == 2000) {
|
|
|
- markTaskScoreRepo.save(data);
|
|
|
- data.clear();
|
|
|
- }
|
|
|
- data.add(markTask);
|
|
|
- }
|
|
|
- //将剩下的数据也导入
|
|
|
- if (!data.isEmpty()) {
|
|
|
- markTaskScoreRepo.save(data);
|
|
|
- }
|
|
|
- }
|
|
|
- paperRepo.save(paperList);
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 生成打分汇总数据
|
|
|
*
|
|
@@ -576,7 +415,6 @@ public class AssignTaskService {
|
|
|
* @param papersList 试卷集合
|
|
|
* @param groupPaperMap 分组考生名单
|
|
|
* @param taskCount 任务数量
|
|
|
- * @param stage
|
|
|
*/
|
|
|
private void randomTaskList(List<Paper> papersList, Map<Long, List<Paper>> groupPaperMap, int taskCount, MarkSubject markSubject) {
|
|
|
|