|
@@ -1,7 +1,11 @@
|
|
|
package cn.com.qmth.stmms.biz.report.service.impl;
|
|
|
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.LinkedList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
|
|
|
import javax.persistence.criteria.CriteriaBuilder;
|
|
|
import javax.persistence.criteria.CriteriaQuery;
|
|
@@ -26,6 +30,7 @@ import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
|
|
|
import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
|
|
|
import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
|
|
|
import cn.com.qmth.stmms.biz.utils.DoubleUtil;
|
|
|
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
|
|
|
|
/**
|
|
|
* 客、主观题分析 service 实现
|
|
@@ -82,88 +87,83 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
|
|
|
|
|
|
@Override
|
|
|
public void saveReportSubjectQuestionData(Integer examId, String subjectCode, Boolean objective) {
|
|
|
+ Map<String,List<ExamQuestion>> map = new HashMap<String, List<ExamQuestion>>();
|
|
|
ExamSubject subject = examSubjectDao.findByExamIdAndCode(examId, subjectCode);
|
|
|
- List<ExamQuestion> examQuestionObjectiveList = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, objective);
|
|
|
+ if(objective){
|
|
|
+ List<ExamQuestion> examQuestionList = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, objective);
|
|
|
+ Set<String> paperTypeSet = new HashSet<String>();
|
|
|
+ for (ExamQuestion examQuestion : examQuestionList) {
|
|
|
+ paperTypeSet.add(examQuestion.getPaperType());
|
|
|
+ }
|
|
|
+ for (String paperType : paperTypeSet) {
|
|
|
+ List<ExamQuestion> oList = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, objective, paperType);
|
|
|
+ map.put(subjectCode+"_"+paperType, oList);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, objective);
|
|
|
+ map.put(subjectCode, sList);
|
|
|
+ }
|
|
|
|
|
|
List<ExamStudent> examStudentList = examStudentDao.findByExamIdAndSubjectCodeAndUploadTimeNotNullAndAbsent(examId, subjectCode, false);
|
|
|
|
|
|
Integer studentCount = examStudentList.size();
|
|
|
-
|
|
|
- for (int i = 0; i < examQuestionObjectiveList.size(); i++) {
|
|
|
- ExamQuestion question = examQuestionObjectiveList.get(i);
|
|
|
- if (question.getTotalScore().doubleValue() > 0) {
|
|
|
- ReportSubjectQuestion reportSubjectQuestion = new ReportSubjectQuestion();
|
|
|
- //得分人数
|
|
|
- Integer scoreCount = 0;
|
|
|
- //满分人数
|
|
|
- Integer fullScoreCount = 0;
|
|
|
- //考生题目得分汇总
|
|
|
- Double sumScore = 0d;
|
|
|
- //题目总分汇总
|
|
|
- //Double questionSumScore = DoubleUtil.mul(question.getTotalScore(), studentCount);
|
|
|
- //方差
|
|
|
- Double variance = 0d;
|
|
|
-
|
|
|
- for (int j = 0; j < studentCount; j++) {
|
|
|
- ExamStudent student = examStudentList.get(j);
|
|
|
- if(question.getPaperType()!=null && !question.getPaperType().equalsIgnoreCase(student.getPaperType())){
|
|
|
- continue;
|
|
|
- }
|
|
|
- Double score = 0d;
|
|
|
- if (objective) {
|
|
|
- if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
|
|
|
- //客观题
|
|
|
- String[] objectiveAnswers = student.getObjectiveScoreList().split(";");
|
|
|
- score = Double.parseDouble(objectiveAnswers[i].split(":")[1]);
|
|
|
+ for(String key:map.keySet()){
|
|
|
+ List<ExamQuestion> examQuestionList = map.get(key);
|
|
|
+ for (int i = 0; i < examQuestionList.size(); i++) {
|
|
|
+ ExamQuestion question = examQuestionList.get(i);
|
|
|
+ if (question.getTotalScore().doubleValue() > 0) {
|
|
|
+ ReportSubjectQuestion reportSubjectQuestion = new ReportSubjectQuestion();
|
|
|
+ //得分人数
|
|
|
+ Integer scoreCount = 0;
|
|
|
+ //满分人数
|
|
|
+ Integer fullScoreCount = 0;
|
|
|
+ //考生题目得分汇总
|
|
|
+ Double sumScore = 0d;
|
|
|
+ //题目总分汇总
|
|
|
+ //Double questionSumScore = DoubleUtil.mul(question.getTotalScore(), studentCount);
|
|
|
+ //方差
|
|
|
+ Double variance = 0d;
|
|
|
+
|
|
|
+ for (int j = 0; j < studentCount; j++) {
|
|
|
+ ExamStudent student = examStudentList.get(j);
|
|
|
+ if(question.getPaperType()!=null && !question.getPaperType().equalsIgnoreCase(student.getPaperType())){
|
|
|
+ continue;
|
|
|
}
|
|
|
- } else {
|
|
|
- if (StringUtils.isNotBlank(student.getSubjectiveScoreList())) {
|
|
|
- //主观题
|
|
|
- String[] subjectiveAnswers = student.getSubjectiveScoreList().split(";");
|
|
|
- score = Double.parseDouble(subjectiveAnswers[i]);
|
|
|
+ List<ScoreItem> scoreItems = student.getScoreList(objective);
|
|
|
+ double score = scoreItems.get(i).getScore();
|
|
|
+ sumScore = DoubleUtil.sum(sumScore, score);
|
|
|
+ if (score > 0) {
|
|
|
+ scoreCount++;
|
|
|
}
|
|
|
- }
|
|
|
- sumScore = DoubleUtil.sum(sumScore, score);
|
|
|
- if (score > 0) {
|
|
|
- scoreCount++;
|
|
|
- }
|
|
|
- if (score.doubleValue() == question.getTotalScore().doubleValue()) {
|
|
|
- fullScoreCount++;
|
|
|
- }
|
|
|
- }
|
|
|
- Double avgScore = DoubleUtil.div(sumScore, examStudentList.size(), 2);
|
|
|
- for (int j = 0; j < studentCount; j++) {
|
|
|
- ExamStudent student = examStudentList.get(j);
|
|
|
- if(question.getPaperType()!=null && !question.getPaperType().equalsIgnoreCase(student.getPaperType())){
|
|
|
- continue;
|
|
|
- }
|
|
|
- Double score = 0d;
|
|
|
- if (objective) {
|
|
|
- if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
|
|
|
- //客观题
|
|
|
- String[] objectiveAnswers = student.getObjectiveScoreList().split(";");
|
|
|
- score = Double.parseDouble(objectiveAnswers[i].split(":")[1]);
|
|
|
+ if (score == question.getTotalScore().doubleValue()) {
|
|
|
+ fullScoreCount++;
|
|
|
}
|
|
|
- } else {
|
|
|
- if (StringUtils.isNotBlank(student.getSubjectiveScoreList())) {
|
|
|
- //主观题
|
|
|
- String[] subjectiveAnswers = student.getSubjectiveScoreList().split(";");
|
|
|
- score = Double.parseDouble(subjectiveAnswers[i]);
|
|
|
+ }
|
|
|
+ Double avgScore = DoubleUtil.div(sumScore, examStudentList.size(), 2);
|
|
|
+ for (int j = 0; j < studentCount; j++) {
|
|
|
+ ExamStudent student = examStudentList.get(j);
|
|
|
+ if(question.getPaperType()!=null && !question.getPaperType().equalsIgnoreCase(student.getPaperType())){
|
|
|
+ continue;
|
|
|
}
|
|
|
+ List<ScoreItem> scoreItems = student.getScoreList(objective);
|
|
|
+ double score = scoreItems.get(i).getScore();
|
|
|
+ variance = DoubleUtil.sum(variance, DoubleUtil.mul(DoubleUtil.sub(score, avgScore), DoubleUtil.sub(score, avgScore)));
|
|
|
}
|
|
|
- variance = DoubleUtil.sum(variance, DoubleUtil.mul(DoubleUtil.sub(score, avgScore), DoubleUtil.sub(score, avgScore)));
|
|
|
+ reportSubjectQuestion.setExamId(examId);
|
|
|
+ reportSubjectQuestion.setSubjectCode(subjectCode);
|
|
|
+ reportSubjectQuestion.setSubjectName(subject.getName());
|
|
|
+ reportSubjectQuestion.setObjective(objective);
|
|
|
+ reportSubjectQuestion.setQuestionName(question.getMainTitle());
|
|
|
+ reportSubjectQuestion.setMainNumber(question.getMainNumber());
|
|
|
+ reportSubjectQuestion.setSubNumber(question.getSubNumber());
|
|
|
+ reportSubjectQuestion.setTotalScore(question.getTotalScore());
|
|
|
+ reportSubjectQuestion.setAvgScore(avgScore);
|
|
|
+ reportSubjectQuestion.setScoreRate(DoubleUtil.div(avgScore, question.getTotalScore(), 2));
|
|
|
+ reportSubjectQuestion.setSd(studentCount==0?0:DoubleUtil.format(Math.sqrt(variance / studentCount), "0.00"));
|
|
|
+ reportSubjectQuestion.setFullScoreRate(DoubleUtil.div(fullScoreCount, studentCount, 2));
|
|
|
+ reportSubjectQuestion.setPaperType(question.getPaperType());
|
|
|
+ reportSubjectQuestionDao.save(reportSubjectQuestion);
|
|
|
}
|
|
|
- reportSubjectQuestion.setExamId(examId);
|
|
|
- reportSubjectQuestion.setSubjectCode(subjectCode);
|
|
|
- reportSubjectQuestion.setSubjectName(subject.getName());
|
|
|
- reportSubjectQuestion.setObjective(objective);
|
|
|
- reportSubjectQuestion.setQuestionName(question.getMainTitle() + "_" + (i + 1));
|
|
|
- reportSubjectQuestion.setTotalScore(question.getTotalScore());
|
|
|
- reportSubjectQuestion.setAvgScore(avgScore);
|
|
|
- reportSubjectQuestion.setScoreRate(DoubleUtil.div(avgScore, question.getTotalScore(), 2));
|
|
|
- reportSubjectQuestion.setSd(studentCount==0?0:DoubleUtil.format(Math.sqrt(variance / studentCount), "0.00"));
|
|
|
- reportSubjectQuestion.setFullScoreRate(DoubleUtil.div(fullScoreCount, studentCount, 2));
|
|
|
- reportSubjectQuestionDao.save(reportSubjectQuestion);
|
|
|
}
|
|
|
}
|
|
|
|