Ver código fonte

增加统计相关人数、导出数量

ting.yin 3 anos atrás
pai
commit
95db32567a
21 arquivos alterados com 228 adições e 82 exclusões
  1. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java
  2. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamQuestionService.java
  3. 33 33
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java
  4. 23 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClass.java
  5. 30 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectCollege.java
  6. 34 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectTeacher.java
  7. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassModule.java
  8. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectCollegeModule.java
  9. 6 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectModule.java
  10. 1 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectTeacherModule.java
  11. 16 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkGroupDTO.java
  12. 14 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerInfoDTO.java
  13. 0 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java
  14. 3 4
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  15. 25 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  16. 4 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkAnswer.jsp
  17. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudent.jsp
  18. 4 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectClass.jsp
  19. 4 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectCollege.jsp
  20. 2 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectTeacher.jsp
  21. 14 4
      stmms-web/src/main/webapp/sql/stmms_ft.sql

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java

@@ -104,4 +104,7 @@ public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, J
     @Query("select distinct q.subjectCode from ExamQuestion q where q.examId=?1 and q.objective=?2 and q.groupNumber is null  ")
     public Set<String> FindSubjectCodeByExamIdAndObjectiveAndGroupNumberIsNull(int examId, boolean objective);
 
+    @Query(value = "select sum(cast(q.total_score as decimal(10,3))) from eb_exam_question q where q.exam_id=?1 and q.subject_code=?2 and q.is_objective=?3 and q.group_number=?4 ", nativeQuery = true)
+    public Double sumTotalScoreByGroupNumber(int examId, String subjectCode, boolean objective, Integer groupNumber);
+
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamQuestionService.java

@@ -76,4 +76,6 @@ public interface ExamQuestionService {
 
     void resetByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(Integer examId, String subjectCode, boolean objective,
             Integer number);
+
+    double sumTotalScoreByGroupNumber(int examId, String subjectCode, boolean objective, Integer groupNumber);
 }

+ 33 - 33
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Sort;
@@ -20,6 +21,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+
 import java.math.BigDecimal;
 import java.util.*;
 
@@ -100,38 +102,36 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveGroupByNumber(Integer examId, String subjectCode,
             boolean objective) {
-        return questionSort(
-                questionDao.findByExamIdAndSubjectCodeAndObjectiveGroupByNumber(examId, subjectCode, objective));
+        return questionSort(questionDao.findByExamIdAndSubjectCodeAndObjectiveGroupByNumber(examId, subjectCode,
+                objective));
     }
 
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean objective, String paperType) {
-        return questionSort(questionDao
-                .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective, paperType,
-                        new Sort(Direction.ASC, "mainNumber", "subNumber")));
+        return questionSort(questionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode,
+                objective, paperType, new Sort(Direction.ASC, "mainNumber", "subNumber")));
     }
 
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
             boolean objective, Integer groupNumber) {
-        return questionSort(questionDao
-                .findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, objective, groupNumber));
+        return questionSort(questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode,
+                objective, groupNumber));
     }
 
     @Override
-    public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumberNotEqual(Integer examId, String subjectCode,
-            boolean objective, Integer groupNumber) {
-        return questionSort(questionDao
-                .findByExamIdAndSubjectCodeAndObjectiveAndGroupNumberNotEqual(examId, subjectCode, objective,
-                        groupNumber));
+    public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumberNotEqual(Integer examId,
+            String subjectCode, boolean objective, Integer groupNumber) {
+        return questionSort(questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumberNotEqual(examId,
+                subjectCode, objective, groupNumber));
     }
 
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber) {
-        return questionSort(questionDao
-                .findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective, mainNumber));
+        return questionSort(questionDao.findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode,
+                objective, mainNumber));
     }
 
     @Override
@@ -154,8 +154,8 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public long countByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode, boolean objective,
             Integer mainNumber) {
-        return questionDao
-                .countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective, mainNumber);
+        return questionDao.countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
+                mainNumber);
     }
 
     private Specification<ExamQuestion> buildSpecification(final ExamQuestionSearchQuery query) {
@@ -190,9 +190,8 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
                 if (query.getMainNumber() != null) {
                     predicates.add(cb.equal(root.get("mainNumber"), query.getMainNumber()));
                 }
-                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()]));
             }
         };
     }
