|
@@ -1,11 +1,7 @@
|
|
|
package cn.com.qmth.stmms.biz.report.service.impl;
|
|
|
|
|
|
-import java.util.Arrays;
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.HashMap;
|
|
|
import java.util.LinkedList;
|
|
|
import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
|
|
|
import javax.persistence.criteria.CriteriaBuilder;
|
|
|
import javax.persistence.criteria.CriteriaQuery;
|
|
@@ -26,15 +22,10 @@ import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
|
|
|
import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
|
|
|
import cn.com.qmth.stmms.biz.exam.dao.ExamSubjectDao;
|
|
|
import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
|
|
|
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
import cn.com.qmth.stmms.biz.report.dao.ReportSubjectGroupDao;
|
|
|
import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
|
|
|
import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
|
|
|
import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
|
|
|
-import cn.com.qmth.stmms.biz.utils.DoubleUtil;
|
|
|
|
|
|
/**
|
|
|
* 大题型统计分析 service 实现
|
|
@@ -72,6 +63,7 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
public List<ReportSubjectGroup> findByQuery(final ReportSubjectQuery query) {
|
|
|
query.setSort(new Sort(Direction.ASC, "groupNumber"));
|
|
|
Page<ReportSubjectGroup> result = reportSubjectGroupDao.findAll(new Specification<ReportSubjectGroup>() {
|
|
|
+
|
|
|
@Override
|
|
|
public Predicate toPredicate(Root<ReportSubjectGroup> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
|
|
|
List<Predicate> predicates = new LinkedList<Predicate>();
|
|
@@ -87,256 +79,10 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
|
|
|
.size()]));
|
|
|
}
|
|
|
- },query);
|
|
|
+ }, query);
|
|
|
return result.getContent();
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void saveReportSubjectGroupData(Integer examId, String subjectCode) {
|
|
|
- // 保存客观题统计分析
|
|
|
- saveReportSubjectObjectiveGroupData(examId, subjectCode);
|
|
|
- // 保存主观题统计分析
|
|
|
- saveReportSubjectSubjectiveGroupData(examId, subjectCode);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 保存题型统计分析
|
|
|
- *
|
|
|
- * @param examId
|
|
|
- * 考试Id
|
|
|
- * @param subjectCode
|
|
|
- * 科目Code
|
|
|
- * @param subjective
|
|
|
- * 主观题
|
|
|
- */
|
|
|
- private void saveReportSubjectSubjectiveGroupData(Integer examId, String subjectCode) {
|
|
|
-
|
|
|
- ExamSubject subject = examSubjectDao.findByExamIdAndCode(examId, subjectCode);
|
|
|
- List<MarkGroup> groups = groupDao.findByExamIdAndSubjectCode(examId, subjectCode);
|
|
|
-
|
|
|
- List<ExamStudent> examStudentList = examStudentDao.findByExamIdAndSubjectCodeAndUploadTimeNotNullAndAbsent(
|
|
|
- examId, subjectCode, false);
|
|
|
- Integer studentCount = examStudentList.size();
|
|
|
- Integer begin = 0;
|
|
|
- for (int i = 0; i < groups.size(); i++) {
|
|
|
- MarkGroup group = groups.get(i);
|
|
|
- // 满分
|
|
|
- double fullScore = group.getTotalScore();
|
|
|
- Integer questionCount = examQuestionDao.findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId,
|
|
|
- subjectCode, false, group.getNumber()).size();
|
|
|
- Double[] totalScoreArray = new Double[studentCount];
|
|
|
- // 题型 总分
|
|
|
- Double totalScore = 0d;
|
|
|
- // 0分人数
|
|
|
- Integer zeroScoreCount = 0;
|
|
|
- // 满分人数
|
|
|
- Integer fullScoreCount = 0;
|
|
|
- // 方差
|
|
|
- Double variance = 0d;
|
|
|
- for (int j = 0; j < studentCount; j++) {
|
|
|
- ExamStudent student = examStudentList.get(j);
|
|
|
- String[] answers = null;
|
|
|
- if (StringUtils.isNotBlank(student.getSubjectiveScoreList())) {
|
|
|
- answers = student.getSubjectiveScoreList().split(";");
|
|
|
- }
|
|
|
- Double score = 0d;
|
|
|
- for (int k = begin; k < begin + questionCount; k++) {
|
|
|
- Double s = 0d;
|
|
|
- if (answers != null) {
|
|
|
- s = Double.parseDouble(answers[k]);
|
|
|
- }
|
|
|
- score = DoubleUtil.sum(score, s);
|
|
|
- }
|
|
|
- if (score.doubleValue() == 0) {
|
|
|
- zeroScoreCount++;
|
|
|
- }
|
|
|
- if (score.doubleValue() == fullScore) {
|
|
|
- fullScoreCount++;
|
|
|
- }
|
|
|
- totalScoreArray[j] = score;
|
|
|
- totalScore = DoubleUtil.sum(totalScore, score);
|
|
|
- }
|
|
|
- // 最大分
|
|
|
- Double maxScore = totalScoreArray.length==0?0:Collections.max(Arrays.asList(totalScoreArray));
|
|
|
- // 最小分
|
|
|
- Double minScore = totalScoreArray.length==0?0:Collections.min(Arrays.asList(totalScoreArray));
|
|
|
- // 平均分
|
|
|
- Double avgScore = DoubleUtil.div(totalScore, studentCount, 2);
|
|
|
- // 计算方差
|
|
|
- for (int j = 0; j < studentCount; j++) {
|
|
|
- ExamStudent student = examStudentList.get(j);
|
|
|
- String[] answers = null;
|
|
|
- if (StringUtils.isNotBlank(student.getSubjectiveScoreList())) {
|
|
|
- answers = student.getSubjectiveScoreList().split(";");
|
|
|
- }
|
|
|
- Double score = 0d;
|
|
|
- for (int k = begin; k < begin + questionCount; k++) {
|
|
|
- Double s = 0d;
|
|
|
- if (answers != null) {
|
|
|
- s = Double.parseDouble(answers[k]);
|
|
|
- }
|
|
|
- score = DoubleUtil.sum(score, s);
|
|
|
- }
|
|
|
- variance = DoubleUtil.sum(variance,
|
|
|
- DoubleUtil.mul(DoubleUtil.sub(score, avgScore), DoubleUtil.sub(score, avgScore)));
|
|
|
- }
|
|
|
- // 标准差
|
|
|
- Double sd = studentCount==0?0:DoubleUtil.format(Math.sqrt(variance / studentCount), "0.00");
|
|
|
- // 差异系数
|
|
|
- Double cv = 0d;
|
|
|
- if (avgScore.doubleValue() > 0) {
|
|
|
- cv = DoubleUtil.mul(DoubleUtil.div(sd, avgScore, 4), 100);
|
|
|
- }
|
|
|
- // 得分率
|
|
|
- Double scoreRate = 0d;
|
|
|
- if (fullScore != 0) {
|
|
|
- scoreRate = DoubleUtil.div(avgScore, fullScore, 2);
|
|
|
- }
|
|
|
- ReportSubjectGroup reportSubjectGroup = new ReportSubjectGroup();
|
|
|
- reportSubjectGroup.setExamId(examId);
|
|
|
- reportSubjectGroup.setSubjectCode(subjectCode);
|
|
|
- reportSubjectGroup.setSubjectName(subject.getName());
|
|
|
- reportSubjectGroup.setGroupName(group.getTitle());
|
|
|
- reportSubjectGroup.setGroupNumber(group.getNumber());
|
|
|
- reportSubjectGroup.setMaxScore(maxScore);
|
|
|
- reportSubjectGroup.setMinScore(minScore);
|
|
|
- reportSubjectGroup.setAvgScore(avgScore);
|
|
|
- reportSubjectGroup.setTotalScore(fullScore);
|
|
|
- reportSubjectGroup.setStdev(sd);
|
|
|
- reportSubjectGroup.setCoefficient(cv);
|
|
|
- reportSubjectGroup.setScoreRate(scoreRate);
|
|
|
- reportSubjectGroup.setZeroCount(zeroScoreCount);
|
|
|
- reportSubjectGroup.setFullCount(fullScoreCount);
|
|
|
-
|
|
|
- begin += questionCount;
|
|
|
- reportSubjectGroupDao.save(reportSubjectGroup);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 保存题型统计分析
|
|
|
- *
|
|
|
- * @param examId
|
|
|
- * 考试Id
|
|
|
- * @param subjectCode
|
|
|
- * 科目Code
|
|
|
- * @param objective
|
|
|
- * 客观题
|
|
|
- */
|
|
|
- private void saveReportSubjectObjectiveGroupData(Integer examId, String subjectCode) {
|
|
|
- ExamSubject subject = examSubjectDao.findByExamIdAndCode(examId, subjectCode);
|
|
|
- List<Object[]> questionGroups = reportSubjectGroupDao.countGroupByMainNum(examId, subjectCode, true);
|
|
|
- List<ExamStudent> examStudentList = examStudentDao.findByExamIdAndSubjectCodeAndUploadTimeNotNullAndAbsent(
|
|
|
- examId, subjectCode, false);
|
|
|
- Integer studentCount = examStudentList.size();
|
|
|
- Integer begin = 0;
|
|
|
- Map<Integer, ExamQuestion> map = new HashMap<Integer, ExamQuestion>();
|
|
|
- for (int i = 0; i < questionGroups.size(); i++) {
|
|
|
- Object[] obj = questionGroups.get(i);
|
|
|
- ExamQuestion question = new ExamQuestion();
|
|
|
- question.setMainNumber(Integer.parseInt(obj[0].toString()));
|
|
|
- question.setMainTitle(obj[1].toString());
|
|
|
- question.setPaperType(obj[2] == null ? null : obj[2].toString());
|
|
|
- question.setSubNumber(Integer.parseInt(obj[3].toString()));
|
|
|
- question.setTotalScore(Double.valueOf(obj[4].toString()));
|
|
|
- if (map.get(question.getMainNumber()) != null) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- map.put(question.getMainNumber(), question);
|
|
|
- // 满分
|
|
|
- double fullScore = question.getTotalScore();
|
|
|
- Integer questionCount = question.getSubNumber();
|
|
|
- Double[] totalScoreArray = new Double[studentCount];
|
|
|
- // 题型 总分
|
|
|
- Double totalScore = 0d;
|
|
|
- // 0分人数
|
|
|
- Integer zeroScoreCount = 0;
|
|
|
- // 满分人数
|
|
|
- Integer fullScoreCount = 0;
|
|
|
- // 方差
|
|
|
- Double variance = 0d;
|
|
|
- for (int j = 0; j < studentCount; j++) {
|
|
|
- ExamStudent student = examStudentList.get(j);
|
|
|
- String[] answers = null;
|
|
|
- if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
|
|
|
- answers = student.getObjectiveScoreList().split(";");
|
|
|
- }
|
|
|
- Double score = 0d;
|
|
|
- for (int k = begin; k < begin + questionCount; k++) {
|
|
|
- Double s = 0d;
|
|
|
- if (answers != null) {
|
|
|
- s = Double.parseDouble(answers[k].split(":")[1]);
|
|
|
- }
|
|
|
- score = DoubleUtil.sum(score, s);
|
|
|
- }
|
|
|
- if (score.doubleValue() == 0) {
|
|
|
- zeroScoreCount++;
|
|
|
- }
|
|
|
- if (score.doubleValue() == fullScore) {
|
|
|
- fullScoreCount++;
|
|
|
- }
|
|
|
- totalScoreArray[j] = score;
|
|
|
- totalScore = DoubleUtil.sum(totalScore, score);
|
|
|
- }
|
|
|
- // 最大分
|
|
|
- Double maxScore = totalScoreArray.length==0?0:Collections.max(Arrays.asList(totalScoreArray));
|
|
|
- // 最小分
|
|
|
- Double minScore = totalScoreArray.length==0?0:Collections.min(Arrays.asList(totalScoreArray));
|
|
|
- // 平均分
|
|
|
- Double avgScore = DoubleUtil.div(totalScore, studentCount, 2);
|
|
|
- // 计算方差
|
|
|
- for (int j = 0; j < studentCount; j++) {
|
|
|
- ExamStudent student = examStudentList.get(j);
|
|
|
- String[] answers = null;
|
|
|
- if (StringUtils.isNotBlank(student.getObjectiveScoreList())) {
|
|
|
- answers = student.getObjectiveScoreList().split(";");
|
|
|
- }
|
|
|
- Double score = 0d;
|
|
|
- for (int k = begin; k < begin + questionCount; k++) {
|
|
|
- Double s = 0d;
|
|
|
- if (answers != null) {
|
|
|
- s = Double.parseDouble(answers[k].split(":")[1]);
|
|
|
- }
|
|
|
- score = DoubleUtil.sum(score, s);
|
|
|
- }
|
|
|
- variance = DoubleUtil.sum(variance,
|
|
|
- DoubleUtil.mul(DoubleUtil.sub(score, avgScore), DoubleUtil.sub(score, avgScore)));
|
|
|
- }
|
|
|
- // 标准差
|
|
|
- Double sd = studentCount==0?0:DoubleUtil.format(Math.sqrt(variance / studentCount), "0.00");
|
|
|
- // 差异系数
|
|
|
- Double cv = 0d;
|
|
|
- if (avgScore.doubleValue() > 0) {
|
|
|
- cv = DoubleUtil.mul(DoubleUtil.div(sd, avgScore, 4), 100);
|
|
|
- }
|
|
|
- // 得分率
|
|
|
- Double scoreRate = 0d;
|
|
|
- if (fullScore != 0) {
|
|
|
- scoreRate = DoubleUtil.div(avgScore, fullScore, 2);
|
|
|
- }
|
|
|
- ReportSubjectGroup reportSubjectGroup = new ReportSubjectGroup();
|
|
|
- reportSubjectGroup.setExamId(examId);
|
|
|
- reportSubjectGroup.setSubjectCode(subjectCode);
|
|
|
- reportSubjectGroup.setSubjectName(subject.getName());
|
|
|
- reportSubjectGroup.setGroupName(question.getMainTitle());
|
|
|
- reportSubjectGroup.setGroupNumber(question.getMainNumber());
|
|
|
- reportSubjectGroup.setMaxScore(maxScore);
|
|
|
- reportSubjectGroup.setMinScore(minScore);
|
|
|
- reportSubjectGroup.setAvgScore(avgScore);
|
|
|
- reportSubjectGroup.setTotalScore(fullScore);
|
|
|
- reportSubjectGroup.setStdev(sd);
|
|
|
- reportSubjectGroup.setCoefficient(cv);
|
|
|
- reportSubjectGroup.setScoreRate(scoreRate);
|
|
|
- reportSubjectGroup.setZeroCount(zeroScoreCount);
|
|
|
- reportSubjectGroup.setFullCount(fullScoreCount);
|
|
|
-
|
|
|
- begin += questionCount;
|
|
|
- reportSubjectGroupDao.save(reportSubjectGroup);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
public ReportSubjectGroup save(ReportSubjectGroup r) {
|
|
|
return reportSubjectGroupDao.save(r);
|