|
@@ -40,6 +40,10 @@ public class PaperResultService {
|
|
|
private MatterService matterService;
|
|
|
@Resource
|
|
|
private PaperCountService paperCountService;
|
|
|
+ @Resource
|
|
|
+ private ScoreSegmentService scoreSegmentService;
|
|
|
+ @Resource
|
|
|
+ private SubjectService subjectService;
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(PaperResultService.class);
|
|
|
|
|
@@ -199,11 +203,10 @@ public class PaperResultService {
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 能力分数
|
|
|
- *
|
|
|
- * @param result 提交的试卷
|
|
|
- * @param paper 试卷
|
|
|
- * @return {"计算能力":4.22,"转化能力":2.1}
|
|
|
+ * 各能力分数,10分制
|
|
|
+ * {
|
|
|
+ * "计算能力":"10.0"
|
|
|
+ * }
|
|
|
*/
|
|
|
public String abilityScore(PaperResult result, Paper paper) {
|
|
|
|
|
@@ -213,11 +216,14 @@ public class PaperResultService {
|
|
|
// Map<String, Set<Integer>> codeNumber = new HashMap<>();
|
|
|
|
|
|
//Map<code,score> 各能力分数
|
|
|
- Map<String, Double> codeScore = new HashMap<>();
|
|
|
+ Map<String, Double> codeScore = new LinkedHashMap<>();
|
|
|
//初始化能力分数
|
|
|
abilityCodes.keySet().forEach(e -> codeScore.put(e, 0d));
|
|
|
|
|
|
- paper.getQuestions().forEach(q -> {
|
|
|
+ for (Question q : paper.getQuestions()) {
|
|
|
+ if (!collectQuestion.contains(q.getNumber())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
String jsonScore = q.getJsonScore();
|
|
|
Map<String, Double> scores = ObjectUtil.json2Map(jsonScore);
|
|
|
// scores.forEach((code, score) -> {
|
|
@@ -228,20 +234,20 @@ public class PaperResultService {
|
|
|
// }
|
|
|
// });
|
|
|
//如果这题做对了 分数累加
|
|
|
- if (collectQuestion.contains(q.getNumber())) {
|
|
|
- for (Map.Entry<String, Double> e : codeScore.entrySet()) {
|
|
|
- e.setValue(e.getValue() + scores.get(e.getKey()));
|
|
|
- }
|
|
|
+ for (Map.Entry<String, Double> e : codeScore.entrySet()) {
|
|
|
+ e.setValue(e.getValue() + scores.get(e.getKey()));
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
+ ;
|
|
|
|
|
|
//获取试卷的分数
|
|
|
Map<String, Double> paperJsonScore = ObjectUtil.json2Map(paper.getJsonScore());
|
|
|
Map<String, Double> d = new HashMap<>();
|
|
|
- //将分数转化为最大值为5
|
|
|
+ //将分数转化为最大值为10
|
|
|
for (Map.Entry<String, Double> e : codeScore.entrySet()) {
|
|
|
double s = e.getValue();
|
|
|
- double score = NumberUtil.format(5 * s * 100.0 / paperJsonScore.get(e.getKey()));
|
|
|
+ //改成10分制
|
|
|
+ double score = NumberUtil.format(10 * s * 100.0 / paperJsonScore.get(e.getKey()));
|
|
|
d.put(abilityCodes.get(e.getKey()), score);
|
|
|
}
|
|
|
return ObjectUtil.object2Json(d);
|
|
@@ -249,11 +255,13 @@ public class PaperResultService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 章节掌握情况
|
|
|
- *
|
|
|
- * @param result 提交的试卷
|
|
|
- * @param paper 试卷
|
|
|
- * @return [[1, 2, 0], [0, 0, 1]]
|
|
|
+ * 以章节为单位各知识点接受程度
|
|
|
+ * 0 未掌握
|
|
|
+ * 1 半掌握
|
|
|
+ * 2 已掌握
|
|
|
+ * [
|
|
|
+ * [1,1],[0,1,2]
|
|
|
+ * ]
|
|
|
*/
|
|
|
public String knowledgeAcceptanceLevel(PaperResult result, Paper paper) {
|
|
|
List<List<Integer>> keepStatus = new ArrayList<>();
|
|
@@ -280,6 +288,13 @@ public class PaperResultService {
|
|
|
return ObjectUtil.object2Json(keepStatus);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 各章节掌握率
|
|
|
+ * {
|
|
|
+ * "预备章节":0,
|
|
|
+ * "第一章":88.8,
|
|
|
+ * }
|
|
|
+ */
|
|
|
public String chapterRate(PaperResult result, Paper paper) {
|
|
|
//Map<chapter,rate> 章节掌握率
|
|
|
Map<String, Double> chapterKeepRate = new LinkedHashMap<>();
|
|
@@ -311,6 +326,17 @@ public class PaperResultService {
|
|
|
return ObjectUtil.object2Json(chapterKeepRate);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * {
|
|
|
+ * "第一章":[{
|
|
|
+ * "chapter":"1",
|
|
|
+ * "number":1,
|
|
|
+ * "knowledgeName":"⼩学⽔平计算",
|
|
|
+ * "matter":"计算出错,学习动力问题"
|
|
|
+ * }]
|
|
|
+ * }
|
|
|
+ */
|
|
|
public Map<String, List<KnowledgeKeepVo>> knowledgeKeepStatus(PaperResult result, Paper paper) {
|
|
|
//Map<chapter,List<KnowledgeKeepVo>>
|
|
|
Map<String, List<KnowledgeKeepVo>> knowledgeKeepStatus = new LinkedHashMap<>();
|
|
@@ -401,12 +427,26 @@ public class PaperResultService {
|
|
|
return ObjectUtil.object2Json(useTime);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 各题目答题时间
|
|
|
+ * [50,20]
|
|
|
+ */
|
|
|
public String avgUseTime(Paper paper) {
|
|
|
paperCountService.updateAvgCommitTime(paper);
|
|
|
PaperCount count = paperCountService.findByPid(paper.getId());
|
|
|
return count.getUseTimeAgvRate();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 模块作答详情
|
|
|
+ * {
|
|
|
+ * "1":{
|
|
|
+ * "collectInfo":"43/50",
|
|
|
+ * "useTime":"30:00/30:00",
|
|
|
+ * "score":35
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
public String sectionInfo(PaperResult result, Paper paper) {
|
|
|
//TODO 按模块输出答题情况
|
|
|
SectionInfoVo vo1 = new SectionInfoVo("模块一", "43/50", "23:00/30:00", 35d);
|
|
@@ -419,6 +459,18 @@ public class PaperResultService {
|
|
|
return ObjectUtil.object2Json(list);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 每章节能力掌握情况
|
|
|
+ * {
|
|
|
+ * "第一章":[{
|
|
|
+ * "chapter":1,
|
|
|
+ * "knowledgeContent":"1.10 因数和倍数"
|
|
|
+ * "knowledgeCode":"A1",
|
|
|
+ * "keep":1,
|
|
|
+ * "abilityCodes": "A1A2"
|
|
|
+ * }]
|
|
|
+ * }
|
|
|
+ */
|
|
|
public String chapterAbility(PaperResult result, Paper paper) {
|
|
|
List<SubjectKnowledge> knowledge = knowledgeService.list(paper.getSubjectId(), paper.getGrade());
|
|
|
//根据章节分组 Map<chapter,List<SubjectKnowledge>>
|
|
@@ -445,14 +497,76 @@ public class PaperResultService {
|
|
|
return ObjectUtil.object2Json(group);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 各能力评价
|
|
|
+ * {
|
|
|
+ * "计算能力":{
|
|
|
+ * "abilityCode":"A1",
|
|
|
+ * "score":4.5,
|
|
|
+ * "evaluate":"您的成绩...",
|
|
|
+ * "keep":[1,0,1,2,0,1,0],
|
|
|
+ * "explain":"这是示例与解释"
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
public String abilityEvaluate(PaperResult result, Paper paper) {
|
|
|
- return "{}";
|
|
|
+
|
|
|
+ List<ScoreSegment> scoreSegments = scoreSegmentService.findBySubjectId(paper.getSubjectId());
|
|
|
+ String subject = subjectService.get(paper.getSubjectId()).getName();
|
|
|
+ String abilityScore = result.getAbilityScore();
|
|
|
+ Map<String, Double> scores = ObjectUtil.json2Map(abilityScore);
|
|
|
+
|
|
|
+ List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
|
|
|
+ //Map<tag,Set<number>> 知识点与题目对应
|
|
|
+ Map<String, Set<Integer>> tagNumbers = tagNumbers(paper);
|
|
|
+ //Map<tag,keep> 每个知识点的掌握情况
|
|
|
+ Map<String, Integer> tagKeep = tagKeep(collects, tagNumbers);
|
|
|
+
|
|
|
+ List<SubjectKnowledge> knowledge = knowledgeService.list(paper.getSubjectId(), paper.getGrade());
|
|
|
+
|
|
|
+ //Map<ability,Set<String>> 能力与知识点对应
|
|
|
+ Map<String, Set<String>> abilityKnowledge = new LinkedHashMap<>();
|
|
|
+ knowledge.forEach(k -> {
|
|
|
+ String[] abilityCodes = k.getAbilityCodes().split(",");
|
|
|
+ for (String abilityCode : abilityCodes) {
|
|
|
+ Set<String> ks = abilityKnowledge.getOrDefault(abilityCode, new HashSet<>());
|
|
|
+ ks.add(k.getCode());
|
|
|
+ abilityKnowledge.put(abilityCode, ks);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ Map<String, String> abilities = subjectAbilityService.map(paper.getSubjectId());
|
|
|
+ Map<String, AbilityEvaluateVo> evaluates = new LinkedHashMap<>();
|
|
|
+ for (Map.Entry<String, Set<String>> entry : abilityKnowledge.entrySet()) {
|
|
|
+ String code = entry.getKey();
|
|
|
+ AbilityEvaluateVo vo = new AbilityEvaluateVo();
|
|
|
+ vo.setAbilityCode(code);
|
|
|
+ vo.setScore(scores.get(code));
|
|
|
+
|
|
|
+ ScoreSegment scoreSegment = scoreSegmentService.getLevel(vo.getScore(), scoreSegments, abilities.get(code), subject);
|
|
|
+ vo.setEvaluate(scoreSegment.getEvaluate());
|
|
|
+ vo.setExplain(scoreSegment.getExplanation());
|
|
|
+
|
|
|
+ Set<String> ks = entry.getValue();
|
|
|
+ List<Integer> keep = new ArrayList<>();
|
|
|
+ ks.forEach(k -> keep.add(tagKeep.get(k)));
|
|
|
+ vo.setKeep(keep);
|
|
|
+ evaluates.put(abilities.get(code), vo);
|
|
|
+ }
|
|
|
+ return ObjectUtil.object2Json(evaluates);
|
|
|
}
|
|
|
|
|
|
public String questionMatter(PaperResult result, Paper paper) {
|
|
|
+ List<Integer> collects = convertCollectQuestion(result.getCollectQuestion());
|
|
|
+ List<Integer> wrongs = convertWrongQuestion(paper, collects);
|
|
|
+
|
|
|
return "{}";
|
|
|
}
|
|
|
|
|
|
+ private List<Integer> convertWrongQuestion(Paper paper, List<Integer> collects) {
|
|
|
+ return paper.getQuestions().stream().map(Question::getNumber).filter(q->!collects.contains(q)).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
private List<Answer> convertAnswer(String json) {
|
|
|
return ObjectUtil.getGson().fromJson(json, new TypeToken<List<Answer>>() {
|
|
|
}.getType());
|