Browse Source

修改 开始考试 和 交卷考试。

tom 4 months ago
parent
commit
d3959853a1

+ 2 - 2
ruoyi-sim/src/main/java/com/ruoyi/sim/controller/TestIotController.java

@@ -62,14 +62,14 @@ public class TestIotController extends BaseController {
             break;
             case 6: {
                 RealExam re = realExamService.selectRealExamByExamId(1L);
-                commSendService.clearAllFaultByExam(re);
+                commSendService.clearOneSimAllFaultByExam(re);
             }
             break;
             case 10: {
                 commSendService.checkAllSimState();
                 commSendService.clearAll();
                 RealExam re = realExamService.selectRealExamByExamId(1L);
-                commSendService.clearAllFaultByExam(re);
+                commSendService.clearOneSimAllFaultByExam(re);
             }
             break;
             case 11: {

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

@@ -212,14 +212,15 @@ public class RealExamFault extends BaseEntity {
     }
 
     /**
-     * 选中:0 1 2 3 4
-     * 未选中:0 1 3 4
+     * 选中Yes:0 1 2 4
+     * 未选中No:0 1 3 4
      */
     public interface State {
         String INIT = "0";
         String CLEARED = "1";
         String WRITTEN = "2";
         String LOOP_READ = "3";
+        // todo: String LAST_READED
         String FINISH = "4";
     }
 

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

@@ -10,8 +10,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Objects;
-
 @Service
 // 多实例
 // 异步调用
@@ -47,7 +45,7 @@ public class CommReceiveService {
         //
         //
         if (reF != null) {
-            realExamFaultService.updateRefState(reF.getRefId(), RealExamFault.State.CLEARED);
+            realExamFaultService.updateRefStateByRefId(reF.getRefId(), RealExamFault.State.CLEARED);
         }
     }
 
@@ -70,9 +68,14 @@ public class CommReceiveService {
             return;
         }
         l.info("faultQuestionValue = {}", faultQuestionValue);
-        reF.setRefState(RealExamFault.State.WRITTEN);
+        // 修改关联状态。
         reF.setSimFaultQuestionValue(faultQuestionValue);
         realExamFaultService.updateRealExamFault(reF);
+        if (RealExamFault.Flag.YES.equals(reF.getFlag())) {
+            realExamFaultService.updateRefStateByRefId(reF.getRefId(), RealExamFault.State.WRITTEN);
+        } else if (RealExamFault.Flag.NO.equals(reF.getFlag())) {
+            realExamFaultService.updateRefStateByRefId(reF.getRefId(), RealExamFault.State.LOOP_READ);
+        }
     }
 
     /**
@@ -82,7 +85,7 @@ public class CommReceiveService {
      * @param s
      * @param reF
      * @param f
-     * @param refState RealExamFault.State.LOOP_READ
+     * @param refState 轮询时候为null
      */
     public void setFaultAnswerValue(SimMsg sm, Sim s, RealExamFault reF, Fault f, String refState) {
         // check
@@ -98,7 +101,9 @@ public class CommReceiveService {
             return;
         }
         l.info("faultAnswerValue = {}", faultAnswerValue);
-        reF.setRefState(refState);
+        if (StringUtils.isNotBlank(refState)) {
+            reF.setRefState(refState);
+        }
         reF.setSimFaultAnswerValue(faultAnswerValue);
         realExamFaultService.updateRealExamFault(reF);
     }

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

@@ -63,20 +63,20 @@ public class CommSendService {
 
     public void readAll() {
         l.info("readAll");
-        List<RealExam> listRE = realExamService.listAllByStatus(RealExam.State.ANSWERING);
-        listRE.forEach(e -> {
+        List<RealExam> listRe = realExamService.listAllByStatus(RealExam.State.ANSWERING);
+        listRe.forEach(e -> {
             if (e == null) {
                 return;
             }
-            List<RealExamFault> listREF = realExamFaultService.listAllType2LoopReadStateByExamId(e.getExamId());
-            listREF.forEach(ref -> {
+            List<RealExamFault> listRef = realExamFaultService.listAllType2State2and3ByExamId(e.getExamId());
+            listRef.forEach(ref -> {
                 Sim s = simService.selectSimBySimId(e.getSimId());
                 Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
                 if (f != null &&
                         Fault.Type.REAL_GZBW.equals(f.getFaultType()) &&
                         Fault.State.ENABLE.equals(f.getFaultState())
                 ) {
-                    readOneFaultResistance(s, ref, f, RealExamFault.State.LOOP_READ);
+                    readOneSimOneFaultResistance(s, ref, f, null);
                 }
             });
         });
@@ -92,16 +92,17 @@ public class CommSendService {
 
     public void readOneExamAtLast(RealExam re) {
         l.info("readOneExamAtLast");
-        List<RealExamFault> listREF = realExamFaultService.listAllType2LoopReadStateByExamId(re.getExamId());
-        listREF.forEach(ref -> {
+        List<RealExamFault> list = realExamFaultService.listAllType2State2and3ByExamId(re.getExamId());
+        for (RealExamFault ref : list) {
             Sim s = simService.selectSimBySimId(re.getSimId());
             Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
-            readOneFaultResistance(s, ref, f, RealExamFault.State.FINISH);
-        });
+            readOneSimOneFaultResistance(s, ref, f, RealExamFault.State.FINISH);
+        }
         // 计算扣分。
         // 最后都读取到,才算扣分。
         {
-            calculateScore(re.getExamId());
+            // todo:暂时不算。
+            // calculateScore(re.getExamId());
         }
     }
 
@@ -138,6 +139,7 @@ public class CommSendService {
             l.info("没有open的考试集合");
             return;
         }
+        readAll();
         //
 
         // AA010102010000000055
@@ -255,7 +257,7 @@ public class CommSendService {
      *
      * @param re
      */
-    public void clearAllFaultByExam(RealExam re) {
+    public void clearOneSimAllFaultByExam(RealExam re) {
         // check
 
         // 更新Exam状态。
@@ -274,7 +276,7 @@ public class CommSendService {
             // check
 
             //
-            clearOneFault(s, ref, f);
+            clearOneSimOneFault(s, ref, f);
         });
     }
 
@@ -285,7 +287,7 @@ public class CommSendService {
      */
     @Async("tp-comm")
     public void clearListFaultByRealExamAsync(RealExam re) {
-        clearAllFaultByExam(re);
+        clearOneSimAllFaultByExam(re);
     }
 
     public void clearAll() {
@@ -294,7 +296,7 @@ public class CommSendService {
             String simType = s.getSimType();
             List<Fault> listF = faultService.listType3EnableBySimType(simType);
             listF.forEach(f -> {
-                clearOneFault(s, null, f);
+                clearOneSimOneFault(s, null, f);
             });
         });
     }
@@ -342,7 +344,7 @@ public class CommSendService {
      * @param reF 可以为空,表示不关联考试的,单独执行的。
      * @param f
      */
-    public void clearOneFault(Sim s, RealExamFault reF, Fault f) {
+    public void clearOneSimOneFault(Sim s, RealExamFault reF, Fault f) {
         l.info("清除One故障:getSimNum = {},fault.getName = {}", s.getSimNum(), f.getName());
         // check todo:
 
@@ -351,16 +353,18 @@ public class CommSendService {
         SimMsg smR = send(smS, s, RETRY_COUNT_CLEAR_ONE_FAULT, SLEEP_LONG);
         simReceiveService.clearOneFault(smR, s, reF, f);
         // step2
-        if (reF != null &&
-                realExamFaultService.isState(reF.getRefId(), RealExamFault.State.CLEARED)) {
-            if (reF.getFlag().equals(RealExamFault.Flag.YES)) {
-                writeOneFault(s, reF, f);
-            } else if (reF.getFlag().equals(RealExamFault.Flag.NO)) {
-                RealExamFault f1 = realExamFaultService.selectRealExamFaultByRefId(reF.getRefId());
-                f1.setRefState(RealExamFault.State.LOOP_READ);
-            }
-        }
 
+        // 下发故障独立运行。下面屏蔽。
+
+//        if (reF != null &&
+//                realExamFaultService.isState(reF.getRefId(), RealExamFault.State.CLEARED)) {
+//            if (reF.getFlag().equals(RealExamFault.Flag.YES)) {
+//                writeOneFault(s, reF, f);
+//            } else if (reF.getFlag().equals(RealExamFault.Flag.NO)) {
+//                RealExamFault f1 = realExamFaultService.selectRealExamFaultByRefId(reF.getRefId());
+//                f1.setRefState(RealExamFault.State.LOOP_READ);
+//            }
+//        }
     }
 
     /**
@@ -412,40 +416,49 @@ public class CommSendService {
         }
     }
 
-    public void writeOneFault(Sim s, RealExamFault ref, Fault f) {
-        l.info("下发故障:getSimId = {},fault.getName = {}", s.getSimId(), f.getName());
+    /**
+     * 下发所有选中的真实的故障部位。
+     *
+     * @param re
+     */
+    public void writeOneSimAllSelectFault(RealExam re) {
+        // 更新Exam状态。
+        realExamService.updateOneState(re.getExamId(), RealExam.State.SIM_WRITING);
+        List<RealExamFault> list = realExamFaultService.listAllType2FlagYesClearedStateByExamId(re.getExamId());
+        for (RealExamFault ref : list) {
+            Sim s = simService.selectSimBySimId(re.getSimId());
+            Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
+            // 选中的才下发。
+            writeOneSimOneFault(s, ref, f);
+        }
+    }
 
+    public void writeOneSimOneFault(Sim s, RealExamFault ref, Fault f) {
+        l.info("下发故障:getSimId = {},fault.getName = {}", s.getSimId(), f.getName());
         // todo:ref is null.
-
         // 下发故障
         SimMsg smA1 = commBuildService.buildSendMsgWriteFault(s.getSimNum(), f.getBindHardwareMsg());
         SimMsg smA2 = send(smA1, s, RETRY_COUNT_WRITE_ONE_FAULT, SLEEP_LONG);
-        // todo:
+        if (smA2.isOk()) {
+
+        }
+    }
+
+    public void readOneSimAllFaultFirstTime(RealExam 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);
+        }
+    }
 
+    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);
-        simReceiveService.setFaultQuestionValue(smB2, s, ref, f);
         if (ref != null) {
-            // 修改关联状态。
-            RealExamFault f1 = realExamFaultService.selectRealExamFaultByRefId(ref.getRefId());
-            f1.setRefState(RealExamFault.State.LOOP_READ);
-            realExamFaultService.updateRealExamFault(f1);
-
-            //
-            {
-                boolean allWritten = realExamFaultService.isAllType2StateXiaFa(f1.getExamId());
-                if (allWritten) {
-                    // 如果全部下发完毕 修改RealExam状态
-                    l.info("allWritten id = {}", f1.getExamId());
-
-                }
-            }
-
-            // todo:
-
-            // todo:单独一个故障,特殊处理
-            realExamService.updateOneState(f1.getExamId(), RealExam.State.SIM_PREPARE_OK);
+            simReceiveService.setFaultQuestionValue(smB2, s, ref, f);
         } else {
             l.info("ref is null");
         }
@@ -480,20 +493,24 @@ public class CommSendService {
         return list;
     }
 
-    public void readOneFaultResistance(Sim s, RealExamFault reF, Fault f, String refState) {
+    /**
+     * @param s
+     * @param reF
+     * @param f
+     * @param refState 中间轮询是null,交卷最后一次读取为finish状态。用来修改状态的。
+     */
+    public void readOneSimOneFaultResistance(Sim s, RealExamFault reF, Fault f, String refState) {
         l.info("readOneFaultResistance");
         SimMsg sm1 = commBuildService.buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
-        // todo:有所区分。
-        SimMsg sm2 = send(sm1, s, RETRY_COUNT_READ_ONE_RESISTANCE, SLEEP_LONG);
+        SimMsg sm2 = null;
+        if (RealExamFault.State.FINISH.equals(refState)) { // 是否最后一次读取。
+            sm2 = send(sm1, s, RETRY_COUNT_READ_ONE_RESISTANCE, SLEEP_SHORT);
+        } else {
+            sm2 = send(sm1, s, RETRY_COUNT_0, SLEEP_SHORT);
+        }
         simReceiveService.setFaultAnswerValue(sm2, s, reF, f, refState);
     }
 
-    @Async("tp-comm")
-    public void readOneFaultResistanceAsync(Sim s, RealExamFault reF, Fault f, String refState) {
-        l.info("readOneFaultResistanceAsync");
-        readOneFaultResistance(s, reF, f, refState);
-    }
-
     /**
      * send hex message
      *
@@ -631,6 +648,7 @@ public class CommSendService {
         }
         try {
             if (cachedSocket != null) {
+                // todo:判断shutdown
                 cachedSocket.getInputStream().close();
                 cachedSocket.getOutputStream().close();
                 cachedSocket.close();

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

@@ -296,7 +296,9 @@ public class RealExamCollectionService extends Ele6RYBaseService {
         // todo:强制停掉所有的自主练习
 
         RealExamCollection f = selectRealExamCollectionByExamCollectionId(examCollectionId);
-
+        if (f == null) {
+            return AjaxResult.error("考试集合不存在!");
+        }
         // 修改考试集合状态。
         {
             f.setExamCollectionState(RealExamCollection.State.OPENED);

+ 80 - 8
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/RealExamFaultService.java

@@ -98,7 +98,7 @@ public class RealExamFaultService {
 
     private static final Logger l = LoggerFactory.getLogger(RealExamFaultService.class);
 
-    public void updateRefState(final long refId, final String state) {
+    public void updateRefStateByRefId(final long refId, final String state) {
         if (!existByRefId(refId)) {
             return;
         }
@@ -126,6 +126,23 @@ public class RealExamFaultService {
         return realExamFaultMapper.selectRealExamFaultList(q);
     }
 
+    public List<RealExamFault> listAllType2FlagYesClearedStateByExamId(Long examId) {
+        RealExamFault q = new RealExamFault();
+        q.setExamId(examId);
+        q.setRefType(RealExamFault.Type.TYPE_2);
+        q.setRefState(RealExamFault.State.CLEARED);
+        q.setFlag(RealExamFault.Flag.YES);
+        return realExamFaultMapper.selectRealExamFaultList(q);
+    }
+
+    public List<RealExamFault> listAllType2ByExamId(Long examId) {
+        RealExamFault q = new RealExamFault();
+        q.setExamId(examId);
+        q.setRefType(RealExamFault.Type.TYPE_2);
+        return realExamFaultMapper.selectRealExamFaultList(q);
+    }
+
+
     /**
      * reset real_exam_fault 表中关联数据
      *
@@ -148,15 +165,27 @@ public class RealExamFaultService {
     }
 
     public void reset(final Long examId) {
-
-    }
-
-    public List<RealExamFault> listAllType2LoopReadStateByExamId(Long examId) {
         RealExamFault q = new RealExamFault();
         q.setExamId(examId);
-        q.setRefType(RealExamFault.Type.TYPE_2);
-        q.setRefState(RealExamFault.State.LOOP_READ);
-        return realExamFaultMapper.selectRealExamFaultList(q);
+    }
+
+    public List<RealExamFault> listAllType2State2and3ByExamId(Long examId) {
+        List<RealExamFault> list = new ArrayList<>();
+        {
+            RealExamFault q = new RealExamFault();
+            q.setExamId(examId);
+            q.setRefType(RealExamFault.Type.TYPE_2);
+            q.setRefState(RealExamFault.State.WRITTEN);
+            list.addAll(realExamFaultMapper.selectRealExamFaultList(q));
+        }
+        {
+            RealExamFault q = new RealExamFault();
+            q.setExamId(examId);
+            q.setRefType(RealExamFault.Type.TYPE_2);
+            q.setRefState(RealExamFault.State.LOOP_READ);
+            list.addAll(realExamFaultMapper.selectRealExamFaultList(q));
+        }
+        return list;
     }
 
     public List<RealExamFault> listAllType2(Long examId) {
@@ -185,6 +214,49 @@ public class RealExamFaultService {
         return true;
     }
 
+    /**
+     * 全部清除并下发选中Ok?
+     * // 如果全部下发完毕 修改RealExam状态
+     * <p>
+     * // todo:单独一个故障,特殊处理
+     *
+     * @param examId
+     * @return
+     */
+    public boolean isType2ExamPrepareStartOk(long examId) {
+        RealExamFault q = new RealExamFault();
+        q.setExamId(examId);
+        q.setRefType(RealExamFault.Type.TYPE_2);
+        List<RealExamFault> list = selectRealExamFaultList(q);
+        for (RealExamFault ref : list) {
+            String flag = ref.getFlag();
+            if (RealExamFault.Flag.YES.equals(flag)) {
+                if (!RealExamFault.State.WRITTEN.equals(ref.getRefState())) {
+                    return false;
+                }
+            } else if (RealExamFault.Flag.NO.equals(flag)) {
+                if (!RealExamFault.State.LOOP_READ.equals(ref.getRefState())) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    public boolean isType2ExamPrepareSubmitOk(long examId) {
+        RealExamFault q = new RealExamFault();
+        q.setExamId(examId);
+        q.setRefType(RealExamFault.Type.TYPE_2);
+        List<RealExamFault> list = selectRealExamFaultList(q);
+        for (RealExamFault ref : list) {
+            // todo:需要更多check
+            if (StringUtils.isBlank(ref.getSimFaultQuestionValue()) || StringUtils.isBlank(ref.getSimFaultAnswerValue())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     public boolean isState(Long refId, String state) {
         RealExamFault f = selectRealExamFaultByRefId(refId);
         if (f == null) {

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

@@ -144,7 +144,7 @@ public class RealExamService {
         // todo:屏蔽
         if (false && RealExam.State.SUBMITTED.equals(state)) {
             // 关联故障list同步锁死。
-            realExamFaultService.listAllType2LoopReadStateByExamId(q.getExamId())
+            realExamFaultService.listAllType2State2and3ByExamId(q.getExamId())
                     .forEach(ref -> {
                         ref.setRefState(RealExamFault.State.FINISH);
                         realExamFaultService.updateRealExamFault(ref);
@@ -240,7 +240,7 @@ public class RealExamService {
         // 兜底
         {
             if (realExamFaultService.isAllType2StateXiaFa(v.getRealExam().getExamId())) {
-                updateOneState(v.getRealExam().getExamId(), RealExam.State.SIM_PREPARE_OK);
+                // updateOneState(v.getRealExam().getExamId(), RealExam.State.SIM_PREPARE_OK);
             }
         }
         // 模拟器不通信。
@@ -264,13 +264,33 @@ public class RealExamService {
      */
     @Transactional
     public AjaxResult studentStartRealExam(Long examId) {
-        l.info("studentStartRealExam");
+        l.info("studentStartRealExam = {}", examId);
         RealExam re = selectRealExamByExamId(examId);
-        l.info("re = {}", re);
-        re.setExamStatus(RealExam.State.ANSWERING);
-        re.setStartTime(DateUtils.getNowDate());
-        updateRealExam(re);
-        return AjaxResult.success(re);
+        if (re == null) {
+            return AjaxResult.error("examId不存在!");
+        }
+
+        // Step 1 读取对应一台模拟器 所有故障部位值。检查模拟器所有的 真实的 故障部位 是否异常 或者 空值。
+
+        // Step 2 清除对应一台模拟器 所有故障部位故障。
+        commSendService.clearOneSimAllFaultByExam(re);
+        // Step 3 下发对应一台模拟器 出题选中的 故障位置故障。
+        commSendService.writeOneSimAllSelectFault(re);
+        // Step 4 读取对应一台模拟器 所有的 真实的 故障部位 电阻值 作为出题值。
+        // 修改关联状态
+        commSendService.readOneSimAllFaultFirstTime(re);
+        // Step 5 修改Exam状态
+
+        if (realExamFaultService.isType2ExamPrepareStartOk(re.getExamId())) {
+            updateOneState(re.getExamId(), RealExam.State.SIM_PREPARE_OK);
+            updateOneState(re.getExamId(), RealExam.State.ANSWERING);
+            // 修改真实考试开始时间。
+            re.setStartTime(DateUtils.getNowDate());
+            updateRealExam(re);
+            return AjaxResult.success("start ok!");
+        } else {
+            return AjaxResult.error("start failed!");
+        }
     }
 
     /**
@@ -298,29 +318,25 @@ public class RealExamService {
      * @param examId
      * @return RealExam
      */
+    @Transactional
     public AjaxResult studentSubmitRealExam(Long examId) {
+        RealExam re = selectRealExamByExamId(examId);
         // 最后检查一下模拟器状态。
-
+        Sim s = simService.selectSimBySimId(re.getSimId());
+        if (s == null || !Sim.State.ONLINE.equals(s.getSimState())) {
+            return AjaxResult.error("模拟器离线,不允许交卷!");
+        }
         // 最后读取一下模拟器电阻值。
-        // todo:
-        RealExam re1 = selectRealExamByExamId(examId);
-        commSendService.readOneExamAtLastAsync(re1);
-
-        submit(examId);
-
-        return AjaxResult.success(re1);
-    }
-
-    /**
-     * @param examId
-     */
-    @Transactional
-    public void submit(long examId) {
-        l.info("submit");
-        RealExam re2 = selectRealExamByExamId(examId);
-        re2.setExamStatus(RealExam.State.SUBMITTED);
-        re2.setEndTime(DateUtils.getNowDate());
-        updateRealExam(re2);
+        commSendService.readOneExamAtLast(re);
+        if (realExamFaultService.isType2ExamPrepareSubmitOk(re.getExamId())) {
+            re.setExamStatus(RealExam.State.SUBMITTED);
+            // 修改真实考试结束时间。
+            re.setEndTime(DateUtils.getNowDate());
+            updateRealExam(re);
+            return AjaxResult.success("成功交卷!");
+        } else {
+            return AjaxResult.error("失败交卷!");
+        }
     }
 
     /**

+ 3 - 3
ruoyi-sim/src/main/resources/mapper/sim/RealExamCollectionMapper.xml

@@ -40,7 +40,7 @@
                update_by,
                update_time,
                remark
-        from mx_real_exam_collection
+        from sim_real_exam_collection
     </sql>
 
     <select id="selectRealExamCollectionList" parameterType="RealExamCollection" resultMap="RealExamCollectionResult">
@@ -144,12 +144,12 @@
 
     <delete id="deleteRealExamCollectionByExamCollectionId" parameterType="Long">
         delete
-        from xm_real_exam_collection
+        from sim_real_exam_collection
         where exam_collection_id = #{examCollectionId}
     </delete>
 
     <delete id="deleteRealExamCollectionByExamCollectionIds" parameterType="String">
-        delete from xm_real_exam_collection where exam_collection_id in
+        delete from sim_real_exam_collection where exam_collection_id in
         <foreach item="examCollectionId" collection="array" open="(" separator="," close=")">
             #{examCollectionId}
         </foreach>