浏览代码

模拟一个exam流程。

tom 5 月之前
父节点
当前提交
84274e6662

+ 70 - 69
pla-sim/01_SQL/02_table/sim_fault.sql

@@ -1,17 +1,17 @@
 /*
  Navicat Premium Dump SQL
 
- Source Server         : qdhome.iot321.top-dev
+ Source Server         : 47.104.188.84-sim
  Source Server Type    : MySQL
- Source Server Version : 50740 (5.7.40-log)
- Source Host           : qdhome.iot321.top:33103
+ Source Server Version : 80020 (8.0.20)
+ Source Host           : 47.104.188.84:65006
  Source Schema         : pla-chem-sim-dev-1
 
  Target Server Type    : MySQL
- Target Server Version : 50740 (5.7.40-log)
+ Target Server Version : 80020 (8.0.20)
  File Encoding         : 65001
 
- Date: 18/12/2024 21:39:39
+ Date: 19/12/2024 22:08:21
 */
 
 SET NAMES utf8mb4;
@@ -24,14 +24,15 @@ DROP TABLE IF EXISTS `sim_fault`;
 CREATE TABLE `sim_fault`  (
   `fault_id` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '故障ID',
   `parent_fault_id` char(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '父故障ID',
-  `sim_type` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模拟器类型\r\n',
+  `sim_type` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模拟器类型',
   `fault_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '故障类型:\r\n1:故障现象\r\n2:故障现象的可能原因\r\n3:故障部位\r\n4:故障部位的排除方法\r\n5:修复结论',
+  `fault_state` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '故障状态\r\n0:启用 \r\n5:禁用',
   `conflict_fault_ids` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '互斥所有故障ID逗号分割',
   `replace_part` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '是否是更换件 1:是 0:不是',
   `replace_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更换件名称',
   `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '名称',
   `bind_hardware_msg` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '绑定硬件通信报文',
-  `order_num` int(4) NULL DEFAULT 0 COMMENT '显示顺序',
+  `order_num` 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 '更新者',
@@ -43,67 +44,67 @@ CREATE TABLE `sim_fault`  (
 -- ----------------------------
 -- Records of sim_fault
 -- ----------------------------
-INSERT INTO `sim_fault` VALUES ('000100010000', '000000000000', '0001', '1', '', '0', '', '开机无响应', '', 1, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100010001', '000100010000', '0001', '3', '', '1', '电源开关', '1.电源开关', '01', 1, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100010002', '000100010000', '0001', '3', '', '1', 'DC/DC转换芯片', '2.DC/DC转换芯片', '02', 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100020000', '000000000000', '0001', '1', '', '0', '', '开机后按抽气开关,微电机不工作', '', 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100020003', '000100020000', '0001', '3', '', '1', '微电机', '3.微电机', '03', 3, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100020004', '000100020000', '0001', '3', '', '1', 'Q2', '4.Q2', '04', 4, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100030000', '000000000000', '0001', '1', '', '0', '', '抽气流量不足', '', 3, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100030005', '000100030000', '0001', '3', '', '1', '滤网', '5.滤网', '05', 5, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100030006', '000100030000', '0001', '3', '', '1', '调速电位器', '6.调速电位器', '06', 6, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100040000', '000000000000', '0001', '1', '', '0', '', '开机后按下加热开关,加热灯不亮,也未加热', '', 4, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100040007', '000100040000', '0001', '3', '', '1', '加热指示灯', '7.加热指示灯', '07', 7, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100040008', '000100040000', '0001', '3', '', '1', '热敏开关', '8.热敏开关', '08', 8, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100050000', '000000000000', '0001', '1', '', '0', '', '不能正常工作', '', 5, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100050009', '000100050000', '0001', '3', '', '1', '外壳及零件', '9.外壳及零件', '09', 9, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100060000', '000000000000', '0001', '1', '', '0', '', '电压低', '', 6, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000100060010', '000100060000', '0001', '3', '', '1', '供电模块', '10.供电模块', '0A', 10, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200010000', '000000000000', '0002', '1', '', '0', '', '仪器无法开机', '', 1, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200010001', '000200010000', '0002', '3', '', '1', '', '1.薄膜开关FPC排线', '', 1, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200010002', '000200010000', '0002', '3', '', '1', '', '2.主控板开机电路', '', 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200020000', '000000000000', '0002', '1', '', '0', '', '蜂鸣器自检时,声音异常', '', 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200020003', '000200020000', '0002', '3', '', '0', '', '3.蜂鸣器出声口', '', 3, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200020004', '000200020000', '0002', '3', '', '0', '', '4.接口接线板', '', 4, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200030000', '000000000000', '0002', '1', '', '0', '', '仪器进入检测界面后,通入检测剂不报警', '', 3, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200030005', '000200030000', '0002', '3', '', '0', '', '5.检测剂', '', 5, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200030006', '000200030000', '0002', '3', '', '0', '', '6.主控板信号采集电路', '', 6, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200040000', '000000000000', '0002', '1', '', '0', '', '显示屏无显示', '', 4, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200040007', '000200040000', '0002', '3', '', '0', '', '7.主控板显示屏供电电路', '', 7, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200040008', '000200040000', '0002', '3', '', '0', '', '8.显示屏', '', 8, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200050000', '000000000000', '0002', '1', '', '0', '', '长时间不进入“检测中”', '', 5, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200050009', '000200050000', '0002', '3', '', '0', '', '9.干燥管', '', 9, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200050010', '000200050000', '0002', '3', '', '0', '', '10.维护管', '', 10, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200060000', '000000000000', '0002', '1', '', '0', '', '不能正常工作', '', 6, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200060011', '000200060000', '0002', '3', '', '0', '', '11.外壳及零件', '', 11, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200070000', '000000000000', '0002', '1', '', '0', '', '电压低', '', 7, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200070012', '000200070000', '0002', '3', '', '0', '', '12.供电模块', '', 12, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200080000', '000000000000', '0002', '1', '', '0', '', '无法开机', '', 8, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000200080001', '000200080000', '0002', '3', '', '0', '', '13.DC/DC', '', 13, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300010000', '000000000000', '0003', '1', '', '0', '', '仪器无法开机', '', 1, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300010001', '000300010000', '0003', '3', '', '0', '', '1.FFC排线', '', 1, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300010002', '000300010000', '0003', '3', '', '0', '', '2.汇总主控板', '', 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300020000', '000000000000', '0003', '1', '', '0', '', '开机后,显示屏无显示', '', 2, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300020003', '000300020000', '0003', '3', '', '0', '', '3.显控报警板', '', 3, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300020004', '000300020000', '0003', '3', '', '0', '', '4.显示屏', '', 4, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300030000', '000000000000', '0003', '1', '', '0', '', '检测状态下模拟剂不报警', '', 3, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300030005', '000300030000', '0003', '3', '', '0', '', '5.汇总主控板信号采集电路', '', 5, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300030006', '000300030000', '0003', '3', '', '0', '', '6.检测剂', '', 6, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300040000', '000000000000', '0003', '1', '', '0', '', '长时间不能进入检测状态', '', 4, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300040007', '000300040000', '0003', '3', '', '0', '', '7.干燥管', '', 7, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300040008', '000300040000', '0003', '3', '', '0', '', '8.维护管', '', 8, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300050000', '000000000000', '0003', '1', '', '0', '', '固液检测/气体检测模式切换失败', '', 5, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300050009', '000300050000', '0003', '3', '', '0', '', '9.固液检测单元与主控板连接线', '', 9, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300050010', '000300050000', '0003', '3', '', '0', '', '10.汇总主控板固液通信电路', '', 10, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300050011', '000300050000', '0003', '3', '', '0', '', '11.切换按键', '', 11, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300060000', '000000000000', '0003', '1', '', '0', '', '有毒有害气体检测模块不报警', '', 6, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300060012', '000300060000', '0003', '3', '', '0', '', '12.高压驱动板与汇总主控板连接线', '', 12, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300060013', '000300060000', '0003', '3', '', '0', '', '13.汇总主控板毒害模块通信电路', '', 13, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300070000', '000000000000', '0003', '1', '', '0', '', '不能正常工作', '', 7, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300070014', '000300070000', '0003', '3', '', '0', '', '14.外壳及零件', '', 14, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300080000', '000000000000', '0003', '1', '', '0', '', '电压低', '', 8, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300080015', '000300080000', '0003', '3', '', '0', '', '15.供电模块', '', 15, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300090000', '000000000000', '0003', '1', '', '0', '', '无法开机', '', 9, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_fault` VALUES ('000300090016', '000300090000', '0003', '3', '', '0', '', '16.DC/DC', '', 16, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100010000', '000000000000', '0001', '1', '0', '', '0', '', '开机无响应', '', 1, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100010001', '000100010000', '0001', '3', '0', '', '1', '电源开关', '1.电源开关', '01', 1, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100010002', '000100010000', '0001', '3', '0', '', '1', 'DC/DC转换芯片', '2.DC/DC转换芯片', '02', 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100020000', '000000000000', '0001', '1', '0', '', '0', '', '开机后按抽气开关,微电机不工作', '', 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100020003', '000100020000', '0001', '3', '0', '', '1', '微电机', '3.微电机', '03', 3, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100020004', '000100020000', '0001', '3', '0', '', '1', 'Q2', '4.Q2', '04', 4, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100030000', '000000000000', '0001', '1', '0', '', '0', '', '抽气流量不足', '', 3, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100030005', '000100030000', '0001', '3', '0', '', '1', '滤网', '5.滤网', '05', 5, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100030006', '000100030000', '0001', '3', '0', '', '1', '调速电位器', '6.调速电位器', '06', 6, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100040000', '000000000000', '0001', '1', '0', '', '0', '', '开机后按下加热开关,加热灯不亮,也未加热', '', 4, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100040007', '000100040000', '0001', '3', '5', '', '1', '加热指示灯', '7.加热指示灯', '07', 7, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100040008', '000100040000', '0001', '3', '5', '', '1', '热敏开关', '8.热敏开关', '08', 8, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100050000', '000000000000', '0001', '1', '0', '', '0', '', '不能正常工作', '', 5, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100050009', '000100050000', '0001', '3', '5', '', '1', '外壳及零件', '9.外壳及零件', '09', 9, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100060000', '000000000000', '0001', '1', '0', '', '0', '', '电压低', '', 6, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000100060010', '000100060000', '0001', '3', '5', '', '1', '供电模块', '10.供电模块', '0A', 10, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200010000', '000000000000', '0002', '1', NULL, '', '0', '', '仪器无法开机', '', 1, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200010001', '000200010000', '0002', '3', NULL, '', '1', '', '1.薄膜开关FPC排线', '', 1, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200010002', '000200010000', '0002', '3', NULL, '', '1', '', '2.主控板开机电路', '', 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200020000', '000000000000', '0002', '1', NULL, '', '0', '', '蜂鸣器自检时,声音异常', '', 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200020003', '000200020000', '0002', '3', NULL, '', '0', '', '3.蜂鸣器出声口', '', 3, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200020004', '000200020000', '0002', '3', NULL, '', '0', '', '4.接口接线板', '', 4, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200030000', '000000000000', '0002', '1', NULL, '', '0', '', '仪器进入检测界面后,通入检测剂不报警', '', 3, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200030005', '000200030000', '0002', '3', NULL, '', '0', '', '5.检测剂', '', 5, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200030006', '000200030000', '0002', '3', NULL, '', '0', '', '6.主控板信号采集电路', '', 6, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200040000', '000000000000', '0002', '1', NULL, '', '0', '', '显示屏无显示', '', 4, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200040007', '000200040000', '0002', '3', NULL, '', '0', '', '7.主控板显示屏供电电路', '', 7, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200040008', '000200040000', '0002', '3', NULL, '', '0', '', '8.显示屏', '', 8, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200050000', '000000000000', '0002', '1', NULL, '', '0', '', '长时间不进入“检测中”', '', 5, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200050009', '000200050000', '0002', '3', NULL, '', '0', '', '9.干燥管', '', 9, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200050010', '000200050000', '0002', '3', NULL, '', '0', '', '10.维护管', '', 10, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200060000', '000000000000', '0002', '1', NULL, '', '0', '', '不能正常工作', '', 6, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200060011', '000200060000', '0002', '3', NULL, '', '0', '', '11.外壳及零件', '', 11, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200070000', '000000000000', '0002', '1', NULL, '', '0', '', '电压低', '', 7, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200070012', '000200070000', '0002', '3', NULL, '', '0', '', '12.供电模块', '', 12, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200080000', '000000000000', '0002', '1', NULL, '', '0', '', '无法开机', '', 8, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000200080001', '000200080000', '0002', '3', NULL, '', '0', '', '13.DC/DC', '', 13, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300010000', '000000000000', '0003', '1', NULL, '', '0', '', '仪器无法开机', '', 1, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300010001', '000300010000', '0003', '3', NULL, '', '0', '', '1.FFC排线', '', 1, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300010002', '000300010000', '0003', '3', NULL, '', '0', '', '2.汇总主控板', '', 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300020000', '000000000000', '0003', '1', NULL, '', '0', '', '开机后,显示屏无显示', '', 2, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300020003', '000300020000', '0003', '3', NULL, '', '0', '', '3.显控报警板', '', 3, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300020004', '000300020000', '0003', '3', NULL, '', '0', '', '4.显示屏', '', 4, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300030000', '000000000000', '0003', '1', NULL, '', '0', '', '检测状态下模拟剂不报警', '', 3, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300030005', '000300030000', '0003', '3', NULL, '', '0', '', '5.汇总主控板信号采集电路', '', 5, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300030006', '000300030000', '0003', '3', NULL, '', '0', '', '6.检测剂', '', 6, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300040000', '000000000000', '0003', '1', NULL, '', '0', '', '长时间不能进入检测状态', '', 4, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300040007', '000300040000', '0003', '3', NULL, '', '0', '', '7.干燥管', '', 7, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300040008', '000300040000', '0003', '3', NULL, '', '0', '', '8.维护管', '', 8, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300050000', '000000000000', '0003', '1', NULL, '', '0', '', '固液检测/气体检测模式切换失败', '', 5, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300050009', '000300050000', '0003', '3', NULL, '', '0', '', '9.固液检测单元与主控板连接线', '', 9, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300050010', '000300050000', '0003', '3', NULL, '', '0', '', '10.汇总主控板固液通信电路', '', 10, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300050011', '000300050000', '0003', '3', NULL, '', '0', '', '11.切换按键', '', 11, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300060000', '000000000000', '0003', '1', NULL, '', '0', '', '有毒有害气体检测模块不报警', '', 6, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300060012', '000300060000', '0003', '3', NULL, '', '0', '', '12.高压驱动板与汇总主控板连接线', '', 12, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300060013', '000300060000', '0003', '3', NULL, '', '0', '', '13.汇总主控板毒害模块通信电路', '', 13, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300070000', '000000000000', '0003', '1', NULL, '', '0', '', '不能正常工作', '', 7, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300070014', '000300070000', '0003', '3', NULL, '', '0', '', '14.外壳及零件', '', 14, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300080000', '000000000000', '0003', '1', NULL, '', '0', '', '电压低', '', 8, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300080015', '000300080000', '0003', '3', NULL, '', '0', '', '15.供电模块', '', 15, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300090000', '000000000000', '0003', '1', NULL, '', '0', '', '无法开机', '', 9, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_fault` VALUES ('000300090016', '000300090000', '0003', '3', NULL, '', '0', '', '16.DC/DC', '', 16, NULL, NULL, NULL, NULL, NULL);
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 29 - 27
pla-sim/01_SQL/02_table/sim_sim.sql

@@ -1,17 +1,17 @@
 /*
  Navicat Premium Dump SQL
 
- Source Server         : qdhome.iot321.top-dev
+ Source Server         : 47.104.188.84-sim
  Source Server Type    : MySQL
- Source Server Version : 50740 (5.7.40-log)
- Source Host           : qdhome.iot321.top:33103
+ Source Server Version : 80020 (8.0.20)
+ Source Host           : 47.104.188.84:65006
  Source Schema         : pla-chem-sim-dev-1
 
  Target Server Type    : MySQL
- Target Server Version : 50740 (5.7.40-log)
+ Target Server Version : 80020 (8.0.20)
  File Encoding         : 65001
 
- Date: 18/12/2024 21:16:24
+ Date: 19/12/2024 22:07:24
 */
 
 SET NAMES utf8mb4;
@@ -22,12 +22,14 @@ SET FOREIGN_KEY_CHECKS = 0;
 -- ----------------------------
 DROP TABLE IF EXISTS `sim_sim`;
 CREATE TABLE `sim_sim`  (
-  `sim_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '模拟器ID',
-  `seat_id` bigint(20) NOT NULL COMMENT '座ID',
+  `sim_id` bigint NOT NULL AUTO_INCREMENT COMMENT '模拟器ID',
+  `seat_id` bigint NOT NULL COMMENT '座ID',
   `sim_type` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模拟器类型',
   `sim_state` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '模拟器状态 0:可用初始化 1:在线 2:模拟器离线 3:网关离线 4:硬件故障异常 5:手动禁用',
   `sim_sn` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模拟器序列号',
   `sim_num` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '模拟器设备编号1~30',
+  `last_sent_time` datetime NULL DEFAULT NULL COMMENT '最后一次成功发送报文时间',
+  `last_received_time` datetime NULL DEFAULT NULL 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 '更新者',
@@ -39,25 +41,25 @@ CREATE TABLE `sim_sim`  (
 -- ----------------------------
 -- Records of sim_sim
 -- ----------------------------
-INSERT INTO `sim_sim` VALUES (11, 1, '0001', '0', '01123456', '1', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (12, 2, '0001', '5', 'A0002', '2', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (13, 3, '0001', '5', 'A0003', '3', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (14, 4, '0001', '5', 'A0004', '4', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (15, 5, '0001', '5', 'A0005', '5', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (16, 6, '0001', '5', 'A0006', '6', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (17, 7, '0001', '5', 'A0007', '7', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (18, 8, '0001', '5', 'A0008', '8', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (19, 9, '0001', '5', 'A0009', '9', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (20, 10, '0001', '5', 'A0010', '10', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (21, 1, '0002', '5', 'B0001', '11', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (22, 2, '0002', '5', 'B0002', '12', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (23, 3, '0002', '5', 'B0003', '13', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (24, 4, '0002', '5', 'B0004', '14', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (25, 5, '0002', '5', 'B0005', '15', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (26, 6, '0002', '5', 'B0006', '16', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (27, 7, '0002', '5', 'B0006', '17', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (28, 8, '0002', '5', 'B0007', '18', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (29, 9, '0002', '5', 'B0008', '19', NULL, NULL, NULL, NULL, NULL);
-INSERT INTO `sim_sim` VALUES (30, 10, '0002', '5', 'B0008', '20', NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (11, 1, '0001', '1', '01010101', '01', '2024-12-19 22:02:16', '2024-12-19 22:02:18', NULL, '2024-12-19 17:32:47', NULL, '2024-12-19 21:06:32', NULL);
+INSERT INTO `sim_sim` VALUES (12, 2, '0001', '5', 'A0002', '02', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (13, 3, '0001', '5', 'A0003', '03', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (14, 4, '0001', '5', 'A0004', '04', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (15, 5, '0001', '5', 'A0005', '05', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (16, 6, '0001', '5', 'A0006', '06', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (17, 7, '0001', '5', 'A0007', '07', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (18, 8, '0001', '5', 'A0008', '08', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (19, 9, '0001', '5', 'A0009', '09', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (20, 10, '0001', '5', 'A0010', '10', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (21, 1, '0002', '5', 'B0001', '11', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (22, 2, '0002', '5', 'B0002', '12', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (23, 3, '0002', '5', 'B0003', '13', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (24, 4, '0002', '5', 'B0004', '14', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (25, 5, '0002', '5', 'B0005', '15', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (26, 6, '0002', '5', 'B0006', '16', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (27, 7, '0002', '5', 'B0006', '17', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (28, 8, '0002', '5', 'B0007', '18', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (29, 9, '0002', '5', 'B0008', '19', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `sim_sim` VALUES (30, 10, '0002', '5', 'B0008', '20', NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 29 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/config/SyncThreadPoolConfig.java

@@ -0,0 +1,29 @@
+package com.ruoyi.sim.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 非核心业务的线程池。
+ */
+@Configuration
+@EnableAsync
+public class SyncThreadPoolConfig {
+
+    @Bean(name = "asyncLogTE")
+    public ThreadPoolTaskExecutor executor() {
+        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+        taskExecutor.setCorePoolSize(10);
+        taskExecutor.setMaxPoolSize(100);
+        taskExecutor.setQueueCapacity(50);
+        taskExecutor.setKeepAliveSeconds(200);
+        taskExecutor.setThreadNamePrefix("asyncLogTE-");
+        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        taskExecutor.initialize();
+        return taskExecutor;
+    }
+}

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

@@ -0,0 +1,84 @@
+package com.ruoyi.sim.controller;
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.sim.domain.RealExam;
+import com.ruoyi.sim.service.impl.CommSendService;
+import com.ruoyi.sim.service.impl.MajorService;
+import com.ruoyi.sim.service.impl.RealExamService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/sim/iot")
+@Api("测试通信Controller")
+public class TestIotController extends BaseController {
+
+    @Autowired
+    private MajorService majorService;
+    @Autowired
+    private CommSendService commSnedService;
+    @Autowired
+    private RealExamService realExamService;
+
+    @ApiOperation("testIot通信")
+    @GetMapping(value = "/{codeId}")
+    public AjaxResult testIndex(@PathVariable("codeId") Integer codeId) {
+        switch (codeId) {
+            case 1: {
+                commSnedService.checkAllSimState();
+            }
+            break;
+            case 2: {
+                // commSnedService.clearOneFault(null, null, null);
+            }
+            break;
+            case 3: {
+                // commSnedService.readOneFaultResistance(null, null);
+            }
+            break;
+            case 4: {
+                // commSnedService.writeOneFault(null, null, null);
+            }
+            break;
+            case 5: {
+//                for (int i = 0; i < 100; i++) {
+//                    commSnedService.readOneFaultResistance(null, null);
+//                }
+            }
+            break;
+            case 6: {
+                RealExam re = realExamService.selectRealExamByExamId(1L);
+                commSnedService.clearListFaultByRealExam(re);
+            }
+            break;
+            case 7: {
+                commSnedService.test();
+            }
+            break;
+            case 10: {
+                commSnedService.checkAllSimState();
+                commSnedService.clearAll();
+                RealExam re = realExamService.selectRealExamByExamId(1L);
+                commSnedService.clearListFaultByRealExam(re);
+            }
+            break;
+            case 11: {
+                commSnedService.readAll();
+            }
+            break;
+            case 12: {
+                RealExam re = realExamService.selectRealExamByExamId(1L);
+                commSnedService.readOneExamAtLast(re);
+                //
+            }
+            break;
+        }
+        return AjaxResult.success();
+    }
+}

+ 9 - 6
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/Fault.java

@@ -44,7 +44,7 @@ public class Fault extends BaseEntity implements Comparable<Fault> {
 
     /**
      * 故障状态
-     * 0: 启用
+     * 0:启用
      * 5:禁用
      */
     @Excel(name = "故障状态")
@@ -206,11 +206,14 @@ public class Fault extends BaseEntity implements Comparable<Fault> {
         }
     }
 
-    public static String FAULT_TYPE_1 = "1";
-    public static String FAULT_TYPE_2 = "2";
-    public static String FAULT_TYPE_3 = "3";
-    public static String FAULT_TYPE_4 = "4";
-    public static String FAULT_TYPE_5 = "5";
+    public static String TYPE_1 = "1";
+    public static String TYPE_2 = "2";
+    public static String TYPE_3 = "3";
+    public static String TYPE_4 = "4";
+    public static String TYPE_5 = "5";
+
+    public static String STATE_ENABLE = "0";
+    public static String STATE_DISABLE = "1";
 
     public static String ROOT_FAULT_ID = "000000000000";
 }

+ 13 - 1
ruoyi-sim/src/main/java/com/ruoyi/sim/domain/RealExam.java

@@ -53,7 +53,7 @@ public class RealExam extends BaseEntity {
      * 2:模拟器检查并下发ok
      * 3:答题中
      * 4:已交卷
-     * 5:获取模拟成绩分析
+     * 5:已经获取模拟成绩分析
      * 80:教师标记缺考
      * 81:登录未开始答题
      * 90:模拟器异常结束
@@ -219,4 +219,16 @@ public class RealExam extends BaseEntity {
                 .append("remark", getRemark())
                 .toString();
     }
+
+    // -------------------------------- tom add  --------------------------------
+
+    public static final String STATE_NOT_LOGGED_IN = "0";
+    public static final String STATE_LOGGED_IN = "1";
+    public static final String STATE_SIM_CHECK_OK = "2";
+    public static final String STATE_ANSWERING = "3";
+    public static final String STATE_SUBMITTED = "4";
+    public static final String STATE_GOT_REPORT = "5";
+    public static final String STATE_ABSENCE_BY_TEACHER = "80";
+    public static final String STATE_LOGIN_NOT_STARTED_ANSWERING_QUESTIONS = "81";
+    public static final String STATE_SIMULATOR_ERROR = "90";
 }

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

@@ -12,6 +12,7 @@ import com.ruoyi.common.core.domain.BaseEntity;
  * @date 2024-12-18
  */
 public class RealExamFault extends BaseEntity {
+
     private static final long serialVersionUID = 1L;
 
     /**
@@ -50,8 +51,8 @@ public class RealExamFault extends BaseEntity {
      * 0:初始化
      * 1:已经清除故障
      * 2:故障已经下发
-     * 3:轮读取刷新电阻代表值
-     * 3:考试结束
+     * 3:轮读取刷新电阻代表值
+     * 4:考试结束
      */
     @Excel(name = "故障ID关联状态")
     private String refState;
@@ -195,4 +196,14 @@ public class RealExamFault extends BaseEntity {
                 .append("remark", getRemark())
                 .toString();
     }
+
+    // -------------------------------- tom add  --------------------------------
+    public static final String REF_TYPE_1 = "1";
+    public static final String REF_TYPE_2 = "2";
+
+    public static final String REF_STATE_INIT = "0";
+    public static final String REF_STATE_CLEARED = "1";
+    public static final String REF_STATE_WRITTEN = "2";
+    public static final String REF_STATE_LOOP_READ = "3";
+    public static final String REF_STATE_FINISH = "4";
 }

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

@@ -1,5 +1,6 @@
 package com.ruoyi.sim.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import com.ruoyi.common.annotation.Excel;
@@ -52,6 +53,20 @@ public class Sim extends BaseEntity {
     @Excel(name = "模拟器设备编号1~30")
     private String simNum;
 
+    /**
+     * 最后一次成功发送报文时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    // @Excel(name = "最后一次成功发送报文时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastSentTime;
+
+    /**
+     * 最后一次成功收到报文时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    // @Excel(name = "最后一次成功收到报文时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastReceivedTime;
+
     public void setSimId(Long simId) {
         this.simId = simId;
     }
@@ -100,6 +115,22 @@ public class Sim extends BaseEntity {
         return simNum;
     }
 
+    public void setLastSentTime(Date lastSentTime) {
+        this.lastSentTime = lastSentTime;
+    }
+
+    public Date getLastSentTime() {
+        return lastSentTime;
+    }
+
+    public void setLastReceivedTime(Date lastReceivedTime) {
+        this.lastReceivedTime = lastReceivedTime;
+    }
+
+    public Date getLastReceivedTime() {
+        return lastReceivedTime;
+    }
+
     @Override
     public String toString() {
         return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
@@ -109,6 +140,8 @@ public class Sim extends BaseEntity {
                 .append("simState", getSimState())
                 .append("simSn", getSimSn())
                 .append("simNum", getSimNum())
+                .append("lastSentTime", getLastSentTime())
+                .append("lastReceivedTime", getLastReceivedTime())
                 .append("createBy", getCreateBy())
                 .append("createTime", getCreateTime())
                 .append("updateBy", getUpdateBy())
@@ -131,23 +164,13 @@ public class Sim extends BaseEntity {
      */
     public static final String TYPE_0003 = "0003";
 
-    public static final Set<String> TYPE_SET = new HashSet<>(
-            Arrays.asList(
-                    TYPE_0001,
-                    TYPE_0002,
-                    TYPE_0003
-            )
-    );
+    public static final Set<String> TYPE_SET = new HashSet<>(Arrays.asList(TYPE_0001, TYPE_0002, TYPE_0003));
 
     public static final String TYPE_0001_NAME = "FZD04B";
     public static final String TYPE_0002_NAME = "FZB006";
     public static final String TYPE_0003_NAME = "防化兵用毒剂报警器";
 
-    public static final Map<String, String> TYPE_NAME_MAP = Map.ofEntries(
-            Map.entry(TYPE_0001, TYPE_0001_NAME),
-            Map.entry(TYPE_0002, TYPE_0002_NAME),
-            Map.entry(TYPE_0003, TYPE_0003_NAME)
-    );
+    public static final Map<String, String> TYPE_NAME_MAP = Map.ofEntries(Map.entry(TYPE_0001, TYPE_0001_NAME), Map.entry(TYPE_0002, TYPE_0002_NAME), Map.entry(TYPE_0003, TYPE_0003_NAME));
 
     public static String STATE_ENABLE_INIT = "0";
     public static String STATE_ONLINE = "1";
@@ -156,13 +179,5 @@ public class Sim extends BaseEntity {
     public static String STATE_SIM_ERROR = "4";
     public static String STATE_DISABLE = "5";
 
-    public static final Set<String> STATE_SET = new HashSet<>(
-            Arrays.asList(
-                    STATE_ONLINE,
-                    STATE_SIM_OFFLINE,
-                    STATE_GATEWAY_OFFLINE,
-                    STATE_SIM_ERROR,
-                    STATE_DISABLE
-            )
-    );
+    public static final Set<String> STATE_SET = new HashSet<>(Arrays.asList(STATE_ENABLE_INIT, STATE_ONLINE, STATE_SIM_OFFLINE, STATE_GATEWAY_OFFLINE, STATE_SIM_ERROR, STATE_DISABLE));
 }

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

@@ -0,0 +1,92 @@
+package com.ruoyi.sim.service.impl;
+
+import com.ruoyi.sim.domain.Fault;
+import com.ruoyi.sim.domain.RealExamFault;
+import com.ruoyi.sim.domain.Sim;
+import com.ruoyi.sim.domain.SimMsg;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+@Service
+// 多实例
+// 异步调用
+// @Scope("prototype")
+public class CommReceiveService {
+
+    private static final Logger l = LoggerFactory.getLogger(CommReceiveService.class);
+    @Autowired
+    private RealExamService realExamService;
+    @Autowired
+    private RealExamFaultService realExamFaultService;
+    @Autowired
+    private SimService simService;
+
+    /**
+     * 只要返回信息,即认为在线。
+     *
+     * @param sm
+     * @param s
+     */
+    public void checkOneSimState(SimMsg sm, Sim s) {
+        if (Objects.isNull(sm)) {
+
+        }
+        if (!StringUtils.isEmpty(sm.getReceiveMsg())) {
+            Sim f = simService.selectSimBySimId(s.getSimId());
+            simService.updateSimStateBySimId(s.getSimId(), Sim.STATE_ONLINE);
+        }
+    }
+
+    public void clearOneFault(SimMsg sm, Sim s, RealExamFault reF, Fault f) {
+        // check
+
+        //
+        if (reF != null) {
+            reF.setRefState(RealExamFault.REF_STATE_CLEARED);
+            realExamFaultService.updateRealExamFault(reF);
+        }
+    }
+
+    public void setFaultQuestionValue(SimMsg sm, Sim s, RealExamFault reF, Fault f) {
+        // check
+
+        //
+        String faultQuestionValue = parseGetData(sm.getReceiveMsg());
+        l.info("faultQuestionValue = {}", faultQuestionValue);
+        reF.setRefState(RealExamFault.REF_STATE_WRITTEN);
+        reF.setSimFaultQuestionValue(faultQuestionValue);
+        realExamFaultService.updateRealExamFault(reF);
+    }
+
+    public void setFaultAnswerValue(SimMsg sm, Sim s, RealExamFault reF, Fault f) {
+        // check
+        if (reF == null) {
+            l.info("reF null!");
+            return;
+        }
+        //
+        String faultAnswerValue = parseGetData(sm.getReceiveMsg());
+        l.info("faultAnswerValue = {}", faultAnswerValue);
+        reF.setRefState(RealExamFault.REF_STATE_LOOP_READ);
+        reF.setSimFaultAnswerValue(faultAnswerValue);
+        realExamFaultService.updateRealExamFault(reF);
+    }
+
+    /**
+     * 截取
+     * @param receiveMsg
+     * @return
+     */
+    public String parseGetData(String receiveMsg) {
+        if (StringUtils.isEmpty(receiveMsg)) {
+            return "";
+        }
+        return StringUtils.substring(receiveMsg, 10, 18);
+    }
+
+}

+ 498 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/CommSendService.java

@@ -0,0 +1,498 @@
+package com.ruoyi.sim.service.impl;
+
+import com.ruoyi.sim.config.SimConfig;
+import com.ruoyi.sim.domain.*;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.SocketTimeoutException;
+import java.util.List;
+import java.util.Objects;
+
+import static com.ruoyi.sim.service.impl.CommSendService.Const.*;
+
+/**
+ * 硬件通信
+ * send service.
+ */
+@Service
+public class CommSendService {
+
+    interface Const {
+
+        String ROUTER_IP = "127.0.0.1";
+        String IP = "123.112.16.165";
+        int PORT = 8899;
+        /**
+         * 报文长度
+         */
+        int MSG_LENGTH = 20;
+
+        String PREFIX = "AA";
+
+        String SUFFIX = "55";
+
+        /**
+         * orientation
+         */
+        String ORN_SEND = "01";
+
+        /**
+         * orientation
+         */
+        String ORN_RECEIVE = "02";
+
+        String CMD_DATA_PLACE_HOLDER = "00000000";
+
+        /**
+         * 故障下发
+         */
+        String CMD_SET_FAULT = "01";
+        /**
+         * 故障清清除
+         */
+        String CMD_CLEAR_FAULT = "02";
+        /**
+         * 设备类型读取
+         */
+        String CMD_READ_TYPE = "03";
+        /**
+         * 状态读取 RESISTANCE电阻值
+         */
+        String CMD_READ_FAULT_RESISTANCE = "03";
+
+        String CMD_ID_GET_SN = "B1";
+        int LENGTH_2 = 2;
+        int LENGTH_8 = 8;
+        int LENGTH_20 = 20;
+    }
+
+    private static final Logger l = LoggerFactory.getLogger(CommSendService.class);
+    /**
+     * 缓存的Socket连接。
+     */
+    private Socket cachedSocket = null;
+    @Autowired
+    private CommReceiveService simReceiveService;
+    @Autowired
+    private SimService simService;
+    @Autowired
+    private FaultService faultService;
+    @Autowired
+    private RealExamService realExamService;
+    @Autowired
+    private RealExamFaultService realExamFaultService;
+    @Autowired
+    private SimConfig sConfig;
+
+    /**
+     * 初始化方法,项目启动后自动运行。
+     */
+    public void init() {
+        //
+        try {
+            if (!isReachable(ROUTER_IP)) {
+                // todo:ping 不通。
+            }
+            if (!isReachable(IP)) {
+                // todo:ping 不通。
+            }
+            openSocket();
+            //
+            checkAllSimState();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 定时任务。
+     */
+    public void scheduledLoopRead() {
+        readAll();
+    }
+
+    public void readAll() {
+        List<RealExam> listRE = realExamService.listAllStatusAnswering();
+        listRE.forEach(e -> {
+            if (e == null) {
+                return;
+            }
+            List<RealExamFault> listREF = realExamFaultService.listAllStatusLoopRead(e.getExamId());
+            listREF.forEach(ref -> {
+                Sim s = simService.selectSimBySimId(e.getSimId());
+                Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
+                readOneFaultResistance(s, ref, f);
+            });
+        });
+    }
+
+    public void readOneExamAtLast(RealExam re) {
+        List<RealExamFault> listREF = realExamFaultService.listAllStatusLoopRead(re.getExamId());
+        listREF.forEach(ref -> {
+            Sim s = simService.selectSimBySimId(re.getSimId());
+            Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
+            readOneFaultResistance(s, ref, f);
+        });
+        realExamService.updateOneState(re, RealExam.STATE_SUBMITTED);
+    }
+
+    /**
+     * 定时任务。
+     */
+    public void scheduledCheckAllSimState() {
+        checkAllSimState();
+    }
+
+    /**
+     * 查找所有没有被手动禁用,并order by sim_num的模拟器列表。检查所有模拟器状态。
+     */
+    public void checkAllSimState() {
+        List<Sim> list = simService.listAllEnable();
+        list.forEach(s -> {
+            checkOneSimState(s);
+        });
+    }
+
+    public void checkOneSimState(Sim s) {
+        l.info(s.toString());
+        // check todo:
+        if (Objects.isNull(s)) {
+            return;
+        }
+        //
+        try {
+            SimMsg sm = new SimMsg();
+            String sendMsg = buildSendMsgReadSimType(s.getSimNum());
+            sm.setSendMsg(sendMsg);
+            String receiveMsg = send(sendMsg, s);
+            sm.setReceiveMsg(receiveMsg);
+            simReceiveService.checkOneSimState(sm, s);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * prepare one exam.
+     *
+     * @param re
+     */
+    public void clearListFaultByRealExam(RealExam re) {
+        // check
+        if (Objects.isNull(re)) {
+
+        }
+        //
+        List<RealExamFault> list = realExamFaultService.listAllStateInitByExamId(re.getExamId());
+        list.forEach(ref -> {
+            Fault f = faultService.selectFaultByFaultId(ref.getFaultId());
+            l.info("f.toString() = " + f.toString());
+            Sim s = simService.selectSimBySimId(re.getSimId());
+            l.info("s.toString() = " + s.toString());
+            // check
+            if (Objects.isNull(f)) {
+
+            }
+            clearOneFault(s, ref, f);
+        });
+    }
+
+    public void clearAll() {
+        // todo:
+        simService.listAllEnable().forEach(s -> {
+            String simType = s.getSimType();
+            List<Fault> listF = faultService.listAllType3EnableBySimType(simType);
+            listF.forEach(f -> {
+                clearOneFault(s, null, f);
+            });
+        });
+    }
+
+    /**
+     * @param s
+     * @param reF 可以为空,表示不关联考试的。
+     * @param f
+     */
+    public void clearOneFault(Sim s, RealExamFault reF, Fault f) {
+        // check todo:
+
+        //
+        try {
+            // step1
+            SimMsg sm1 = new SimMsg();
+            String sendMsg1 = buildSendMsgClearFault(s.getSimNum(), f.getBindHardwareMsg());
+            sm1.setSendMsg(sendMsg1);
+            String receiveMsg1 = send(sendMsg1, s);
+            sm1.setReceiveMsg(receiveMsg1);
+            simReceiveService.clearOneFault(sm1, s, reF, f);
+            // step2
+            if (reF != null && realExamFaultService.isState(reF.getRefId(), RealExamFault.REF_STATE_CLEARED)) {
+                writeOneFault(s, reF, f);
+            }
+        } catch (SocketTimeoutException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public void writeOneFault(Sim s, RealExamFault reF, Fault f) {
+        try {
+            // 下发故障
+            SimMsg sm1 = new SimMsg();
+            String sendMsg1 = buildSendMsgWriteFault(s.getSimNum(), f.getBindHardwareMsg());
+            sm1.setSendMsg(sendMsg1);
+            String receiveMsg1 = send(sendMsg1, s);
+            sm1.setReceiveMsg(receiveMsg1);
+            // todo:
+
+            // 读取一次当前电阻代表值作为出题值。
+            SimMsg sm2 = new SimMsg();
+            String sendMsg2 = buildSendMsgReadFaultResistance(s.getSimNum(), f.getBindHardwareMsg());
+            sm2.setSendMsg(sendMsg2);
+            String receiveMsg2 = send(sendMsg2, s);
+            sm2.setReceiveMsg(receiveMsg2);
+            simReceiveService.setFaultQuestionValue(sm2, s, reF, f);
+            // 修改关联状态。
+            {
+                RealExamFault f1 = realExamFaultService.selectRealExamFaultByRefId(reF.getRefId());
+                f1.setRefState(RealExamFault.REF_STATE_LOOP_READ);
+                realExamFaultService.updateRealExamFault(f1);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public void readOneFaultResistance(Sim s, RealExamFault reF, Fault f) {
+        try {
+            SimMsg sm = new SimMsg();
+            String sendMsg = buildSendMsgReadFaultResistance(s.getSimNum(), "03");
+            sm.setSendMsg(sendMsg);
+            String receiveMsg = send(sendMsg, s);
+            sm.setReceiveMsg(receiveMsg);
+            simReceiveService.setFaultAnswerValue(sm, s, reF, f);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void test() {
+        try {
+            {
+                String sendMsg = buildSendMsgReadFaultResistance("01", "04");
+                send(sendMsg, null);
+            }
+            {
+                String sendMsg = buildSendMsgReadFaultResistance("01", "05");
+                send(sendMsg, null);
+            }
+            {
+                String sendMsg = buildSendMsgReadFaultResistance("01", "06");
+                send(sendMsg, null);
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 设备类型读取
+     *
+     * @param simNum sim.sim_num
+     */
+    public String buildSendMsgReadSimType(final String simNum) {
+        return buildSendMsg(simNum, CMD_READ_TYPE, CMD_ID_GET_SN);
+    }
+
+    /**
+     * 故障下发
+     *
+     * @param simNum          sim.sim_num
+     * @param bindHardwareMsg fault.bind_hardware_msg
+     */
+    public String buildSendMsgWriteFault(final String simNum, final String bindHardwareMsg) {
+        return buildSendMsg(simNum, CMD_SET_FAULT, bindHardwareMsg);
+    }
+
+    /**
+     * 状态读取
+     *
+     * @param simNum          sim.sim_num
+     * @param bindHardwareMsg fault.bind_hardware_msg
+     */
+    public String buildSendMsgReadFaultResistance(final String simNum, final String bindHardwareMsg) {
+        return buildSendMsg(simNum, CMD_READ_FAULT_RESISTANCE, bindHardwareMsg);
+    }
+
+    /**
+     * 故障清清除
+     *
+     * @param simNum          sim.sim_num
+     * @param bindHardwareMsg fault.bind_hardware_msg
+     */
+    public String buildSendMsgClearFault(final String simNum, final String bindHardwareMsg) {
+        return buildSendMsg(simNum, CMD_CLEAR_FAULT, bindHardwareMsg);
+    }
+
+    public String buildSendMsg(final String simNum, final String cmd, final String cmdId) {
+        return buildSendMsg(simNum, cmd, cmdId, CMD_DATA_PLACE_HOLDER);
+    }
+
+    public String buildSendMsg(final String simNum, final String cmd, final String cmdId, final String data) {
+        if (StringUtils.isEmpty(simNum) || StringUtils.isEmpty(cmd) || StringUtils.isEmpty(cmdId) || StringUtils.isEmpty(data)) {
+            throw new IllegalArgumentException("buildSendMsg isEmpty");
+        }
+        if (simNum.length() != LENGTH_2) {
+            throw new IllegalArgumentException("buildSendMsg length error");
+        }
+        if (cmd.length() != LENGTH_2) {
+            throw new IllegalArgumentException("buildSendMsg length error");
+        }
+        if (cmdId.length() != LENGTH_2) {
+            throw new IllegalArgumentException("buildSendMsg length error");
+        }
+        if (data.length() != LENGTH_8) {
+            throw new IllegalArgumentException("buildSendMsg length error");
+        }
+        StringBuffer m = new StringBuffer();
+        m.append(PREFIX);
+        m.append(simNum);
+        m.append(ORN_SEND);
+        m.append(cmd);
+        m.append(cmdId);
+        m.append(data);
+        m.append(SUFFIX);
+        final String mFinal = m.toString();
+        if (mFinal.length() != LENGTH_20) {
+            throw new IllegalArgumentException("buildSendMsg length error");
+        }
+        return mFinal;
+    }
+
+    /**
+     * send hex message
+     *
+     * @param sendMsg
+     * @param s       可以为空,更新最后发送/接收时间 用。
+     * @return
+     */
+    public synchronized String send(final String sendMsg, final Sim s) throws IOException {
+        l.info("sendMsg = " + sendMsg);
+        String receiveMsg = null;
+        if (cachedSocket == null) {
+            openSocket();
+        }
+        InputStream is = cachedSocket.getInputStream();
+        OutputStream os = cachedSocket.getOutputStream();
+        os.write(hexStrToByteArrs(sendMsg));
+        if (s != null) {
+            simService.updateLastSentTime(s);
+        }
+        byte[] buffer = new byte[1024];
+        int length = is.read(buffer);
+        StringBuffer sbHex = new StringBuffer();
+        for (int i = 0; i < length; i++) {
+            sbHex.append(String.format("%02X", buffer[i]));
+        }
+        receiveMsg = sbHex.toString();
+        l.info("receiveMsg = {}", receiveMsg);
+        if (!checkReceiveMsg(receiveMsg)) {
+            // todo:
+            l.warn("checkReceiveMsg fail receiveMsg = {}", receiveMsg);
+            return "";
+        }
+        if (s != null) {
+            simService.updateLastReceivedTime(s);
+        }
+        return receiveMsg;
+    }
+
+    public void openSocket() throws IOException {
+
+        if (cachedSocket == null) {
+            cachedSocket = new Socket(IP, PORT);
+            // setSoTimeout
+            // cachedSocket.setSoTimeout(1000);
+        }
+    }
+
+    /**
+     * todo:异常精细处理
+     *
+     * @throws IOException
+     */
+    public void closeSocket() throws IOException {
+        if (cachedSocket != null) {
+            cachedSocket.close();
+        }
+        cachedSocket = null;
+    }
+
+    public byte[] hexStrToByteArrs(String hexString) {
+//        if (StringUtils.isEmpty(hexString)) {
+//            return null;
+//        }
+        hexString = hexString.replaceAll(" ", "");
+        int len = hexString.length();
+        int index = 0;
+
+        byte[] bytes = new byte[len / 2];
+
+        while (index < len) {
+            String sub = hexString.substring(index, index + 2);
+            bytes[index / 2] = (byte) Integer.parseInt(sub, 16);
+            index += 2;
+        }
+        return bytes;
+    }
+
+    /**
+     * ping
+     *
+     * @param ipV4
+     * @return
+     * @throws IOException
+     */
+    public boolean isReachable(String ipV4) throws IOException {
+        InetAddress ia = InetAddress.getByName(ipV4);
+        return ia.isReachable(sConfig.getGatewayReachableTimeout());
+    }
+
+    /**
+     * check receiveMsg
+     *
+     * @param receiveMsg
+     * @return
+     */
+    public boolean checkReceiveMsg(String receiveMsg) {
+        if (StringUtils.isEmpty(receiveMsg)) {
+            return false;
+        }
+        if (receiveMsg.length() != CommSendService.Const.LENGTH_20) {
+            return false;
+        }
+        final String orn = StringUtils.substring(receiveMsg, 4, 6);
+        if (!CommSendService.Const.ORN_RECEIVE.equals(orn)) {
+            return false;
+        }
+        if (!StringUtils.startsWith(receiveMsg, CommSendService.Const.PREFIX)) {
+            return false;
+        }
+        if (!StringUtils.endsWith(receiveMsg, CommSendService.Const.SUFFIX)) {
+            return false;
+        }
+        return true;
+    }
+}

+ 8 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/FaultService.java

@@ -94,6 +94,14 @@ public class FaultService {
     @Autowired
     private SimService simService;
 
+    public List<Fault> listAllType3EnableBySimType(String simType) {
+        Fault q = new Fault();
+        q.setSimType(simType);
+        q.setFaultType(Fault.TYPE_3);
+        q.setFaultState(Fault.STATE_ENABLE);
+        return selectFaultList(q);
+    }
+
     /**
      * 查询故障列表tree
      *

+ 0 - 276
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/IotService.java

@@ -1,276 +0,0 @@
-package com.ruoyi.sim.service.impl;
-
-import com.ruoyi.sim.config.SimConfig;
-import com.ruoyi.sim.domain.Sim;
-import com.ruoyi.sim.domain.SimMsg;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.util.Objects;
-
-import static com.ruoyi.sim.service.impl.IotService.Const.*;
-
-/**
- * 硬件通信
- * send service.
- */
-@Service
-public class IotService {
-
-    interface Const {
-
-        String ROUTER_IP = "127.0.0.1";
-        String IP = "123.112.16.165";
-        int PORT = 8899;
-        /**
-         * 报文长度
-         */
-        int MSG_LENGTH = 20;
-
-        String PREFIX = "AA";
-
-        String SUFFIX = "55";
-
-        /**
-         * orientation
-         */
-        String ORN_SEND = "01";
-
-        /**
-         * orientation
-         */
-        String ORN_RECEIVE = "02";
-
-        String CMD_DATA_PLACE_HOLDER = "00000000";
-
-        /**
-         * 故障下发
-         */
-        String CMD_SET_FAULT = "01";
-        /**
-         * 故障清清除
-         */
-        String CMD_CLEAR_FAULT = "02";
-        /**
-         * 设备类型读取
-         */
-        String CMD_READ_TYPE = "03";
-        /**
-         * 状态读取 RESISTANCE电阻值
-         */
-        String CMD_READ_FAULT_RESISTANCE = "03";
-
-        String CMD_ID_GET_SN = "B1";
-        int LENGTH_2 = 2;
-        int LENGTH_8 = 8;
-        int LENGTH_20 = 20;
-    }
-
-    private static final Logger l = LoggerFactory.getLogger(IotService.class);
-    /**
-     * 缓存的Socket连接。
-     */
-    private Socket cachedSocket = null;
-    @Autowired
-    private SimReceiveService simReceiveService;
-    @Autowired
-    private SimConfig sc;
-
-    /**
-     * 初始化方法,项目启动后自动运行。
-     */
-    public void init() {
-        //
-        try {
-            if (!isReachable(ROUTER_IP)) {
-                // todo:ping 不通。
-            }
-            if (!isReachable(IP)) {
-                // todo:ping 不通。
-            }
-            openSocket();
-            //
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * 定时。
-     */
-    public void scheduledCheckAllSimState() {
-
-    }
-
-    /**
-     * 查找所有没有被手动禁用,并order by sim_num的模拟器列表。检查所有模拟器状态。
-     */
-    public void checkAllSimState() {
-
-    }
-
-    public void checkOneSimState(final Sim s) {
-        if (Objects.isNull(s)) {
-            return;
-        }
-        try {
-            SimMsg sm = new SimMsg();
-            // "s.getSimNum()"
-            String sendMsg = buildSendMsgReadSimType("s.getSimNum()");
-            sm.setSendMsg(sendMsg);
-            String receiveMsg = send(sendMsg);
-            sm.setReceiveMsg(receiveMsg);
-            simReceiveService.checkOneSimState(sm);
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * 设备类型读取
-     *
-     * @param simNum sim.sim_num
-     */
-    public String buildSendMsgReadSimType(final String simNum) {
-        return buildSendMsg(simNum, CMD_READ_TYPE, CMD_ID_GET_SN);
-    }
-
-    /**
-     * 故障下发
-     *
-     * @param simNum          sim.sim_num
-     * @param bindHardwareMsg fault.bind_hardware_msg
-     */
-    public String buildSendMsgWriteFault(final String simNum, final String bindHardwareMsg) {
-        return buildSendMsg(simNum, CMD_SET_FAULT, bindHardwareMsg);
-    }
-
-    /**
-     * 状态读取
-     *
-     * @param simNum          sim.sim_num
-     * @param bindHardwareMsg fault.bind_hardware_msg
-     */
-    public String buildSendMsgReadFaultResistance(final String simNum, final String bindHardwareMsg) {
-        return buildSendMsg(simNum, CMD_READ_FAULT_RESISTANCE, bindHardwareMsg);
-    }
-
-    /**
-     * 故障清清除
-     *
-     * @param simNum          sim.sim_num
-     * @param bindHardwareMsg fault.bind_hardware_msg
-     */
-    public String buildSendMsgClearFault(final String simNum, final String bindHardwareMsg) {
-        return buildSendMsg(simNum, CMD_CLEAR_FAULT, bindHardwareMsg);
-    }
-
-    public String buildSendMsg(final String simNum, final String cmd, final String cmdId) {
-        return buildSendMsg(simNum, cmd, cmdId, CMD_DATA_PLACE_HOLDER);
-    }
-
-    public String buildSendMsg(final String simNum, final String cmd, final String cmdId, final String data) {
-        if (StringUtils.isEmpty(simNum) || StringUtils.isEmpty(cmd) || StringUtils.isEmpty(cmdId) || StringUtils.isEmpty(data)) {
-            throw new IllegalArgumentException("buildSendMsg isEmpty");
-        }
-        if (simNum.length() != LENGTH_2 || cmd.length() != LENGTH_2 || cmdId.length() != LENGTH_2 || data.length() != LENGTH_8) {
-            throw new IllegalArgumentException("buildSendMsg length error");
-        }
-        StringBuffer m = new StringBuffer();
-        m.append(PREFIX);
-        m.append(simNum);
-        m.append(ORN_SEND);
-        m.append(cmd);
-        m.append(cmdId);
-        m.append(data);
-        m.append(SUFFIX);
-        final String mFinal = m.toString();
-        if (mFinal.length() != LENGTH_20) {
-            throw new IllegalArgumentException("buildSendMsg length error");
-        }
-        return mFinal;
-    }
-
-    /**
-     * send hex message
-     *
-     * @param sendMsg
-     * @return
-     */
-    public String send(final String sendMsg) throws IOException {
-        l.info("sendMsg = " + sendMsg);
-        String receiveMsg = null;
-        if (cachedSocket == null) {
-            openSocket();
-        }
-        InputStream is = cachedSocket.getInputStream();
-        OutputStream os = cachedSocket.getOutputStream();
-        os.write(hexStrToByteArrs(sendMsg));
-        byte[] buffer = new byte[1024];
-        int length = is.read(buffer);
-        StringBuffer sbHex = new StringBuffer();
-        for (int i = 0; i < length; i++) {
-            sbHex.append(String.format("%02X", buffer[i]));
-        }
-        receiveMsg = sbHex.toString();
-        l.info("receiveMsg = " + receiveMsg);
-        return receiveMsg;
-    }
-
-    public void openSocket() throws IOException {
-
-        if (cachedSocket == null) {
-            cachedSocket = new Socket(IP, PORT);
-        }
-    }
-
-    /**
-     * todo:异常精细处理
-     *
-     * @throws IOException
-     */
-    public void closeSocket() throws IOException {
-        if (cachedSocket != null) {
-            cachedSocket.close();
-        }
-        cachedSocket = null;
-    }
-
-    public byte[] hexStrToByteArrs(String hexString) {
-//        if (StringUtils.isEmpty(hexString)) {
-//            return null;
-//        }
-        hexString = hexString.replaceAll(" ", "");
-        int len = hexString.length();
-        int index = 0;
-
-        byte[] bytes = new byte[len / 2];
-
-        while (index < len) {
-            String sub = hexString.substring(index, index + 2);
-            bytes[index / 2] = (byte) Integer.parseInt(sub, 16);
-            index += 2;
-        }
-        return bytes;
-    }
-
-    /**
-     * ping
-     *
-     * @param ipV4
-     * @return
-     * @throws IOException
-     */
-    public boolean isReachable(String ipV4) throws IOException {
-        InetAddress ia = InetAddress.getByName(ipV4);
-        return ia.isReachable(sc.getGatewayReachableTimeout());
-    }
-}

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

@@ -3,6 +3,8 @@ package com.ruoyi.sim.service.impl;
 import java.util.List;
 
 import com.ruoyi.common.utils.DateUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.sim.mapper.RealExamFaultMapper;
@@ -80,4 +82,38 @@ public class RealExamFaultService {
     public int deleteRealExamFaultByRefId(Long refId) {
         return realExamFaultMapper.deleteRealExamFaultByRefId(refId);
     }
+
+    // -------------------------------- tom add  --------------------------------
+
+    private static final Logger l = LoggerFactory.getLogger(RealExamFaultService.class);
+    /**
+     * 初始化的关联列表
+     *
+     * @param examId
+     * @return
+     */
+    public List<RealExamFault> listAllStateInitByExamId(Long examId) {
+        RealExamFault q = new RealExamFault();
+        q.setExamId(examId);
+        q.setRefType(RealExamFault.REF_TYPE_2);
+        q.setRefState(RealExamFault.REF_STATE_INIT);
+        return realExamFaultMapper.selectRealExamFaultList(q);
+    }
+
+    public List<RealExamFault> listAllStatusLoopRead(Long examId) {
+        RealExamFault q = new RealExamFault();
+        q.setExamId(examId);
+        q.setRefType(RealExamFault.REF_TYPE_2);
+        q.setRefState(RealExamFault.REF_STATE_LOOP_READ);
+        l.info(q.toString());
+        return realExamFaultMapper.selectRealExamFaultList(q);
+    }
+
+    public boolean isState(Long refId, String state) {
+        RealExamFault f = selectRealExamFaultByRefId(refId);
+        if (f == null) {
+            return false;
+        }
+        return state.equals(f.getRefState());
+    }
 }

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

@@ -3,10 +3,12 @@ package com.ruoyi.sim.service.impl;
 import java.util.List;
 
 import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.sim.domain.RealExamFault;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.sim.mapper.RealExamMapper;
 import com.ruoyi.sim.domain.RealExam;
+import org.springframework.transaction.annotation.Transactional;
 
 /**
  * 考试Service业务层处理
@@ -80,4 +82,29 @@ public class RealExamService {
     public int deleteRealExamByExamId(Long examId) {
         return realExamMapper.deleteRealExamByExamId(examId);
     }
+
+    // -------------------------------- tom add  --------------------------------
+    @Autowired
+    private RealExamFaultService realExamFaultService;
+
+    public List<RealExam> listAllStatusAnswering() {
+        RealExam q = new RealExam();
+        q.setExamStatus(RealExam.STATE_ANSWERING);
+        return selectRealExamList(q);
+    }
+
+    @Transactional
+    public int updateOneState(RealExam re, final String state) {
+        RealExam q = selectRealExamByExamId(re.getExamId());
+        if (state.equals(RealExam.STATE_SUBMITTED)) {
+            // 关联故障list同步锁死。
+            realExamFaultService.listAllStatusLoopRead(q.getExamId())
+                    .forEach(ref -> {
+                        ref.setRefState(RealExamFault.REF_STATE_FINISH);
+                        realExamFaultService.updateRealExamFault(ref);
+                    });
+        }
+        q.setExamStatus(state);
+        return updateRealExam(q);
+    }
 }

+ 0 - 20
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/SimReceiveService.java

@@ -1,20 +0,0 @@
-package com.ruoyi.sim.service.impl;
-
-import com.ruoyi.sim.domain.SimMsg;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Service;
-
-@Service
-// 多实例
-// 异步调用
-// @Scope("prototype")
-public class SimReceiveService {
-
-    private static final Logger l = LoggerFactory.getLogger(IotService.class);
-
-    public void checkOneSimState(SimMsg sm) {
-
-    }
-}

+ 31 - 0
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/SimService.java

@@ -1,11 +1,13 @@
 package com.ruoyi.sim.service.impl;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
 import com.ruoyi.common.utils.DateUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import com.ruoyi.sim.mapper.SimMapper;
 import com.ruoyi.sim.domain.Sim;
@@ -86,6 +88,17 @@ public class SimService {
 
     // -------------------------------- tom add  --------------------------------
 
+    public List<Sim> listAllEnable() {
+        List<Sim> list = selectSimList(new Sim());
+        List<Sim> listR = new ArrayList<Sim>();
+        for (Sim o : list) {
+            if (!Sim.STATE_DISABLE.equals(o.getSimState())) {
+                listR.add(o);
+            }
+        }
+        return listR;
+    }
+
     public List<String> listSimTypes() {
         return Sim.TYPE_SET.stream().toList();
     }
@@ -158,4 +171,22 @@ public class SimService {
         }
         return count;
     }
+
+    @Async("asyncLogTE")
+    public void updateLastSentTime(Sim s) {
+        if (s == null) {
+            return;
+        }
+        s.setLastSentTime(DateUtils.getNowDate());
+        updateSim(s);
+    }
+
+    @Async("asyncLogTE")
+    public void updateLastReceivedTime(Sim s) {
+        if (s == null) {
+            return;
+        }
+        s.setLastReceivedTime(DateUtils.getNowDate());
+        updateSim(s);
+    }
 }

+ 3 - 4
ruoyi-sim/src/main/java/com/ruoyi/sim/service/impl/TaskService.java

@@ -1,6 +1,5 @@
 package com.ruoyi.sim.service.impl;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -67,7 +66,7 @@ public class TaskService {
             if (o == null) {
                 continue;
             }
-            if (Fault.FAULT_TYPE_3.equals(o.getFaultType())) {
+            if (Fault.TYPE_3.equals(o.getFaultType())) {
                 TaskFault tf = o.getTaskFault();
                 TaskFault tfQ = taskFaultService.selectUniqueTaskFault(taskId, tf.getFaultId());
                 // 存在就设置上数据库中TaskFault值。
@@ -129,7 +128,7 @@ public class TaskService {
                 if (ftv == null) {
                     continue;
                 }
-                if (!Fault.FAULT_TYPE_3.equals(ftv.getFaultType())) {
+                if (!Fault.TYPE_3.equals(ftv.getFaultType())) {
                     continue;
                 }
                 TaskFault tf = ftv.getTaskFault();
@@ -224,7 +223,7 @@ public class TaskService {
                 if (ftv == null) {
                     continue;
                 }
-                if (!Fault.FAULT_TYPE_3.equals(ftv.getFaultType())) {
+                if (!Fault.TYPE_3.equals(ftv.getFaultType())) {
                     continue;
                 }
                 TaskFault tf = ftv.getTaskFault();

+ 12 - 0
ruoyi-sim/src/main/resources/mapper/sim/SimMapper.xml

@@ -11,6 +11,8 @@
         <result property="simState" column="sim_state"/>
         <result property="simSn" column="sim_sn"/>
         <result property="simNum" column="sim_num"/>
+        <result property="lastSentTime" column="last_sent_time"/>
+        <result property="lastReceivedTime" column="last_received_time"/>
         <result property="createBy" column="create_by"/>
         <result property="createTime" column="create_time"/>
         <result property="updateBy" column="update_by"/>
@@ -25,6 +27,8 @@
                sim_state,
                sim_sn,
                sim_num,
+               last_sent_time,
+               last_received_time,
                create_by,
                create_time,
                update_by,
@@ -41,6 +45,8 @@
             <if test="simState != null  and simState != ''">and sim_state = #{simState}</if>
             <if test="simSn != null  and simSn != ''">and sim_sn = #{simSn}</if>
             <if test="simNum != null  and simNum != ''">and sim_num = #{simNum}</if>
+            <if test="lastSentTime != null ">and last_sent_time = #{lastSentTime}</if>
+            <if test="lastReceivedTime != null ">and last_received_time = #{lastReceivedTime}</if>
         </where>
     </select>
 
@@ -60,6 +66,8 @@
             <if test="simState != null and simState != ''">sim_state,</if>
             <if test="simSn != null and simSn != ''">sim_sn,</if>
             <if test="simNum != null and simNum != ''">sim_num,</if>
+            <if test="lastSentTime != null">last_sent_time,</if>
+            <if test="lastReceivedTime != null">last_received_time,</if>
             <if test="createBy != null">create_by,</if>
             <if test="createTime != null">create_time,</if>
             <if test="updateBy != null">update_by,</if>
@@ -72,6 +80,8 @@
             <if test="simState != null and simState != ''">#{simState},</if>
             <if test="simSn != null and simSn != ''">#{simSn},</if>
             <if test="simNum != null and simNum != ''">#{simNum},</if>
+            <if test="lastSentTime != null">#{lastSentTime},</if>
+            <if test="lastReceivedTime != null">#{lastReceivedTime},</if>
             <if test="createBy != null">#{createBy},</if>
             <if test="createTime != null">#{createTime},</if>
             <if test="updateBy != null">#{updateBy},</if>
@@ -88,6 +98,8 @@
             <if test="simState != null and simState != ''">sim_state = #{simState},</if>
             <if test="simSn != null and simSn != ''">sim_sn = #{simSn},</if>
             <if test="simNum != null and simNum != ''">sim_num = #{simNum},</if>
+            <if test="lastSentTime != null">last_sent_time = #{lastSentTime},</if>
+            <if test="lastReceivedTime != null">last_received_time = #{lastReceivedTime},</if>
             <if test="createBy != null">create_by = #{createBy},</if>
             <if test="createTime != null">create_time = #{createTime},</if>
             <if test="updateBy != null">update_by = #{updateBy},</if>