Parcourir la source

Merge branch 'dev-api' into dev

tom il y a 5 mois
Parent
commit
15bac6dc14

+ 3 - 3
pla-sim/01_SQL/02_table/sim_real_exam_fault.sql

@@ -11,7 +11,7 @@
  Target Server Version : 80020 (8.0.20)
  File Encoding         : 65001
 
- Date: 24/12/2024 08:59:02
+ Date: 24/12/2024 11:59:27
 */
 
 SET NAMES utf8mb4;
@@ -22,7 +22,7 @@ SET FOREIGN_KEY_CHECKS = 0;
 -- ----------------------------
 DROP TABLE IF EXISTS `sim_real_exam_fault`;
 CREATE TABLE `sim_real_exam_fault`  (
-  `ref_id` bigint NOT NULL COMMENT '关联ID',
+  `ref_id` bigint NOT NULL AUTO_INCREMENT COMMENT '关联ID',
   `exam_id` bigint NOT NULL COMMENT '考试ID',
   `fault_id` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '故障ID',
   `ref_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关联类型:[1]-选择题,[2]-模拟器维修故障',
@@ -40,6 +40,6 @@ CREATE TABLE `sim_real_exam_fault`  (
   `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
   PRIMARY KEY (`ref_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'sim-考试故障关联表' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'sim-考试故障关联表' ROW_FORMAT = DYNAMIC;
 
 SET FOREIGN_KEY_CHECKS = 1;

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

@@ -29,6 +29,8 @@ public class TestIotController extends BaseController {
     @ApiOperation("testIot通信")
     @GetMapping(value = "/{codeId}")
     public AjaxResult testIndex(@PathVariable("codeId") Integer codeId) {
+
+        long examId = 2L;
         switch (codeId) {
             case 1: {
                 commSnedService.checkAllSimState();
@@ -78,6 +80,37 @@ public class TestIotController extends BaseController {
                 //
             }
             break;
+
+            case 20: {
+                realExamService.studentEnterRealExam(examId);
+                //
+            }
+            break;
+            case 21: {
+                realExamService.studentLoopPrepareRealExam(examId);
+                //
+            }
+            break;
+            case 22: {
+                realExamService.studentStartRealExam(examId);
+                //
+            }
+            break;
+            case 23: {
+                realExamService.studentLoopAnsweringRealExam(examId);
+                //
+            }
+            break;
+            case 24: {
+                realExamService.studentSubmitRealExam(examId);
+                //
+            }
+            break;
+            case 25: {
+                realExamService.studentLoopPostRealExam(examId);
+                //
+            }
+            break;
         }
         return AjaxResult.success();
     }

+ 10 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/vo/StudentRealExamIngVo.java

@@ -1,6 +1,7 @@
 package com.ruoyi.sim.domain.vo;
 
 import com.ruoyi.sim.domain.RealExam;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
  * [学生]正在考试页面Vo。
@@ -36,4 +37,13 @@ public class StudentRealExamIngVo {
     public void setCompulsiveSubmit(boolean compulsiveSubmit) {
         this.compulsiveSubmit = compulsiveSubmit;
     }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this)
+                .append("realExam", realExam)
+                .append("remainingMilliseconds", remainingMilliseconds)
+                .append("compulsiveSubmit", compulsiveSubmit)
+                .toString();
+    }
 }

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

@@ -46,6 +46,7 @@ public class CommReceiveService {
         // check
 
         //
+        //
         if (reF != null) {
             reF.setRefState(RealExamFault.State.CLEARED);
             realExamFaultService.updateRealExamFault(reF);
@@ -65,6 +66,11 @@ public class CommReceiveService {
 
         //
         String faultQuestionValue = parseGetData(sm.getReceiveMsg());
+        // todo:
+        if (StringUtils.isBlank(faultQuestionValue)) {
+            l.warn("faultQuestionValue is empty!");
+            return;
+        }
         l.info("faultQuestionValue = {}", faultQuestionValue);
         reF.setRefState(RealExamFault.State.WRITTEN);
         reF.setSimFaultQuestionValue(faultQuestionValue);
@@ -87,6 +93,11 @@ public class CommReceiveService {
         }
         //
         String faultAnswerValue = parseGetData(sm.getReceiveMsg());
+        // todo:
+        if (StringUtils.isBlank(faultAnswerValue)) {
+            l.warn("faultAnswerValue is empty!");
+            return;
+        }
         l.info("faultAnswerValue = {}", faultAnswerValue);
         reF.setRefState(RealExamFault.State.LOOP_READ);
         reF.setSimFaultAnswerValue(faultAnswerValue);

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

@@ -124,7 +124,7 @@ public class CommSendService {
             if (e == null) {
                 return;
             }
-            List<RealExamFault> listREF = realExamFaultService.listAllType2YesLoopReadState(e.getExamId());
+            List<RealExamFault> listREF = realExamFaultService.listAllType2LoopReadStateByExamId(e.getExamId());
             listREF.forEach(ref -> {
                 Sim s = simService.selectSimBySimId(e.getSimId());
                 Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
@@ -147,7 +147,7 @@ public class CommSendService {
     }
 
     public void readOneExamAtLast(RealExam re) {
-        List<RealExamFault> listREF = realExamFaultService.listAllType2YesLoopReadState(re.getExamId());
+        List<RealExamFault> listREF = realExamFaultService.listAllType2LoopReadStateByExamId(re.getExamId());
         listREF.forEach(ref -> {
             Sim s = simService.selectSimBySimId(re.getSimId());
             Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
@@ -170,7 +170,7 @@ public class CommSendService {
     public void scheduledReadSim() {
         l.info("scheduledReadSim");
         if (isSocketOk()) {
-            readAll();
+            readAllAsync();
         } else {
             scheduledConnect();
         }
@@ -314,6 +314,7 @@ public class CommSendService {
      * @param f
      */
     public void clearOneFault(Sim s, RealExamFault reF, Fault f) {
+        l.info("故障清除:getSimId = {},fault.getName = {}", s.getSimId(), f.getName());
         // check todo:
 
         //
@@ -336,6 +337,7 @@ public class CommSendService {
 
 
     public void writeOneFault(Sim s, RealExamFault ref, Fault f) {
+        l.info("下发故障:getSimId = {},fault.getName = {}", s.getSimId(), f.getName());
         try {
             // todo:ref is null.
 
@@ -362,7 +364,7 @@ public class CommSendService {
 
                 //
                 {
-                    boolean allWritten = realExamFaultService.isAllType2YesStateEqualWritten(f1.getExamId());
+                    boolean allWritten = realExamFaultService.isAllType2StateXiaFa(f1.getExamId());
                     if (allWritten) {
                         // 如果全部下发完毕 修改RealExam状态
                         l.info("allWritten id = {}", f1.getExamId());
@@ -382,7 +384,7 @@ public class CommSendService {
         l.info("readOneFaultResistance");
         try {
             SimMsg sm = new SimMsg();
-            String sendMsg = buildSendMsgReadFaultResistance(s.getSimNum(), "03");
+            String sendMsg = buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
             sm.setSendMsg(sendMsg);
             String receiveMsg = send(sendMsg, s);
             sm.setReceiveMsg(receiveMsg);
@@ -493,7 +495,16 @@ public class CommSendService {
      * @return
      */
     public synchronized String send(final String sendMsg, final Sim s) throws IOException {
-        l.info("sendMsg = " + sendMsg);
+        l.info("********sendMsg == [{}]", sendMsg);
+        //
+        {
+            try {
+                Thread.currentThread().sleep(1000L);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        //
         String receiveMsg = null;
         if (!isSocketOk()) {
             openSocket();
@@ -513,7 +524,7 @@ public class CommSendService {
             sbHex.append(String.format("%02X", buffer[i]));
         }
         receiveMsg = sbHex.toString();
-        l.info("receiveMsg = {}", receiveMsg);
+        l.info("********receiveMsg = [{}]", receiveMsg);
         if (!checkReceiveMsg(receiveMsg)) {
             // todo:
             l.warn("checkReceiveMsg fail receiveMsg = {}", receiveMsg);

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

@@ -107,27 +107,49 @@ public class RealExamFaultService {
         return realExamFaultMapper.selectRealExamFaultList(q);
     }
 
-    public List<RealExamFault> listAllType2YesLoopReadState(Long examId) {
+    public void resetAllType2(Long examId) {
+        listAllType2(examId)
+                .stream()
+                .forEach(ref -> {
+                    ref.setRefState(RealExamFault.State.INIT);
+                    ref.setAnswerRight(RealExamFault.AnswerRight.UNKNOWN);
+                    ref.setChoiceQuestionValue("");
+                    ref.setChoiceAnswerValue("");
+                    ref.setSimFaultQuestionValue("");
+                    ref.setSimFaultAnswerValue("");
+                    ref.setMinus(0L);
+                    updateRealExamFault(ref);
+                });
+    }
+
+    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);
-        q.setFlag(RealExamFault.Flag.YES);
         return realExamFaultMapper.selectRealExamFaultList(q);
     }
 
-    public List<RealExamFault> listAllType2Yes(Long examId) {
+    public List<RealExamFault> listAllType2(Long examId) {
         RealExamFault q = new RealExamFault();
         q.setExamId(examId);
         q.setRefType(RealExamFault.Type.TYPE_2);
-        q.setFlag(RealExamFault.Flag.YES);
         return realExamFaultMapper.selectRealExamFaultList(q);
     }
 
-    public boolean isAllType2YesStateEqualWritten(long examId) {
-        List<RealExamFault> list = listAllType2Yes(examId);
+    /**
+     * 全部下发Ok?
+     *
+     * @param examId
+     * @return
+     */
+    public boolean isAllType2StateXiaFa(long examId) {
+        List<RealExamFault> list = listAllType2(examId);
         for (RealExamFault ref : list) {
-            if (ref.getRefState() != RealExamFault.State.WRITTEN) {
+            String state = ref.getRefState();
+            if (RealExamFault.State.WRITTEN.equals(state) || RealExamFault.State.LOOP_READ.equals(state)) {
+
+            } else {
                 return false;
             }
         }
@@ -163,7 +185,9 @@ public class RealExamFaultService {
             throw new RuntimeException("calculateMinus");
         }
         if (!RealExamFault.Flag.YES.equals(f.getFlag())) {
-            throw new RuntimeException("calculateMinus");
+            // throw new RuntimeException("calculateMinus");
+            l.warn("not yes");
+            return;
         }
         int minus = 0;
         String answerRight = RealExamFault.AnswerRight.UNKNOWN;

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

@@ -11,8 +11,9 @@ import com.ruoyi.sim.domain.vo.RealExamVo;
 import com.ruoyi.sim.domain.vo.StudentRealExamIngVo;
 import com.ruoyi.sim.domain.vo.StudentRealExamPostVo;
 import com.ruoyi.sim.domain.vo.StudentRealExamPreVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.ruoyi.sim.mapper.RealExamMapper;
 import org.springframework.transaction.annotation.Transactional;
@@ -27,8 +28,6 @@ import org.springframework.transaction.annotation.Transactional;
 public class RealExamService {
     @Autowired
     private RealExamMapper realExamMapper;
-    @Autowired
-    private CommReceiveService commReceiveService;
 
     /**
      * 查询考试
@@ -93,6 +92,10 @@ public class RealExamService {
     }
 
     // -------------------------------- tom add  --------------------------------
+    private static final Logger l = LoggerFactory.getLogger(CommSendService.class);
+
+    @Autowired
+    private CommReceiveService commReceiveService;
     @Autowired
     private StudentService studentService;
     @Autowired
@@ -128,16 +131,16 @@ public class RealExamService {
     /**
      * 交卷自动修改关联状态
      *
-     * @param id
+     * @param examId
      * @param state
      * @return
      */
     @Transactional
-    public int updateOneState(long id, final String state) {
-        RealExam q = selectRealExamByExamId(id);
+    public int updateOneState(long examId, final String state) {
+        RealExam q = selectRealExamByExamId(examId);
         if (RealExam.State.SUBMITTED.equals(state)) {
             // 关联故障list同步锁死。
-            realExamFaultService.listAllType2YesLoopReadState(q.getExamId())
+            realExamFaultService.listAllType2LoopReadStateByExamId(q.getExamId())
                     .forEach(ref -> {
                         ref.setRefState(RealExamFault.State.FINISH);
                         realExamFaultService.updateRealExamFault(ref);
@@ -174,13 +177,16 @@ public class RealExamService {
      *
      * @return
      */
-    public AjaxResult studentEnterRealExam(Long realExamId) {
-        RealExam re = selectRealExamByExamId(realExamId);
+    public AjaxResult studentEnterRealExam(Long examId) {
+        RealExam re = selectRealExamByExamId(examId);
         if (re == null) {
             AjaxResult.error("realExamId error!");
         }
         // todo:应该在登录位置实现
-        updateOneState(realExamId, RealExam.State.LOGGED_IN);
+        // todo: temp
+        updateOneState(examId, RealExam.State.LOGGED_IN);
+        // todo: temp
+        realExamFaultService.resetAllType2(examId);
         return AjaxResult.success(re);
     }
 
@@ -191,6 +197,7 @@ public class RealExamService {
      * @return
      */
     public AjaxResult studentLoopPrepareRealExam(Long realExamId) {
+        l.info("studentLoopPrepareRealExam");
         // check
         if (realExamId == null || realExamId == 0) {
             // todo:
@@ -227,6 +234,7 @@ public class RealExamService {
             // 异步执行
             commSendService.clearListFaultByRealExamAsync(re);
         }
+        l.info("vo = {}", vo);
         return AjaxResult.success(vo);
     }
 
@@ -283,6 +291,7 @@ public class RealExamService {
         long remaining = (re.getStartTime().getTime() + rec.getLimitDuration() * 60 * 1000) - DateUtils.getNowDate().getTime();
         vo.setRemainingMilliseconds(remaining);
         vo.setCompulsiveSubmit(remaining >= RealExam.EXAM_TIMEOUT_LIMIT);
+        l.info("studentLoopAnsweringRealExam vo = {}", vo);
         return AjaxResult.success(vo);
     }