@@ -211,17 +210,15 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String paperType) {
-        return questionDao
-                .countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective, mainNumber,
-                        paperType);
+        return questionDao.countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
+                mainNumber, paperType);
     }
 
     @Override
     public long countByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String subNumber) {
-        return questionDao
-                .countByExamIdAndSubjectCodeAndObjectiveAndMainNumberAndSubNumber(examId, subjectCode, objective,
-                        mainNumber, subNumber);
+        return questionDao.countByExamIdAndSubjectCodeAndObjectiveAndMainNumberAndSubNumber(examId, subjectCode,
+                objective, mainNumber, subNumber);
     }
 
     @Transactional
@@ -242,23 +239,20 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public ExamQuestion findByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String subNumber) {
-        return questionDao
-                .findByExamIdAndSubjectCodeAndObjectiveAndMainNumberAndSubNumber(examId, subjectCode, objective,
-                        mainNumber, subNumber);
+        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndMainNumberAndSubNumber(examId, subjectCode,
+                objective, mainNumber, subNumber);
     }
 
     @Override
-    public List<ExamQuestion> findMainByExamAndSubjectAndObjective(Integer examId, String subjectCode,
-            boolean objective) {
+    public List<ExamQuestion> findMainByExamAndSubjectAndObjective(Integer examId, String subjectCode, boolean objective) {
         List<ExamQuestion> list = new ArrayList<ExamQuestion>();
         Set<Integer> mainNumbers = new LinkedHashSet<>();
         List<ExamQuestion> all = questionDao.findByExamIdAndSubjectCodeAndObjective(examId, subjectCode, objective);
         for (ExamQuestion q : all) {
             if (!mainNumbers.contains(q.getMainNumber())) {
                 mainNumbers.add(q.getMainNumber());
-                List<ExamQuestion> questions = questionDao
-                        .findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
-                                q.getMainNumber());
+                List<ExamQuestion> questions = questionDao.findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId,
+                        subjectCode, objective, q.getMainNumber());
                 BigDecimal totalScore = BigDecimal.ZERO;
                 for (ExamQuestion examQuestion : questions) {
                     totalScore = totalScore.add(BigDecimal.valueOf(examQuestion.getTotalScore()));
@@ -299,4 +293,10 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
         questionDao.resetByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, objective, groupNumber);
     }
 
+    @Override
+    public double sumTotalScoreByGroupNumber(int examId, String subjectCode, boolean objective, Integer groupNumber) {
+        Double score = questionDao.sumTotalScoreByGroupNumber(examId, subjectCode, objective, groupNumber);
+        return score != null ? score.doubleValue() : 0d;
+    }
+
 }

+ 23 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClass.java

@@ -106,6 +106,20 @@ public class ReportSubjectClass implements Serializable {
     @Column(name = "avg_score")
     private Double avgScore;
 
+    /**
+     * 报考人数
+     */
+    @ExcelField(title = "报考人数", align = 2, sort = 110)
+    @Column(name = "total_count")
+    private Integer totalCount;
+
+    /**
+     * 有效人数
+     */
+    @ExcelField(title = "有效人数", align = 2, sort = 120)
+    @Column(name = "reality_count")
+    private Integer realityCount;
+
     /**
      * 差异系数
      */
@@ -145,15 +159,9 @@ public class ReportSubjectClass implements Serializable {
     /**
      * 一分一段分段统计
      */
-    @Column(name = "score_range", nullable = true,columnDefinition = "text")
+    @Column(name = "score_range", nullable = true, columnDefinition = "text")
     private String scoreRange;
 
-    /**
-     * 有效人数
-     */
-    @Column(name = "reality_count")
-    private Integer realityCount;
-
     public Integer getId() {
         return id;
     }
@@ -314,4 +322,12 @@ public class ReportSubjectClass implements Serializable {
         this.realityCount = realityCount;
     }
 
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+    }
+
 }

+ 30 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectCollege.java

