wangliang 1 рік тому
батько
коміт
679d9e581a

+ 59 - 0
themis-business/src/main/java/com/qmth/themis/business/bean/admin/OrgSummaryBean.java

@@ -0,0 +1,59 @@
+package com.qmth.themis.business.bean.admin;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 机构统计bean
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/4/20
+ */
+public class OrgSummaryBean implements Serializable {
+
+    @ApiModelProperty(name = "在线人数")
+    private Integer onlineCount = 0;
+
+    @ApiModelProperty(name = "考试人数")
+    private Integer examCount = 0;
+
+    @ApiModelProperty(name = "考试科次人数")
+    private Integer finishCount = 0;
+
+    @ApiModelProperty(name = "考生完成人数")
+    private Integer finishStudentCount = 0;
+
+    public Integer getOnlineCount() {
+        return onlineCount;
+    }
+
+    public void setOnlineCount(Integer onlineCount) {
+        this.onlineCount = onlineCount;
+    }
+
+    public Integer getExamCount() {
+        return examCount;
+    }
+
+    public void setExamCount(Integer examCount) {
+        this.examCount = examCount;
+    }
+
+    public Integer getFinishCount() {
+        return finishCount;
+    }
+
+    public void setFinishCount(Integer finishCount) {
+        this.finishCount = finishCount;
+    }
+
+    public Integer getFinishStudentCount() {
+        return finishStudentCount;
+    }
+
+    public void setFinishStudentCount(Integer finishStudentCount) {
+        this.finishStudentCount = finishStudentCount;
+    }
+}

+ 9 - 0
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamActivityMapper.java

