wangliang 4 лет назад
Родитель
Сommit
c2045df0b0

+ 3 - 3
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java

@@ -370,7 +370,7 @@ public class TEExamController {
         Integer loginCount = 0;
         AtomicReference<Integer> prepareCount = new AtomicReference<>(0);
         AtomicReference<Integer> examCount = new AtomicReference<>(0);
-        AtomicReference<Integer> clientCommunicationStatusCount = new AtomicReference<>(0);
+        AtomicReference<Integer> clientWebsocketStatusCount = new AtomicReference<>(0);
         AtomicReference<Integer> monitorStatusSourceCount = new AtomicReference<>(0);
         AtomicReference<Integer> alreadyComplete = new AtomicReference<>(0);
         Integer notComplete = 0;
@@ -405,7 +405,7 @@ public class TEExamController {
                             //客户端通讯状态
                             WebsocketStatusEnum clientStatus = Objects.isNull(recordIdObjectMap.get("clientWebsocketStatus")) ? null : WebsocketStatusEnum.valueOf(String.valueOf(recordIdObjectMap.get("clientWebsocketStatus")));
                             if (Objects.nonNull(clientStatus) && Objects.equals(clientStatus, WebsocketStatusEnum.OFF_LINE)) {
-                                clientCommunicationStatusCount.getAndSet(clientCommunicationStatusCount.get() + 1);
+                                clientWebsocketStatusCount.getAndSet(clientWebsocketStatusCount.get() + 1);
                             }
                             //监控端通讯状态
                             MonitorVideoSourceEnum source = null;
@@ -442,7 +442,7 @@ public class TEExamController {
         }
         notComplete = allCount - alreadyComplete.get();
         BigDecimal completionRate = new BigDecimal(alreadyComplete.get()).divide(new BigDecimal(allCount)).setScale(2, BigDecimal.ROUND_HALF_UP);
-        ExamPropCountDto examPropCountDto = new ExamPropCountDto(examId, allCount, loginCount, prepareCount.get(), examCount.get(), clientCommunicationStatusCount.get(), monitorStatusSourceCount.get(), alreadyComplete.get(), notComplete, completionRate);
+        ExamPropCountDto examPropCountDto = new ExamPropCountDto(examId, allCount, loginCount, prepareCount.get(), examCount.get(), clientWebsocketStatusCount.get(), monitorStatusSourceCount.get(), alreadyComplete.get(), notComplete, completionRate);
         return ResultUtil.ok(examPropCountDto);
     }
 }

+ 22 - 10
themis-business/src/main/java/com/qmth/themis/business/bean/backend/InvigilateListBean.java

@@ -1,6 +1,7 @@
 package com.qmth.themis.business.bean.backend;
 
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
 import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 import com.qmth.themis.business.enums.WebsocketStatusEnum;
 import io.swagger.annotations.ApiModel;
