|
@@ -4,15 +4,7 @@ import java.io.ByteArrayInputStream;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.HashMap;
|
|
|
|
-import java.util.HashSet;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
-import java.util.Set;
|
|
|
|
-
|
|
|
|
-import net.sf.json.JSONArray;
|
|
|
|
-import net.sf.json.JSONObject;
|
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
|
import org.apache.commons.io.output.ByteArrayOutputStream;
|
|
import org.apache.commons.io.output.ByteArrayOutputStream;
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.apache.commons.lang.StringUtils;
|
|
@@ -21,6 +13,8 @@ import org.slf4j.LoggerFactory;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
|
|
+import com.qmth.boot.tools.codec.CodecUtils;
|
|
|
|
+
|
|
import cn.com.qmth.stmms.biz.exam.model.Exam;
|
|
import cn.com.qmth.stmms.biz.exam.model.Exam;
|
|
import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
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.ExamStudent;
|
|
@@ -32,31 +26,17 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
import cn.com.qmth.stmms.biz.file.enums.FormatType;
|
|
import cn.com.qmth.stmms.biz.file.enums.FormatType;
|
|
import cn.com.qmth.stmms.biz.file.service.FileService;
|
|
import cn.com.qmth.stmms.biz.file.service.FileService;
|
|
import cn.com.qmth.stmms.biz.lock.LockService;
|
|
import cn.com.qmth.stmms.biz.lock.LockService;
|
|
-import cn.com.qmth.stmms.biz.report.model.ReportSubject;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
|
|
|
|
|
|
+import cn.com.qmth.stmms.biz.report.model.*;
|
|
import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
|
|
import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
|
|
|
|
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
|
|
|
|
|
|
+import cn.com.qmth.stmms.biz.report.service.*;
|
|
import cn.com.qmth.stmms.biz.report.utils.ReportContext;
|
|
import cn.com.qmth.stmms.biz.report.utils.ReportContext;
|
|
import cn.com.qmth.stmms.biz.report.utils.ReportSubjectRangeDTO;
|
|
import cn.com.qmth.stmms.biz.report.utils.ReportSubjectRangeDTO;
|
|
import cn.com.qmth.stmms.biz.utils.ExportExcel;
|
|
import cn.com.qmth.stmms.biz.utils.ExportExcel;
|
|
import cn.com.qmth.stmms.common.enums.ExamStatus;
|
|
import cn.com.qmth.stmms.common.enums.ExamStatus;
|
|
import cn.com.qmth.stmms.common.enums.LockType;
|
|
import cn.com.qmth.stmms.common.enums.LockType;
|
|
import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
|
|
import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
|
|
-
|
|
|
|
-import com.qmth.boot.tools.codec.CodecUtils;
|
|
|
|
|
|
+import net.sf.json.JSONArray;
|
|
|
|
+import net.sf.json.JSONObject;
|
|
|
|
|
|
@Component
|
|
@Component
|
|
public class ReportServiceImpl implements ReportService {
|
|
public class ReportServiceImpl implements ReportService {
|
|
@@ -152,25 +132,15 @@ public class ReportServiceImpl implements ReportService {
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void deleteData(Integer examId, String subjectCode) {
|
|
public void deleteData(Integer examId, String subjectCode) {
|
|
-
|
|
|
|
reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectCollegeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectCollegeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectTeacherService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectTeacherService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectTeacherClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectTeacherClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectQuestionService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectQuestionService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
reportSubjectClassGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
reportSubjectClassGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -236,15 +206,76 @@ public class ReportServiceImpl implements ReportService {
|
|
lockService.unlock(LockType.SCORE_CALCULATE, examId);
|
|
lockService.unlock(LockType.SCORE_CALCULATE, examId);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void reportExamObjective(Integer examId, Set<String> subjectCodeSet) {
|
|
|
|
+ objectiveMap = new HashMap<String, List<ExamQuestion>>();
|
|
|
|
+ subjectMap = new HashMap<String, ExamSubject>();
|
|
|
|
+ Exam exam = examService.findById(examId);
|
|
|
|
+ if (exam == null || exam.getStatus() != ExamStatus.START) {
|
|
|
|
+ // log.info("report exception for examId=" + examId +
|
|
|
|
+ // ", exam is null or status error");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (!lockService.trylock(LockType.SCORE_CALCULATE, examId)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ if (subjectCodeSet == null) {
|
|
|
|
+ subjectCodeSet = new HashSet<String>();
|
|
|
|
+ List<ExamSubject> list = subjectService.listObjectiveScore(exam.getId(), 0d);
|
|
|
|
+ for (ExamSubject subject : list) {
|
|
|
|
+ if (!lockService.isLocked(LockType.SCORE_CALCULATE, subject.getExamId(), subject.getCode())) {
|
|
|
|
+ subjectCodeSet.add(subject.getCode());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ log.info("start report Objective for examId=" + examId + ", subjectCode count=" + subjectCodeSet.size());
|
|
|
|
+
|
|
|
|
+ for (String subjectCode : subjectCodeSet) {
|
|
|
|
+ // 尝试上锁,失败直接跳过
|
|
|
|
+ if (!lockService.trylock(LockType.SCORE_CALCULATE, examId, subjectCode)) {
|
|
|
|
+ log.warn("report locked for examId=" + examId + ", subjectCode=" + subjectCode);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ log.info("start report for examId=" + examId + ", subjectCode=" + subjectCode);
|
|
|
|
+ // 删除原有统计数据
|
|
|
|
+ // this.deleteObjectiveData(examId, subjectCode);
|
|
|
|
+ context = new ReportContext(exam);
|
|
|
|
+ int pageNumber = 1;
|
|
|
|
+ int pageSize = 1000;
|
|
|
|
+ List<ExamStudent> list = studentService.findByExamIdAndSubjectCode(examId, subjectCode, pageNumber,
|
|
|
|
+ pageSize);
|
|
|
|
+ while (list != null && list.size() > 0) {
|
|
|
|
+ for (ExamStudent student : list) {
|
|
|
|
+ // 统计
|
|
|
|
+ statistic(student);
|
|
|
|
+ }
|
|
|
|
+ pageNumber++;
|
|
|
|
+ list = studentService.findByExamIdAndSubjectCode(examId, subjectCode, pageNumber, pageSize);
|
|
|
|
+ }
|
|
|
|
+ // 结束统计
|
|
|
|
+ context.save();
|
|
|
|
+ // 生成文件
|
|
|
|
+ reoprtExcel(examId, subjectCode);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("report exception for examId=" + examId + ", subjectCode=" + subjectCode, e);
|
|
|
|
+ } finally {
|
|
|
|
+ lockService.unlock(LockType.SCORE_CALCULATE, examId, subjectCode);
|
|
|
|
+ log.info("finish report for examId=" + examId + ", subjectCode=" + subjectCode);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ lockService.unlock(LockType.SCORE_CALCULATE, examId);
|
|
|
|
+ }
|
|
|
|
+
|
|
private void statistic(ExamStudent student) {
|
|
private void statistic(ExamStudent student) {
|
|
ExamSubject subject = findExamSubject(student.getExamId(), student.getSubjectCode());
|
|
ExamSubject subject = findExamSubject(student.getExamId(), student.getSubjectCode());
|
|
if (SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())
|
|
if (SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())
|
|
|| (subject.getSubjectiveScore().doubleValue() == 0 && subject.getObjectiveScore() > 0)) {
|
|
|| (subject.getSubjectiveScore().doubleValue() == 0 && subject.getObjectiveScore() > 0)) {
|
|
student.setSubject(subject);
|
|
student.setSubject(subject);
|
|
- student.setObjectiveQuestionList(findQuestionList(student.getExamId(), student.getSubjectCode(),
|
|
|
|
- student.getPaperType(), true));
|
|
|
|
- student.setSubjectiveQuestionList(findQuestionList(student.getExamId(), student.getSubjectCode(),
|
|
|
|
- student.getPaperType(), false));
|
|
|
|
|
|
+ student.setObjectiveQuestionList(
|
|
|
|
+ findQuestionList(student.getExamId(), student.getSubjectCode(), student.getPaperType(), true));
|
|
|
|
+ student.setSubjectiveQuestionList(
|
|
|
|
+ findQuestionList(student.getExamId(), student.getSubjectCode(), student.getPaperType(), false));
|
|
context.process(student);
|
|
context.process(student);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -288,8 +319,8 @@ public class ReportServiceImpl implements ReportService {
|
|
uploadGroup(examId, subjectCode, findExamSubject(examId, subjectCode).getName(), "分组统计分析");
|
|
uploadGroup(examId, subjectCode, findExamSubject(examId, subjectCode).getName(), "分组统计分析");
|
|
}
|
|
}
|
|
|
|
|
|
- private void uploadGroup(int examId, String subjectCode, String subjectName, String name) throws IOException,
|
|
|
|
- Exception {
|
|
|
|
|
|
+ private void uploadGroup(int examId, String subjectCode, String subjectName, String name)
|
|
|
|
+ throws IOException, Exception {
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
query.setExamId(examId);
|
|
query.setExamId(examId);
|
|
query.setSubjectCode(subjectCode);
|
|
query.setSubjectCode(subjectCode);
|
|
@@ -335,8 +366,8 @@ public class ReportServiceImpl implements ReportService {
|
|
FormatType.XLSX);
|
|
FormatType.XLSX);
|
|
}
|
|
}
|
|
|
|
|
|
- private void uploadTeacher(int examId, String subjectCode, String subjectName, String name) throws IOException,
|
|
|
|
- Exception {
|
|
|
|
|
|
+ private void uploadTeacher(int examId, String subjectCode, String subjectName, String name)
|
|
|
|
+ throws IOException, Exception {
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
query.setExamId(examId);
|
|
query.setExamId(examId);
|
|
query.setSubjectCode(subjectCode);
|
|
query.setSubjectCode(subjectCode);
|
|
@@ -347,8 +378,8 @@ public class ReportServiceImpl implements ReportService {
|
|
r.setAvgScore(new BigDecimal(r.getAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
r.setAvgScore(new BigDecimal(r.getAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
r.setExcellentRate(new BigDecimal(r.getExcellentRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
r.setExcellentRate(new BigDecimal(r.getExcellentRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
r.setPassRate(new BigDecimal(r.getPassRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
r.setPassRate(new BigDecimal(r.getPassRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
- r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP)
|
|
|
|
- .doubleValue());
|
|
|
|
|
|
+ r.setRelativeAvgScore(
|
|
|
|
+ new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
|
|
}
|
|
}
|
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
new ExportExcel(name, ReportSubjectTeacher.class).setDataList(list).write(os);
|
|
new ExportExcel(name, ReportSubjectTeacher.class).setDataList(list).write(os);
|
|
@@ -359,8 +390,8 @@ public class ReportServiceImpl implements ReportService {
|
|
FormatType.XLSX);
|
|
FormatType.XLSX);
|
|
}
|
|
}
|
|
|
|
|
|
- private void uploadClass(int examId, String subjectCode, String subjectName, String name) throws IOException,
|
|
|
|
- Exception {
|
|
|
|
|
|
+ private void uploadClass(int examId, String subjectCode, String subjectName, String name)
|
|
|
|
+ throws IOException, Exception {
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
query.setExamId(examId);
|
|
query.setExamId(examId);
|
|
query.setSubjectCode(subjectCode);
|
|
query.setSubjectCode(subjectCode);
|
|
@@ -381,8 +412,8 @@ public class ReportServiceImpl implements ReportService {
|
|
FormatType.XLSX);
|
|
FormatType.XLSX);
|
|
}
|
|
}
|
|
|
|
|
|
- private void uploadCollege(int examId, String subjectCode, String subjectName, String name) throws IOException,
|
|
|
|
- Exception {
|
|
|
|
|
|
+ private void uploadCollege(int examId, String subjectCode, String subjectName, String name)
|
|
|
|
+ throws IOException, Exception {
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
ReportSubjectQuery query = new ReportSubjectQuery();
|
|
query.setExamId(examId);
|
|
query.setExamId(examId);
|
|
query.setSubjectCode(subjectCode);
|
|
query.setSubjectCode(subjectCode);
|
|
@@ -403,13 +434,13 @@ public class ReportServiceImpl implements ReportService {
|
|
FormatType.XLSX);
|
|
FormatType.XLSX);
|
|
}
|
|
}
|
|
|
|
|
|
- private void uploadRange(int examId, String subjectCode, String subjectName, String name) throws IOException,
|
|
|
|
- Exception {
|
|
|
|
|
|
+ private void uploadRange(int examId, String subjectCode, String subjectName, String name)
|
|
|
|
+ throws IOException, Exception {
|
|
List<ReportSubjectRangeDTO> list = new ArrayList<ReportSubjectRangeDTO>();
|
|
List<ReportSubjectRangeDTO> list = new ArrayList<ReportSubjectRangeDTO>();
|
|
ReportSubject subject = reportSubjectService.findOne(examId, subjectCode);
|
|
ReportSubject subject = reportSubjectService.findOne(examId, subjectCode);
|
|
if (subject != null) {
|
|
if (subject != null) {
|
|
- JSONArray array = getScoreRange(subject.getScoreRange(), subject.getTotalScore(),
|
|
|
|
- subject.getRealityCount(), 10);
|
|
|
|
|
|
+ JSONArray array = getScoreRange(subject.getScoreRange(), subject.getTotalScore(), subject.getRealityCount(),
|
|
|
|
+ 10);
|
|
for (int i = 0; i < array.size(); i++) {
|
|
for (int i = 0; i < array.size(); i++) {
|
|
JSONObject jsonObject = array.getJSONObject(i);
|
|
JSONObject jsonObject = array.getJSONObject(i);
|
|
Integer score = jsonObject.getInt("score");
|
|
Integer score = jsonObject.getInt("score");
|