@@ -100,4 +100,13 @@ public interface TEExamActivityMapper extends BaseMapper<TEExamActivity> {
     public List<Map<String, Long>> findMinStartTimeAndMaxFinshTimeByExamId(@Param("examId") Long examId);
 
     public List<Long> findExamIdToday(@Param("startTime") Long startTime, @Param("endTime") Long endTime);
+
+    /**
+     * 查找当前待考列表
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<TEExamActivity> findCurrentExamActivity(@Param("startTime") Long startTime, @Param("endTime") Long endTime);
 }

+ 2 - 25
themis-business/src/main/java/com/qmth/themis/business/dao/TEOrgSummaryMapper.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.business.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.themis.business.bean.admin.OrgSummaryBean;
 import com.qmth.themis.business.entity.TEOrgSummary;
 import org.apache.ibatis.annotations.Param;
 
@@ -22,15 +23,7 @@ public interface TEOrgSummaryMapper extends BaseMapper<TEOrgSummary> {
      * @param examIdSet
      * @return
      */
-    List<Integer> orgSummary(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
-
-    /**
-     * 机构统计考试次数和考试人数信息
-     *
-     * @param examIdSet
-     * @return
-     */
-    List<Integer> orgSummaryByFinishCountAndFinishStudentCount(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
+    OrgSummaryBean orgSummary(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
 
     /**
      * 统计全局考试科次
@@ -40,22 +33,6 @@ public interface TEOrgSummaryMapper extends BaseMapper<TEOrgSummary> {
      */
     Integer orgSummaryByFinishCount(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
 
-    /**
-     * 统计全局考试科次
-     *
-     * @param examIdSet
-     * @return
-     */
-    Integer orgSummaryByOnlineCount(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
-
-    /**
-     * 统计全局考试科次
-     *
-     * @param examIdSet
-     * @return
-     */
-    Integer orgSummaryByExamCount(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
-
     /**
      * 保存机构统计信息
      *

+ 9 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TEOrgSummary.java

@@ -3,6 +3,7 @@ package com.qmth.themis.business.entity;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.themis.business.bean.admin.OrgSummaryBean;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -50,6 +51,14 @@ public class TEOrgSummary implements Serializable {
         this.finishStudentCount = Objects.isNull(finishStudentCount) ? 0 : finishStudentCount;
     }
 
+    public TEOrgSummary(Long orgId, OrgSummaryBean orgSummaryBean) {
+        this.orgId = orgId;
+        this.onlineCount = orgSummaryBean.getOnlineCount();
+        this.examCount = orgSummaryBean.getExamCount();
+        this.finishCount = orgSummaryBean.getFinishCount();
+        this.finishStudentCount = orgSummaryBean.getFinishStudentCount();
+    }
+
     public Long getOrgId() {
         return orgId;
     }

+ 9 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TEExamActivityService.java

@@ -124,4 +124,13 @@ public interface TEExamActivityService extends IService<TEExamActivity> {
     void saveExamActivity(List<TEExamActivity> teExamActivityList);
 
     List<Long> findExamIdToday();
+
+    /**
+     * 查找当前待考列表
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    List<TEExamActivity> findCurrentExamActivity(Long startTime, Long endTime);
 }

+ 12 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java

@@ -489,4 +489,16 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
         }
         return null;
     }
+
+    /**
+     * 查找当前待考列表
+     *
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    @Override
+    public List<TEExamActivity> findCurrentExamActivity(Long startTime, Long endTime) {
+        return this.baseMapper.findCurrentExamActivity(startTime, endTime);
+    }
 }

+ 6 - 6
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEOrgSummaryServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.business.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.themis.business.bean.admin.OrgSummaryBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.dao.TEOrgSummaryMapper;
 import com.qmth.themis.business.entity.TBOrg;
@@ -46,9 +47,8 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
     @Override
     public void orgSummary(Long orgId, List<Long> examIdSet) {
         if (orgId.longValue() == 0) {//全局机构
-            //todo 全局统计需求和产品探讨(能否不显示考试科目数和已完成考生数),sql合并
-            List<Integer> list = this.baseMapper.orgSummary(orgId, examIdSet);
-            TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, list.get(0), list.get(1), list.get(2), list.get(3));
+            OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet);
+            TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, orgSummaryBean);
             teOrgSummaryService.saveOrUpdate(teOrgSummary);
         } else {
             LinkedMultiValueMap<Long, Long> orgExamIdMap = new LinkedMultiValueMap<>();
@@ -66,8 +66,8 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
                 }
             }
             if (reloadDb) {//没有该批次的考试统计缓存信息,则从数据库取数据
-                List<Integer> list = this.baseMapper.orgSummary(orgId, examIdSet);
-                TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, list.get(0), list.get(1), list.get(2), list.get(3));
+                OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet);
+                TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, orgSummaryBean);
                 teOrgSummaryService.saveOrUpdate(teOrgSummary);
             } else {
                 orgExamIdMap.forEach((k, v) -> {//从考试批次缓存信息里拿取在线人数、考试人数、完成考生数
@@ -80,7 +80,7 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
                             finishStudentCount = finishStudentCount + t.getFinishCount();
                         }
                     }
-                    //TODO finishCount可以从缓存取?
+                    //这里取不了,examSummary只有考生完成数,没有考试科目数
                     Integer finishCount = this.baseMapper.orgSummaryByFinishCount(orgId, v);
                     TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, onlineCount, examCount, finishCount, finishStudentCount);
                     teOrgSummaryService.saveOrUpdate(teOrgSummary);

+ 15 - 18
themis-business/src/main/java/com/qmth/themis/business/service/impl/ThemisCacheServiceImpl.java

@@ -619,31 +619,28 @@ public class ThemisCacheServiceImpl implements ThemisCacheService {
             SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             Long startTime = sdf2.parse(current + " 00:00:00").getTime();
             Long endTime = sdf2.parse(current + " 23:59:59").getTime();
-            //todo 联合teexam表查一次(enable为true),暂定1小时刷新一次,取缓存时不判断enable状态,不做删除缓存操作
-            List<TEExamActivity> teExamActivityList = teExamActivityService.list(new QueryWrapper<TEExamActivity>().lambda()
-                    .and(w -> w.ge(TEExamActivity::getStartTime, startTime).le(TEExamActivity::getStartTime, endTime))
-                    .or(w -> w.le(TEExamActivity::getStartTime, startTime).ge(TEExamActivity::getFinishTime, endTime))
-                    .eq(TEExamActivity::getEnable, 1));
+//            List<TEExamActivity> teExamActivityList = teExamActivityService.list(new QueryWrapper<TEExamActivity>().lambda()
+//                    .and(w -> w.ge(TEExamActivity::getStartTime, startTime).le(TEExamActivity::getStartTime, endTime))
+//                    .or(w -> w.le(TEExamActivity::getStartTime, startTime).ge(TEExamActivity::getFinishTime, endTime))
+//                    .eq(TEExamActivity::getEnable, 1));
+            List<TEExamActivity> teExamActivityList = teExamActivityService.findCurrentExamActivity(startTime, endTime);
             //统计当天00:00:00~23:59:59可以进行的考试批次、场次、考场编码信息
             if (!CollectionUtils.isEmpty(teExamActivityList)) {
                 LinkedMultiValueMap<Long, ExamListBean> currentExamListMap = new LinkedMultiValueMap<>();//考试批次、场次集合/考场编码集合
                 Map<Long, Set<Long>> examActivityIdMap = new HashMap<>();//考试批次id,场次id集合
                 Map<Long, Set<String>> roomCodeMap = new HashMap<>();//考试场次id,考场编码集合
                 for (TEExamActivity t : teExamActivityList) {
-                    ExamCacheBean examCacheBean = teExamService.getExamCacheBean(t.getExamId());
-                    if (Objects.nonNull(examCacheBean.getEnable()) && examCacheBean.getEnable().intValue() == 1 && Objects.nonNull(t.getEnable()) && t.getEnable().intValue() == 1) {
-                        List<TEExamStudent> teExamStudentList = teExamStudentService.list(new QueryWrapper<TEExamStudent>().lambda().eq(TEExamStudent::getExamId, t.getExamId()).eq(TEExamStudent::getExamActivityId, t.getId()));
-                        if (!CollectionUtils.isEmpty(teExamStudentList)) {
-                            Set<String> roomCodeSet = teExamStudentList.stream().map(s -> s.getRoomCode()).collect(Collectors.toSet());
-                            if (examActivityIdMap.containsKey(t.getExamId())) {
-                                Set<Long> examActivityIdSet = examActivityIdMap.get(t.getExamId());
-                                examActivityIdSet.add(t.getId());
-                                examActivityIdMap.put(t.getExamId(), examActivityIdSet);
-                            } else {
-                                examActivityIdMap.put(t.getExamId(), new HashSet<>(Arrays.asList(t.getId())));
-                            }
-                            roomCodeMap.put(t.getId(), roomCodeSet);
+                    List<TEExamStudent> teExamStudentList = teExamStudentService.list(new QueryWrapper<TEExamStudent>().lambda().eq(TEExamStudent::getExamId, t.getExamId()).eq(TEExamStudent::getExamActivityId, t.getId()));
+                    if (!CollectionUtils.isEmpty(teExamStudentList)) {
+                        Set<String> roomCodeSet = teExamStudentList.stream().map(s -> s.getRoomCode()).collect(Collectors.toSet());
+                        if (examActivityIdMap.containsKey(t.getExamId())) {
+                            Set<Long> examActivityIdSet = examActivityIdMap.get(t.getExamId());
+                            examActivityIdSet.add(t.getId());
+                            examActivityIdMap.put(t.getExamId(), examActivityIdSet);
+                        } else {
+                            examActivityIdMap.put(t.getExamId(), new HashSet<>(Arrays.asList(t.getId())));
                         }
+                        roomCodeMap.put(t.getId(), roomCodeSet);
                     }
                 }
                 examActivityIdMap.forEach((k, v) -> {

+ 0 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/WarningServiceImpl.java

@@ -246,7 +246,6 @@ public class WarningServiceImpl implements WarningService {
      * @param tIeInvigilateWarnInfo
      */
     public void setWarningCount(Long recordId, TIeInvigilateWarnInfo tIeInvigilateWarnInfo) {
-        //todo 直接写数据库不走redis缓存,orgId同步修改
         tOeExamRecordService.updateWarningCountCache(recordId, tIeInvigilateWarnInfo);
     }
 

+ 15 - 0
themis-business/src/main/resources/mapper/TEExamActivityMapper.xml

@@ -214,4 +214,19 @@
           and t.enable = 1
           and f.enable = 1
     </select>
+
+    <select id="findCurrentExamActivity" resultType="com.qmth.themis.business.entity.TEExamActivity">
+        SELECT
+        teea.*
+        FROM
+        t_e_exam_activity teea
+        left join t_e_exam tee on tee.id = teea.exam_id
+        WHERE
+        (teea.start_time <![CDATA[ >= ]]> #{startTime}
+        AND teea.start_time <![CDATA[ <= ]]> #{endTime})
+        OR (teea.start_time <![CDATA[ <= ]]> #{startTime}
+        AND teea.finish_time <![CDATA[ >= ]]> #{endTime})
+        AND teea.enable = 1
+        and teea.enable = 1
+    </select>
 </mapper>

+ 28 - 62
themis-business/src/main/resources/mapper/TEOrgSummaryMapper.xml

@@ -2,52 +2,50 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.qmth.themis.business.dao.TEOrgSummaryMapper">
 
-    <select id="orgSummary" resultType="java.lang.Integer">
-        <include refid="orgSummaryByOnlineCountCommon" />
-            union all
-        <include refid="orgSummaryByExamCountCommon" />
-            union all
-        <include refid="orgSummaryByFinishCountAndFinishStudentCountCommon" />
-    </select>
-
-    <select id="orgSummaryByFinishCountAndFinishStudentCount" resultType="java.lang.Integer">
-        <include refid="orgSummaryByFinishCountAndFinishStudentCountCommon" />
-    </select>
-
-    <sql id="orgSummaryByFinishCountAndFinishStudentCountCommon">
-        select count(1) as c
-        from t_oe_exam_record toer
-        where toer.STATUS in ('FINISHED', 'PERSISTED')
-        <if test="orgId != null and orgId != '' and orgId > 0">
+    <select id="orgSummary" resultType="com.qmth.themis.business.bean.admin.OrgSummaryBean">
+        select
+            sum(case when (toer.client_websocket_status = 'ON_LINE'
             <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
                 and toer.exam_id in
                 <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
                     #{examId}
                 </foreach>
-            </if>
-        </if>
-        union all
-        select count(tees.id) as c
-        from t_e_exam_student tees
-        left join t_oe_exam_record toer on toer.exam_student_id = tees.id and tees.current_record_id = toer.id
-        where toer.STATUS in ('FINISHED', 'PERSISTED') or tees.already_exam_count > 0
-        <if test="orgId != null and orgId != ''">
+            </if>) then 1 else 0 end) as onlineCount,
+            sum(case when (toer.status = 'ANSWERING' and toer.client_websocket_status = 'ON_LINE') or toer.status = 'RESUME_PREPARE' or toer.status = 'BREAK_OFF'
             <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
                 and toer.exam_id in
                 <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
                     #{examId}
                 </foreach>
-            </if>
-        </if>
-    </sql>
+            </if> then 1 else 0 end) as examCount,
+            sum(case when (toer.status in ('FINISHED', 'PERSISTED')
+            <if test="orgId != null and orgId != '' and orgId > 0">
+                <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
+                    and toer.exam_id in
+                    <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
+                        #{examId}
+                    </foreach>
+                </if>
+            </if>) then 1 else 0 end) as finishCount,
+            sum(case when (tees.id and toer.status in ('FINISHED', 'PERSISTED') or tees.already_exam_count > 0
+            <if test="orgId != null and orgId != ''">
+                <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
+                    and toer.exam_id in
+                    <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
+                        #{examId}
+                    </foreach>
+                </if>
+            </if>) then 1 else 0 end) as finishStudentCount
+            from t_oe_exam_record toer
+            left join t_e_exam_student tees on tees.current_record_id = toer.id
+    </select>
 
     <select id="orgSummaryByFinishCount" resultType="java.lang.Integer">
         <include refid="orgSummaryByFinishCountCommon" />
     </select>
 
     <sql id="orgSummaryByFinishCountCommon">
-        select count(1) as finishCount
-        from t_oe_exam_record toer
+        select count(1) as finishCount from t_oe_exam_record toer
         where toer.STATUS in ('FINISHED', 'PERSISTED')
         <if test="orgId != null and orgId != '' and orgId > 0">
             <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
@@ -59,38 +57,6 @@
         </if>
     </sql>
 
-    <select id="orgSummaryByOnlineCount" resultType="java.lang.Integer">
-        <include refid="orgSummaryByOnlineCountCommon" />
-    </select>
-
-    <sql id="orgSummaryByOnlineCountCommon">
-        select count(1) as c
-        from t_oe_exam_record toer
-        where toer.client_websocket_status = 'ON_LINE'
-        <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
-            and toer.exam_id in
-            <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
-                #{examId}
-            </foreach>
-        </if>
-    </sql>
-
-    <select id="orgSummaryByExamCount" resultType="java.lang.Integer">
-        <include refid="orgSummaryByExamCountCommon" />
-    </select>
-
-    <sql id="orgSummaryByExamCountCommon">
-        select count(1) as c
-        from t_oe_exam_record toer
-        where (toer.STATUS = 'ANSWERING' and toer.client_websocket_status = 'ON_LINE') or toer.status = 'RESUME_PREPARE' or toer.status = 'BREAK_OFF'
-        <if test="examIdSet != null and examIdSet != '' and examIdSet.size > 0">
-            and toer.exam_id in
-            <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
-                #{examId}
-            </foreach>
-        </if>
-    </sql>
-
     <insert id="saveOrgSummary">
         INSERT INTO t_e_org_summary
             (${fieldName})