瀏覽代碼

定时任务需更新大题评卷数量;删除大题需统分;增加客观题导入验证;修复人工确认增加;修复成绩分析各种错误

ting.yin 6 年之前
父節點
當前提交
8aa27e5423
共有 17 個文件被更改,包括 136 次插入105 次删除
  1. 1 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java
  2. 1 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  3. 3 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java
  4. 0 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java
  5. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassServiceImpl.java
  6. 2 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectCollegeServiceImpl.java
  7. 86 74
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java
  8. 5 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java
  9. 2 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectRangeServiceImpl.java
  10. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectServiceImpl.java
  11. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherClassServiceImpl.java
  12. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherServiceImpl.java
  13. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/DoubleUtil.java
  14. 11 10
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java
  15. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  16. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java
  17. 5 5
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectGroup.jsp

+ 1 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -187,6 +187,7 @@ public class MarkCronService {
                 try {
                     markService.buildFormalLibrary(student, campus, group, subject);
                     markService.updateLibraryCount(group);
+                    markService.updateMarkedCount(group);
                     lastBuildTime = student.getUploadTime();
                 } catch (Exception e) {
                     log.error("build formal library error for studentId=" + student.getId() + ", groupNumber="

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -238,7 +238,7 @@ public class MarkServiceImpl implements MarkService {
                     sumTotalScore(group.getExamId(), group.getSubjectCode()));
             //需要重新统分
             Exam exam = examService.findById(group.getExamId());
-            exam.setNeedCalculate(false);
+            exam.setNeedCalculate(true);
             examService.save(exam);
         } catch (Exception e) {
             throw e;

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java

@@ -22,8 +22,9 @@ public interface ReportSubjectGroupDao extends PagingAndSortingRepository<Report
     @Query("delete from ReportSubjectGroup r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
-    @Query("select q.mainNumber,q.mainTitle,q.paperType,count(q.mainNumber) as subNumber from ExamQuestion q where q.examId=?1 and q.subjectCode=?2 and q.objective=?3 group by q.mainNumber,q.mainTitle,q.paperType  "
-            + "order by q.mainNumber")
+    @Query("select q.mainNumber,q.mainTitle,q.paperType,count(q.mainNumber) as subNumber ,sum(q.totalScore) as mainTotalScore "
+            + " from ExamQuestion q where q.examId=?1 and q.subjectCode=?2 and q.objective=?3 group by q.mainNumber,q.mainTitle,q.paperType  "
+            + " order by q.mainNumber")
     public List<Object[]> countGroupByMainNum(Integer examId, String subjectCode, boolean objective);
 
 }

+ 0 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java

@@ -6,7 +6,6 @@ import cn.com.qmth.stmms.biz.report.service.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -52,7 +51,6 @@ public class ReportServiceImpl implements ReportService {
      *
      * @param examId 考试id
      */
-    @Transactional
     @Override
     public void generateReportData(Integer examId) {
 

+ 4 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassServiceImpl.java

@@ -8,15 +8,18 @@ import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
 import cn.com.qmth.stmms.biz.utils.DoubleUtil;
+
 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 javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+
 import java.util.LinkedList;
 import java.util.List;
 
@@ -35,7 +38,7 @@ public class ReportSubjectClassServiceImpl extends BaseQueryService<ReportSubjec
     @Autowired
     private ExamSubjectDao examSubjectDao;
 
-
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectClassDao.deleteByExamId(examId);

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectCollegeServiceImpl.java

@@ -13,6 +13,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 javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -37,7 +38,7 @@ public class ReportSubjectCollegeServiceImpl extends BaseQueryService<ReportSubj
     @Autowired
     private ExamSubjectDao examSubjectDao;
 
-
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectCollegeDao.deleteByExamId(examId);

+ 86 - 74
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java

@@ -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
 
     }
 
-
 }

+ 5 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java

@@ -12,6 +12,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.ExamStudentDao;
@@ -52,6 +53,7 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
         return reportSubjectQuestionDao.save(reportSubjectQuestion);
     }
 
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectQuestionDao.deleteByExamId(examId);
@@ -104,7 +106,7 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
 
                 for (int j = 0; j < studentCount; j++) {
                     ExamStudent student = examStudentList.get(j);
-                    if(!question.getPaperType().equalsIgnoreCase(student.getPaperType())){
+                    if(question.getPaperType()!=null && !question.getPaperType().equalsIgnoreCase(student.getPaperType())){
                         continue;
                     }
                     Double score = 0d;
@@ -132,7 +134,7 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                 Double avgScore = DoubleUtil.div(sumScore, examStudentList.size(), 2);
                 for (int j = 0; j < studentCount; j++) {
                     ExamStudent student = examStudentList.get(j);
-                    if(!question.getPaperType().equalsIgnoreCase(student.getPaperType())){
+                    if(question.getPaperType()!=null && !question.getPaperType().equalsIgnoreCase(student.getPaperType())){
                         continue;
                     }
                     Double score = 0d;
@@ -158,7 +160,7 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                 reportSubjectQuestion.setQuestionName(question.getMainTitle() + "_" + (i + 1));
                 reportSubjectQuestion.setTotalScore(question.getTotalScore());
                 reportSubjectQuestion.setAvgScore(avgScore);
-                reportSubjectQuestion.setScoreRate(DoubleUtil.div(scoreCount, studentCount, 2));
+                reportSubjectQuestion.setScoreRate(DoubleUtil.div(avgScore, question.getTotalScore(), 2));
                 reportSubjectQuestion.setSd(DoubleUtil.format(Math.sqrt(variance / studentCount), "0.00"));
                 reportSubjectQuestion.setFullScoreRate(DoubleUtil.div(fullScoreCount, studentCount, 2));
                 reportSubjectQuestionDao.save(reportSubjectQuestion);

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectRangeServiceImpl.java

@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 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.report.dao.ReportSubjectRangeDao;
@@ -33,7 +34,7 @@ public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjec
     @Autowired
     private ReportSubjectRangeDao reportSubjectRangetDao;
 
-
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectRangetDao.deleteByExamId(examId);

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectServiceImpl.java

@@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 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.report.dao.ReportSubjectDao;
@@ -38,6 +39,7 @@ public class ReportSubjectServiceImpl extends BaseQueryService<ReportSubject> im
         return reportSubjectDao.save(reportSubject);
     }
 
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectDao.deleteByExamId(examId);

+ 4 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherClassServiceImpl.java

@@ -9,15 +9,18 @@ import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
 import cn.com.qmth.stmms.biz.utils.DoubleUtil;
+
 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 javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+
 import java.util.LinkedList;
 import java.util.List;
 
@@ -39,7 +42,7 @@ public class ReportSubjectTeacherClassServiceImpl extends BaseQueryService<Repor
     @Autowired
     private ExamSubjectDao examSubjectDao;
 
-
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectTeacherClassDao.deleteByExamId(examId);

+ 4 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectTeacherServiceImpl.java

@@ -9,15 +9,18 @@ import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
 import cn.com.qmth.stmms.biz.utils.DoubleUtil;
+
 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 javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+
 import java.util.LinkedList;
 import java.util.List;
 
@@ -39,7 +42,7 @@ public class ReportSubjectTeacherServiceImpl extends BaseQueryService<ReportSubj
     @Autowired
     private ExamSubjectDao examSubjectDao;
 
-
+    @Transactional
     @Override
     public void deleteByExamId(Integer examId) {
         reportSubjectTeacherDao.deleteByExamId(examId);

+ 4 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/DoubleUtil.java

@@ -60,7 +60,10 @@ public class DoubleUtil {
      * @return
      */
     public static double div(double d1, double d2, int scale) {
-        //  当然在此之前,你要判断分母是否为0,    
+        //  当然在此之前,你要判断分母是否为0,   
+        if(d2==0){
+            return 0;
+        }
         //  为0你可以根据实际需求做相应的处理 
         BigDecimal bd1 = new BigDecimal(Double.toString(d1));
         BigDecimal bd2 = new BigDecimal(Double.toString(d2));

+ 11 - 10
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java

@@ -200,15 +200,17 @@ public class SubjectQuestionDTO {
         Map<Integer,Double> mainScoreMap1 = new HashMap<Integer, Double>();
         int maniCount1 = 0;
         for (ExamQuestion question : value) {
-            Integer subCount = subCountMap1.get(question.getMainNumber());
-            if (subCount != null ) {
-                subCountMap1.put(question.getMainNumber(), subCount+1);
-                Double mainScore = mainScoreMap1.get(question.getMainNumber());
-                mainScoreMap1.put(question.getMainNumber(), mainScore+question.getTotalScore());
-            } else {
-                subCountMap1.put(question.getMainNumber(), 1);
-                mainScoreMap1.put(question.getMainNumber(), question.getTotalScore());
-                maniCount1++;
+            if(question.getTotalScore()!=0){
+                Integer subCount = subCountMap1.get(question.getMainNumber());
+                if (subCount != null ) {
+                    subCountMap1.put(question.getMainNumber(), subCount+1);
+                    Double mainScore = mainScoreMap1.get(question.getMainNumber());
+                    mainScoreMap1.put(question.getMainNumber(), mainScore+question.getTotalScore());
+                } else {
+                    subCountMap1.put(question.getMainNumber(), 1);
+                    mainScoreMap1.put(question.getMainNumber(), question.getTotalScore());
+                    maniCount1++;
+                }
             }
         }
         if(maniCount!=maniCount1){
@@ -218,7 +220,6 @@ public class SubjectQuestionDTO {
             if(!subCountMap.get(mainNumber).equals(subCountMap1.get(mainNumber))){
                 return "小题数量不一致";
             }
-            //
             if(!mainScoreMap.get(mainNumber).equals(mainScoreMap1.get(mainNumber))){
                 return "大题总分不一致";
             }

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -375,7 +375,7 @@ public class ScoreController extends BaseExamController {
     private String enableExport(int examId,String subjectCode) {
         String message = null;
         List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL,MarkStatus.TRIAL);
-        if(groups!=null){
+        if(groups!=null && !groups.isEmpty()){
             message = subjectCode+" 科目未评卷完成";
         }
         return message;

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java

@@ -76,6 +76,7 @@ public class ScoreCalculateThread implements Runnable {
     public void run() {
         log.info("start calculate for examId=" + examId);
         try {
+            checkStudentService.deleteByExamId(examId);
             int pageNumber = 1;
             int pageSize = 1000;
             List<ExamStudent> list = studentService.findByExamIdAndUploadAndAbsent(examId, true, false, pageNumber,
@@ -90,7 +91,6 @@ public class ScoreCalculateThread implements Runnable {
             }
 
             // 统计识别缺考的试卷
-            checkStudentService.deleteByExamId(examId);
             List<ExamStudent> students = studentService.findByExamIdAndUploadAndAbsent(examId, true, true, 1,
                     Integer.MAX_VALUE);
             for (ExamStudent examStudent : students) {

+ 5 - 5
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectGroup.jsp

@@ -36,9 +36,9 @@
                         <c:if test="${query.subjectCode eq subject.code }">selected</c:if>>${subject.code}-${subject.name}</option>
             </c:forEach>
         </select>
-        <label>大题</label>
-            <select class="input-medium" id="group-select" name="groupNumber">
-            </select>
+<!--         <label>大题</label> -->
+<!--             <select class="input-medium" id="group-select" name="groupNumber"> -->
+<!--             </select> -->
         &nbsp;
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
 		&nbsp;
@@ -89,7 +89,7 @@ $("#export-button").click(function(){
 	$("#searchForm").attr("action","${ctx}/admin/exam/reportSubjectGroup/export");
 	$("#searchForm").submit();
 });
-var searchSubjectCode = '${query.subjectCode}';
+/* var searchSubjectCode = '${query.subjectCode}';
 var searchGroupNumber = '${query.groupNumber}';
 $('#subject-select').change(function(){
     var code = $(this).val();
@@ -110,7 +110,7 @@ $('#subject-select').change(function(){
         }
         parent.trigger('change');
     });
-});
+}); */
 $('#subject-select').trigger('change');
 
     function viewGroupEcharts() {