From 30406b83fbc9d66a018b2f7941fed20ee0952f8b Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期三, 28 十月 2026 10:12:08 +0800
Subject: [PATCH] fix(无人值守): 远程控制加真实TCP探测+通讯日志+执行耗时+模拟模式标注;门禁点下拉status过滤写反(写死0导致5个门禁点查不到);报表总净重多除1000

---
 src/main/java/com/ruoyi/wrzs/monitor/service/MonitorService.java |   97 +++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 82 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/ruoyi/wrzs/monitor/service/MonitorService.java b/src/main/java/com/ruoyi/wrzs/monitor/service/MonitorService.java
index bedc933..e3fd2c1 100644
--- a/src/main/java/com/ruoyi/wrzs/monitor/service/MonitorService.java
+++ b/src/main/java/com/ruoyi/wrzs/monitor/service/MonitorService.java
@@ -23,7 +23,11 @@
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -310,7 +314,14 @@
 
     /**
      * 杩滅▼鍚仠鎺у埗
-     * 涓嶆敮鎸佽繙绋嬫帶鍒剁殑璁惧鐩存帴鎷掔粷锛岄伩鍏嶉〉闈笂鍑虹幇"鍋囨寜閽�"
+     * <p>
+     * 涓嶆敮鎸佽繙绋嬫帶鍒剁殑璁惧鐩存帴鎷掔粷锛岄伩鍏嶉〉闈笂鍑虹幇"鍋囨寜閽�"銆�
+     * <p>
+     * 鎵ц娴佺▼锛堟瘡涓�姝ラ兘鍐欒繘 exec_detail锛屽墠绔彲灞曞紑鏌ョ湅閫氳鏃ュ織锛夛細
+     * 1. 鏍¢獙璁惧涓庤繙绋嬫帶鍒跺紑鍏�
+     * 2. 鑻ラ厤缃簡鍚堟硶 IP锛屽厛鍋氱湡瀹� TCP 杩為�氭�ф帰娴嬶紙Modbus 502 绔彛锛�800ms 瓒呮椂锛�
+     * 3. 褰撳墠鏈帴鍏ョ幇鍦鸿澶囷紝杩涘叆妯℃嫙妯″紡锛氫笉鍐欐帶鍒跺瘎瀛樺櫒锛屼絾濡傚疄璁板綍鎺㈡祴缁撴灉
+     * 4. 鏇存柊璁惧鐘舵�佸苟璁板綍鑰楁椂
      */
     @Transactional(rollbackFor = Exception.class)
     public MonitorControl control(Long deviceId, String command, String remark) {
@@ -321,7 +332,51 @@
         if (!"1".equals(device.getControlEnabled())) {
             throw new IllegalArgumentException("璇ヨ澶囨湭鎺ュ叆杩滅▼鎺у埗鍥炶矾锛屼笉鏀寔杩滅▼鍚仠锛岃鐜板満鎿嶄綔");
         }
-        LocalDateTime now = LocalDateTime.now();
+
+        long startMs = System.currentTimeMillis();
+        List<String> logs = new ArrayList<>();
+        String protocol = StringUtils.hasText(device.getCommProtocol()) ? device.getCommProtocol() : "鏈厤缃�";
+        String ip = StringUtils.hasText(device.getIpAddress()) ? device.getIpAddress().trim() : "";
+
+        logs.add(ts() + " 璁惧锛�" + device.getDeviceName() + "锛屽崗璁細" + protocol + "锛屽湴鍧�锛�" + (ip.isEmpty() ? "鏈厤缃�" : ip));
+
+        String simulateTip;
+        boolean ipValid = ip.matches("^\\d{1,3}(\\.\\d{1,3}){3}$");
+        if (ipValid) {
+            logs.add(ts() + " 灏濊瘯杩炴帴 " + ip + ":502 鈥�");
+            boolean tcpOk = probeTcp(ip, 502, 800);
+            if (tcpOk) {
+                logs.add(ts() + " TCP 杩炴帴鎴愬姛");
+                logs.add(ts() + " 妯℃嫙妯″紡锛氳繛閫氭�ф甯革紝浣嗘湭閰嶇疆瀵勫瓨鍣ㄦ槧灏勶紝鏈啓鍏ユ帶鍒跺瘎瀛樺櫒");
+                simulateTip = "璁惧鍦ㄧ嚎锛�" + ip + ":502 鍙揪锛夛紝妯℃嫙妯″紡鎸囦护鏈疄闄呭啓鍏�";
+            } else {
+                logs.add(ts() + " 杩炴帴澶辫触锛�" + ip + ":502 鏃犲搷搴旓紙800ms 瓒呮椂锛�");
+                logs.add(ts() + " 妯℃嫙妯″紡锛氳烦杩囨帶鍒跺瘎瀛樺櫒鍐欏叆");
+                simulateTip = "璁惧 " + ip + ":502 鏃犳硶杩炴帴锛屾寚浠ゆ湭瀹為檯涓嬪彂";
+            }
+        } else {
+            logs.add(ts() + " 璁惧鏈厤缃湁鏁堥�氳鍦板潃锛岃烦杩囪繛閫氭�ф帰娴�");
+            logs.add(ts() + " 妯℃嫙妯″紡锛氳烦杩囨帶鍒跺瘎瀛樺櫒鍐欏叆");
+            simulateTip = "璁惧鏈厤缃�氳鍦板潃锛屾寚浠ゆ湭瀹為檯涓嬪彂";
+        }
+
+        String execMsg;
+        if ("stop".equalsIgnoreCase(command)) {
+            device.setRunStatus("0");
+            execMsg = "鍋滄満鎸囦护宸插彈鐞�";
+        } else if ("start".equalsIgnoreCase(command)) {
+            device.setRunStatus("1");
+            execMsg = "鍚姩鎸囦护宸插彈鐞�";
+        } else if ("restart".equalsIgnoreCase(command)) {
+            device.setRunStatus("1");
+            execMsg = "閲嶅惎鎸囦护宸插彈鐞�";
+        } else {
+            throw new IllegalArgumentException("涓嶆敮鎸佺殑鎺у埗鎸囦护");
+        }
+
+        long duration = System.currentTimeMillis() - startMs;
+        logs.add(ts() + " " + execMsg + "锛岃�楁椂 " + duration + "ms");
+
         MonitorControl control = new MonitorControl();
         control.setDeviceId(deviceId);
         control.setDeviceName(device.getDeviceName());
@@ -329,26 +384,38 @@
         control.setControlType(StringUtils.hasText(device.getControlType()) ? device.getControlType() : "鍚仠");
         control.setCommandSource("杩滅▼鎺у埗");
         control.setOperator(currentUserName());
-        control.setOperateTime(now);
+        control.setOperateTime(LocalDateTime.now());
         control.setRemark(remark);
-        if ("stop".equalsIgnoreCase(command)) {
-            device.setRunStatus("0");
-            control.setResultMsg("鍋滄満鎸囦护宸蹭笅鍙�");
-        } else if ("start".equalsIgnoreCase(command)) {
-            device.setRunStatus("1");
-            control.setResultMsg("鍚姩鎸囦护宸蹭笅鍙�");
-        } else if ("restart".equalsIgnoreCase(command)) {
-            device.setRunStatus("1");
-            control.setResultMsg("閲嶅惎鎸囦护宸蹭笅鍙�");
-        } else {
-            throw new IllegalArgumentException("涓嶆敮鎸佺殑鎺у埗鎸囦护");
-        }
         control.setExecResult("0");
+        control.setExecDuration((int) duration);
+        control.setResultMsg(execMsg + "锛�" + simulateTip + "锛�");
+        control.setExecDetail(String.join("\n", logs));
         controlMapper.insert(control);
         deviceMapper.updateById(device);
         return control;
     }
 
+    /** 褰撳墠鏃堕棿鎴� HH:mm:ss.SSS锛岀敤浜庨�氳鏃ュ織 */
+    private static String ts() {
+        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss.SSS"));
+    }
+
+    /** TCP 杩為�氭�ф帰娴嬶紙鐪熷疄杩炴帴锛岀敤浜庡垽鏂澶囨槸鍚﹀彲杈撅級 */
+    private static boolean probeTcp(String host, int port, int timeoutMs) {
+        Socket socket = new Socket();
+        try {
+            socket.connect(new InetSocketAddress(host, port), timeoutMs);
+            return true;
+        } catch (Exception e) {
+            return false;
+        } finally {
+            try {
+                socket.close();
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
     public IPage<MonitorControl> controlPage(Page<MonitorControl> page, MonitorControl query) {
         return controlMapper.selectPage(page, Wrappers.<MonitorControl>lambdaQuery()
                 .like(StringUtils.hasText(query.getDeviceName()), MonitorControl::getDeviceName, query.getDeviceName())

--
Gitblit v1.9.3