Эх сурвалжийг харах

增加启动时统计机构

wangliang 1 жил өмнө
parent
commit
95ece5750b

+ 36 - 6
themis-business/src/main/java/com/qmth/themis/business/cache/ExamRecordCacheUtil.java

@@ -247,7 +247,12 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setAlreadyBreakCount(Long recordId, Integer alreadyBreakCount) {
-        redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.already_break_count.getCode(), Long.parseLong(alreadyBreakCount.toString()));
+        Integer alreadyBreakCountCache = ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
+        if (Objects.isNull(alreadyBreakCountCache)) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.already_break_count.getCode(), alreadyBreakCount);
+        } else {
+            redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.already_break_count.getCode(), Long.parseLong(alreadyBreakCount.toString()));
+        }
     }
 
     private static ExamStatusBean getStatusBean(Long recordId) {
@@ -298,7 +303,12 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setWarningCount(Long recordId, Integer warningCount) {
-        redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_count.getCode(), Long.parseLong(warningCount.toString()));
+        Integer warningCountCache = ExamRecordCacheUtil.getWarningCount(recordId);
+        if (Objects.isNull(warningCountCache)) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_count.getCode(), warningCount);
+        } else {
+            redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_count.getCode(), Long.parseLong(warningCount.toString()));
+        }
     }
 
     public static Integer getWarningCount(Long recordId) {
@@ -307,7 +317,12 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setWarningUnread(Long recordId, Integer warningUnread) {
-        redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_unread.getCode(), Long.parseLong(warningUnread.toString()));
+        Integer warningUnreadCache = ExamRecordCacheUtil.getWarningUnread(recordId);
+        if (Objects.isNull(warningUnreadCache)) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_unread.getCode(), warningUnread);
+        } else {
+            redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_unread.getCode(), Long.parseLong(warningUnread.toString()));
+        }
     }
 
     public static Integer getWarningUnread(Long recordId) {
@@ -316,7 +331,12 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setWarningMultipleFaceCount(Long recordId, Integer warningMultipleFaceCount) {
-        redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_multiple_face_count.getCode(), Long.parseLong(warningMultipleFaceCount.toString()));
+        Integer warningMultipleFaceCountCache = ExamRecordCacheUtil.getWarningMultipleFaceCount(recordId);
+        if (Objects.isNull(warningMultipleFaceCountCache)) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_multiple_face_count.getCode(), warningMultipleFaceCount);
+        } else {
+            redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.warning_multiple_face_count.getCode(), Long.parseLong(warningMultipleFaceCount.toString()));
+        }
     }
 
     public static Integer getWarningMultipleFaceCount(Long recordId) {
@@ -325,7 +345,12 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setExceptionCount(Long recordId, Integer exceptionCount) {
-        redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.exception_count.getCode(), Long.parseLong(exceptionCount.toString()));
+        Integer exceptionCountCache = ExamRecordCacheUtil.getExceptionCount(recordId);
+        if (Objects.isNull(exceptionCountCache)) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.exception_count.getCode(), exceptionCount);
+        } else {
+            redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.exception_count.getCode(), Long.parseLong(exceptionCount.toString()));
+        }
     }
 
     public static Integer getExceptionCount(Long recordId) {
@@ -357,7 +382,12 @@ public class ExamRecordCacheUtil {
     }
 
     public static void setInProcessLivenessVerifyCount(Long recordId, Integer inProcessLivenessVerifyCount) {
-        redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_verify_count.getCode(), Long.parseLong(inProcessLivenessVerifyCount.toString()));
+        Integer inProcessLivenessVerifyCountCache = ExamRecordCacheUtil.getInProcessLivenessVerifyCount(recordId);
+        if (Objects.isNull(inProcessLivenessVerifyCountCache)) {
+            redisUtil.set(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_verify_count.getCode(), inProcessLivenessVerifyCount);
+        } else {
+            redisUtil.setInc(RedisKeyHelper.examRecordCacheKey(recordId), ExamRecordFieldEnum.in_process_liveness_verify_count.getCode(), Long.parseLong(inProcessLivenessVerifyCount.toString()));
+        }
     }
 
     public static Integer getInProcessLivenessVerifyCount(Long recordId) {

+ 11 - 1
themis-business/src/main/java/com/qmth/themis/business/dao/TEOrgSummaryMapper.java

@@ -20,10 +20,12 @@ public interface TEOrgSummaryMapper extends BaseMapper<TEOrgSummary> {
     /**
      * 机构统计考试次数和考试人数信息
      *
+     * @param orgId
      * @param examIdSet
+     * @param all
      * @return
      */
-    OrgSummaryBean orgSummary(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
+    OrgSummaryBean orgSummary(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet, boolean all);
 
     /**
      * 统计全局考试科次
@@ -33,6 +35,14 @@ public interface TEOrgSummaryMapper extends BaseMapper<TEOrgSummary> {
      */
     Integer orgSummaryByFinishCount(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
 
+    /**
+     * 统计全局考生完成数
+     *
+     * @param examIdSet
+     * @return
+     */
+    Integer orgSummaryByFinishStudentCount(@Param("orgId") Long orgId, @Param("examIdSet") List<Long> examIdSet);
+
     /**
      * 保存机构统计信息
      *

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

@@ -59,6 +59,11 @@ public class TEOrgSummary implements Serializable {
         this.finishStudentCount = orgSummaryBean.getFinishStudentCount();
     }
 
+    public TEOrgSummary(Long orgId) {
+        this.orgId = orgId;
+    }
+
+
     public Long getOrgId() {
         return orgId;
     }

+ 16 - 0
themis-business/src/main/java/com/qmth/themis/business/service/TEOrgSummaryService.java

@@ -23,6 +23,13 @@ public interface TEOrgSummaryService extends IService<TEOrgSummary> {
      */
     public void orgSummary(Long orgId, List<Long> examIdSet);
 
+    /**
+     * 根据机构id统计信息
+     *
+     * @param orgId
+     */
+    public void orgSummary(Long orgId);
+
     /**
      * 更新全局机构考试完成数量和考生完成数量
      *
@@ -30,4 +37,13 @@ public interface TEOrgSummaryService extends IService<TEOrgSummary> {
      * @param finishStudentCount
      */
     public void updateOrgZeroSummary(Long orgId, Integer finishStudentCount);
+
+    /**
+     * 根据机构id更新在线和考试人数
+     *
+     * @param orgId
+     * @param onlineCount
+     * @param examCount
+     */
+    public void updateOrgSummary(Long orgId, Integer onlineCount, Integer examCount);
 }

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/service/TOeExamRecordService.java

@@ -24,7 +24,7 @@ import java.util.Set;
  */
 public interface TOeExamRecordService extends IService<TOeExamRecord> {
 
-    Long saveByPrepare(Long examId, Long examActivityId, Long examStudentId, Long paperId, Integer serialNumber, Long studentId, Integer mobilePhotoUpload);
+    TOeExamRecord saveByPrepare(Long examId, Long examActivityId, Long examStudentId, Long paperId, Integer serialNumber, Long studentId, Integer mobilePhotoUpload);
 
     /**
      * 计算客观分

+ 17 - 5
themis-business/src/main/java/com/qmth/themis/business/service/impl/AuthInfoServiceImpl.java

@@ -8,13 +8,11 @@ import com.qmth.boot.core.solar.service.SolarService;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.entity.TBOrg;
+import com.qmth.themis.business.entity.TEOrgSummary;
 import com.qmth.themis.business.entity.TSAuth;
 import com.qmth.themis.business.enums.AuthEnum;
 import com.qmth.themis.business.enums.UploadFileEnum;
-import com.qmth.themis.business.service.AuthInfoService;
-import com.qmth.themis.business.service.ThemisCacheService;
-import com.qmth.themis.business.service.TBOrgService;
-import com.qmth.themis.business.service.TSAuthService;
+import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
@@ -61,6 +59,9 @@ public class AuthInfoServiceImpl implements AuthInfoService {
     @Resource
     OssUtil ossUtil;
 
+    @Resource
+    TEOrgSummaryService teOrgSummaryService;
+
     /**
      * 授权信息初始化
      *
@@ -214,11 +215,12 @@ public class AuthInfoServiceImpl implements AuthInfoService {
                     tbOrg.setLogo(o.getLogoUrl());
                 }
                 tbOrgSet.add(tbOrg);
-            } else {
                 tbOrg.setAccessKey(o.getAccessKey());
                 tbOrg.setAccessSecret(o.getAccessSecret());
                 tbOrg.setLogo(Objects.nonNull(o.getLogoUrl()) ? o.getLogoUrl() : tbOrg.getLogo());
                 tbOrgSet.add(tbOrg);
+            } else {
+                tbOrgSet.add(tbOrg);
             }
         }
 
@@ -227,11 +229,21 @@ public class AuthInfoServiceImpl implements AuthInfoService {
             tsAuthService.saveOrUpdateBatch(tsAuthList);
 
             if (!CollectionUtils.isEmpty(tbOrgSet)) {
+                for (TBOrg tbOrg : tbOrgSet) {
+                    TEOrgSummary teOrgSummary = teOrgSummaryService.getOne(new QueryWrapper<TEOrgSummary>().lambda().eq(TEOrgSummary::getOrgId, tbOrg.getId()));
+                    if (Objects.isNull(teOrgSummary)) {
+                        teOrgSummaryService.orgSummary(tbOrg.getId());
+                    }
+                }
                 tbOrgService.saveOrUpdateBatch(tbOrgSet);
                 themisCacheService.removeOrgIdCache();
                 themisCacheService.removeOrgCodeCache();
             }
 
+            TEOrgSummary teOrgSummary = teOrgSummaryService.getOne(new QueryWrapper<TEOrgSummary>().lambda().eq(TEOrgSummary::getOrgId, 0L));
+            if (Objects.isNull(teOrgSummary)) {
+                teOrgSummaryService.orgSummary(0L);
+            }
             AuthInfoService authInfoService = SpringContextHolder.getBean(AuthInfoService.class);
             authInfoService.updateSchoolEnable(orgCodesMap);
         }

+ 11 - 10
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -295,14 +295,6 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 } else {
                     cache = true;
                 }
-                //最后开考时间发送定时任务
-                //删除再新增quartz任务,发送mq消息start
-                Map<String, Object> prop = new HashMap<>();
-                prop.put(SystemConstant.OPER, SystemConstant.INSERT);
-                prop.put(SystemConstant.EXAM, teExamService.getById(es.getExamId()));
-                MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY_FINAL_PREPARE_TIME.name(), JacksonUtil.parseJson(tOeExamRecord), MqTagEnum.EXAM_ACTIVITY_FINAL_PREPARE_TIME, String.valueOf(tOeExamRecord.getId()), prop, examStudentCacheBean.getName());
-                mqDtoService.assembleSendAsyncOrderMsg(mqDto);
-                //删除再新增quartz任务,发送mq消息end
 
                 SysConfig sysConfig = themisCacheService.addSysConfigCache(SystemConstant.MONITOR_CONFIG_PREFIX);
                 Optional.ofNullable(sysConfig).orElseThrow(() -> new BusinessException("未配置监控前缀"));
@@ -366,10 +358,10 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         //            throw new BusinessException("试卷答案未上传:" + paperId);
         //        }
 
-        Long recordId = toeExamRecordService
+        tOeExamRecord = toeExamRecordService
                 .saveByPrepare(es.getExamId(), es.getExamActivityId(), examStudentId, paperId,
                         es.getAlreadyExamCount() + 1, studentId, ec.getMobilePhotoUpload());
-
+        Long recordId = tOeExamRecord.getId();
         es.setCurrentRecordId(recordId);
         // 更新考生缓存
         redisUtil.set(RedisKeyHelper.examStudentCacheKey(examStudentId), es);
@@ -400,6 +392,15 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         MqDto mqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FIRST_PREPARE, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), IpUtil.getRemoteIp(ServletUtil.getRequest()));
         this.sendOeLogMessage(SystemOperationEnum.FIRST_PREPARE, examStudentId, recordId, mqDto);
         //mq发送消息end
+
+        //最后开考时间发送定时任务
+        //删除再新增quartz任务,发送mq消息start
+        Map<String, Object> prop = new HashMap<>();
+        prop.put(SystemConstant.OPER, SystemConstant.INSERT);
+        prop.put(SystemConstant.EXAM, teExamService.getById(es.getExamId()));
+        MqDto mqDtoFinalPrepare = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_ACTIVITY_FINAL_PREPARE_TIME.name(), JacksonUtil.parseJson(tOeExamRecord), MqTagEnum.EXAM_ACTIVITY_FINAL_PREPARE_TIME, String.valueOf(tOeExamRecord.getId()), prop, String.valueOf(tOeExamRecord.getId()));
+        mqDtoService.assembleSendAsyncOrderMsg(mqDtoFinalPrepare);
+        //删除再新增quartz任务,发送mq消息end
         return prepare;
     }
 

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

@@ -1,11 +1,13 @@
 package com.qmth.themis.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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;
+import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExamSummary;
 import com.qmth.themis.business.entity.TEOrgSummary;
 import com.qmth.themis.business.service.TEExamService;
@@ -17,7 +19,9 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -48,9 +52,8 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
     @Override
     public void orgSummary(Long orgId, List<Long> examIdSet) {
         if (orgId.longValue() == 0) {//全局机构
-            OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet);
-            TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, orgSummaryBean);
-            teOrgSummaryService.saveOrUpdate(teOrgSummary);
+            OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet, false);
+            this.updateOrgSummary(orgId, orgSummaryBean.getOnlineCount(), orgSummaryBean.getExamCount());
         } else {
             LinkedMultiValueMap<Long, Long> orgExamIdMap = new LinkedMultiValueMap<>();
             boolean reloadDb = false;
@@ -67,9 +70,8 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
                 }
             }
             if (reloadDb) {//没有该批次的考试统计缓存信息,则从数据库取数据
-                OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet);
-                TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, orgSummaryBean);
-                teOrgSummaryService.saveOrUpdate(teOrgSummary);
+                OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet, false);
+                this.updateOrgSummary(orgId, orgSummaryBean.getOnlineCount(), orgSummaryBean.getExamCount());
             } else {
                 orgExamIdMap.forEach((k, v) -> {//从考试批次缓存信息里拿取在线人数、考试人数、完成考生数
                     Integer onlineCount = 0, examCount = 0;
@@ -80,17 +82,37 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
                             examCount = examCount + t.getExamCount();
                         }
                     }
-                    UpdateWrapper<TEOrgSummary> teOrgSummaryUpdateWrapper = new UpdateWrapper<>();
-                    teOrgSummaryUpdateWrapper.lambda().set(TEOrgSummary::getOnlineCount, onlineCount)
-                            .set(TEOrgSummary::getExamCount, examCount)
-                            .eq(TEOrgSummary::getOrgId, orgId);
-                    teOrgSummaryService.update(teOrgSummaryUpdateWrapper);
+                    this.updateOrgSummary(orgId, onlineCount, examCount);
                 });
             }
         }
         themisCacheService.updateOrgSummaryCache(orgId);
     }
 
+    /**
+     * 根据机构id统计信息
+     *
+     * @param orgId
+     */
+    @Override
+    public void orgSummary(Long orgId) {
+        List<Long> examIdSet = null;
+        if (orgId.longValue() != 0) {//全局机构
+            List<TEExam> teExamList = teExamService.list(new QueryWrapper<TEExam>().lambda().eq(TEExam::getOrgId, orgId));
+            if (!CollectionUtils.isEmpty(teExamList)) {
+                examIdSet = teExamList.stream().map(s -> s.getId()).collect(Collectors.toList());
+            } else {
+                examIdSet = Arrays.asList(-1L);
+            }
+        }
+        OrgSummaryBean orgSummaryBean = this.baseMapper.orgSummary(orgId, examIdSet, true);
+        Integer finishStudentCount = this.baseMapper.orgSummaryByFinishStudentCount(orgId, examIdSet);
+        orgSummaryBean.setFinishStudentCount(finishStudentCount);
+        TEOrgSummary teOrgSummary = new TEOrgSummary(orgId, orgSummaryBean);
+        teOrgSummaryService.save(teOrgSummary);
+        themisCacheService.updateOrgSummaryCache(orgId);
+    }
+
     /**
      * 更新全局机构考试完成数量和考生完成数量
      *
@@ -102,4 +124,20 @@ public class TEOrgSummaryServiceImpl extends ServiceImpl<TEOrgSummaryMapper, TEO
     public void updateOrgZeroSummary(Long orgId, Integer finishStudentCount) {
         this.baseMapper.updateOrgZeroSummary(orgId, finishStudentCount);
     }
+
+    /**
+     * 根据机构id更新在线和考试人数
+     *
+     * @param orgId
+     * @param onlineCount
+     * @param examCount
+     */
+    @Override
+    public void updateOrgSummary(Long orgId, Integer onlineCount, Integer examCount) {
+        UpdateWrapper<TEOrgSummary> teOrgSummaryUpdateWrapper = new UpdateWrapper<>();
+        teOrgSummaryUpdateWrapper.lambda().set(TEOrgSummary::getOnlineCount, onlineCount)
+                .set(TEOrgSummary::getExamCount, examCount)
+                .eq(TEOrgSummary::getOrgId, orgId);
+        teOrgSummaryService.update(teOrgSummaryUpdateWrapper);
+    }
 }

+ 4 - 5
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -28,7 +28,6 @@ import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.FileUtil;
 import com.qmth.themis.common.util.GsonUtil;
 import com.qmth.themis.common.util.SimpleBeanUtil;
-import com.tencentcloudapi.cme.v20191029.models.IntegerRange;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -121,8 +120,8 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
 
     @Transactional
     @Override
-    public Long saveByPrepare(Long examId, Long examActivityId, Long examStudentId, Long paperId,
-                              Integer serialNumber, Long studentId, Integer mobilePhotoUpload) {
+    public TOeExamRecord saveByPrepare(Long examId, Long examActivityId, Long examStudentId, Long paperId,
+                                       Integer serialNumber, Long studentId, Integer mobilePhotoUpload) {
         ExamActivityCacheBean ac = examActivityService.getExamActivityCacheBean(examActivityId);
         ExamCacheBean exam = examService.getExamCacheBean(examId);
         TOeExamRecord er = new TOeExamRecord();
@@ -169,7 +168,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
 
         //2022-04-15新增
         ExamingDataCacheUtil.setExamingRecordId(studentId, er.getId());
-        return er.getId();
+        return er;
     }
 
     /**
@@ -588,7 +587,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             } else if (Objects.nonNull(warningUnread) && number.intValue() > 0) {
                 ExamRecordCacheUtil.setWarningUnread(id, -(warningUnread - number));
             } else {
-                ExamRecordCacheUtil.setWarningUnread(id, -warningUnread);
+                ExamRecordCacheUtil.setWarningUnread(id, 0);
             }
             if (Objects.nonNull(updateDb) && updateDb) {
                 this.sendExamRecordDataSaveMq(id, System.currentTimeMillis());

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

@@ -17,27 +17,35 @@
                 <foreach collection="examIdSet" item="examId" index="index" open="(" close=")" separator=",">
                     #{examId}
                 </foreach>
-            </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
+            </if> then 1 else 0 end) as examCount
+            <if test="all != null and all != '' and all == 1">
+                   ,
+                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
+            </if>
             from t_oe_exam_record toer
-            left join t_e_exam_student tees on tees.current_record_id = toer.id
+    </select>
+
+    <select id="orgSummaryByFinishStudentCount" resultType="java.lang.Integer">
+        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')
+        <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>
     </select>
 
     <select id="orgSummaryByFinishCount" resultType="java.lang.Integer">

+ 9 - 9
themis-task/src/main/java/com/qmth/themis/task/quartz/ExamSummaryJob.java

@@ -81,6 +81,15 @@ public class ExamSummaryJob extends QuartzJobBean {
                             log.info("examSummaryJob examId:{},examActivityId:{},roomCodeSet:{} 开始统计", examId, e.getExamActivityId(), roomCodeSet);
                             teExamSummaryService.examSummary(examId, e.getExamActivityId(), roomCodeSet);
                             teRegionSummaryService.regionSummary(examId, e.getExamActivityId());
+                            //统计机构信息
+                            if (orgExamIdMap.size() > 0) {
+                                List<Long> examIdAll = new ArrayList<>();
+                                orgExamIdMap.forEach((k, v) -> {
+                                    teOrgSummaryService.orgSummary(k, v);
+                                    examIdAll.addAll(v);
+                                });
+                                teOrgSummaryService.orgSummary(0L, examIdAll);
+                            }
                         } else if (endTime <= timestamp) {//超过考试结束时间则删除考试场次缓存
                             themisCacheService.removeCurrentExamListCache(entry.getKey(), e.getExamActivityId());
                         }
@@ -89,15 +98,6 @@ public class ExamSummaryJob extends QuartzJobBean {
                     themisCacheService.removeCurrentExamListCache(entry.getKey());
                 }
             }
-            //统计机构信息
-            if (orgExamIdMap.size() > 0) {
-                List<Long> examIdAll = new ArrayList<>();
-                orgExamIdMap.forEach((k, v) -> {
-                    teOrgSummaryService.orgSummary(k, v);
-                    examIdAll.addAll(v);
-                });
-                teOrgSummaryService.orgSummary(0L, examIdAll);
-            }
         }
     }
 }

+ 3 - 1
themis-task/src/main/java/com/qmth/themis/task/quartz/service/impl/QuartzLogicServiceImpl.java

@@ -219,7 +219,9 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         String[] strings = key.split("\\.");
         String[] examRecordIds = strings[1].split("-");
         TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(Long.parseLong(examRecordIds[0]));
-        if (Objects.nonNull(tOeExamRecord)) {
+        if (Objects.nonNull(tOeExamRecord)
+                && tOeExamRecord.getStatus() == ExamRecordStatusEnum.FIRST_PREPARE
+                && tOeExamRecord.getClientWebsocketStatus() == WebsocketStatusEnum.ON_LINE) {
             Map<String, Object> properties = new HashMap<>();
             properties.put(SystemConstant.RECORD_ID, tOeExamRecord.getId());
             MqDto clientMqDto = new MqDto(mqUtil.getTopic(), MqTagEnum.EXAM_EXIT.name(), tOeExamRecord.getId(), MqTagEnum.EXAM_EXIT, String.valueOf(tOeExamRecord.getId()), properties, String.valueOf(tOeExamRecord.getId()));