deason 2 gadi atpakaļ
vecāks
revīzija
93868c99a5

+ 6 - 1
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamStatisticController.java

@@ -28,6 +28,12 @@ public class ExamStatisticController extends ControllerSupport {
     @Autowired
     private SystemProperties systemConfig;
 
+    @PostMapping("/overview/refresh")
+    @ApiOperation(value = "统计概况(刷新)")
+    public void refresh(@RequestParam Long examId, @RequestParam Long courseId) {
+        examStatisticService.refresh(examId, courseId);
+    }
+
     @PostMapping("/overview")
     @ApiOperation(value = "统计概况")
     public OverviewInfo overview(@RequestParam Long examId, @RequestParam Long courseId) {
@@ -62,7 +68,6 @@ public class ExamStatisticController extends ControllerSupport {
 
         exportFile("学习中心统计.xlsx", file);
         FileUtils.deleteQuietly(file);
-
     }
 
 }

+ 2 - 0
examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/ExamStatisticRepo.java

@@ -14,4 +14,6 @@ public interface ExamStatisticRepo extends JpaRepository<ExamStatisticEntity, Lo
 
     List<ExamStatisticEntity> findByExamIdAndCourseId(Long examId, Long courseId);
 
+    ExamStatisticEntity findByExamIdAndCourseIdAndOrgId(Long examId, Long courseId, Long orgId);
+
 }

+ 1 - 3
examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/entity/ExamStatisticEntity.java

@@ -9,9 +9,7 @@ import javax.persistence.*;
  */
 @Entity
 @Table(name = "ec_oe_exam_statistic", indexes = {
-        @Index(name = "IDX_OE_ES_001", columnList = "examId"),
-        @Index(name = "IDX_OE_ES_002", columnList = "courseId"),
-        @Index(name = "IDX_OE_ES_003", columnList = "orgId")
+        @Index(name = "IDX_OE_ES_001", columnList = "examId,courseId,orgId", unique = true)
 })
 public class ExamStatisticEntity extends JpaEntity {
 

+ 2 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamStatisticService.java

@@ -7,6 +7,8 @@ import java.util.List;
 
 public interface ExamStatisticService {
 
+    void refresh(Long examId, Long courseId);
+
     OverviewInfo overview(Long examId, Long courseId);
 
     List<ExamStatisticInfo> overviewForOrg(Long examId, Long courseId);

+ 75 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/statistic/ExamStudentScoreInfo.java

@@ -0,0 +1,75 @@
+package cn.com.qmth.examcloud.core.oe.admin.service.bean.statistic;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+
+public class ExamStudentScoreInfo implements JsonSerializable {
+
+    private static final long serialVersionUID = 5667104330981650606L;
+
+    private Long examId;
+
+    private Long courseId;
+
+    private Long orgId;
+
+    private Long examStudentId;
+
+    /**
+     * 考生成绩
+     */
+    private Double totalScore;
+
+    /**
+     * 试卷总分
+     */
+    private Double paperScore;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public Long getExamStudentId() {
+        return examStudentId;
+    }
+
+    public void setExamStudentId(Long examStudentId) {
+        this.examStudentId = examStudentId;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Double getPaperScore() {
+        return paperScore;
+    }
+
+    public void setPaperScore(Double paperScore) {
+        this.paperScore = paperScore;
+    }
+
+}

+ 68 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamStatisticServiceImpl.java

@@ -11,15 +11,19 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.ExamStatisticRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamStatisticEntity;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamStatisticService;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.statistic.ExamStatisticInfo;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.statistic.ExamStudentScoreInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.statistic.OverviewInfo;
 import com.google.common.collect.Lists;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -38,6 +42,70 @@ public class ExamStatisticServiceImpl implements ExamStatisticService {
     @Autowired
     private OrgCloudService orgCloudService;
 
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Override
+    public void refresh(Long examId, Long courseId) {
+        int passScoreLine = 60;
+        int goodScoreLine = 90;
+
+        long start = System.currentTimeMillis();
+
+        StringBuffer sql = new StringBuffer();
+        sql.append(" select es.exam_id,es.course_id,es.org_id,es.exam_student_id,sc.total_score,d.paper_score");
+        sql.append(" from ec_oe_exam_student es");
+        sql.append(" left join ec_oe_exam_student_final_score sc on sc.exam_student_id = es.exam_student_id");
+        sql.append(" left join ec_oe_exam_record_data d on d.id = sc.exam_record_data_id");
+        sql.append(" where es.exam_id = ").append(examId);
+        sql.append(" and es.course_id = ").append(courseId);
+
+        List<ExamStudentScoreInfo> list = jdbcTemplate.query(sql.toString(), new BeanPropertyRowMapper(ExamStudentScoreInfo.class));
+        if (CollectionUtils.isEmpty(list)) {
+            log.warn("ExamStudent is empty! examId:{} courseId:{}", examId, courseId);
+            return;
+        }
+
+        Map<Long, List<ExamStudentScoreInfo>> orgStatisticMaps = list.stream().collect(Collectors.groupingBy(ExamStudentScoreInfo::getOrgId));
+        for (Map.Entry<Long, List<ExamStudentScoreInfo>> e : orgStatisticMaps.entrySet()) {
+            int allCount = 0, finishCount = 0, passScoreCount = 0, goodScoreCount = 0;
+            for (ExamStudentScoreInfo v : e.getValue()) {
+                allCount++;
+
+                if (v.getTotalScore() == null) {
+                    // 无成绩,则未完成考试
+                    continue;
+                }
+
+                finishCount++;
+
+                if (v.getTotalScore() >= (v.getPaperScore() * passScoreLine) / 100d) {
+                    passScoreCount++;
+                }
+
+                if (v.getTotalScore() >= (v.getPaperScore() * goodScoreLine) / 100d) {
+                    goodScoreCount++;
+                }
+            }
+
+            ExamStatisticEntity result = examStatisticRepo.findByExamIdAndCourseIdAndOrgId(examId, courseId, e.getKey());
+            if (result == null) {
+                result = new ExamStatisticEntity();
+                result.setExamId(examId);
+                result.setCourseId(courseId);
+                result.setOrgId(e.getKey());
+            }
+            result.setAllCount(allCount);
+            result.setFinishCount(finishCount);
+            result.setPassScoreCount(passScoreCount);
+            result.setGoodScoreCount(goodScoreCount);
+            result.setUpdateTime(new Date());
+            examStatisticRepo.save(result);
+        }
+
+        log.warn("refresh ok! examId:{} courseId:{} cost:{}ms", examId, courseId, System.currentTimeMillis() - start);
+    }
+
     @Override
     public OverviewInfo overview(Long examId, Long courseId) {
         OverviewInfo result = new OverviewInfo();