Explorar el Código

优化开始考试的方法。

tom hace 2 meses
padre
commit
224f075118

+ 1 - 1
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/SimMsg.java

@@ -253,7 +253,7 @@ public class SimMsg extends BaseEntity {
         Integer DEFAULT_VALUE = 0;
         Integer SUCCESS = 200;
         Integer SOCKET_CONNECT_EXCEPTION = 501;
-        Integer SOCKET_TIMEOUT_EXCEPTION = 502;
+        Integer SOCKET_READ_TIMEOUT_EXCEPTION = 502;
         Integer RECEIVE_CHECK_FAIL = 520;
     }
 

+ 1 - 1
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/CommCheckService.java

@@ -154,7 +154,7 @@ public class CommCheckService {
             return AjaxResult.success(msg);
         } else if (Objects.equals(result, SimMsg.Result.RECEIVE_CHECK_FAIL)) {
             return AjaxResult.error("失败,报文回复异常。");
-        } else if (Objects.equals(result, SimMsg.Result.SOCKET_CONNECT_EXCEPTION)) {
+        } else if (Objects.equals(result, SimMsg.Result.SOCKET_READ_TIMEOUT_EXCEPTION)) {
             // 更新SimId
             seatService.updateSimIdBySeatNum(seat.getSeatNum(), Sim.ID_0);
             String msgTemp = "座号[{0}]-没有连接任何接模拟器,检查线缆连接和线缆开关";

+ 3 - 3
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/CommSendService.java

@@ -264,7 +264,7 @@ public class CommSendService {
      * <p>
      * <p>
      * 主动查询一次模拟器状态。更新模拟器在线/离线状态;否则返回对应错误。
-     * todo:需要重新考虑
+     * todo:需要重新考虑,不再使用。
      *
      * @param seat
      * @return
@@ -852,8 +852,8 @@ public class CommSendService {
         } catch (InterruptedException | IOException e) {
             // SocketTimeoutException
             l.error("SocketTimeoutException");
-            // e.printStackTrace();
-            sm.setResult(SimMsg.Result.SOCKET_TIMEOUT_EXCEPTION);
+            e.printStackTrace();
+            sm.setResult(SimMsg.Result.SOCKET_READ_TIMEOUT_EXCEPTION);
             if (sim != null) {
                 l.info("fail sim.getSimId() = {}", sim.getSimId());
             }

+ 31 - 48
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/RealExamService.java

@@ -166,13 +166,7 @@ public class RealExamService {
      * @param state
      * @return
      */
-    @Transactional
     public int updateOneState(long examId, final String state) {
-        if (false) {
-            // php项目维护exam_status字段。java这边不操作。
-            // 屏蔽
-            return 0;
-        }
         RealExam q = selectRealExamByExamId(examId);
         // todo:屏蔽
         if (false && RealExam.State.SUBMITTED.equals(state)) {
@@ -298,10 +292,6 @@ public class RealExamService {
      * @return
      */
     public AjaxResult studentStartRealExam(final Long examId, final String studentBindIp, final String examCollectionType) {
-        // todo: 暂时没有解决方案 检查 考试的sim和seat,是否正确对应。
-        // Step :检查参数studentBindIp有效性
-        // Step :检查参数examCollectionType有效性
-
         // Check:检查参数examId有效性
         {
             AjaxResult ar = checkExamId(examId);
@@ -309,36 +299,36 @@ public class RealExamService {
                 return ar;
             }
         }
-        // Check:检查studentBindIp有效性
+        RealExam re = selectRealExamByExamId(examId);
+        RealExamCollection rec = realExamCollectionService.selectRealExamCollectionByExamCollectionId(re.getExamCollectionId());
+        // Check:检查参数studentBindIp有效性
         if (StringUtils.isBlank(studentBindIp)) {
             return AjaxResult.error("IP地址无效");
         }
-        // todo:examCollectionType 类型对应
-
-        RealExam re = selectRealExamByExamId(examId);
         Seat seat = seatService.uniqueByBindIp(studentBindIp);
+        if (seat == null) {
+            return AjaxResult.error("没有IP对应座次数据!");
+        }
+        // Check:检查参数examCollectionType有效性
+        if (!StringUtils.equals(examCollectionType, rec.getExamCollectionType())) {
+            return AjaxResult.error("考试集合类型不对应!");
+        }
+        // Check:ping通 路由器。
         {
-            if (seat == null) {
-
-                throw new IllegalArgumentException("XXX");
+            AjaxResult ar = commCheckService.checkRouterState(simConfig.getRouterIp());
+            if (ar.isError()) {
+                return ar;
             }
         }
-        // Step :ping通 路由器。
+        // Check:ping通 学员端电脑
         if (false) {
-            AjaxResult ar = commCheckService.checkRouterState(simConfig.getRouterIp());
+            AjaxResult ar = commCheckService.checkPingStudentPcState(studentBindIp);
             if (ar.isError()) {
                 return ar;
             }
         }
-        // Step :ping通 学员端电脑
+        // Check:ping通 RS485
         {
-//            AjaxResult ar = commCheckService.checkPingStudentPcState(studentBindIp);
-//            if (ar.isError()) {
-//                return ar;
-//            }
-        }
-        // Step :ping通 RS485。
-        if (false) {
             AjaxResult ar = commCheckService.checkPingRs485State(seat.getSeatRs485Ip());
             if (ar.isError()) {
                 // todo:重复
@@ -351,21 +341,21 @@ public class RealExamService {
                 // Ping通不代表在线,Socket连接建立表示在线。
             }
         }
-        // Step :如果有缓存Socket并且可用,使用缓存Socket,检查并建立Socket连接;否则返回对应错误。
+        // Check:如果有缓存Socket并且可用,使用缓存Socket,检查并建立Socket连接;否则返回对应错误。
         {
             AjaxResult ar = socketService.openOne(seat.toSimSocketParamVo(), true);
             if (ar.isError()) {
                 return ar;
             }
         }
-        // Step :发送通用询问指令,询问是连接的哪种型号的哪一台模拟器;否则返回对应错误。
+        // Check:发送通用询问指令,询问是连接的哪种型号的哪一台模拟器;否则返回对应错误。
         {
             AjaxResult ar = commCheckService.checkOneSeatState(seat, true);
             if (ar.isError()) {
                 return ar;
             }
         }
-        // 重新查询。已经确定simId了。
+        // Step:重新查询。已经确定simId和simState了。
         {
             // 修改exam表对应examId的一条数据,填充并锁定seat_id和sim_id值。
             // 设置上seatId和simId
@@ -373,10 +363,9 @@ public class RealExamService {
             seat = seatService.uniqueByBindIp(studentBindIp);
             re.setSeatId(seat.getSeatId());
             re.setSimId(seat.getCurrentSimId());
-            l.debug("re = {}", re);
             updateRealExam(re);
         }
-        // 查询模拟器在线状态,纯DB查询。
+        // Step:查询模拟器在线状态,纯DB查询。
         {
             AjaxResult ar = commCheckService.checkOneSimOnlineState(seat.getCurrentSimId());
             if (ar.isError()) {
@@ -384,7 +373,7 @@ public class RealExamService {
             }
         }
         Sim sim = simService.selectSimBySimId(re.getSimId());
-        // 检查模拟器类型
+        // Check:检查模拟器类型
         final String targetSimType = re.getSimType();
         {
             AjaxResult ar = commCheckService.checkOneSimType(seat, true, targetSimType);
@@ -392,34 +381,28 @@ public class RealExamService {
                 return ar;
             }
         }
-        // Step 5:
-        {
-//            AjaxResult arE3 = commSendService.checkOneSimStateActive(seat);
-//            if (arE3.isError()) {
-//                return arE3;
-//            }
-        }
-        // Step :可换件检查,读取对应一台模拟器 所有故障部位值。检查模拟器所有的 真实的 故障部位 是否异常 或者 空值。特殊的故障部位要单独判断。
+        // Step:可换件检查,读取对应一台模拟器 所有故障部位值。
+        //      检查模拟器所有的 真实的 故障部位 是否异常 或者 空值。特殊的故障部位要单独判断。
         if (SimDebugConfig.CHECK_REPLACE_EMPTY) {
             AjaxResult ar = commSendService.readOneSimAllFaultCheck(seat, sim);
             if (ar.isError()) {
                 return ar;
             }
         }
-        // Step :清除对应一台模拟器 所有 真实的 故障部位故障。
+        // Step:清除对应一台模拟器 所有 真实的 故障部位故障。
         {
             commSendService.clearOneSimAllFaultByExam(re);
         }
-        // Step :下发对应一台模拟器 出题选中的 故障位置故障。
+        // Step:下发对应一台模拟器 出题选中的 故障位置故障。
         {
             commSendService.writeOneSimAllSelectFaultByExam(re);
         }
-        // Step :读取对应一台模拟器 所有的 真实的 故障部位 电阻值代表值 作为出题值。
-        // 修改关联状态
+        // Step:读取对应一台模拟器 所有的 真实的 故障部位 电阻值代表值 作为出题值。
         {
             commSendService.readOneSimAllFaultFirstTimeByExam(re);
         }
-        // Step :修改当前exam_id考试数据的状态。
+        // Step:修改当前exam_id的考试状态。
+        // 修改关联状态
         if (realExamFaultService.isType2ExamPrepareStartOk(re.getExamId())) {
             updateOneState(re.getExamId(), RealExam.State.SIM_PREPARE_OK);
             updateOneState(re.getExamId(), RealExam.State.ANSWERING);
@@ -428,7 +411,7 @@ public class RealExamService {
             updateRealExam(re);
             return AjaxResult.success("开始考试成功!");
         } else {
-            return AjaxResult.error("连接超时,请检查模拟器连接!");
+            return AjaxResult.error("执行超时!");
         }
     }
 
@@ -453,7 +436,7 @@ public class RealExamService {
             return AjaxResult.success();
         }
     }
-    
+
     /**
      * [轮询][学生]正在考试界面。
      *