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