@@ -57,11 +58,11 @@ public class InvigilateListBean implements Serializable {
     @ApiModelProperty(name = "预警量")
     private Integer warningCount;
 
-    @ApiModelProperty(name = "客户端网络通信状态", required = false)
-    private WebsocketStatusEnum clientCommunicationStatus;
+    @ApiModelProperty(name = "客户端网络通信状态")
+    private WebsocketStatusEnum clientWebsocketStatus;
 
-    @ApiModelProperty(name = "监控通信状态", required = false)
-    private MonitorVideoSourceEnum monitorStatusSource;
+    @ApiModelProperty(name = "监控通信状态")
+    private MonitorStatusSourceEnum monitorStatusSource;
 
     @ApiModelProperty(name = "ip地址")
     private String clientCurrentIp;
@@ -72,6 +73,17 @@ public class InvigilateListBean implements Serializable {
     @ApiModelProperty(name = "更新时间")
     private Date updateTime;
 
+    @ApiModelProperty(name = "剩余时间")
+    private String remainTime;
+
+    public String getRemainTime() {
+        return remainTime;
+    }
+
+    public void setRemainTime(String remainTime) {
+        this.remainTime = remainTime;
+    }
+
     public String getRoomName() {
         return roomName;
     }
@@ -203,19 +215,19 @@ public class InvigilateListBean implements Serializable {
         this.warningCount = warningCount;
     }
 
-    public WebsocketStatusEnum getClientCommunicationStatus() {
-        return clientCommunicationStatus;
+    public WebsocketStatusEnum getClientWebsocketStatus() {
+        return clientWebsocketStatus;
     }
 
-    public void setClientCommunicationStatus(WebsocketStatusEnum clientCommunicationStatus) {
-        this.clientCommunicationStatus = clientCommunicationStatus;
+    public void setClientWebsocketStatus(WebsocketStatusEnum clientWebsocketStatus) {
+        this.clientWebsocketStatus = clientWebsocketStatus;
     }
 
-    public MonitorVideoSourceEnum getMonitorStatusSource() {
+    public MonitorStatusSourceEnum getMonitorStatusSource() {
         return monitorStatusSource;
     }
 
-    public void setMonitorStatusSource(MonitorVideoSourceEnum monitorStatusSource) {
+    public void setMonitorStatusSource(MonitorStatusSourceEnum monitorStatusSource) {
         this.monitorStatusSource = monitorStatusSource;
     }
 

+ 9 - 9
themis-business/src/main/java/com/qmth/themis/business/dto/ExamPropCountDto.java

@@ -33,7 +33,7 @@ public class ExamPropCountDto implements Serializable {
     private Integer examCount;//考试中
 
     @ApiModelProperty(name = "客户端通讯故障")
-    private Integer clientCommunicationStatusCount;//客户端通讯故障
+    private Integer clientWebsocketStatusCount;//客户端通讯故障
 
     @ApiModelProperty(name = "监控设备通讯故障")
     private Integer monitorStatusSourceCount;//监控设备通讯故障
@@ -69,13 +69,13 @@ public class ExamPropCountDto implements Serializable {
 
     }
 
-    public ExamPropCountDto(Long examId, Integer allCount, Integer loginCount, Integer prepareCount, Integer examCount, Integer clientCommunicationStatusCount, Integer monitorStatusSourceCount, Integer alreadyComplete, Integer notComplete, Set<String> roomCodes, BigDecimal completionRate) {
+    public ExamPropCountDto(Long examId, Integer allCount, Integer loginCount, Integer prepareCount, Integer examCount, Integer clientWebsocketStatusCount, Integer monitorStatusSourceCount, Integer alreadyComplete, Integer notComplete, Set<String> roomCodes, BigDecimal completionRate) {
         this.examId = examId;
         this.allCount = allCount;
         this.loginCount = loginCount;
         this.prepareCount = prepareCount;
         this.examCount = examCount;
-        this.clientCommunicationStatusCount = clientCommunicationStatusCount;
+        this.clientWebsocketStatusCount = clientWebsocketStatusCount;
         this.monitorStatusSourceCount = monitorStatusSourceCount;
         this.alreadyComplete = alreadyComplete;
         this.notComplete = notComplete;
@@ -83,13 +83,13 @@ public class ExamPropCountDto implements Serializable {
         this.completionRate = completionRate;
     }
 
-    public ExamPropCountDto(Long examId, Integer allCount, Integer loginCount, Integer prepareCount, Integer examCount, Integer clientCommunicationStatusCount, Integer monitorStatusSourceCount, Integer alreadyComplete, Integer notComplete, BigDecimal completionRate) {
+    public ExamPropCountDto(Long examId, Integer allCount, Integer loginCount, Integer prepareCount, Integer examCount, Integer clientWebsocketStatusCount, Integer monitorStatusSourceCount, Integer alreadyComplete, Integer notComplete, BigDecimal completionRate) {
         this.examId = examId;
         this.allCount = allCount;
         this.loginCount = loginCount;
         this.prepareCount = prepareCount;
         this.examCount = examCount;
-        this.clientCommunicationStatusCount = clientCommunicationStatusCount;
+        this.clientWebsocketStatusCount = clientWebsocketStatusCount;
         this.monitorStatusSourceCount = monitorStatusSourceCount;
         this.alreadyComplete = alreadyComplete;
         this.notComplete = notComplete;
@@ -192,12 +192,12 @@ public class ExamPropCountDto implements Serializable {
         this.examCount = examCount;
     }
 
-    public Integer getClientCommunicationStatusCount() {
-        return clientCommunicationStatusCount;
+    public Integer getClientWebsocketStatusCount() {
+        return clientWebsocketStatusCount;
     }
 
-    public void setClientCommunicationStatusCount(Integer clientCommunicationStatusCount) {
-        this.clientCommunicationStatusCount = clientCommunicationStatusCount;
+    public void setClientWebsocketStatusCount(Integer clientWebsocketStatusCount) {
+        this.clientWebsocketStatusCount = clientWebsocketStatusCount;
     }
 
     public Integer getMonitorStatusSourceCount() {

+ 13 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TEExamStudent.java

@@ -2,6 +2,7 @@ package com.qmth.themis.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.qmth.themis.business.base.BaseEntity;
+import com.qmth.themis.business.enums.LoginStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -79,6 +80,18 @@ public class TEExamStudent extends BaseEntity {
     @TableField(value = "course_name")
     private String courseName;
 
+    @ApiModelProperty(value = "登录状态")
+    @TableField(value = "login_status")
+    private LoginStatusEnum loginStatus;
+
+    public LoginStatusEnum getLoginStatus() {
+        return loginStatus;
+    }
+
+    public void setLoginStatus(LoginStatusEnum loginStatus) {
+        this.loginStatus = loginStatus;
+    }
+
     public String getCourseName() {
         return courseName;
     }

+ 13 - 0
themis-business/src/main/java/com/qmth/themis/business/entity/TOeExamRecord.java

@@ -3,6 +3,7 @@ package com.qmth.themis.business.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.qmth.themis.business.enums.*;
+import com.sun.tools.internal.ws.wsdl.document.jaxws.Exception;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -172,6 +173,18 @@ public class TOeExamRecord implements Serializable {
     @TableField(value = "score_status")
     private ScoreStatusEnum scoreStatus;
 
+    @ApiModelProperty(value = "异常状态")
+    @TableField(value = "exception_status")
+    private ExceptionEnum exceptionStatus;
+
+    public ExceptionEnum getExceptionStatus() {
+        return exceptionStatus;
+    }
+
+    public void setExceptionStatus(ExceptionEnum exceptionStatus) {
+        this.exceptionStatus = exceptionStatus;
+    }
+
     public ScoreStatusEnum getScoreStatus() {
         return scoreStatus;
     }

+ 25 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/LoginStatusEnum.java

@@ -0,0 +1,25 @@
+package com.qmth.themis.business.enums;
+
+/**
+* @Description: 登录状态
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/9/7
+*/
+public enum LoginStatusEnum {
+
+    LOGIN("已登录"),
+
+    NO_LOGIN("未登录");
+
+    private String code;
+
+    private LoginStatusEnum(String code){
+        this.code = code;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 11 - 9
themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml

@@ -92,19 +92,22 @@
             s.name name,
             s.course_name courseName,
             s.course_code courseCode,
-            t.paper_download paperDownload,
+            IFNULL(t.paper_download,1) paperDownload,
             t.status statusCode,
             t.answer_progress progress,
-            t.client_current_ip clientCurrentIp,
-            t.warning_count warningCount,
-            t.breach_status breachStatus,
-            t.client_websocket_status as clientWebsocketStatus,
-            t.monitor_status_source as monitorStatusSource
+            IFNULL(t.client_current_ip,'无') clientCurrentIp,
+            IFNULL(t.warning_count,0) as warningCount,
+            IFNULL(t.breach_status,1) as breachStatus,
+            IFNULL(t.client_websocket_status,'OFF_LINE') as clientWebsocketStatus,
+            IFNULL(t.monitor_status_source,'STOP') as monitorStatusSource,
+            t.client_last_sync_time as updateTime
     </sql>
 
     <sql id="invigilatePageMiddle">
         from t_oe_exam_record t
         left join t_e_exam_student s on t.exam_student_id = s.id
+        left join t_e_exam tee on tee.id = t.exam_id
+        left join t_e_exam_activity teea on teea.id = t.exam_activity_id
         inner join (select toer.id from t_oe_exam_record toer where EXISTS(select tees.id from t_e_exam_student tees where EXISTS (select distinct tbeiu.room_code from t_b_exam_invigilate_user tbeiu
         where
         <if test="userId != null and userId != ''">
@@ -151,9 +154,9 @@
 
     <select id="invigilatePageList" resultType="com.qmth.themis.business.bean.backend.InvigilateListBean">
         <include refid="invigilatePageHead" />
+        ,date_format(date_sub(date_add(teea.start_time, interval IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) second), interval teea.max_duration_seconds / 60 - t.duration_seconds minute),'%H:%i:%s') as remainTime
         <include refid="invigilatePageMiddle" />
         <include refid="invigilatePageFoot" />
-            and t.status = 'ANSWERING'
         <if test="paperDownload != null and paperDownload != ''">
             and t.paper_download = #{paperDownload}
         </if>
@@ -165,7 +168,6 @@
         ,t.monitor_live_url as monitorLiveUrl
         <include refid="invigilatePageMiddle" />
         <include refid="invigilatePageFoot" />
-            and t.status = 'ANSWERING'
         <if test="paperDownload != null and paperDownload != ''">
             and t.paper_download = #{paperDownload}
         </if>
@@ -179,7 +181,7 @@
         'FACE_COUNT_ERROR' and tiiwi.`level` = 'D8') as multipleFaceCount
         <include refid="invigilatePageMiddle"/>
         <include refid="invigilatePageFoot" />
-            and t.status = 'ANSWERING' ) t
+            ) t
         <where>
             <if test="minMultipleFaceCount != null and minMultipleFaceCount != ''">
                 and t.multipleFaceCount &lt;= #{minMultipleFaceCount}