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

添加 考试开始的 故障部位检查。要求非00000000值。0002型01故障特殊判断。

tom 2 тижнів тому
батько
коміт
9d19723ab1

+ 2 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -7,8 +7,8 @@ ruoyi:
   # 版权年份
   copyrightYear: 2024
   # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
-  profile: C:/ruoyi/uploadPath
-  # profile: /home/ruoyi/uploadPath
+  # profile: C:/ruoyi/uploadPath
+  profile: /home/ruoyi/uploadPath
   # 获取ip地址开关
   addressEnabled: false
   # 验证码类型 math 数字计算 char 字符验证

+ 2 - 2
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/Sim.java

@@ -180,7 +180,7 @@ public class Sim extends BaseEntity {
     public interface State {
         String ENABLE_INIT = "0";
         String ONLINE = "1";
-        String SIM_OFFLINE = "2";
+        String OFFLINE = "2";
         String GATEWAY_OFFLINE = "3";
         String SIM_ERROR = "4";
         String DISABLE = "5";
@@ -189,7 +189,7 @@ public class Sim extends BaseEntity {
     public static final Set<String> STATE_SET = new HashSet<>(Arrays.asList(
             State.ENABLE_INIT,
             State.ONLINE,
-            State.SIM_OFFLINE,
+            State.OFFLINE,
             State.GATEWAY_OFFLINE,
             State.SIM_ERROR,
             State.DISABLE

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

@@ -20,6 +20,8 @@ public interface CommConst {
 
     String CMD_DATA_PLACE_HOLDER = "00000000";
 
+    String BLANK_CONTENT = "00000000";
+
     /**
      * 故障下发
      */
@@ -67,6 +69,7 @@ public interface CommConst {
             "06", "07", "08", "09", "0A",
             "0B", "0C", "0D", "0E", "0F"};
 
+    int RETRY_COUNT_CHECK_ONE_FAULT = 1;
     int RETRY_COUNT_CLEAR_ONE_FAULT = 2;
     int RETRY_COUNT_WRITE_ONE_FAULT = 2;
     int RETRY_COUNT_READ_ONE_RESISTANCE = 4;

+ 24 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/CommReceiveService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.sim.service.impl;
 
+import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.sim.domain.Fault;
 import com.ruoyi.sim.domain.RealExamFault;
 import com.ruoyi.sim.domain.Sim;
@@ -10,6 +11,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import static com.ruoyi.sim.service.impl.CommConst.*;
+
 @Service
 // 多实例
 // 异步调用
@@ -121,4 +124,25 @@ public class CommReceiveService {
         return StringUtils.substring(receiveMsg, 10, 18);
     }
 
+    /**
+     * 0002型 01故障部位进行特殊处理。
+     */
+    public String FAULT_0002_GZBW_01 = "0002GZBW0001";
+
+    public AjaxResult getOneFaultCheck(SimMsg sm, Sim s, Fault f) {
+        String checkValue = parseGetData(sm.getReceiveMsg());
+        if (s != null &&
+                s.getSimType().equals(Sim.TYPE_0002) &&
+                f.getFaultId().equals(FAULT_0002_GZBW_01)) {
+            return AjaxResult.success(f);
+        }
+        if (BLANK_CONTENT.equals(checkValue)) {
+            l.info("故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]未正确安装;");
+            return AjaxResult.error(
+                    "故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]未正确安装;"
+                    , f);
+        } else {
+            return AjaxResult.success(f);
+        }
+    }
 }

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

@@ -4,7 +4,6 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.sim.config.SimConfig;
 import com.ruoyi.sim.domain.*;
-import com.ruoyi.sim.util.CRC16Modbus;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
@@ -220,7 +219,7 @@ public class CommSendService {
             return;
         }
         if (Sim.State.DISABLE.equals(s.getSimState())) {
-            l.warn("sim DISABLE sim = {}", s);
+            l.warn("sim DISABLE,模拟器被禁用,sim = {}", s);
             return;
         }
         if (StringUtils.isBlank(s.getSimType()) || StringUtils.isBlank(s.getSimNum())) {
@@ -232,7 +231,7 @@ public class CommSendService {
         SimMsg smR = send(smS, s, RETRY_COUNT_0, SLEEP_SHORT);
         if (StringUtils.isNotBlank(smR.getReceiveMsg())) {
             l.info("isNotBlank");
-            failCountClearOne(s.getSimId());
+            commFailCountClearOne(s.getSimId());
         }
         simReceiveService.checkOneSimState(smR, s);
     }
@@ -259,7 +258,7 @@ public class CommSendService {
      * @param re
      */
     public void clearOneSimAllFaultByExam(RealExam re) {
-        l.info("清除exam = {}", re);
+        l.info("clearOneSimAllFaultByExam = {}", re);
         // check
 
         // 更新Exam状态。
@@ -350,7 +349,8 @@ public class CommSendService {
      * @param f
      */
     public void clearOneSimOneFault(Sim s, RealExamFault reF, Fault f) {
-        l.info("清除One故障:getSimNum = {},fault.getName = {}", s.getSimNum(), f.getName());
+        l.info("clearOneSimOneFault 清除One故障:getSimNum = {},getBindHardwareMsg = {},fault.getName = {}",
+                s.getSimNum(), f.getBindHardwareMsg(), f.getName());
         // check todo:
 
         // step1
@@ -449,6 +449,56 @@ public class CommSendService {
         }
     }
 
+    /**
+     * 检查读取。
+     *
+     * @param s
+     * @return
+     */
+    public AjaxResult readOneSimAllFaultCheck(Sim s) {
+        Fault q = new Fault();
+        q.setFaultType(Fault.Type.REAL_GZBW);
+        q.setSimType(s.getSimType());
+        List<Fault> list = faultService.selectFaultList(q);
+        List<Fault> listNG = new ArrayList<>();
+        for (Fault f : list) {
+            AjaxResult ar = readOneSimOneFaultCheck(s, f);
+            if (ar.isError()) {
+                listNG.add(f);
+                l.info("故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]未正确安装;");
+            } else {
+                l.info("故障部位[" + f.getBindHardwareMsg() + "][" + f.getReplaceName() + "]安装ok;");
+            }
+        }
+        if (listNG.isEmpty()) {
+            return AjaxResult.success("所有故障部位检查没有问题。");
+        }
+        StringBuilder sbNG = new StringBuilder();
+        for (Fault f : listNG) {
+            sbNG.append("[" + f.getReplaceName() + "]零件异常;<br>");
+        }
+        sbNG.append("请检查后重新开始考试!");
+        return AjaxResult.error(sbNG.toString());
+    }
+
+    /**
+     * 检查读取。
+     *
+     * @param s
+     * @param f
+     * @return
+     */
+    public AjaxResult readOneSimOneFaultCheck(Sim s, Fault 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);
+    }
+
+    /**
+     * 第一次读取,作为出题值。
+     *
+     * @param re
+     */
     public void readOneSimAllFaultFirstTime(RealExam re) {
         List<RealExamFault> list = realExamFaultService.listAllType2(re.getExamId());
         for (RealExamFault ref : list) {
@@ -458,12 +508,19 @@ public class CommSendService {
         }
     }
 
+    /**
+     * 第一次读取,作为出题值。
+     *
+     * @param s
+     * @param ref
+     * @param f
+     */
     public void readOneSimOneFaultFirstTime(Sim s, RealExamFault ref, Fault f) {
         // 读取一次当前电阻代表值作为出题值。
-        SimMsg smB1 = commBuildService.buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
-        SimMsg smB2 = send(smB1, s, RETRY_COUNT_WRITE_ONE_FAULT, SLEEP_LONG);
+        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(smB2, s, ref, f);
+            simReceiveService.setFaultQuestionValue(sm2, s, ref, f);
         } else {
             l.info("ref is null");
         }
@@ -579,10 +636,10 @@ public class CommSendService {
         } catch (InterruptedException | IOException e) {   // SocketTimeoutException
             e.printStackTrace();
             // 失败计数
-            boolean limit = failCountAdd1(Objects.requireNonNull(s).getSimId());
+            boolean limit = commFailCountAdd1(Objects.requireNonNull(s).getSimId());
             if (limit) {
-                simService.updateSimStateBySimId(s.getSimId(), Sim.State.SIM_OFFLINE);
-                failCountClearOne(s.getSimId());
+                simService.updateSimStateBySimId(s.getSimId(), Sim.State.OFFLINE);
+                commFailCountClearOne(s.getSimId());
             }
             // 先考虑一台模拟器演示。
             // 进行重试 start
@@ -643,7 +700,7 @@ public class CommSendService {
                 l.info("openSocket cachedSocket is not ok!new socket!");
                 cachedSocket = new Socket(config.getRs485Ip(), config.getRs485Port());
                 cachedSocket.setSoTimeout(SOCKET_TIME_OUT);
-                failCountClearAll();
+                commFailCountClearAll();
             } else {
                 l.info("openSocket cachedSocket is ok!");
             }
@@ -680,7 +737,7 @@ public class CommSendService {
             return AjaxResult.success("closeSocket IOException");
         } finally {
             cachedSocket = null;
-            failCountClearAll();
+            commFailCountClearAll();
         }
         return AjaxResult.success();
     }
@@ -712,7 +769,7 @@ public class CommSendService {
      * @param simId
      * @return true超过通信失败次数限制
      */
-    private boolean failCountAdd1(long simId) {
+    private boolean commFailCountAdd1(long simId) {
         l.info("map.containsKey(simId) = {}", map.containsKey(simId));
         if (map.containsKey(simId)) {
             map.put(simId, map.get(simId) + 1);
@@ -722,11 +779,11 @@ public class CommSendService {
         return (map.get(simId) >= OFFLINE_LIMIT);
     }
 
-    private void failCountClearOne(long simId) {
+    private void commFailCountClearOne(long simId) {
         map.remove(simId);
     }
 
-    private void failCountClearAll() {
+    private void commFailCountClearAll() {
         map.clear();
     }
 

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

@@ -295,14 +295,27 @@ public class RealExamService {
         }
         RealExam re = selectRealExamByExamId(examId);
         // Step 1 读取对应一台模拟器 所有故障部位值。检查模拟器所有的 真实的 故障部位 是否异常 或者 空值。
-
+        {
+            Sim sim = simService.selectSimBySimId(re.getSimId());
+            AjaxResult arE2 = commSendService.readOneSimAllFaultCheck(sim);
+            if (arE2.isError()) {
+                return arE2;
+            }
+        }
         // Step 2 清除对应一台模拟器 所有故障部位故障。
-        commSendService.clearOneSimAllFaultByExam(re);
+        {
+            commSendService.clearOneSimAllFaultByExam(re);
+        }
         // Step 3 下发对应一台模拟器 出题选中的 故障位置故障。
+        {
+
+        }
         commSendService.writeOneSimAllSelectFault(re);
         // Step 4 读取对应一台模拟器 所有的 真实的 故障部位 电阻值 作为出题值。
         // 修改关联状态
-        commSendService.readOneSimAllFaultFirstTime(re);
+        {
+            commSendService.readOneSimAllFaultFirstTime(re);
+        }
         // Step 5 修改Exam状态
 
         if (realExamFaultService.isType2ExamPrepareStartOk(re.getExamId())) {
@@ -311,9 +324,9 @@ public class RealExamService {
             // 修改真实考试开始时间。
             re.setStartTime(DateUtils.getNowDate());
             updateRealExam(re);
-            return AjaxResult.success("start ok!");
+            return AjaxResult.success("开始考试成功!");
         } else {
-            return AjaxResult.error("start failed!");
+            return AjaxResult.error("连接超时,请检查模拟器连接!");
         }
     }