@@ -106,6 +106,20 @@ public class ReportSubjectCollege implements Serializable {
     @Column(name = "excellent_count")
     private Integer excellentCount;
 
+    /**
+     * 报考人数
+     */
+    @ExcelField(title = "报考人数", align = 2, sort = 110)
+    @Column(name = "total_count")
+    private Integer totalCount;
+
+    /**
+     * 有效人数
+     */
+    @ExcelField(title = "有效人数", align = 2, sort = 120)
+    @Column(name = "reality_count")
+    private Integer realityCount;
+
     public Integer getId() {
         return id;
     }
@@ -202,4 +216,20 @@ public class ReportSubjectCollege implements Serializable {
         this.excellentCount = excellentCount;
     }
 
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public Integer getRealityCount() {
+        return realityCount;
+    }
+
+    public void setRealityCount(Integer realityCount) {
+        this.realityCount = realityCount;
+    }
+
 }

+ 34 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectTeacher.java

@@ -57,69 +57,76 @@ public class ReportSubjectTeacher implements Serializable {
     @Column(name = "teacher_name")
     private String teacherName;
 
-    /**
-     * 有效人数
-     */
-    @ExcelField(title = "有效人数", align = 2, sort = 40)
-    @Column(name = "reality_count")
-    private int realityCount;
-
     /**
      * 最高分
      */
-    @ExcelField(title = "最高分", align = 2, sort = 50)
+    @ExcelField(title = "最高分", align = 2, sort = 40)
     @Column(name = "max_score")
     private Double maxScore;
 
     /**
      * 最低分
      */
-    @ExcelField(title = "最低分", align = 2, sort = 60)
+    @ExcelField(title = "最低分", align = 2, sort = 50)
     @Column(name = "min_score")
     private Double minScore;
 
     /**
      * 及格人数
      */
-    @ExcelField(title = "及格人数", align = 2, sort = 70)
+    @ExcelField(title = "及格人数", align = 2, sort = 60)
     @Column(name = "pass_count")
     private int passCount;
 
     /**
      * 及格率
      */
-    @ExcelField(title = "及格率", align = 2, sort = 80)
+    @ExcelField(title = "及格率", align = 2, sort = 70)
     @Column(name = "pass_rate")
     private Double passRate;
 
     /**
      * 优秀数
      */
-    @ExcelField(title = "优秀人数", align = 2, sort = 90)
+    @ExcelField(title = "优秀人数", align = 2, sort = 80)
     @Column(name = "excellent_count")
     private int excellentCount;
 
     /**
      * 优秀率
      */
-    @ExcelField(title = "优秀率", align = 2, sort = 100)
+    @ExcelField(title = "优秀率", align = 2, sort = 90)
     @Column(name = "excellent_rate")
     private Double excellentRate;
 
     /**
      * 平均分
      */
-    @ExcelField(title = "平均分", align = 2, sort = 110)
+    @ExcelField(title = "平均分", align = 2, sort = 100)
     @Column(name = "avg_score")
     private Double avgScore;
 
     /**
      * 平均相对分
      */
-    @ExcelField(title = "平均相对分", align = 2, sort = 120)
+    @ExcelField(title = "平均相对分", align = 2, sort = 110)
     @Column(name = "relative_avg_score")
     private Double relativeAvgScore;
 
+    /**
+     * 报考人数
+     */
+    @ExcelField(title = "报考人数", align = 2, sort = 120)
+    @Column(name = "total_count")
+    private Integer totalCount;
+
+    /**
+     * 有效人数
+     */
+    @ExcelField(title = "有效人数", align = 2, sort = 130)
+    @Column(name = "reality_count")
+    private Integer realityCount;
+
     public Integer getId() {
         return id;
     }
@@ -232,4 +239,16 @@ public class ReportSubjectTeacher implements Serializable {
         this.relativeAvgScore = relativeAvgScore;
     }
 
+    public Integer getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(Integer totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public void setRealityCount(Integer realityCount) {
+        this.realityCount = realityCount;
+    }
+
 }

+ 4 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassModule.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
 import cn.com.qmth.stmms.biz.report.utils.Module;
 import cn.com.qmth.stmms.biz.report.utils.ReportContext;
 import cn.com.qmth.stmms.biz.report.utils.unit.BaseCalculatorUnit;
+import cn.com.qmth.stmms.biz.report.utils.unit.BaseCounter;
 import cn.com.qmth.stmms.biz.utils.SpringContextHolder;
 
 public class SubjectClassModule extends SubjectModule implements Module {
@@ -28,6 +29,7 @@ public class SubjectClassModule extends SubjectModule implements Module {
                 String subjectCode = s[0];
                 String className = s[1];
                 BaseCalculatorUnit unit = units.get(key);
+                BaseCounter counter = counters.get(key);
                 ReportSubjectClass r = new ReportSubjectClass();
                 r.setExamId(this.context.getExamId());
                 r.setSubjectCode(subjectCode);
@@ -43,7 +45,8 @@ public class SubjectClassModule extends SubjectModule implements Module {
                 r.setCoefficient(unit.coefficient);
                 r.setDifficulty(unit.difficulty);
                 r.setStdev(unit.stdev);
-                r.setRealityCount(this.counters.get(key).realityCount);
+                r.setTotalCount(counter.totalCount);
+                r.setRealityCount(counter.realityCount);
                 service.save(r);
             }
         }

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectCollegeModule.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
 import cn.com.qmth.stmms.biz.report.utils.Module;
 import cn.com.qmth.stmms.biz.report.utils.ReportContext;
 import cn.com.qmth.stmms.biz.report.utils.unit.BaseCalculatorUnit;
+import cn.com.qmth.stmms.biz.report.utils.unit.BaseCounter;
 import cn.com.qmth.stmms.biz.utils.SpringContextHolder;
 
 public class SubjectCollegeModule extends SubjectModule implements Module {
@@ -28,6 +29,7 @@ public class SubjectCollegeModule extends SubjectModule implements Module {
                 String subjectCode = s[0];
                 String collegeName = s[1];
                 BaseCalculatorUnit unit = units.get(key);
+                BaseCounter counter = counters.get(key);
                 ReportSubjectCollege r = new ReportSubjectCollege();
                 r.setExamId(this.context.getExamId());
                 r.setSubjectCode(subjectCode);
@@ -40,6 +42,8 @@ public class SubjectCollegeModule extends SubjectModule implements Module {
                 r.setPassRate(unit.passRate);
                 r.setExcellentCount(unit.excellentCount);
                 r.setExcellentRate(unit.excellentRate);
+                r.setTotalCount(counter.totalCount);
+                r.setRealityCount(counter.realityCount);
                 service.save(r);
             }
         }

+ 6 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectModule.java

@@ -104,16 +104,17 @@ public class SubjectModule implements Module {
         BaseCalculatorUnit unit = units.get(key);
         if (unit == null) {
             unit = new BaseCalculatorUnit();
-            unit.passScore = context.getPassScore();
-            unit.excellentScore = context.getExcellentScore();
-
             String keys[] = key.split("\t");
             ExamSubject subject = context.getSubject(keys[0]);
+
+            unit.passScore = subject.getTotalScore() * context.getPassScore() * 0.01;
+            unit.excellentScore = subject.getTotalScore() * context.getExcellentScore() * 0.01;
+
             if (subject != null && subject.getPassScore() != null) {
-                unit.passScore = subject.getPassScore();
+                unit.passScore = subject.getTotalScore() * subject.getPassScore() * 0.01;
             }
             if (subject != null && subject.getExcellentScore() != null) {
-                unit.excellentScore = subject.getExcellentScore();
+                unit.excellentScore = subject.getTotalScore() * subject.getExcellentScore() * 0.01;
             }
             units.put(key, unit);
         }

+ 1 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectTeacherModule.java

@@ -37,6 +37,7 @@ public class SubjectTeacherModule extends SubjectModule implements Module {
                 subject.setSubjectName(context.getSubject(subjectCode).getName());
                 subject.setTeacherName(teacherName);
                 subject.setRealityCount(counter.realityCount);
+                subject.setTotalCount(counter.totalCount);
                 subject.setPassCount(unit.passCount);
                 subject.setExcellentCount(unit.excellentCount);
                 subject.setMaxScore(unit.maxScore);

+ 16 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkGroupDTO.java

@@ -1,7 +1,5 @@
 package cn.com.qmth.stmms.admin.dto;
 
-import java.text.DecimalFormat;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
@@ -32,7 +30,10 @@ public class MarkGroupDTO {
     @ExcelField(title = "评卷进度", align = 2, sort = 80)
     private String percent;
 
-    @ExcelField(title = "课程备注", align = 2, sort = 90)
+    @ExcelField(title = "待复核量", align = 2, sort = 90)
+    private long inspectedCount;
+
+    @ExcelField(title = "课程备注", align = 2, sort = 100)
     private String subjectRemark;
 
     public MarkGroupDTO(ExamSubject subject, MarkGroup group) {
@@ -44,8 +45,10 @@ public class MarkGroupDTO {
         libraryCount = group.getLibraryCount();
         markedCount = group.getMarkedCount();
         subjectRemark = subject.getRemark();
-        percent = libraryCount > 0 ? (new DecimalFormat("####.###").format(markedCount * 100.0 / libraryCount) + "%")
-                : "0%";
+        // percent = libraryCount > 0 ? (new
+        // DecimalFormat("####.###").format(markedCount * 100.0 / libraryCount)
+        // + "%")
+        // : "0%";
     }
 
     public String getSubjectCode() {
@@ -120,4 +123,12 @@ public class MarkGroupDTO {
         this.subjectRemark = subjectRemark;
     }
 
+    public long getInspectedCount() {
+        return inspectedCount;
+    }
+
+    public void setInspectedCount(long inspectedCount) {
+        this.inspectedCount = inspectedCount;
+    }
+
 }

+ 14 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerInfoDTO.java

@@ -19,13 +19,16 @@ public class MarkerInfoDTO {
     @ExcelField(title = "大题名称", align = 2, sort = 40)
     private String groupName;
 
-    @ExcelField(title = "登录名", align = 2, sort = 50)
+    @ExcelField(title = "分组总分", align = 2, sort = 50)
+    private Double totalScore;
+
+    @ExcelField(title = "登录名", align = 2, sort = 60)
     private String loginName;
 
-    @ExcelField(title = "姓名", align = 2, sort = 60)
+    @ExcelField(title = "姓名", align = 2, sort = 70)
     private String name;
 
-    @ExcelField(title = "评卷数量", align = 2, sort = 70)
+    @ExcelField(title = "评卷数量", align = 2, sort = 80)
     private long markedCount;
 
     public MarkerInfoDTO(Marker marker, ExamSubject subject, MarkGroup group) {
@@ -94,4 +97,12 @@ public class MarkerInfoDTO {
         this.groupNumber = groupNumber;
     }
 
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
 }

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

@@ -95,7 +95,6 @@ public class AnswerCheckController extends BaseExamController {
             query = studentService.findByQuery(query);
         }
         setting.accumulate("ids", StringUtils.join(ids, ","));
-        setting.accumulate("count", ids.size());
         return setting;
     }
 

+ 3 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -62,17 +62,16 @@ public class CheckStudentController extends BaseExamController {
 
     @RequestMapping("/getSetting")
     @ResponseBody
-    public JSONObject start(HttpServletRequest request, @RequestParam CheckType type) {
+    public JSONObject getSetting(HttpServletRequest request, @RequestParam CheckType checkType) {
         int examId = getSessionExamId(request);
         JSONObject setting = new JSONObject();
         setting.accumulate("fileServer", fileService.getFileServer());
         List<Integer> ids = new ArrayList<Integer>();
-        List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
+        List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, checkType);
         for (CheckStudent student : list) {
             ids.add(student.getStudentId());
         }
-        setting.accumulate("ids", StringUtils.join(ids, ","));
-        setting.accumulate("count", ids.size());
+        setting.accumulate("ids", ids);
         return setting;
     }
 

+ 25 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -2,8 +2,10 @@ package cn.com.qmth.stmms.admin.exam;
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
@@ -167,12 +169,33 @@ public class MarkController extends BaseExamController {
         } else {
             list.addAll(groupService.findByExam(examId));
         }
+        Map<String, String> subjectPercent = new HashMap<String, String>();
         for (MarkGroup group : list) {
             group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, group.getSubjectCode(),
                     group.getNumber()));
             group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
                     group.getSubjectCode(), false, group.getNumber()));
             MarkGroupDTO dto = new MarkGroupDTO(subjectService.find(examId, group.getSubjectCode()), group);
+            String percent = subjectPercent.get(group.getSubjectCode());
+            if (percent == null) {
+                MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
+                mQuery.setExamId(examId);
+                mQuery.setSubjectCode(group.getSubjectCode());
+                long libraryCount = libraryService.countByQuery(mQuery);
+                mQuery.addStatus(LibraryStatus.MARKED);
+                mQuery.addStatus(LibraryStatus.ARBITRATED);
+                mQuery.addStatus(LibraryStatus.INSPECTED);
+                long totalMarkedCount = libraryService.countByQuery(mQuery);
+                percent = libraryCount > 0 ? (new DecimalFormat("####.###").format(totalMarkedCount * 100.0
+                        / libraryCount) + "%") : "0%";
+                subjectPercent.put(group.getSubjectCode(), percent);
+            }
+            dto.setPercent(percent);
+            MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
+            mQuery.setExamId(examId);
+            mQuery.setSubjectCode(group.getSubjectCode());
+            mQuery.addStatus(LibraryStatus.MARKED);
+            dto.setInspectedCount(libraryService.countByQuery(mQuery));
             result.add(dto);
         }
 
@@ -204,6 +227,8 @@ public class MarkController extends BaseExamController {
             marker.setUser(userService.findById(marker.getUserId()));
             MarkerInfoDTO dto = new MarkerInfoDTO(marker, subjectService.find(marker.getExamId(),
                     marker.getSubjectCode()), group);
+            dto.setTotalScore(questionService.sumTotalScoreByGroupNumber(examId, marker.getSubjectCode(), false,
+                    marker.getGroupNumber()));
             result.add(dto);
         }
 

+ 4 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkAnswer.jsp

@@ -114,7 +114,7 @@
         </div>
         <div class="form-actions">
             <a href="javascript:void(0)" class="btn" id="count-button">查询数量</a>
-            <a href="javascript:void(0)" class="btn btn-primary hide" id="start-button">开始处理</a>
+            <a href="javascript:void(0)" class="btn btn-primary hide" id="start-button" target="_blank">开始处理</a>
         </div>
 	</form>
 <script type="text/javascript">
@@ -150,7 +150,9 @@ $('#count-button').click(function(){
 });
 
 $('#start-button').click(function(){
-    $('#searchForm').submit();
+	var queryId=new Date().getTime()
+	sessionStorage.setItem(queryId, $("#searchForm").serialize());
+	$('#start-button').attr('href','${ctx}/web/admin/exam/check/answer/start?queryId='+queryId);
 });
 
 function check(name){

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudent.jsp

@@ -26,7 +26,7 @@
 			&nbsp;
 			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
 			&nbsp;
-			<a href="${ctx}/admin/exam/check/student/start?type=${query.type.value}" target="_blank" class="btn btn-primary" id="start-button">开始处理</a>
+			<a href="${ctx}/web/admin/exam/check/student/start?type=${query.type.value}" target="_blank" class="btn btn-primary" id="start-button">开始处理</a>
 		</div>
 	</form>
 	<tags:message content="${message}"/>
@@ -59,7 +59,7 @@
 
 $('#start-button').click(function(){
 	var value = $('#type').val();
-	$('#start-button').attr('href','${ctx}/admin/exam/check/student/start?type='+value);
+	$('#start-button').attr('href','${ctx}/web/admin/exam/check/student/start?checkType='+value);
 });
 
 function page(n,s){

+ 4 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectClass.jsp

@@ -56,6 +56,8 @@
     <thead>
     <tr>
         <th data-i18n-text="report.class.name">班级</th>
+        <th data-i18n-text="report.subject.totalCount">报考人数</th>
+		<th data-i18n-text="report.subject.realityCount">有效人数</th>
         <th data-i18n-text="report.class.avgScore">平均分</th>
         <th data-i18n-text="report.class.maxScore">最高分</th>
         <th data-i18n-text="report.class.minScore">最低分</th>
@@ -69,6 +71,8 @@
     <c:forEach items="${list}" var="reportSubjectClass">
         <tr>
             <td>${reportSubjectClass.className}</td>
+            <td>${reportSubjectClass.totalCount}</td>
+			<td>${reportSubjectClass.realityCount}</td>
             <td><fmt:formatNumber type="number" value="${reportSubjectClass.avgScore}" pattern="0.00" maxFractionDigits="2"/></td>
             <td>${reportSubjectClass.maxScore}</td>
             <td>${reportSubjectClass.minScore}</td>

+ 4 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectCollege.jsp

@@ -59,6 +59,8 @@
     <thead>
     <tr>
         <th data-i18n-text="report.college.name">学生院系</th>
+		<th data-i18n-text="report.subject.totalCount">报考人数</th>
+		<th data-i18n-text="report.subject.realityCount">有效人数</th>
         <th data-i18n-text="report.college.avgScore">平均分</th>
         <th data-i18n-text="report.college.maxScore">最高分</th>
         <th data-i18n-text="report.college.minScore">最低分</th>
@@ -72,6 +74,8 @@
     <c:forEach items="${list}" var="reportSubjectCollege">
         <tr>
             <td>${reportSubjectCollege.collegeName}</td>
+            <td>${reportSubjectCollege.totalCount}</td>
+			<td>${reportSubjectCollege.realityCount}</td>
             <td><fmt:formatNumber type="number" value="${reportSubjectCollege.avgScore}" pattern="0.00" maxFractionDigits="2"/></td>
             <td>${reportSubjectCollege.maxScore}</td>
             <td>${reportSubjectCollege.minScore}</td>

+ 2 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectTeacher.jsp

@@ -56,6 +56,7 @@
     <thead>
     <tr>
         <th data-i18n-text="report.teacher.name">任课老师</th>
+		<th data-i18n-text="report.subject.totalCount">报考人数</th>
         <th data-i18n-text="report.teacher.realityCount">有效人数</th>
         <th data-i18n-text="report.teacher.passCount">及格</th>
         <th data-i18n-text="report.teacher.excellentCount">优秀</th>
@@ -74,6 +75,7 @@
                     '${reportSubjectteacher.teacherName}',
                 ${reportSubjectteacher.examId},
                     '${reportSubjectteacher.subjectCode}')">${reportSubjectteacher.teacherName}</a></td>
+			<td>${reportSubjectteacher.totalCount}</td>
             <td>${reportSubjectteacher.realityCount}</td>
             <td>${reportSubjectteacher.passCount}</td>
             <td>${reportSubjectteacher.excellentCount}</td>

+ 14 - 4
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -201,8 +201,8 @@ CREATE TABLE `eb_exam`
 	`sheet_view`		tinyint(1)   NOT NULL COMMENT '原卷显示功能',
     `mark_mode`       	varchar(16)  DEFAULT NULL COMMENT '强制评卷模式',
 	`scan_config`       text         DEFAULT NULL COMMENT '扫描配置',
-    `auto_scroll`   	tinyint(1) 		NOT NULL COMMENT '评卷是否跳转',
-	`enable_split`   	tinyint(1)  	NOT NULL COMMENT '页面是否裁切',
+    `auto_scroll`   	tinyint(1) 		NOT NULL COMMENT '评卷提交自动定位',
+	`enable_split`   	tinyint(1)  	NOT NULL COMMENT '自动对切题卡',
     PRIMARY KEY (`id`),
     UNIQUE KEY `index1` (`school_id`, `code`)
 ) ENGINE = InnoDB
@@ -331,7 +331,8 @@ CREATE TABLE `eb_exam_subject`
     `card_type`        varchar(16)  DEFAULT NULL COMMENT '题卡类型',
     `paper_file_type`  varchar(16)  DEFAULT NULL COMMENT '试卷文件类型',
     `answer_file_type` varchar(16)  DEFAULT NULL COMMENT '标答文件类型',
-	`enable_split`   	tinyint(1)	DEFAULT NULL COMMENT '页面是否裁切',
+	`auto_scroll`   	tinyint(1)	DEFAULT NULL COMMENT '评卷提交自动定位',
+	`enable_split`   	tinyint(1)	DEFAULT NULL COMMENT '自动对切题卡',
     PRIMARY KEY (`exam_id`, `code`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='考试科目表';
@@ -445,6 +446,7 @@ CREATE TABLE `eb_subjective_score`
     `group_score`  double      NOT NULL COMMENT '分组得分',
     `main_score`   double      NOT NULL COMMENT '大题得分',
     `score`        double      NOT NULL COMMENT '小题得分',
+    `unanswered_count`   	int(11)	NOT NULL COMMENT '未作答的步骤数量',
     PRIMARY KEY (`student_id`, `main_number`, `sub_number`),
     KEY `index1` (`exam_id`, `subject_code`, `main_number`, `main_score`)
 ) ENGINE = InnoDB
@@ -545,6 +547,7 @@ CREATE TABLE `m_library`
     `header_time`       datetime     DEFAULT NULL COMMENT '科组长评卷时间',
     `header_score`      double       DEFAULT NULL COMMENT '科组长总分',
     `header_score_list` text		 DEFAULT NULL COMMENT '科组长给分明细',
+    `unanswered_count`  int(11)		 DEFAULT NULL COMMENT '未作答的步骤数量',
     PRIMARY KEY (`id`),
     KEY `index1` (`exam_id`, `subject_code`, `group_number`, `status`),
     UNIQUE KEY `index2` (`student_id`, `group_number`, `task_number`),
@@ -595,6 +598,7 @@ CREATE TABLE `m_track`
     `offset_index`    int(11)      NOT NULL COMMENT '裁切图序号',
     `offset_x`        int(11)      NOT NULL COMMENT '裁切图X轴坐标',
     `offset_y`        int(11)      NOT NULL COMMENT '裁切图Y轴坐标',
+    `unanswered`      tinyint(1)   NOT NULL COMMENT '未作答',
     PRIMARY KEY (`library_id`, `question_number`, `number`),
     KEY `index1` (`student_id`, `group_number`),
     KEY `index2` (`marker_id`),
@@ -639,6 +643,7 @@ CREATE TABLE `m_problem_history`
     `user_id`       int(11)      DEFAULT NULL COMMENT '处理人ID',
     `total_score`   double       DEFAULT NULL COMMENT '总分',
     `score_list`    text		 DEFAULT NULL COMMENT '给分明细',
+	`unanswered_count`	int(11)	DEFAULT NULL COMMENT '未作答的步骤数量',
     `create_time`   datetime    NOT NULL COMMENT '创建时间',
     `update_time`   datetime     DEFAULT NULL COMMENT '处理时间',
     PRIMARY KEY (`id`),
@@ -715,6 +720,7 @@ CREATE TABLE `m_trial_track`
     `offset_index`    int(11)     NOT NULL COMMENT '裁切图序号',
     `offset_x`        int(11)     NOT NULL COMMENT '裁切图X轴坐标',
     `offset_y`        int(11)     NOT NULL COMMENT '裁切图Y轴坐标',
+    `unanswered`      tinyint(1)   NOT NULL COMMENT '未作答',
     PRIMARY KEY (`library_id`, `marker_id`, `number`, `question_number`),
     KEY `index1` (`exam_id`, `subject_code`, `group_number`),
     KEY `index2` (`student_id`),
@@ -887,7 +893,8 @@ CREATE TABLE `s_basic_subject_class`
     `difficulity_level`    text        DEFAULT NULL COMMENT '难度分布',
     `discrimination_level` text        DEFAULT NULL COMMENT '区分度分布',
     `range_level`          text        DEFAULT NULL COMMENT '高低分分布',
-    `reality_count`        int(11)     DEFAULT NULL COMMENT '有效数量',
+	`total_count`      	   int(11)     DEFAULT NULL COMMENT '报考人数',
+    `reality_count`        int(11)     DEFAULT NULL COMMENT '有效人数',
     PRIMARY KEY (`id`),
     KEY `index1` (`exam_id`, `subject_code`)
 ) ENGINE = InnoDB
@@ -905,6 +912,8 @@ CREATE TABLE `s_basic_subject_college`
     `subject_code`    varchar(32) DEFAULT NULL COMMENT '科目代码',
     `subject_name`    varchar(32) DEFAULT NULL COMMENT '科目名称',
     `college_name`    varchar(64) DEFAULT NULL COMMENT '学院名称',
+	`total_count`      	 int(11)     DEFAULT NULL COMMENT '报考人数',    
+    `reality_count`      int(11)     DEFAULT NULL COMMENT '有效人数',
     `excellent_count` int(11)     DEFAULT NULL COMMENT '优秀人数',
     `excellent_rate`  double      DEFAULT NULL COMMENT '优秀率',
     `pass_count`      int(11)     DEFAULT NULL COMMENT '及格人数',
@@ -936,6 +945,7 @@ CREATE TABLE `s_basic_subject_teacher`
     `max_score`          double      DEFAULT NULL COMMENT '最高分',
     `min_score`          double      DEFAULT NULL COMMENT '最低分',
     `avg_score`          double      DEFAULT NULL COMMENT '平均分',
+    `total_count`      	 int(11)     DEFAULT NULL COMMENT '报考人数',    
     `reality_count`      int(11)     DEFAULT NULL COMMENT '有效人数',
     `relative_avg_score` double      DEFAULT NULL COMMENT '平均相对分',
     PRIMARY KEY (`id`),