ソースを参照

登录 覆盖 login_time 字段。

tom 2 週間 前
コミット
fa8715594a

+ 63 - 32
pla-sim/01_SQL/02_table/mx_sim.sql

@@ -11,7 +11,7 @@
  Target Server Version : 80032 (8.0.32-X-Cluster-8.4.19-20241112)
  File Encoding         : 65001
 
- Date: 21/03/2025 15:46:59
+ Date: 15/08/2025 22:37:10
 */
 
 SET NAMES utf8mb4;
@@ -30,46 +30,77 @@ CREATE TABLE `mx_sim`  (
   `sim_num` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模拟器设备通信编号-站ID',
   `last_sent_time` datetime NULL DEFAULT NULL COMMENT '最后一次成功发送报文时间',
   `last_received_time` datetime NULL DEFAULT NULL COMMENT '最后一次成功收到报文时间',
+  `charging_count` int NULL DEFAULT 0 COMMENT '充电计数',
   `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
   `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
   `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
   `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
   PRIMARY KEY (`sim_id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 171 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'sim-模拟器表' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 181 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'sim-模拟器表' ROW_FORMAT = DYNAMIC;
 
 -- ----------------------------
 -- Records of mx_sim
 -- ----------------------------
-INSERT INTO `mx_sim` VALUES (1, 1, '0001', '0', '030000A2', '01', '2025-03-19 16:41:33', '2025-03-19 16:41:33', NULL, NULL, NULL, '2025-03-19 16:41:33', '');
-INSERT INTO `mx_sim` VALUES (2, 2, '0001', '0', '030000A2', '02', '2025-03-19 17:07:28', '2025-03-19 17:07:28', NULL, NULL, NULL, '2025-03-19 17:07:28', '');
-INSERT INTO `mx_sim` VALUES (3, 3, '0001', '0', '030000A2', '03', '2025-03-19 18:38:29', '2025-03-19 18:38:29', NULL, NULL, NULL, '2025-03-19 18:38:29', '');
-INSERT INTO `mx_sim` VALUES (4, 4, '0001', '0', '030000A2', '04', '2025-03-19 18:16:30', '2025-03-19 18:16:30', NULL, NULL, NULL, '2025-03-19 20:18:40', '');
-INSERT INTO `mx_sim` VALUES (5, 5, '0001', '0', '030000A2', '05', '2025-03-19 16:44:31', '2025-03-19 16:44:31', NULL, NULL, NULL, '2025-03-19 16:44:31', '');
-INSERT INTO `mx_sim` VALUES (6, 6, '0001', '0', '030000A2', '06', '2025-03-19 18:45:50', '2025-03-19 18:45:50', NULL, NULL, NULL, '2025-03-19 18:45:50', '');
-INSERT INTO `mx_sim` VALUES (7, 7, '0001', '0', '030000A2', '07', '2025-03-19 17:51:05', '2025-03-19 17:51:05', NULL, NULL, NULL, '2025-03-21 15:18:36', '');
-INSERT INTO `mx_sim` VALUES (8, 8, '0001', '0', '030000A2', '08', '2025-03-19 18:00:15', '2025-03-19 18:00:15', NULL, NULL, NULL, '2025-03-19 19:40:11', '');
-INSERT INTO `mx_sim` VALUES (9, 9, '0001', '0', '030000A2', '09', '2025-03-19 15:39:10', '2025-03-19 15:39:10', NULL, NULL, NULL, '2025-03-19 17:25:24', '');
-INSERT INTO `mx_sim` VALUES (10, 10, '0001', '0', '030000A2', '0A', '2025-03-12 21:01:30', NULL, NULL, NULL, NULL, '2025-03-15 12:40:55', '');
-INSERT INTO `mx_sim` VALUES (81, 1, '0002', '0', '030000A2', '51', '2025-03-18 18:47:35', '2025-03-18 18:47:35', NULL, NULL, NULL, '2025-03-18 18:47:35', '');
-INSERT INTO `mx_sim` VALUES (82, 2, '0002', '0', '030000A2', '52', '2025-03-18 18:28:33', '2025-03-18 18:28:33', NULL, NULL, NULL, '2025-03-18 18:28:33', '');
-INSERT INTO `mx_sim` VALUES (83, 3, '0002', '0', '030000A2', '53', '2025-03-18 17:17:02', '2025-03-18 17:17:02', NULL, NULL, NULL, '2025-03-18 17:17:02', '');
-INSERT INTO `mx_sim` VALUES (84, 4, '0002', '0', '030000A2', '54', '2025-03-18 19:34:09', '2025-03-18 19:34:09', NULL, NULL, NULL, '2025-03-18 19:34:09', '');
-INSERT INTO `mx_sim` VALUES (85, 5, '0002', '0', '030000A2', '55', '2025-03-18 18:08:27', '2025-03-18 18:08:27', NULL, NULL, NULL, '2025-03-18 18:08:27', '');
-INSERT INTO `mx_sim` VALUES (86, 6, '0002', '0', '030000A2', '56', '2025-03-18 20:06:45', '2025-03-18 20:06:45', NULL, NULL, NULL, '2025-03-18 20:06:45', '');
-INSERT INTO `mx_sim` VALUES (87, 7, '0002', '0', '030000A2', '57', '2025-03-18 19:54:36', '2025-03-18 19:54:36', NULL, NULL, NULL, '2025-03-18 19:54:36', '');
-INSERT INTO `mx_sim` VALUES (88, 8, '0002', '0', '030000A2', '58', '2025-03-18 19:05:04', '2025-03-18 19:05:04', NULL, NULL, NULL, '2025-03-18 19:05:04', '');
-INSERT INTO `mx_sim` VALUES (89, 9, '0002', '0', '030000A2', '59', '2025-03-18 16:59:12', '2025-03-18 16:59:12', NULL, NULL, NULL, '2025-03-18 16:59:12', '');
-INSERT INTO `mx_sim` VALUES (90, 10, '0002', '0', '030000A2', '5A', '2025-03-18 17:49:22', '2025-03-18 17:49:22', NULL, NULL, NULL, '2025-03-18 17:49:22', '');
-INSERT INTO `mx_sim` VALUES (161, 1, '0003', '0', '030000A2', 'A1', '2025-03-17 14:21:19', '2025-03-17 14:21:19', NULL, NULL, NULL, '2025-03-17 14:21:19', '');
-INSERT INTO `mx_sim` VALUES (162, 2, '0003', '0', '030000A2', 'A2', '2025-03-17 13:37:25', '2025-03-17 13:37:25', NULL, NULL, NULL, '2025-03-17 13:37:25', '');
-INSERT INTO `mx_sim` VALUES (163, 3, '0003', '0', '030000A2', 'A3', '2025-03-17 13:46:22', '2025-03-17 13:46:22', NULL, NULL, NULL, '2025-03-17 13:46:22', '');
-INSERT INTO `mx_sim` VALUES (164, 4, '0003', '0', '030000A2', 'A4', '2025-03-17 15:12:12', '2025-03-17 13:49:12', NULL, NULL, NULL, '2025-03-17 15:12:12', '');
-INSERT INTO `mx_sim` VALUES (165, 5, '0003', '0', '030000A2', 'A5', '2025-03-17 14:04:58', '2025-03-17 14:04:58', NULL, NULL, NULL, '2025-03-17 14:38:15', '');
-INSERT INTO `mx_sim` VALUES (166, 6, '0003', '0', '030000A2', 'A6', '2025-03-17 13:52:11', '2025-03-17 13:52:11', NULL, NULL, NULL, '2025-03-17 14:21:15', '');
-INSERT INTO `mx_sim` VALUES (167, 7, '0003', '0', '030000A2', 'A7', '2025-03-17 15:08:33', '2025-03-17 15:08:33', NULL, NULL, NULL, '2025-03-17 15:08:33', '');
-INSERT INTO `mx_sim` VALUES (168, 8, '0003', '0', '030000A2', 'A8', '2025-03-17 15:48:59', '2025-03-17 15:32:36', NULL, NULL, NULL, '2025-03-17 15:48:59', '');
-INSERT INTO `mx_sim` VALUES (169, 9, '0003', '0', '030000A2', 'A9', '2025-03-12 21:01:24', NULL, NULL, NULL, NULL, '2025-03-15 12:41:52', '');
-INSERT INTO `mx_sim` VALUES (170, 10, '0003', '0', '030000A2', 'AA', '2025-03-17 14:42:29', '2025-03-17 14:42:29', NULL, NULL, NULL, '2025-03-17 15:13:10', '');
+INSERT INTO `mx_sim` VALUES (1, 0, '0001', '2', '', '01', '2025-07-09 10:58:01', '2025-07-09 10:58:01', 0, NULL, NULL, NULL, '2025-07-10 16:57:58', '');
+INSERT INTO `mx_sim` VALUES (2, 0, '0001', '2', '', '02', '2025-07-11 15:14:35', '2025-07-11 15:14:36', 0, NULL, NULL, NULL, '2025-07-11 15:14:36', '');
+INSERT INTO `mx_sim` VALUES (3, 0, '0001', '2', '', '03', '2025-07-09 11:45:04', '2025-07-09 11:45:04', 0, NULL, NULL, NULL, '2025-07-09 11:45:04', '');
+INSERT INTO `mx_sim` VALUES (4, 0, '0001', '2', '', '04', '2025-04-01 21:11:13', '2025-04-01 21:11:13', 0, NULL, NULL, NULL, '2025-04-01 21:11:13', '');
+INSERT INTO `mx_sim` VALUES (5, 0, '0001', '2', '', '05', '2025-07-09 11:53:52', '2025-07-09 11:53:52', 0, NULL, NULL, NULL, '2025-07-09 11:53:52', '');
+INSERT INTO `mx_sim` VALUES (6, 0, '0001', '2', '', '06', '2025-07-10 16:19:15', '2025-07-10 16:19:15', 0, NULL, NULL, NULL, '2025-07-10 16:19:15', '');
+INSERT INTO `mx_sim` VALUES (7, 0, '0001', '2', '', '07', '2025-07-09 10:33:06', '2025-07-09 10:33:06', 0, NULL, NULL, NULL, '2025-07-09 10:33:06', '');
+INSERT INTO `mx_sim` VALUES (8, 0, '0001', '2', '', '08', '2025-07-09 11:46:36', '2025-07-09 11:46:36', 0, NULL, NULL, NULL, '2025-07-09 11:46:36', '');
+INSERT INTO `mx_sim` VALUES (9, 0, '0001', '2', '', '09', '2025-07-09 11:46:05', '2025-07-09 11:46:05', 0, NULL, NULL, NULL, '2025-07-09 11:46:05', '');
+INSERT INTO `mx_sim` VALUES (10, 0, '0001', '2', '', '0A', '2025-07-09 11:42:13', '2025-07-09 11:42:14', 0, NULL, NULL, NULL, '2025-07-09 11:42:14', '');
+INSERT INTO `mx_sim` VALUES (11, 0, '0001', '2', '', '0B', '2025-07-11 23:20:58', '2025-07-11 23:20:58', 0, NULL, NULL, NULL, '2025-07-11 23:20:58', '');
+INSERT INTO `mx_sim` VALUES (12, 0, '0001', '2', '', '0C', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (13, 0, '0001', '2', '', '0D', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (14, 0, '0001', '2', '', '0E', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (15, 0, '0001', '2', '', '0F', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (16, 0, '0001', '2', '', '10', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (17, 0, '0001', '2', '', '11', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (18, 0, '0001', '2', '', '12', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (19, 0, '0001', '2', '', '13', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (20, 0, '0001', '2', '', '14', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (81, 0, '0002', '2', '', '51', '2025-06-27 10:42:04', '2025-06-27 10:42:04', 0, NULL, NULL, NULL, '2025-06-27 10:42:04', '');
+INSERT INTO `mx_sim` VALUES (82, 0, '0002', '2', '', '52', '2025-06-27 10:41:51', '2025-06-27 10:41:51', 0, NULL, NULL, NULL, '2025-06-27 10:41:51', '');
+INSERT INTO `mx_sim` VALUES (83, 0, '0002', '2', '', '53', '2025-06-20 08:57:42', '2025-06-20 08:57:42', 0, NULL, NULL, NULL, '2025-06-20 08:57:42', '');
+INSERT INTO `mx_sim` VALUES (84, 0, '0002', '2', '', '54', '2025-06-27 10:42:18', '2025-06-27 10:42:18', 0, NULL, NULL, NULL, '2025-06-27 10:42:18', '');
+INSERT INTO `mx_sim` VALUES (85, 0, '0002', '2', '', '55', '2025-06-27 10:42:09', '2025-06-27 10:42:09', 0, NULL, NULL, NULL, '2025-06-27 10:42:09', '');
+INSERT INTO `mx_sim` VALUES (86, 0, '0002', '2', '', '56', '2025-06-27 10:41:47', '2025-06-27 10:41:47', 0, NULL, NULL, NULL, '2025-06-27 10:41:47', '');
+INSERT INTO `mx_sim` VALUES (87, 0, '0002', '2', '', '57', '2025-03-30 17:15:55', '2025-03-30 17:15:55', 0, NULL, NULL, NULL, '2025-03-30 17:15:55', '');
+INSERT INTO `mx_sim` VALUES (88, 0, '0002', '1', '', '58', '2025-06-27 10:42:23', '2025-06-27 10:42:23', 300, NULL, NULL, NULL, '2025-08-15 22:37:01', '');
+INSERT INTO `mx_sim` VALUES (89, 0, '0002', '2', '', '59', '2025-06-20 09:05:44', '2025-06-20 09:05:45', 0, NULL, NULL, NULL, '2025-06-27 10:03:53', '');
+INSERT INTO `mx_sim` VALUES (90, 0, '0002', '2', '', '5A', '2025-06-27 10:42:58', '2025-06-27 10:42:58', 0, NULL, NULL, NULL, '2025-06-27 10:42:58', '');
+INSERT INTO `mx_sim` VALUES (91, 0, '0002', '2', '', '5B', '2025-06-20 09:20:00', '2025-06-20 09:08:18', 0, NULL, NULL, NULL, '2025-06-20 09:20:00', '');
+INSERT INTO `mx_sim` VALUES (92, 0, '0002', '2', '', '5C', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (93, 0, '0002', '2', '', '5D', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (94, 0, '0002', '2', '', '5E', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (95, 0, '0002', '2', '', '5F', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (96, 0, '0002', '2', '', '60', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (97, 0, '0002', '2', '', '61', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (98, 0, '0002', '2', '', '62', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (99, 0, '0002', '2', '', '63', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (100, 0, '0002', '2', '', '64', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (161, 0, '0003', '2', '', 'A1', '2025-07-10 17:06:24', '2025-07-10 17:06:24', 0, NULL, NULL, NULL, '2025-07-10 17:06:24', '');
+INSERT INTO `mx_sim` VALUES (162, 0, '0003', '2', '', 'A2', '2025-07-09 17:51:26', '2025-07-09 17:51:26', 0, NULL, NULL, NULL, '2025-07-09 17:51:26', '');
+INSERT INTO `mx_sim` VALUES (163, 0, '0003', '2', '', 'A3', '2025-07-10 17:16:47', '2025-07-10 17:16:47', 0, NULL, NULL, NULL, '2025-07-10 17:16:47', '');
+INSERT INTO `mx_sim` VALUES (164, 0, '0003', '2', '', 'A4', '2025-07-09 17:56:01', '2025-07-09 17:56:01', 0, NULL, NULL, NULL, '2025-07-09 17:56:01', '');
+INSERT INTO `mx_sim` VALUES (165, 0, '0003', '1', '', 'A5', '2025-07-10 17:34:32', '2025-07-10 17:34:32', 0, NULL, NULL, NULL, '2025-08-15 22:17:20', '');
+INSERT INTO `mx_sim` VALUES (166, 0, '0003', '2', '', 'A6', '2025-07-10 17:25:16', '2025-07-10 17:25:16', 0, NULL, NULL, NULL, '2025-07-10 17:25:56', '');
+INSERT INTO `mx_sim` VALUES (167, 0, '0003', '2', '', 'A7', '2025-07-09 18:35:44', '2025-07-09 18:35:44', 0, NULL, NULL, NULL, '2025-07-10 12:47:31', '');
+INSERT INTO `mx_sim` VALUES (168, 0, '0003', '2', '', 'A8', '2025-07-10 17:20:42', '2025-07-10 17:20:42', 0, NULL, NULL, NULL, '2025-07-10 17:20:42', '');
+INSERT INTO `mx_sim` VALUES (169, 0, '0003', '2', '', 'A9', '2025-07-10 17:19:05', '2025-07-10 17:19:05', 0, NULL, NULL, NULL, '2025-07-10 17:19:05', '');
+INSERT INTO `mx_sim` VALUES (170, 0, '0003', '2', '', 'AA', '2025-07-10 17:13:57', '2025-07-10 17:13:57', 0, NULL, NULL, NULL, '2025-07-10 17:13:57', '');
+INSERT INTO `mx_sim` VALUES (171, 0, '0003', '2', '', 'AB', '2025-04-26 16:09:51', '2025-04-26 16:09:51', 0, NULL, NULL, NULL, '2025-04-26 16:35:32', '');
+INSERT INTO `mx_sim` VALUES (172, 0, '0003', '2', '', 'AC', '2025-04-26 16:09:47', '2025-04-26 16:09:47', 0, NULL, NULL, NULL, '2025-04-26 16:09:47', '');
+INSERT INTO `mx_sim` VALUES (173, 0, '0003', '2', '', 'AD', '2025-06-19 16:44:33', '2025-06-19 16:09:25', 0, NULL, NULL, NULL, '2025-06-19 16:44:33', '');
+INSERT INTO `mx_sim` VALUES (174, 0, '0003', '2', '', 'AE', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (175, 0, '0003', '2', '', 'AF', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (176, 0, '0003', '2', '', 'B0', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (177, 0, '0003', '2', '', 'B1', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (178, 0, '0003', '2', '', 'B2', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (179, 0, '0003', '2', '', 'B3', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
+INSERT INTO `mx_sim` VALUES (180, 0, '0003', '2', '', 'B4', NULL, NULL, 0, NULL, NULL, NULL, NULL, '');
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 1 - 1
ruoyi-sim/src/main/java/com/ruoyi/sim/constant/FaultIdConst.java

@@ -1,7 +1,7 @@
 package com.ruoyi.sim.constant;
 
 /**
- *
+ * 故障id常量
  */
 public interface FaultIdConst {
 

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

@@ -137,7 +137,7 @@ public class CommCheckService {
         SimMsg smS = commBuildService.buildSendMsgWhichSim();
         SimMsg smR = commSendService.send(smS, seat, null, retryTotalCount, commStrategy.getSleepShort());
         Integer result = smR.getResult();
-        if (Objects.equals(result, SimMsg.Result.SUCCESS)) { // 在线
+        if (Objects.equals(result, SimMsg.Result.SUCCESS)) { // 正常情况:模拟器在线
             final String simNum = CommParseUtils.subSimNum(smR.getReceiveMsg());
             Sim sim = simService.uniqueBySimNum(simNum);
             if (sim == null) {
@@ -145,18 +145,37 @@ public class CommCheckService {
             } else {
                 l.info("座号[{}]上发现模拟器[{}]", seat.getSeatNum(), sim.getSimNum());
             }
-            // 更新座上SimId
-            seatService.updateCurrentSimIdBySeatNum(seat.getSeatNum(), sim.getSimId());
             // 更新Sim状态
             simService.updateSimStateBySimId(sim.getSimId(), Sim.State.ONLINE);
+            // 更新座上SimId
+            seatService.updateCurrentSimIdBySeatNum(seat.getSeatNum(), sim.getSimId());
             // 查询出最新的Sim对象
             sim = simService.uniqueBySimNum(simNum);
             //
             String msgTemp = "座号[{0}]-模拟器[{1}]型[{2}]在线";
             String msg = MessageFormat.format(msgTemp, seat.getSeatNum(), Sim.TYPE_NAME_MAP.get(sim.getSimType()), sim.getSimNum());
+            // 针对TYPE_0002型号,电量的特殊处理。
+            if (StringUtils.equals(sim.getSimType(), Sim.TYPE_0002)) {
+                StringBuffer sb = new StringBuffer(msg);
+                sb.append(";")
+                        .append("电量")
+                        .append(simService.getChargingCountPercentage(sim.getSimId()))
+                        .append("%;");
+                if (simService.isChargingCountFullBySimId(sim.getSimId())) {
+                    sb.append("充电完成!");
+                } else {
+                    sb.append("充电中!");
+                }
+                msg = sb.toString();
+            }
             // 成功的话,Obj为Sim对象。
             return AjaxResult.success(msg, sim);
-        } else if (Objects.equals(result, SimMsg.Result.READ_TIMEOUT_EXCEPTION)) { // 离线
+        } else if (Objects.equals(result, SimMsg.Result.READ_TIMEOUT_EXCEPTION)) { // 正常情况:模拟器离线
+            // 更新Sim状态
+            if (!seat.getCurrentSimId().equals(Sim.ID_0)) {
+                Sim simPre = simService.selectSimBySimId(seat.getCurrentSimId());
+                simService.updateSimStateBySimId(simPre.getSimId(), Sim.State.OFFLINE);
+            }
             // 更新座上SimId
             seatService.updateCurrentSimIdBySeatNum(seat.getSeatNum(), Sim.ID_0);
             String msgTemp = "座号[{0}]-没有连接任何接模拟器,检查线缆开关和线缆连接!";
@@ -164,6 +183,7 @@ public class CommCheckService {
             // 构造一个假的Sim对象,用来返回结果。不知道之前模拟器的状态。
             Sim simFake = new Sim();
             simFake.setSimState(Sim.State.OFFLINE);
+            // 成功的话,Obj为虚拟构建Sim对象。
             return AjaxResult.success(msg, simFake);
         } else if (Objects.equals(result, SimMsg.Result.RECEIVE_CHECK_FAIL)) {
             return smR.getDefaultErrorAR();

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

@@ -3,8 +3,6 @@ package com.ruoyi.sim.service.impl;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.sim.constant.CommConst;
 import com.ruoyi.sim.constant.FaultConst;
-import com.ruoyi.sim.constant.FaultContentConst;
-import com.ruoyi.sim.constant.FaultIdConst;
 import com.ruoyi.sim.domain.*;
 import com.ruoyi.sim.domain.vo.FaultCheckVo;
 import com.ruoyi.sim.util.CRC16Modbus;
@@ -189,7 +187,7 @@ public class CommReceiveService {
         // 是否是
         // 2型的 检测干燥管 或
         // 3型的 检测干燥管
-        if (FaultConst.FAULT_SET_WHG.contains(f.getFaultId())) {
+        if (FaultConst.FAULT_SET_GAN_ZAO_GUAN.contains(f.getFaultId())) {
             // 判断必须存在
             String WHG_EXIST_MSG = checkValue.substring(4, 6);
             if (!WHG_MSG_EXIST_YES.equals(WHG_EXIST_MSG)) {

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

@@ -1251,16 +1251,21 @@ public class CommSendService {
             if (re == null || re.getExamId() == null || re.getExamId() == 0L) {
                 return;
             }
-            if (StringUtils.equalsAny(re.getExamStatus(), RealExam.State.LOGGED_IN)) {
+            if (StringUtils.equals(re.getExamStatus(), RealExam.State.LOGGED_IN)) {
                 Seat qSeat = seatService.selectSeatBySeatId(re.getSeatId());
                 // 检查后就知道seat上是否有sim
-                commCheckService.checkOneSeatState(qSeat, true);
-                Long currSimId = seatService.selectSeatBySeatId(re.getSeatId()).getCurrentSimId();
-                if (!currSimId.equals(Sim.ID_0)) {
-                    Integer count = simService.updateChargingCountPlusBySimId(currSimId);
-                    l.info("scheduledChargingCount count = {}", count);
+                AjaxResult ar = commCheckService.checkOneSeatState(qSeat, true);
+                if (ar.isSuccess()) {
+                    // 获取当前simId
+                    Long currSimId = seatService.selectSeatBySeatId(re.getSeatId()).getCurrentSimId();
+                    if (!currSimId.equals(Sim.ID_0)) {
+                        Integer count = simService.updateChargingCountPlusBySimId(currSimId);
+                        l.info("scheduledChargingCount count = {}", count);
+                    } else {
+                        l.info("scheduledChargingCount Sim.ID_0 seatId = {}", qSeat.getSeatId());
+                    }
                 } else {
-                    l.info("scheduledChargingCount Sim.ID_0 seatId = {}", qSeat.getSeatId());
+                    l.info("checkOneSeatState failed");
                 }
             } else {
                 l.info("skip");

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

@@ -551,6 +551,12 @@ public class RealExamCollectionService extends Ele6RYBaseService {
         return AjaxResult.success(count.intValue());
     }
 
+    /**
+     * 物理删除 一个考试集合相关的所有数据。
+     *
+     * @param id
+     * @return
+     */
     public AjaxResult deleteRef(Long id) {
         // delete ref exam data.
         realExamService.deleteRefByExamCollectionId(id);

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

@@ -250,6 +250,12 @@ public class RealExamFaultService {
         return true;
     }
 
+    /**
+     * QuestionValue and AnswerValue not isBlank
+     *
+     * @param examId
+     * @return
+     */
     public boolean isType2ExamPrepareSubmitOk(long examId) {
         RealExamFault q = new RealExamFault();
         q.setExamId(examId);

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

@@ -279,7 +279,7 @@ public class RealExamService {
     }
 
     /**
-     * [学生]开始考试、训练、练习
+     * [学生]开始 考试、训练、练习
      *
      * @param examId             考试Id
      * @param studentBindIp      考试学员IP
@@ -559,7 +559,7 @@ public class RealExamService {
     public static final Long DURATION_10_MIN = 1000L * 60 * 10;
 
     /**
-     * [学生]交卷考试
+     * [学生]交卷 考试、训练、练习
      *
      * @param examId
      * @return RealExam
@@ -686,6 +686,8 @@ public class RealExamService {
             // 修改真实考试结束时间。
             re.setEndTime(DateUtils.getNowDate());
             updateRealExam(re);
+            // 修改sim State为 OFFLINE,顺带 ChargingCountReset
+            simService.updateSimStateBySimId(re.getSimId(), Sim.State.OFFLINE);
             return AjaxResult.success("交卷成功!");
         } else {
             return AjaxResult.error("交卷失败!考试数据不完整。");
@@ -758,21 +760,30 @@ public class RealExamService {
         }
         for (RealExam re : list) {
             RealExamCollection rec = realExamCollectionService.selectRealExamCollectionByExamCollectionId(re.getExamCollectionId());
-            // 如果考试集合状态是OPENED。
-            if (StringUtils.equals(rec.getExamCollectionState(), RealExamCollection.State.OPENED)) {
-                if (StringUtils.equalsAny(re.getExamStatus(), RealExam.State.NOT_LOGGED_IN, RealExam.State.LOGGED_IN)) {
+            // 如果考试集合状态是OPENED。理论上只有一个。
+            // 考虑到一个学员在教室不会有很多场考试。
+            if (StringUtils.equals(rec.getExamCollectionState(), RealExamCollection.State.OPENED)) { // 考试集合状态是OPENED
+                if (StringUtils.equalsAny(re.getExamStatus(),
+                        RealExam.State.NOT_LOGGED_IN,
+                        RealExam.State.LOGGED_IN)) { // 初始化状态 或 已登录状态
                     Seat seat = seatService.uniqueByBindIp(ip);
                     if (seat == null || seat.getSeatId() == 0L) {
                         return AjaxResult.error("没有座次信息");
                     }
+                    // 覆盖 seat_id 字段
                     re.setSeatId(seat.getSeatId());
+                    // 覆盖 exam_status 字段
                     re.setExamStatus(RealExam.State.LOGGED_IN);
-                    //
+                    // 覆盖 login_time 字段
+                    re.setLoginTime(new Date());
+                    // 更新 mx_real_exam 表
                     updateRealExam(re);
-                    //
+                    // 更新 mx_seat 表 user_id 字段
                     seatService.updateCurrentUserIdBySeatId(seat.getSeatId(), userId);
                     return AjaxResult.success("成功");
                 }
+            } else {
+                l.info("RealExam not OPENED = {}", re.getExamId());
             }
         }
         return AjaxResult.success("没有学生考试数据");

+ 17 - 6
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/SimService.java

@@ -198,6 +198,12 @@ public class SimService {
         return list;
     }
 
+    /**
+     * 修改所有启用的模拟器 在线/离线 状态。
+     *
+     * @param simState
+     * @return 修改模拟器状态的数量。
+     */
     public int updateAllEnableState(final String simState) {
         List<Sim> list = listAllEnable();
         for (Sim sim : list) {
@@ -230,10 +236,19 @@ public class SimService {
         if (Objects.isNull(q)) {
             return 0;
         }
+        // 离线强制重置 chargingCount = 0,归零。
+        if (StringUtils.equals(simState, Sim.State.OFFLINE)) {
+            updateChargingCountResetBySimId(simId);
+        }
         q.setSimState(simState);
         return updateSim(q);
     }
 
+    @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.SERIALIZABLE)
+    public int updateSimStateBySimNum(final String simNum, final String simState) {
+        return updateSimStateBySimId(uniqueBySimNum(simNum).getSimId(), simState);
+    }
+
     /**
      * 充满量
      * 单位:s
@@ -304,17 +319,13 @@ public class SimService {
         return (q.getChargingCount() >= CHARGING_TOTAL);
     }
 
-    public Double getChargingCountPercentage(final Long simId) {
+    public Long getChargingCountPercentage(final Long simId) {
         Sim q = selectSimBySimId(simId);
         if (Objects.isNull(q)) {
             throw new IllegalArgumentException("simId");
         }
         double p = q.getChargingCount() / ((double) CHARGING_TOTAL);
-        return Double.parseDouble(String.format("%.2f", p));
-    }
-
-    public int updateSimStateBySimNum(final String simNum, final String simState) {
-        return updateSimStateBySimId(uniqueBySimNum(simNum).getSimId(), simState);
+        return Math.round(p * 100);
     }
 
     public boolean isSimStateBySimId(Long simId, String simState) {