|
@@ -16,6 +16,7 @@ import org.apache.commons.lang.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.jpa.domain.Specification;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import cn.com.qmth.stmms.biz.common.BaseQueryService;
|
|
|
import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
|
|
@@ -39,7 +40,8 @@ import cn.com.qmth.stmms.biz.utils.DoubleUtil;
|
|
|
* @Date 2019-04-18
|
|
|
*/
|
|
|
@Service
|
|
|
-public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjectGroup> implements ReportSubjectGroupService {
|
|
|
+public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjectGroup> implements
|
|
|
+ ReportSubjectGroupService {
|
|
|
|
|
|
@Autowired
|
|
|
private ReportSubjectGroupDao reportSubjectGroupDao;
|
|
@@ -52,11 +54,11 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
|
|
|
@Autowired
|
|
|
private ExamSubjectDao examSubjectDao;
|
|
|
-
|
|
|
+
|
|
|
@Autowired
|
|
|
private MarkGroupDao groupDao;
|
|
|
|
|
|
-
|
|
|
+ @Transactional
|
|
|
@Override
|
|
|
public void deleteByExamId(Integer examId) {
|
|
|
reportSubjectGroupDao.deleteByExamId(examId);
|
|
@@ -66,6 +68,7 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
@Override
|
|
|
public List<ReportSubjectGroup> findByQuery(final ReportSubjectQuery query) {
|
|
|
List<ReportSubjectGroup> result = reportSubjectGroupDao.findAll(new Specification<ReportSubjectGroup>() {
|
|
|
+
|
|
|
@Override
|
|
|
public Predicate toPredicate(Root<ReportSubjectGroup> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
|
|
|
List<Predicate> predicates = new LinkedList<Predicate>();
|
|
@@ -75,11 +78,11 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
if (StringUtils.isNotBlank(query.getSubjectCode())) {
|
|
|
predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
|
|
|
}
|
|
|
- if (query.getGroupNumber()>0) {
|
|
|
+ if (query.getGroupNumber() > 0) {
|
|
|
predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
|
|
|
}
|
|
|
- return predicates.isEmpty() ? cb.conjunction()
|
|
|
- : cb.and(predicates.toArray(new Predicate[predicates.size()]));
|
|
|
+ return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
|
|
|
+ .size()]));
|
|
|
}
|
|
|
});
|
|
|
return result;
|
|
@@ -87,98 +90,104 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
|
|
|
@Override
|
|
|
public void saveReportSubjectGroupData(Integer examId, String subjectCode) {
|
|
|
- //保存客观题统计分析
|
|
|
+ // 保存客观题统计分析
|
|
|
saveReportSubjectObjectiveGroupData(examId, subjectCode);
|
|
|
- //保存主观题统计分析
|
|
|
+ // 保存主观题统计分析
|
|
|
saveReportSubjectSubjectiveGroupData(examId, subjectCode);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 保存题型统计分析
|
|
|
*
|
|
|
- * @param examId 考试Id
|
|
|
- * @param subjectCode 科目Code
|
|
|
- * @param subjective 主观题
|
|
|
+ * @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);
|
|
|
+
|
|
|
+ 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 fullScore = group.getTotalScore();
|
|
|
+ Integer questionCount = examQuestionDao.findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId,
|
|
|
+ subjectCode, false, group.getNumber()).size();
|
|
|
Double[] totalScoreArray = new Double[studentCount];
|
|
|
- //题型 总分
|
|
|
+ // 题型 总分
|
|
|
Double totalScore = 0d;
|
|
|
- //0分人数
|
|
|
+ // 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(";");
|
|
|
- }
|
|
|
+ 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]);
|
|
|
+ s = Double.parseDouble(answers[k]);
|
|
|
}
|
|
|
score = DoubleUtil.sum(score, s);
|
|
|
}
|
|
|
if (score.doubleValue() == 0) {
|
|
|
zeroScoreCount++;
|
|
|
}
|
|
|
- if (score.doubleValue() == fullScore.doubleValue()) {
|
|
|
+ if (score.doubleValue() == fullScore) {
|
|
|
fullScoreCount++;
|
|
|
}
|
|
|
totalScoreArray[j] = score;
|
|
|
totalScore = DoubleUtil.sum(totalScore, score);
|
|
|
}
|
|
|
- //最大分
|
|
|
+ // 最大分
|
|
|
Double maxScore = Collections.max(Arrays.asList(totalScoreArray));
|
|
|
- //最小分
|
|
|
+ // 最小分
|
|
|
Double minScore = 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(";");
|
|
|
- }
|
|
|
+ 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]);
|
|
|
+ s = Double.parseDouble(answers[k]);
|
|
|
}
|
|
|
score = DoubleUtil.sum(score, s);
|
|
|
}
|
|
|
- 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)));
|
|
|
}
|
|
|
- //标准差
|
|
|
+ // 标准差
|
|
|
Double sd = 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);
|
|
|
+ if (fullScore != 0) {
|
|
|
+ scoreRate = DoubleUtil.div(avgScore, fullScore, 2);
|
|
|
}
|
|
|
ReportSubjectGroup reportSubjectGroup = new ReportSubjectGroup();
|
|
|
reportSubjectGroup.setExamId(examId);
|
|
@@ -200,104 +209,108 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
reportSubjectGroupDao.save(reportSubjectGroup);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 保存题型统计分析
|
|
|
*
|
|
|
- * @param examId 考试Id
|
|
|
- * @param subjectCode 科目Code
|
|
|
- * @param objective 客观题
|
|
|
+ * @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);
|
|
|
+ List<ExamStudent> examStudentList = examStudentDao.findByExamIdAndSubjectCodeAndUploadTimeNotNullAndAbsent(
|
|
|
+ examId, subjectCode, false);
|
|
|
Integer studentCount = examStudentList.size();
|
|
|
Integer begin = 0;
|
|
|
- Map<Integer,ExamQuestion> map = new HashMap<Integer, ExamQuestion>();
|
|
|
+ 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].toString());
|
|
|
+ question.setPaperType(obj[2] == null ? null : obj[2].toString());
|
|
|
question.setSubNumber(Integer.parseInt(obj[3].toString()));
|
|
|
- if(map.get(question.getMainNumber())!=null){
|
|
|
+ question.setTotalScore(Double.valueOf(obj[4].toString()));
|
|
|
+ if (map.get(question.getMainNumber()) != null) {
|
|
|
continue;
|
|
|
}
|
|
|
map.put(question.getMainNumber(), question);
|
|
|
- //满分
|
|
|
- Double fullScore = examQuestionDao.queryFullScoreByExamIdAndSubjectCodeAndMainNumberAndPaperType(examId, subjectCode, question.getMainNumber(),question.getPaperType());
|
|
|
+ // 满分
|
|
|
+ double fullScore = question.getTotalScore();
|
|
|
Integer questionCount = question.getSubNumber();
|
|
|
Double[] totalScoreArray = new Double[studentCount];
|
|
|
- //题型 总分
|
|
|
+ // 题型 总分
|
|
|
Double totalScore = 0d;
|
|
|
- //0分人数
|
|
|
+ // 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(";");
|
|
|
- }
|
|
|
+ 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]);
|
|
|
+ s = Double.parseDouble(answers[k].split(":")[1]);
|
|
|
}
|
|
|
score = DoubleUtil.sum(score, s);
|
|
|
}
|
|
|
if (score.doubleValue() == 0) {
|
|
|
zeroScoreCount++;
|
|
|
}
|
|
|
- if (score.doubleValue() == fullScore.doubleValue()) {
|
|
|
+ if (score.doubleValue() == fullScore) {
|
|
|
fullScoreCount++;
|
|
|
}
|
|
|
totalScoreArray[j] = score;
|
|
|
totalScore = DoubleUtil.sum(totalScore, score);
|
|
|
}
|
|
|
- //最大分
|
|
|
+ // 最大分
|
|
|
Double maxScore = Collections.max(Arrays.asList(totalScoreArray));
|
|
|
- //最小分
|
|
|
+ // 最小分
|
|
|
Double minScore = 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(";");
|
|
|
- }
|
|
|
+ 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]);
|
|
|
+ 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)));
|
|
|
+ variance = DoubleUtil.sum(variance,
|
|
|
+ DoubleUtil.mul(DoubleUtil.sub(score, avgScore), DoubleUtil.sub(score, avgScore)));
|
|
|
}
|
|
|
- //标准差
|
|
|
+ // 标准差
|
|
|
Double sd = 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);
|
|
|
+ if (fullScore != 0) {
|
|
|
+ scoreRate = DoubleUtil.div(avgScore, fullScore, 2);
|
|
|
}
|
|
|
ReportSubjectGroup reportSubjectGroup = new ReportSubjectGroup();
|
|
|
reportSubjectGroup.setExamId(examId);
|
|
@@ -321,5 +334,4 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
|
|
|
|
|
|
}
|
|
|
|
|
|
-
|
|
|
}
|