ソースを参照

加入批次结束时间校验

wangliang 2 年 前
コミット
e1cad8e5de

+ 1 - 1
themis-admin/src/main/java/com/qmth/themis/admin/api/SysController.java

@@ -170,7 +170,7 @@ public class SysController {
             }
         }
         Map map = new HashMap();
-        map.put(SystemConstant.ID, tbAttachment.getId());
+        map.put(SystemConstant.ID, String.valueOf(tbAttachment.getId()));
         map.put(SystemConstant.NAME, tbAttachment.getName());
         map.put(SystemConstant.TYPE, tbAttachment.getType());
         map.put(SystemConstant.URL, url);

+ 1 - 0
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamActivityController.java

@@ -115,6 +115,7 @@ public class TEExamActivityController {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
+        teAudio.setOrgId(Objects.nonNull(tbUser.getOrgId()) ? tbUser.getOrgId() : -1L);
         if (Objects.isNull(teAudio.getId())) {
             teAudio.insertInfo(tbUser.getId());
         } else {

+ 26 - 11
themis-admin/src/main/java/com/qmth/themis/admin/api/TEExamController.java

@@ -24,6 +24,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -107,7 +108,7 @@ public class TEExamController {
         }
         TEExam teExam = null;
         Long oldId = null;
-        String activityCode = null;
+        Integer size = 0;
         try {
             TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
             TBOrg tbOrg = (TBOrg) ServletUtil.getRequestOrg();
@@ -144,12 +145,16 @@ public class TEExamController {
                     }
                 }
             } else {
+                size++;
                 teExamDto.setId(uidUtil.getId());
                 teExamDto.setCreateId(tbUser.getId());
             }
             teExamDto.setMonitorStatus(Objects.nonNull(oldTeExam) ? oldTeExam.getMonitorStatus() : InvigilateMonitorStatusEnum.NOT_START);
             teExam = new TEExam(teExamDto);
-            if (!teExam.equals(oldTeExam)) {//不一样则日志记录
+            if (Objects.nonNull(oldTeExam) && !teExam.equals(oldTeExam)) {//不一样则日志记录
+                if (teExam.getEndTime().longValue() < oldTeExam.getEndTime().longValue()) {
+                    throw new BusinessException("修改的批次结束时间只能大于未修改前的批次结束时间");
+                }
                 tsLogService.save(new TSLog(LogEnum.EXAM, teExam.getName(),
                         JacksonUtil.parseJson(oldTeExam),
                         JacksonUtil.parseJson(teExam),
@@ -219,7 +224,6 @@ public class TEExamController {
                             (int) ((teExam.getEndTime() - teExam.getStartTime()) / 1000), teExam.getStartTime(),
                             teExam.getEndTime(), tbUser.getId());
                     teExamActivity.setCode(String.valueOf(redisUtil.getRedisActivityCodeSequence(teExam.getId())));
-                    activityCode = teExamActivity.getCode();
                     teExamActivity.setEnable(1);
                     teExamActivityService.saveOrUpdate(teExamActivity);
                     teExamActivityService.updateExamActivityCacheBean(teExamActivity.getId());
@@ -238,8 +242,13 @@ public class TEExamController {
             }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-            if (Objects.nonNull(teExam) && Objects.nonNull(teExam.getId()) && Objects.nonNull(activityCode)) {
-                redisUtil.setRedisActivityCodeSequence(teExam.getId(), Integer.parseInt(activityCode) - 1);
+            if (Objects.nonNull(teExam) && redisUtil.lock(SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX + teExam.getId(), SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_TIME_OUT)) {
+                try {
+                    Integer value = redisUtil.getRedisActivityCodeSequenceValue(teExam.getId());
+                    redisUtil.setRedisActivityCodeSequence(teExam.getId(), value - size);
+                } finally {
+                    redisUtil.releaseLock(SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX + teExam.getId());
+                }
             }
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();
@@ -375,7 +384,7 @@ public class TEExamController {
         TEExam teExam = teExamService.cacheConvert(examCacheBean);
         List<TEExamActivity> teExamActivityList = null;
         try {
-            teExam.setId(null);
+            teExam.setId(uidUtil.getId());
             teExam.setUpdateId(null);
             teExam.setUpdateTime(null);
             teExam.setShortCode(null);
@@ -391,7 +400,7 @@ public class TEExamController {
             teExamActivityList = teExamActivityService.list(teExamActivityQueryWrapper);
             if (Objects.nonNull(teExamActivityList)) {
                 teExamActivityList.forEach(s -> {
-                    s.setId(null);
+                    s.setId(uidUtil.getId());
                     s.setExamId(teExam.getId());
                     s.setCreateId(teExam.getCreateId());
                     s.setUpdateId(null);
@@ -404,10 +413,16 @@ public class TEExamController {
             }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-            if (Objects.nonNull(examId) && Objects.nonNull(teExam.getId()) && (Objects.nonNull(teExamActivityList)
-                    && teExamActivityList.size() > 0 && Objects.nonNull(teExamActivityList.get(0)))) {
-                redisUtil.setRedisActivityCodeSequence(examId,
-                        Integer.parseInt(teExamActivityList.get(0).getCode()) - 1);
+            if (Objects.nonNull(teExam.getId()) && redisUtil.lock(SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX + teExam.getId(), SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_TIME_OUT)) {
+                try {
+                    Integer value = redisUtil.getRedisActivityCodeSequenceValue(teExam.getId());
+                    if (!CollectionUtils.isEmpty(teExamActivityList)) {
+                        value = value - teExamActivityList.size();
+                    }
+                    redisUtil.setRedisActivityCodeSequence(teExam.getId(), value);
+                } finally {
+                    redisUtil.releaseLock(SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX + teExam.getId());
+                }
             }
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();

+ 27 - 17
themis-business/src/main/java/com/qmth/themis/business/bean/exam/ExamFileUploadBean.java

@@ -3,24 +3,34 @@ package com.qmth.themis.business.bean.exam;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+/**
+ * @Description: 考试文件上传返回信息
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/23
+ */
 @ApiModel("考试文件上传返回信息")
 public class ExamFileUploadBean {
-	@ApiModelProperty("文件上传成功后的访问地址")
-	private String url;
-	@ApiModelProperty("时间戳")
-	private Long uploadTime;
-	public String getUrl() {
-		return url;
-	}
-	public void setUrl(String url) {
-		this.url = url;
-	}
-	public Long getUploadTime() {
-		return uploadTime;
-	}
-	public void setUploadTime(Long uploadTime) {
-		this.uploadTime = uploadTime;
-	}
+    @ApiModelProperty("文件上传成功后的访问地址")
+    private String url;
 
-	
+    @ApiModelProperty("时间戳")
+    private Long uploadTime;
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public Long getUploadTime() {
+        return uploadTime;
+    }
+
+    public void setUploadTime(Long uploadTime) {
+        this.uploadTime = uploadTime;
+    }
 }

+ 10 - 5
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -298,6 +298,8 @@ public class SystemConstant {
 
     public static final long REDIS_LOCK_REEXAM_EXAM_STUDENT_TIME_OUT = 30L;
 
+    public static final long REDIS_LOCK_EXAM_ACTIVITY_CODE_TIME_OUT = 30L;
+
     public static final long REDIS_CACHE_TIME_OUT = 30L;
 
     public static final long REDIS_LOCK_EXAM_STATUS_TIME_OUT = 60L;
@@ -310,6 +312,9 @@ public class SystemConstant {
     //考生锁
     public static final String REDIS_LOCK_EXAM_STUDENT_PREFIX = "lock:student:student_id_";
 
+    //考试批次code锁
+    public static final String REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX = "lock:exam:activity:code:exam_id_";
+
     //计算客观分总分锁
     public static final String REDIS_LOCK_TOTAL_OBJECTIVE_SCORE_PREFIX = "lock:total_objective_score:record_id_";
 
@@ -385,11 +390,11 @@ public class SystemConstant {
     /**
      * 线程池配置
      */
-    public static final String THREAD_POOL_NAME = "taskThreadPool";
-    //    public static final int THREAD_POOL_CORE_POOL_SIZE = 5;
+//    public static final String THREAD_POOL_NAME = "taskThreadPool";
+//    public static final int THREAD_POOL_CORE_POOL_SIZE = 5;
 //    public static final int THREAD_POOL_MAX_POOL_SIZE = 100;
-    public static final int THREAD_POOL_KEEP_ALIVE_SECONDS = 10;
-    public static final int THREAD_POOL_QUEUE_CAPACITY = 500;
+//    public static final int THREAD_POOL_KEEP_ALIVE_SECONDS = 10;
+//    public static final int THREAD_POOL_QUEUE_CAPACITY = 500;
     /**
      * websocket
      */
@@ -397,7 +402,7 @@ public class SystemConstant {
 
     public static final String WEBSOCKET_MOBILE_ONLINE_COUNT = "websocket:mobile:online:count";
 
-    public static final String WEBSOCKET_ADMIN_ONLINE_COUNT = "websocket:admin:online:count";
+//    public static final String WEBSOCKET_ADMIN_ONLINE_COUNT = "websocket:admin:online:count";
 
     public static final String GET = "get";
 

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

@@ -97,7 +97,7 @@ public interface TEExamActivityMapper extends BaseMapper<TEExamActivity> {
     public List<TEExamActivity> findByExamIdAndOrgId(@Param("examId") Long examId, @Param("orgId") Long orgId);
 
     @SuppressWarnings("MybatisXMapperMethodInspection")
-    public List<Map<String,Long>> findMinStartTimeAndMaxFinshTimeByExamId(@Param("examId") Long examId);
+    public List<Map<String, Long>> findMinStartTimeAndMaxFinshTimeByExamId(@Param("examId") Long examId);
 
-    public List<Long> findExamIdToday(@Param("startTime") Long startTime,@Param("endTime") Long endTime);
+    public List<Long> findExamIdToday(@Param("startTime") Long startTime, @Param("endTime") Long endTime);
 }

+ 0 - 1
themis-business/src/main/java/com/qmth/themis/business/entity/TEAudio.java

@@ -28,7 +28,6 @@ public class TEAudio extends BaseEntity implements Serializable {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "机构id")
-    @NotNull(message = "机构id不能为空")
     private Long orgId;
 
     @JsonSerialize(using = ToStringSerializer.class)

+ 21 - 10
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java

@@ -35,6 +35,7 @@ import javax.annotation.Resource;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -331,6 +332,7 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
             throw new BusinessException(ExceptionResultEnum.EXAM_INFO_IS_NULL);
         }
         Long examId = null;
+        AtomicReference<Integer> size = new AtomicReference<>(0);
         try {
             TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
             examId = teExamActivityList.get(0).getExamId();
@@ -362,14 +364,20 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
                         teAudioList.add(new TEAudio(tbUser.getOrgId(), s.getId(), SystemConstant.AFTER_AUDIO_ATTACHMENT_Id, AudioTypeEnum.AFTER.getTitle(), AudioTypeEnum.AFTER, AudioDefaultEnum.SYS, tbUser.getId(), SystemConstant.AFTER_AUDIO_SECOND));//考试结束前语音
                     }
                     TEExamActivity teExamActivityDb = this.getById(s.getId());
-                    s.setCode(teExamActivityDb.getCode());
-                    if (!s.equals(teExamActivityDb)) {//不一样则日志记录
-                        tsLogService.save(new TSLog(LogEnum.EXAM_ACTIVITY, s.getCode(),
-                                JacksonUtil.parseJson(teExamActivityDb),
-                                JacksonUtil.parseJson(s),
-                                tbUser.getId(), s.getId()));
+                    if (Objects.nonNull(teExamActivityDb)) {
+                        s.setCode(teExamActivityDb.getCode());
+                        if (!s.equals(teExamActivityDb)) {//不一样则日志记录
+                            if (s.getFinishTime().longValue() < teExamActivityDb.getFinishTime().longValue()) {
+                                throw new BusinessException("修改的场次结束时间只能大于未修改前的场次结束时间");
+                            }
+                            tsLogService.save(new TSLog(LogEnum.EXAM_ACTIVITY, s.getCode(),
+                                    JacksonUtil.parseJson(teExamActivityDb),
+                                    JacksonUtil.parseJson(s),
+                                    tbUser.getId(), s.getId()));
+                        }
                     }
                 } else {
+                    size.getAndSet(size.get() + 1);
                     s.setId(uidUtil.getId());
                     s.setCreateId(tbUser.getId());
                     s.setCode(String.valueOf(redisUtil.getRedisActivityCodeSequence(s.getExamId())));
@@ -399,10 +407,13 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
             }
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
-            if (Objects.nonNull(examId) && Objects.nonNull(teExamActivityList) && (Objects.nonNull(teExamActivityList)
-                    && teExamActivityList.size() > 0 && Objects.nonNull(teExamActivityList.get(0)))) {
-                redisUtil.setRedisActivityCodeSequence(examId,
-                        Integer.parseInt(teExamActivityList.get(0).getCode()) - 1);
+            if (Objects.nonNull(examId) && redisUtil.lock(SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX + examId, SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_TIME_OUT)) {
+                try {
+                    Integer value = redisUtil.getRedisActivityCodeSequenceValue(examId);
+                    redisUtil.setRedisActivityCodeSequence(examId, value - size.get());
+                } finally {
+                    redisUtil.releaseLock(SystemConstant.REDIS_LOCK_EXAM_ACTIVITY_CODE_PREFIX + examId);
+                }
             }
             if (e instanceof DuplicateKeyException) {
                 String errorColumn = e.getCause().toString();

+ 12 - 0
themis-business/src/main/java/com/qmth/themis/business/util/RedisUtil.java

@@ -294,6 +294,18 @@ public class RedisUtil {
         return entityIdCounter.incrementAndGet();
     }
 
+    /**
+     * 获取redis activity code序列
+     *
+     * @param key
+     * @return
+     */
+    public Integer getRedisActivityCodeSequenceValue(Long key) {
+        RedisAtomicInteger entityIdCounter = new RedisAtomicInteger(SystemConstant.REDIS_ACTIVITY_CODE_SEQUENCE + key,
+                redisTemplate.getConnectionFactory());
+        return entityIdCounter.get();
+    }
+
     /**
      * 设置redis activity code序列
      *

+ 3 - 1
themis-business/src/main/resources/mapper/TEAudioMapper.xml

@@ -17,7 +17,8 @@
         t.createName) as updateName,
         if(t.updateTime is not null,
         t.updateTime,
-        t.createTime) as updateTime
+        t.createTime) as updateTime,
+        t.playTime
         from
         (
         select
@@ -29,6 +30,7 @@
         tea.enable,
         tea.audio_default as audioDefault,
         tea.attachment_id as attachmentId,
+        tea.play_time as playTime,
         (
         select
         t.name

+ 67 - 62
themis-business/src/main/resources/mapper/TEExamActivityMapper.xml

@@ -3,13 +3,10 @@
 <mapper namespace="com.qmth.themis.business.dao.TEExamActivityMapper">
 
     <select id="existTable" resultType="java.lang.Integer">
-        select
-            count(*)
-        from
-            information_schema.TABLES
-        where
-            LCASE(TABLE_NAME)= #{tableName}
-        and TABLE_SCHEMA = #{schema}
+        select count(*)
+        from information_schema.TABLES
+        where LCASE(TABLE_NAME) = #{tableName}
+          and TABLE_SCHEMA = #{schema}
     </select>
 
     <update id="dropTable">
@@ -17,46 +14,48 @@
     </update>
 
     <update id="createNewTable">
-        CREATE TABLE ${tableName} (
-          `id` bigint NOT NULL COMMENT '主键',
-          `exam_id` bigint NOT NULL COMMENT '批次id',
-          `code` varchar(50) NOT NULL COMMENT '场次代码',
-          `prepare_seconds` int NOT NULL COMMENT '提前多长时间开始候考(秒)',
-          `max_duration_seconds` int DEFAULT NULL COMMENT '最大考试时长',
-          `enable` tinyint DEFAULT '1' COMMENT '是否启用',
-          `opening_seconds` int DEFAULT NULL COMMENT '允许开考时长(秒)',
-          `start_time` bigint DEFAULT NULL COMMENT '开考时间',
-          `finish_time` bigint DEFAULT NULL COMMENT '结束时间',
-          `create_time` bigint DEFAULT NULL COMMENT '创建时间',
-          `update_time` bigint DEFAULT NULL COMMENT '更新时间',
-          `create_id` bigint DEFAULT NULL COMMENT '创建人id',
-          `update_id` bigint DEFAULT NULL COMMENT '更新人id',
-          PRIMARY KEY (`id`),
-          UNIQUE KEY `${tableName}_examId_code_Idx` (`exam_id`,`code`)
+        CREATE TABLE ${tableName}
+        (
+            `id`                   bigint      NOT NULL COMMENT '主键',
+            `exam_id`              bigint      NOT NULL COMMENT '批次id',
+            `code`                 varchar(50) NOT NULL COMMENT '场次代码',
+            `prepare_seconds`      int         NOT NULL COMMENT '提前多长时间开始候考(秒)',
+            `max_duration_seconds` int     DEFAULT NULL COMMENT '最大考试时长',
+            `enable`               tinyint DEFAULT '1' COMMENT '是否启用',
+            `opening_seconds`      int     DEFAULT NULL COMMENT '允许开考时长(秒)',
+            `start_time`           bigint  DEFAULT NULL COMMENT '开考时间',
+            `finish_time`          bigint  DEFAULT NULL COMMENT '结束时间',
+            `create_time`          bigint  DEFAULT NULL COMMENT '创建时间',
+            `update_time`          bigint  DEFAULT NULL COMMENT '更新时间',
+            `create_id`            bigint  DEFAULT NULL COMMENT '创建人id',
+            `update_id`            bigint  DEFAULT NULL COMMENT '更新人id',
+            PRIMARY KEY (`id`),
+            UNIQUE KEY `${tableName}_examId_code_Idx` (`exam_id`,`code`)
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考试场次'
     </update>
 
     <insert id="insertInfo" parameterType="com.qmth.themis.business.entity.TEExamActivity">
         INSERT INTO ${tableName}
-            (id, exam_id, code, prepare_seconds, max_duration_seconds, enable, opening_seconds, start_time, finish_time, create_time, update_time, create_id, update_id)
-        VALUES(
-            #{TEExamActivity.id},
-            #{TEExamActivity.examId},
-            #{TEExamActivity.code},
-            #{TEExamActivity.prepareSeconds},
-            #{TEExamActivity.maxDurationSeconds},
-            #{TEExamActivity.enable},
-            #{TEExamActivity.openingSeconds},
-            #{TEExamActivity.startTime},
-            #{TEExamActivity.finishTime},
-            #{TEExamActivity.createTime},
-            #{TEExamActivity.updateTime},
-            #{TEExamActivity.createId},
-            #{TEExamActivity.updateId})
+        (id, exam_id, code, prepare_seconds, max_duration_seconds, enable, opening_seconds, start_time, finish_time,
+         create_time, update_time, create_id, update_id)
+        VALUES (#{TEExamActivity.id},
+                #{TEExamActivity.examId},
+                #{TEExamActivity.code},
+                #{TEExamActivity.prepareSeconds},
+                #{TEExamActivity.maxDurationSeconds},
+                #{TEExamActivity.enable},
+                #{TEExamActivity.openingSeconds},
+                #{TEExamActivity.startTime},
+                #{TEExamActivity.finishTime},
+                #{TEExamActivity.createTime},
+                #{TEExamActivity.updateTime},
+                #{TEExamActivity.createId},
+                #{TEExamActivity.updateId})
     </insert>
 
     <select id="selectListPage" resultType="com.qmth.themis.business.entity.TEExamActivity">
-        select * from ${tableName}
+        select *
+        from ${tableName}
     </select>
 
     <select id="examActivityQuery" resultType="com.qmth.themis.business.dto.response.TEExamActivityQueryDto">
@@ -113,16 +112,17 @@
     </select>
 
     <sql id="getWaitingHeadCommon">
-        select
-        teea.id,
-        teea.code,
-        (teea.start_time / 1000 - IFNULL(teea.prepare_seconds, tee.prepare_seconds)) * 1000 as prepareTime,
-        IFNULL(teea.start_time, tee.start_time) as minStartTime,
-        (teea.start_time / 1000 + IFNULL(teea.opening_seconds, tee.opening_seconds)) * 1000 as maxStartTime,
-        IF(tee.mode = 'TOGETHER' and tee.force_finish = 1, IFNULL(teea.finish_time , tee.end_time), null) as maxFinishTime,
-        tee.min_duration_seconds as minDurationSeconds,
-        IFNULL(teea.max_duration_seconds,tee.max_duration_seconds) as maxDurationSeconds,
-        tee.id as examId
+        select teea.id,
+               teea.code,
+               (teea.start_time / 1000 - IFNULL(teea.prepare_seconds, tee.prepare_seconds)) * 1000 as prepareTime,
+               IFNULL(teea.start_time, tee.start_time)                                             as minStartTime,
+               (teea.start_time / 1000 + IFNULL(teea.opening_seconds, tee.opening_seconds)) *
+               1000                                                                                as maxStartTime,
+               IF(tee.mode = 'TOGETHER' and tee.force_finish = 1, IFNULL(teea.finish_time, tee.end_time),
+                  null)                                                                            as maxFinishTime,
+               tee.min_duration_seconds                                                            as minDurationSeconds,
+               IFNULL(teea.max_duration_seconds, tee.max_duration_seconds)                         as maxDurationSeconds,
+               tee.id                                                                              as examId
     </sql>
 
     <select id="getWaitingExam" resultType="com.qmth.themis.business.dto.response.TEExamActivityWaitDto">
@@ -136,7 +136,7 @@
         tee.id = tees.exam_id
         left join t_e_exam_activity teea on
         teea.id = tees.exam_activity_id
-        <where> 1 = 1
+        <where>1 = 1
             and teea.id in
             <foreach collection="examActivityIds" item="examActivityId" index="index" open="(" close=")" separator=",">
                 #{examActivityId}
@@ -180,8 +180,8 @@
         from
         t_e_exam_activity teea
         left join t_e_exam tee on
-         tee.id = teea.exam_id
-        <where> 1 = 1
+        tee.id = teea.exam_id
+        <where>1 = 1
             <if test="examActivityId != null and examActivityId != ''">
                 and teea.id = #{examActivityId}
             </if>
@@ -198,16 +198,21 @@
             and f.org_id=#{orgId}
         </if>
     </select>
-    
-    <select id="findMinStartTimeAndMaxFinshTimeByExamId" resultType="java.util.Map" >
-        select min(t.start_time) startTime,max(t.finish_time) finishTime from t_e_exam_activity t
-        where t.exam_id=#{examId} and t.enable=1
+
+    <select id="findMinStartTimeAndMaxFinshTimeByExamId" resultType="java.util.Map">
+        select min(t.start_time) startTime, max(t.finish_time) finishTime
+        from t_e_exam_activity t
+        where t.exam_id = #{examId}
+          and t.enable = 1
     </select>
-    
-    <select id="findExamIdToday" resultType="java.lang.Long" >
-        select distinct t.exam_id  from t_e_exam_activity t
-        left join t_e_exam f on t.exam_id=f.id
-        where t.start_time&gt;=#{startTime} and t.start_time&lt;=#{endTime} and t.enable=1 and f.enable=1
+
+    <select id="findExamIdToday" resultType="java.lang.Long">
+        select distinct t.exam_id
+        from t_e_exam_activity t
+                 left join t_e_exam f on t.exam_id = f.id
+        where t.start_time &gt;= #{startTime}
+          and t.start_time &lt;= #{endTime}
+          and t.enable = 1
+          and f.enable = 1
     </select>
-    
 </mapper>

+ 1 - 1
themis-business/src/main/resources/mapper/TEStudentMapper.xml

@@ -67,7 +67,7 @@
             t_m_tencent_video_message t
             where
             t.exam_record_id = toer.id)) as videoCount,
-            tee.monitor_record as monitorRecord
+            toer.monitor_record as monitorRecord
         from
             t_e_exam_student tees
         join t_e_exam tee on