Переглянути джерело

添加 DebugFault 数据库插入和修改相关。

tom 1 тиждень тому
батько
коміт
fa6df9ab3e

+ 2 - 2
ruoyi-sim/src/main/java/com/ruoyi/sim/config/SimDebugConfig.java

@@ -10,7 +10,7 @@ public class SimDebugConfig {
 
     public static final String KEY_SCHEDULED_CONNECT = "SCHEDULED_CONNECT";
     /**
-     * 是否运行 连接情况 的 定时任务。
+     * 是否运行 连接情况 的 定时任务。默认true todo:
      */
-    public static boolean SCHEDULED_CONNECT = true;
+    public static boolean SCHEDULED_CONNECT = false;
 }

+ 14 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/controller/RealExamController.java

@@ -88,6 +88,13 @@ public class RealExamController extends BaseController {
         return realExamService.studentStartRealExam(examId);
     }
 
+    @GetMapping("/student/self-exercise/start/{examId}")
+    @ApiOperation("[学生][正式使用]开始自主练习")
+    public AjaxResult studentStartRealSelfExercise(@PathVariable("examId") Long examId) {
+        l.info("[学生][正式使用]开始自主练习");
+        return realExamService.studentStartRealExam(examId);
+    }
+
     @GetMapping("/student/exam/answering/{examId}")
     @ApiOperation("[轮询][学生]正在考试界面")
     public AjaxResult studentLoopAnsweringRealExam(@PathVariable("examId") Long examId) {
@@ -108,6 +115,13 @@ public class RealExamController extends BaseController {
         return realExamService.studentSubmitRealExam(examId);
     }
 
+    @GetMapping("/student/self-exercise/submit/{examId}")
+    @ApiOperation("[学生][正式使用]交卷自主练习")
+    public AjaxResult studentSubmitRealSelfExercise(@PathVariable("examId") Long examId) {
+        l.info("[学生][正式使用]交卷自主练习");
+        return realExamService.studentSubmitRealExam(examId);
+    }
+
     @GetMapping("/student/exam/report/{examId}")
     @ApiOperation("[轮询][学生]结束考试界面")
     public AjaxResult studentLoopPostRealExam(@PathVariable("examId") Long examId) {

+ 13 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/DebugFault.java

@@ -143,4 +143,17 @@ public class DebugFault extends BaseEntity {
                 .append("updateTime", getUpdateTime())
                 .toString();
     }
+
+    // -------------------------------- tom add  --------------------------------
+    public interface Flag {
+        String YES = "1";
+        String NO = "0";
+        String UNKNOWN = "7";
+    }
+
+    public interface AnswerRight {
+        String UNKNOWN = "0";
+        String YES = "1";
+        String NO = "2";
+    }
 }

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

@@ -47,7 +47,7 @@ public interface CommConst {
      */
     int LENGTH_20 = 20;
     /**
-     * 添加CRC后的报文长度
+     * 添加CRC校验后的报文长度
      */
     int LENGTH_24 = 24;
 

+ 33 - 6
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/CommReceiveService.java

@@ -9,6 +9,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.HashSet;
+
 import static com.ruoyi.sim.service.impl.CommConst.*;
 
 @Service
@@ -25,6 +27,8 @@ public class CommReceiveService {
     private SimService simService;
     @Autowired
     private DebugFaultService debugFaultService;
+    @Autowired
+    private FaultService faultService;
 
     /**
      * 只要返回信息,即认为在线。
@@ -57,10 +61,11 @@ public class CommReceiveService {
      *
      * @param sm
      * @param s
-     * @param reF
+     * @param reF      debug模式下为null。
      * @param f
+     * @param faultIds debug模式下为null。
      */
-    public void setFaultQuestionValue(SimMsg sm, Sim s, RealExamFault reF, Fault f) {
+    public void setFaultQuestionValue(SimMsg sm, Sim s, RealExamFault reF, Fault f, String[] faultIds) {
         // check
 
         //
@@ -81,13 +86,35 @@ public class CommReceiveService {
                 realExamFaultService.updateRefStateByRefId(reF.getRefId(), RealExamFault.State.LOOP_READ);
             }
         } else {
-            DebugFault df = debugFaultService.exist(s.getSimId(), f.getFaultId());
+            //
+
+            //
+            HashSet<Fault> fSet = new HashSet<>();
+            for (String fId : faultIds) {
+                fSet.add(faultService.selectFaultByFaultId(fId));
+            }
+            String faultId = f.getFaultId();
+            DebugFault df = debugFaultService.exist(s.getSimId(), faultId);
             if (df == null) {
                 df = new DebugFault();
+                df.setSimId(s.getSimId());
+                df.setFaultId(f.getFaultId());
+                if (fSet.contains(faultId)) {
+                    df.setFlag(DebugFault.Flag.YES);
+                } else {
+                    df.setFlag(DebugFault.Flag.NO);
+                }
                 df.setSimFaultQuestionValue(faultQuestionValue);
+                df.setSimFaultQuestionValue("");
                 debugFaultService.insertDebugFault(df);
             } else {
+                if (fSet.contains(faultId)) {
+                    df.setFlag(DebugFault.Flag.YES);
+                } else {
+                    df.setFlag(DebugFault.Flag.NO);
+                }
                 df.setSimFaultQuestionValue(faultQuestionValue);
+                df.setSimFaultQuestionValue("");
                 debugFaultService.updateDebugFault(df);
             }
         }
@@ -122,6 +149,8 @@ public class CommReceiveService {
             DebugFault df = debugFaultService.exist(s.getSimId(), f.getFaultId());
             if (df == null) {
                 df = new DebugFault();
+                df.setSimId(s.getSimId());
+                df.setFaultId(f.getFaultId());
                 df.setSimFaultAnswerValue(faultAnswerValue);
                 debugFaultService.insertDebugFault(df);
             } else {
@@ -159,9 +188,7 @@ public class CommReceiveService {
         }
         if (BLANK_CONTENT.equals(checkValue)) {
             l.info("故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]未正确安装;");
-            return AjaxResult.error(
-                    "故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]未正确安装;"
-                    , f);
+            return AjaxResult.error("故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]未正确安装;", f);
         } else {
             return AjaxResult.success(f);
         }

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

@@ -19,10 +19,7 @@ import java.io.OutputStream;
 import java.net.InetAddress;
 import java.net.Socket;
 import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 import static com.ruoyi.sim.service.impl.CommConst.*;
 
@@ -386,6 +383,7 @@ public class CommSendService {
     }
 
     public AjaxResult debugClearAllOnlineSimAllFault() {
+        l.info("debugClearAllOnlineSimAllFault");
         simService.listAllOnline().forEach(s -> {
             AjaxResult ar = debugClearAllFaultBySimNum(s.getSimNum());
         });
@@ -504,7 +502,7 @@ public class CommSendService {
                 return ar1;
             }
         }
-        // 主动查询一次模拟器状态
+        // Step 1 主动查询一次模拟器状态
         {
             checkOneSimState(s, true);
             // 如果模拟器离线
@@ -537,7 +535,7 @@ public class CommSendService {
         }
         // Step 5 读取
         {
-            readOneSimAllFaultFirstTimeBySim(s);
+            readOneSimAllFaultFirstTimeBySim(s, faultIds);
         }
         return AjaxResult.success("下发故障流程执行成功!");
     }
@@ -634,6 +632,7 @@ public class CommSendService {
      * @return
      */
     public AjaxResult readOneSimOneFaultCheck(Sim s, Fault f) {
+        l.info("readOneSimOneFaultCheck s = {},f = {}", s, f);
         SimMsg sm1 = commBuildService.buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
         SimMsg sm2 = send(sm1, s, RETRY_COUNT_CHECK_ONE_FAULT, SLEEP_LONG);
         return simReceiveService.getOneFaultCheck(sm2, s, f);
@@ -645,18 +644,26 @@ public class CommSendService {
      * @param re
      */
     public void readOneSimAllFaultFirstTimeByExam(RealExam re) {
+        l.info("readOneSimAllFaultFirstTimeByExam re = {}", re);
         List<RealExamFault> list = realExamFaultService.listAllType2(re.getExamId());
         for (RealExamFault ref : list) {
             Sim s = simService.selectSimBySimId(re.getSimId());
             Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
-            readOneSimOneFaultFirstTime(s, ref, f);
+            readOneSimOneFaultFirstTime(s, ref, f, null);
         }
     }
 
-    public void readOneSimAllFaultFirstTimeBySim(Sim s) {
+    /**
+     * 第一次读取,作为出题值。debug模式。
+     *
+     * @param s
+     * @param faultIds
+     */
+    public void readOneSimAllFaultFirstTimeBySim(Sim s, final String[] faultIds) {
+        l.info("readOneSimAllFaultFirstTimeBySim s = {}", s);
         List<Fault> list = faultService.listType3(s.getSimType());
         for (Fault f : list) {
-            readOneSimOneFaultFirstTime(s, null, f);
+            readOneSimOneFaultFirstTime(s, null, f, faultIds);
         }
     }
 
@@ -664,18 +671,16 @@ public class CommSendService {
      * 第一次读取,作为出题值。
      *
      * @param s
-     * @param ref debug调试模式为空。
+     * @param ref      debug调试模式为空。可以为空。
      * @param f
+     * @param faultIds debug调试模式为空。
      */
-    public void readOneSimOneFaultFirstTime(Sim s, RealExamFault ref, Fault f) {
+    public void readOneSimOneFaultFirstTime(Sim s, RealExamFault ref, Fault f, String[] faultIds) {
+        l.info("readOneSimOneFaultFirstTime");
         // 读取一次当前电阻代表值作为出题值。
         SimMsg sm1 = commBuildService.buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
         SimMsg sm2 = send(sm1, s, RETRY_COUNT_WRITE_ONE_FAULT, SLEEP_LONG);
-        if (ref != null) {
-            simReceiveService.setFaultQuestionValue(sm2, s, ref, f);
-        } else {
-            l.info("ref is null");
-        }
+        simReceiveService.setFaultQuestionValue(sm2, s, ref, f, faultIds);
     }
 
     /**
@@ -711,10 +716,10 @@ public class CommSendService {
      * @param s
      * @param reF
      * @param f
-     * @param refState 中间轮询是null,交卷最后一次读取为finish状态。用来修改状态的。
+     * @param refState 中间轮询是null,交卷最后一次读取为finish状态。用来修改状态的。debug模式下执行为null。
      */
     public void readOneSimOneFaultResistance(Sim s, RealExamFault reF, Fault f, String refState) {
-        l.info("readOneFaultResistance");
+        l.info("readOneSimOneFaultResistance");
         SimMsg sm1 = commBuildService.buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
         SimMsg sm2 = null;
         if (reF != null && refState != null) {
@@ -729,6 +734,8 @@ public class CommSendService {
         simReceiveService.setFaultAnswerValue(sm2, s, reF, f, refState);
     }
 
+    // private long shangyige_sleep = 0
+
     /**
      * send hex message
      *
@@ -769,7 +776,7 @@ public class CommSendService {
             if (s != null) {
                 simService.updateLastSentTime(s);
             }
-            byte[] buffer = new byte[LENGTH_20];
+            byte[] buffer = new byte[LENGTH_24];
             int length = is.read(buffer);
             StringBuffer sbHex = new StringBuffer();
             for (int i = 0; i < length; i++) {

+ 6 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/DebugFaultService.java

@@ -101,4 +101,10 @@ public class DebugFaultService {
         }
         return null;
     }
+
+    public interface Flag {
+        String YES = "1";
+        String NO = "0";
+        String UNKNOWN = "7";
+    }
 }

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

@@ -307,7 +307,7 @@ public class RealExamService {
         }
         RealExam re = selectRealExamByExamId(examId);
         Sim s = simService.selectSimBySimId(re.getSimId());
-        // Step 1 主动查询一次模拟器状态
+        // Step 1 主动查询一次模拟器状态。获取模拟器在线/离线状态。
         {
             commSendService.checkOneSimState(s, true);
             // 如果模拟器离线
@@ -315,14 +315,14 @@ public class RealExamService {
                 return AjaxResult.error("未连接模拟器,请检查连接!");
             }
         }
-        // Step 2 读取对应一台模拟器 所有故障部位值。检查模拟器所有的 真实的 故障部位 是否异常 或者 空值。
+        // Step 2 读取对应一台模拟器 所有故障部位值。检查模拟器所有的 真实的 故障部位 是否异常 或者 空值。特殊的故障部位要单独判断。
         if (SimDebugConfig.CHECK_REPLACE_EMPTY) {
             AjaxResult arE2 = commSendService.readOneSimAllFaultCheck(s);
             if (arE2.isError()) {
                 return arE2;
             }
         }
-        // Step 3 清除对应一台模拟器 所有故障部位故障。
+        // Step 3 清除对应一台模拟器 所有 真实的 故障部位故障。
         {
             commSendService.clearOneSimAllFaultByExam(re);
         }
@@ -330,12 +330,12 @@ public class RealExamService {
         {
             commSendService.writeOneSimAllSelectFaultByExam(re);
         }
-        // Step 5 读取对应一台模拟器 所有的 真实的 故障部位 电阻值 作为出题值。
+        // Step 5 读取对应一台模拟器 所有的 真实的 故障部位 电阻值代表值 作为出题值。
         // 修改关联状态
         {
             commSendService.readOneSimAllFaultFirstTimeByExam(re);
         }
-        // Step 6 修改Exam状态
+        // Step 6 修改当前Exam状态
         if (realExamFaultService.isType2ExamPrepareStartOk(re.getExamId())) {
             updateOneState(re.getExamId(), RealExam.State.SIM_PREPARE_OK);
             updateOneState(re.getExamId(), RealExam.State.ANSWERING);