|
@@ -11,6 +11,7 @@ import cn.com.qmth.stmms.ms.core.repository.CheckDataRepo;
|
|
|
import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
|
|
|
import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
|
|
|
import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -24,7 +25,7 @@ import java.util.stream.Collectors;
|
|
|
@Service
|
|
|
public class CheckDataService {
|
|
|
|
|
|
- private static final String SEPARATE = "#";
|
|
|
+ private static final String SEPARATE = "##";
|
|
|
|
|
|
@Resource
|
|
|
SystemConfig systemConfig;
|
|
@@ -54,20 +55,40 @@ public class CheckDataService {
|
|
|
|
|
|
int errorCount = 0;
|
|
|
List<JSONObject> list = null;
|
|
|
+ String content = null;
|
|
|
try {
|
|
|
Long workId = checkData.getWorkId();
|
|
|
if (CheckItemEnum.PAPER_SIZE.equals(checkData.getCheckItem())) {
|
|
|
errorCount = checkPaperSize(workId);
|
|
|
+ if (errorCount > 0) {
|
|
|
+ content = String.format("有%d张图片大小为0", errorCount);
|
|
|
+ }
|
|
|
} else if (CheckItemEnum.ALL_SCORE.equals(checkData.getCheckItem())) {
|
|
|
- errorCount = checkAllScore(workId);
|
|
|
+ Map<String, Long> map = checkAllScore(workId);
|
|
|
+ if (map != null) {
|
|
|
+ errorCount = map.values().stream().mapToInt(Math::toIntExact).sum();
|
|
|
+ }
|
|
|
+ if (errorCount > 0) {
|
|
|
+ StringJoiner stringJoiner = new StringJoiner(";");
|
|
|
+ for (Map.Entry<String, Long> entry : map.entrySet()) {
|
|
|
+ stringJoiner.add(String.format("%s有%d张没有成绩", entry.getKey(), entry.getValue()));
|
|
|
+ }
|
|
|
+ content = stringJoiner.toString();
|
|
|
+ }
|
|
|
} else if (CheckItemEnum.LEVEL_SCORE_MATCH.equals(checkData.getCheckItem())) {
|
|
|
list = checkLevelScoreMatch(workId);
|
|
|
+ errorCount = list.size();
|
|
|
+ content = JSON.toJSONString(list);
|
|
|
} else if (CheckItemEnum.LEVEL_DIFF.equals(checkData.getCheckItem())) {
|
|
|
- list = checkLevelDiff(workId, checkData.getParamValue());
|
|
|
+ list = checkDiff(workId, checkData.getParamValue(), true);
|
|
|
+ errorCount = list.size();
|
|
|
+ content = JSON.toJSONString(list);
|
|
|
} else if (CheckItemEnum.SCORE_DIFF.equals(checkData.getCheckItem())) {
|
|
|
- list = checkScoreDiff(workId, checkData.getParamValue());
|
|
|
+ list = checkDiff(workId, checkData.getParamValue(), false);
|
|
|
+ errorCount = list.size();
|
|
|
+ content = JSON.toJSONString(list);
|
|
|
} else {
|
|
|
- throw new Exception("没有此类型任务");
|
|
|
+ throw new RuntimeException("没有此类型任务");
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
@@ -75,9 +96,7 @@ public class CheckDataService {
|
|
|
checkData.setStatus(CheckDataStatusEnum.FINISH);
|
|
|
checkData.setResult(errorCount == 0);
|
|
|
checkData.setErrorCount(errorCount);
|
|
|
- if (list != null && list.size() > 0) {
|
|
|
- checkData.setContent(JSONObject.toJSONString(list));
|
|
|
- }
|
|
|
+ checkData.setContent(content);
|
|
|
checkData.setEndTime(new Date());
|
|
|
checkDataRepo.saveAndFlush(checkData);
|
|
|
}
|
|
@@ -106,7 +125,7 @@ public class CheckDataService {
|
|
|
|
|
|
private int getZeroCount(int count, File fileDir) {
|
|
|
List<File> files = getAllFile(fileDir);
|
|
|
- if (files != null && files.size() > 0) {
|
|
|
+ if (!files.isEmpty()) {
|
|
|
int zeroCount = Math.toIntExact(files.stream().filter(m -> m.length() == 0).count());
|
|
|
count = count + zeroCount;
|
|
|
}
|
|
@@ -118,12 +137,12 @@ public class CheckDataService {
|
|
|
*
|
|
|
* @param workId 工作ID
|
|
|
*/
|
|
|
- private int checkAllScore(Long workId) {
|
|
|
+ private Map<String, Long> checkAllScore(Long workId) {
|
|
|
List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
|
|
|
- if (paperList != null && paperList.size() > 0) {
|
|
|
- return Math.toIntExact(paperList.stream().filter(m -> m.getScore() == null).count());
|
|
|
+ if (paperList != null && !paperList.isEmpty()) {
|
|
|
+ return paperList.stream().filter(m -> m.getScore() == null).collect(Collectors.groupingBy(m -> m.getSubject().name(), Collectors.counting()));
|
|
|
}
|
|
|
- return 0;
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -132,37 +151,55 @@ public class CheckDataService {
|
|
|
* @param workId 工作ID
|
|
|
*/
|
|
|
private List<JSONObject> checkLevelScoreMatch(Long workId) {
|
|
|
+ List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
|
|
|
List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
|
|
|
List<JSONObject> list = new ArrayList<>();
|
|
|
- if (paperList != null && paperList.size() > 0) {
|
|
|
- // 有未打分的,算未匹配
|
|
|
- List<Paper> papers = paperList.stream().filter(m -> m.getScore() == null).collect(Collectors.toList());
|
|
|
- if (papers.size() > 0) {
|
|
|
- list = papers.stream().map(p -> {
|
|
|
- JSONObject object = new JSONObject();
|
|
|
- object.put("examNumber", p.getExamNumber());
|
|
|
- object.put("studentName", p.getStudentName());
|
|
|
- return object;
|
|
|
- }).collect(Collectors.toList());
|
|
|
- } else {
|
|
|
- //分档、打分完成后,做匹配校验
|
|
|
- List<Level> levels = levelRepo.findByWorkId(workId);
|
|
|
- Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
|
|
|
+ if (paperList != null && !paperList.isEmpty()) {
|
|
|
+ // 多科目,先按准考证号+考生姓名分组
|
|
|
+ Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
|
|
|
+ List<Level> levels = levelRepo.findByWorkId(workId);
|
|
|
+ Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
|
|
|
+ for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
|
|
|
+ String key = entry.getKey();
|
|
|
+ String[] strings = key.split(SEPARATE);
|
|
|
+ List<Paper> papers = entry.getValue();
|
|
|
+ StringJoiner stringJoiner = new StringJoiner(";");
|
|
|
+ // 每个科目做比较
|
|
|
+ List<String> subjectsAll = markSubjects.stream().map(m -> m.getSubject().name()).collect(Collectors.toList());
|
|
|
+ papers.forEach(paper -> {
|
|
|
+ String subject = paper.getSubject().name();
|
|
|
+ subjectsAll.remove(subject);
|
|
|
+ // 未分档
|
|
|
+ if (paper.getLevel() == null) {
|
|
|
+ stringJoiner.add(subject + "未分档");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 未打分
|
|
|
+ if (paper.getScore() == null) {
|
|
|
+ stringJoiner.add(subject + "未打分");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Level level = levelMap.get(paper.getLevel());
|
|
|
+ if (level == null) {
|
|
|
+ stringJoiner.add("档位" + paper.getLevel() + "不存在");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 已分档并打分,进行校验
|
|
|
+ if (paper.getScore().intValue() <= level.getMinScore() || paper.getScore().intValue() >= level.getMaxScore()) {
|
|
|
+ stringJoiner.add(String.format("%s档位[%s]分数[%s]不匹配", subject, paper.getLevel(), paper.getScore()));
|
|
|
+ }
|
|
|
+ });
|
|
|
|
|
|
- list = paperList.stream().filter(p -> {
|
|
|
- // 未分档的,不参与统计
|
|
|
- if (p.getLevel() == null) {
|
|
|
- return false;
|
|
|
+ // 未采集
|
|
|
+ if (!subjectsAll.isEmpty()) {
|
|
|
+ for (String subject : subjectsAll) {
|
|
|
+ stringJoiner.add(subject + "未采集");
|
|
|
}
|
|
|
- Level level = levelMap.get(p.getLevel());
|
|
|
- // 正常范围,是左开右闭
|
|
|
- return p.getScore().intValue() <= level.getMinScore() || p.getScore().intValue() >= level.getMaxScore();
|
|
|
- }).map(p -> {
|
|
|
- JSONObject object = new JSONObject();
|
|
|
- object.put("examNumber", p.getExamNumber());
|
|
|
- object.put("studentName", p.getStudentName());
|
|
|
- return object;
|
|
|
- }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (stringJoiner.toString().length() > 1) {
|
|
|
+ list.add(assembleErrorData(strings[0], strings[1], stringJoiner.toString()));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
return list;
|
|
@@ -173,66 +210,41 @@ public class CheckDataService {
|
|
|
*
|
|
|
* @param workId 工作ID
|
|
|
* @param paramValue 变量参数值
|
|
|
+ * @param isLevel 是否校验档位
|
|
|
*/
|
|
|
- private List<JSONObject> checkLevelDiff(Long workId, int paramValue) {
|
|
|
+ private List<JSONObject> checkDiff(Long workId, int paramValue, boolean isLevel) {
|
|
|
List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
|
|
|
-
|
|
|
- List<Level> levels = levelRepo.findByWorkId(workId);
|
|
|
- Map<String, Level> levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
|
|
|
-
|
|
|
- List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
|
|
|
- Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
|
|
|
- List<JSONObject> list = new ArrayList<>();
|
|
|
- for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
|
|
|
- String key = entry.getKey();
|
|
|
- List<Paper> papers = entry.getValue();
|
|
|
- // 只考部分科目,校验不通过
|
|
|
- if (papers.size() != markSubjects.size()) {
|
|
|
- list.add(assembleErrorData(key, "只考" + papers.size() + "科"));
|
|
|
- } else {
|
|
|
- long noLevel = papers.stream().filter(m -> m.getLevel() == null).count();
|
|
|
- if (noLevel > 0) {
|
|
|
- list.add(assembleErrorData(key, "有" + noLevel + "科未分档"));
|
|
|
- } else {
|
|
|
- List<Integer> integers = papers.stream().map(m -> levelMap.get(m.getLevel()).getLevelValue()).collect(Collectors.toList());
|
|
|
- // true为校验通过,false为不通过
|
|
|
- boolean checkFlag = calcDiff(integers, paramValue);
|
|
|
- if (!checkFlag) {
|
|
|
- list.add(assembleErrorData(key, "最大差值大于" + paramValue));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ Map<String, Level> levelMap = new HashMap<>();
|
|
|
+ if (isLevel) {
|
|
|
+ List<Level> levels = levelRepo.findByWorkId(workId);
|
|
|
+ levelMap = levels.stream().collect(Collectors.toMap(Level::getCode, Function.identity()));
|
|
|
}
|
|
|
- return list;
|
|
|
- }
|
|
|
|
|
|
- /**
|
|
|
- * 同一考生各科目成绩差
|
|
|
- *
|
|
|
- * @param workId 工作ID
|
|
|
- * @param paramValue 变量参数值
|
|
|
- */
|
|
|
- private List<JSONObject> checkScoreDiff(Long workId, int paramValue) {
|
|
|
- List<MarkSubject> markSubjects = markSubjectRepo.findAllByWorkIdAndEnableTrue(workId);
|
|
|
List<Paper> paperList = paperRepo.findByWorkIdAndIsMissing(workId, false);
|
|
|
Map<String, List<Paper>> collect = paperList.stream().collect(Collectors.groupingBy(m -> m.getExamNumber() + SEPARATE + m.getStudentName()));
|
|
|
List<JSONObject> list = new ArrayList<>();
|
|
|
for (Map.Entry<String, List<Paper>> entry : collect.entrySet()) {
|
|
|
String key = entry.getKey();
|
|
|
+ String[] strings = key.split(SEPARATE);
|
|
|
List<Paper> papers = entry.getValue();
|
|
|
// 只考部分科目,校验不通过
|
|
|
if (papers.size() != markSubjects.size()) {
|
|
|
- list.add(assembleErrorData(key, "只考" + papers.size() + "科"));
|
|
|
+ list.add(assembleErrorData(strings[0], strings[1], "只考" + papers.size() + "科,无法校验"));
|
|
|
} else {
|
|
|
- long noScore = papers.stream().filter(m -> m.getLevel() != null && m.getScore() == null).count();
|
|
|
- if (noScore > 0) {
|
|
|
- list.add(assembleErrorData(key, "有" + noScore + "科已分档未打分"));
|
|
|
+ long noLevel = papers.stream().filter(m -> isLevel ? m.getLevel() == null : m.getScore() == null).count();
|
|
|
+ if (noLevel > 0) {
|
|
|
+ list.add(assembleErrorData(strings[0], strings[1], "有" + noLevel + "科未" + (isLevel ? "分档" : "打分") + ",无法校验"));
|
|
|
} else {
|
|
|
- List<Integer> integers = papers.stream().map(m -> m.getScore().intValue()).collect(Collectors.toList());
|
|
|
- // true为校验通过,false为不通过
|
|
|
- boolean checkFlag = calcDiff(integers, paramValue);
|
|
|
- if (!checkFlag) {
|
|
|
- list.add(assembleErrorData(key, "最大差值大于" + paramValue));
|
|
|
+ Map<String, Level> finalLevelMap = levelMap;
|
|
|
+ Map<String, Integer> integersMap = papers.stream().collect(Collectors.toMap(m -> m.getSubject().name(), m -> isLevel ? finalLevelMap.get(m.getLevel()).getLevelValue() : m.getScore().intValue()));
|
|
|
+ // 校验详情
|
|
|
+ Map<String[], Integer> map = calcDiff(integersMap, paramValue);
|
|
|
+ if (!map.isEmpty()) {
|
|
|
+ StringJoiner stringJoiner = new StringJoiner(";");
|
|
|
+ for (Map.Entry<String[], Integer> integerEntry : map.entrySet()) {
|
|
|
+ stringJoiner.add(String.format("%s相差%d", Arrays.toString(integerEntry.getKey()), integerEntry.getValue()));
|
|
|
+ }
|
|
|
+ list.add(assembleErrorData(strings[0], strings[1], stringJoiner.toString()));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -243,36 +255,38 @@ public class CheckDataService {
|
|
|
/**
|
|
|
* 计算差值
|
|
|
*
|
|
|
- * @param integers 值集合
|
|
|
- * @param paramValue 变量
|
|
|
+ * @param integersMap 值
|
|
|
+ * @param paramValue 变量
|
|
|
* @return true为通过,false为不通过
|
|
|
*/
|
|
|
- private boolean calcDiff(List<Integer> integers, int paramValue) {
|
|
|
- List<Integer> diffList = new ArrayList<>();
|
|
|
- for (int i = 0; i < integers.size(); i++) {
|
|
|
- for (int j = i; j < integers.size(); j++) {
|
|
|
+ private Map<String[], Integer> calcDiff(Map<String, Integer> integersMap, int paramValue) {
|
|
|
+ Map<String[], Integer> map = new HashMap<>();
|
|
|
+ List<String> stringList = new ArrayList<>(integersMap.keySet());
|
|
|
+ for (int i = 0; i < stringList.size(); i++) {
|
|
|
+ for (int j = i; j < stringList.size(); j++) {
|
|
|
if (i != j) {
|
|
|
- int diffValue = Math.abs(integers.get(i) - integers.get(j));
|
|
|
- diffList.add(diffValue);
|
|
|
+ int diffValue = Math.abs(integersMap.get(stringList.get(i)) - integersMap.get(stringList.get(j)));
|
|
|
+ if (diffValue > paramValue) {
|
|
|
+ String[] key = {stringList.get(i), stringList.get(j)};
|
|
|
+ map.put(key, diffValue);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // A和C,差值为2,若paramValue=2,不通过,返回false,paramValue = 1,通过,返回true
|
|
|
- int maxDiff = diffList.stream().max(Comparator.comparing(i -> i)).get();
|
|
|
- return maxDiff < paramValue;
|
|
|
+ return map;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 组装错误信息
|
|
|
*
|
|
|
- * @param key 分组key(准考证号#考生姓名)
|
|
|
+ * @param examNumber 准考证号
|
|
|
+ * @param studentName 考生姓名
|
|
|
* @param errorMessage 错误信息
|
|
|
*/
|
|
|
- private JSONObject assembleErrorData(String key, String errorMessage) {
|
|
|
+ private JSONObject assembleErrorData(String examNumber, String studentName, String errorMessage) {
|
|
|
JSONObject object = new JSONObject();
|
|
|
- String[] strings = key.split(SEPARATE);
|
|
|
- object.put("examNumber", strings[0]);
|
|
|
- object.put("studentName", strings[1]);
|
|
|
+ object.put("examNumber", examNumber);
|
|
|
+ object.put("studentName", studentName);
|
|
|
object.put("errorMessage", errorMessage);
|
|
|
return object;
|
|
|
}
|
|
@@ -283,15 +297,15 @@ public class CheckDataService {
|
|
|
* @param dirFile 文件夹
|
|
|
*/
|
|
|
public static List<File> getAllFile(File dirFile) {
|
|
|
+ List<File> files = new ArrayList<>();
|
|
|
// 如果文件夹不存在或着不是文件夹,则返回 null
|
|
|
if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile())
|
|
|
- return null;
|
|
|
+ return files;
|
|
|
|
|
|
File[] childrenFiles = dirFile.listFiles();
|
|
|
if (Objects.isNull(childrenFiles) || childrenFiles.length == 0)
|
|
|
- return null;
|
|
|
+ return files;
|
|
|
|
|
|
- List<File> files = new ArrayList<>();
|
|
|
for (File childFile : childrenFiles) {
|
|
|
|
|
|
// 如果时文件,直接添加到结果集合
|
|
@@ -300,7 +314,7 @@ public class CheckDataService {
|
|
|
} else {
|
|
|
// 如果是文件夹,则将其内部文件添加进结果集合
|
|
|
List<File> cFiles = getAllFile(childFile);
|
|
|
- if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
|
|
|
+ if (cFiles.isEmpty()) {
|
|
|
continue;
|
|
|
}
|
|
|
files.addAll(cFiles);
|