From 0ee340a21c1061cb68eb124ab26b482552634dba Mon Sep 17 00:00:00 2001
From: zhubaomin <zhubaomin>
Date: 星期三, 23 十月 2024 20:23:22 +0800
Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

---
 /dev/null                                                                                                        |   39 ---
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorSv.java            |  174 +++++++++++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/QueryVo.java              |   32 ++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/CodeLocal.java     |    6 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java            |   19 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorCtrl.java          |   49 ++++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/CodeLocal.java                             |   21 +
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java |   14 +
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeMapper.java                        |   17 +
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/ToRtuMwCom.java                            |   85 +++++++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/CommandInnerDeaLer.java          |   31 ++
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml                                       |  131 ++++++++++-
 12 files changed, 548 insertions(+), 70 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeMapper.java
index f67fb00..9789d67 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeMapper.java
@@ -127,6 +127,23 @@
     //List<VoOnLineIntake> getOnLineIntakes(@Param("onLineMap") String onLineMap, @Param("isOnLine") Boolean isOnLine);
     List<VoOnLineIntake> getOnLineIntakes(Map<?, ?> params);
 
+
+    /**
+     * 鑾峰彇鍙栨按鍙f暟閲忥紙鍦ㄧ嚎鎴栦笉鍦ㄧ嚎锛�
+     * @param params
+     * @return
+     */
+    Long selectIntakesCountForOnLine(Map<?, ?> params);
+
+    /**
+     * 鑾峰彇鍙栨按鍙e垪琛ㄥ湪绾挎垨涓嶅湪绾匡級
+     * @param params
+     * @return
+     */
+    List<VoOnLineIntake> selectIntakesForOnLine(Map<?, ?> params);
+
+
+
     /**
      * 鏍规嵁鍙栨按鍙g紪鍙疯幏鍙栧彇姘村彛瀵硅薄
      * @param params
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/CodeLocal.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/CodeLocal.java
new file mode 100644
index 0000000..24f3a3c
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/CodeLocal.java
@@ -0,0 +1,21 @@
+package com.dy.pipIrrGlobal.rtuMw;
+
+public class CodeLocal {
+
+	public static final String clock = "LCD0000" ;//鏌ヨ鐩戞帶涓棿浠舵椂閽�
+
+	public static final String onLineAll = "LCD0001" ;//鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌
+
+	public static final String onLinePart = "LCD0002" ;//鏌ヨ閮ㄥ垎RTU鍦ㄧ嚎鎯呭喌
+
+	public static final String onLineStatistics = "LCD0003" ;//鏌ヨ鎵�鏈塕TU鐘舵�佹儏鍐�
+
+	public static final String allProtocols = "LCD0100" ;//鏌ヨ鎵�鏈夊崗璁厤缃�
+
+	public static final String stopTcpSv = "LCD0110" ;//鍋滄TCP鏈嶅姟锛屼笉鍐嶆帴鍏ユ柊鐨凾CP杩炴帴锛屽凡缁廡CP杩炴帴鐨勫叏閮ㄦ柇杩炴帴
+
+	public static final String recoverTcpSv = "LCD0112" ;//閲嶅惎TCP鏈嶅姟锛屾帴鍏ユ柊鐨凾CP杩炴帴
+
+	public static final String mwState = "LCD0200" ;//寰楀埌閫氫俊涓棿浠惰繍琛屼俊鎭�
+
+}
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/ToRtuMwCom.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/ToRtuMwCom.java
new file mode 100644
index 0000000..74099ea
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/rtuMw/ToRtuMwCom.java
@@ -0,0 +1,85 @@
+package com.dy.pipIrrGlobal.rtuMw;
+
+import com.dy.common.multiDataSource.DataSourceContext;
+import com.dy.common.mw.protocol.Command;
+import com.dy.common.mw.protocol.CommandType;
+import com.dy.common.webUtil.BaseResponse;
+import org.springframework.core.env.Environment;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/10/23 11:45
+ * @Description
+ */
+public abstract class ToRtuMwCom {
+    /**
+     * pro_mw锛氬睘鎬�
+     * tag浠庢帶鍒跺櫒涓幏鍙�
+     * key_mw锛歶rl鐨刱ey
+     */
+    private static final String pro_mw = "mw";
+    private static final String key_mw = "comSendUrl";
+
+
+    /**
+     * 寰楀埌鍚戦�氫俊涓棿浠跺彂閫佹暟鎹殑URL
+     * @param env
+     * @return
+     */
+    protected String getToMwUrl(Environment env) {
+        return env.getProperty(pro_mw + "." + DataSourceContext.get() + "." + key_mw);
+    }
+
+    /**
+     * 鍒涘缓澶栭儴鍛戒护锛堝彂缁欐帶鍒跺櫒锛�
+     * @param code 鍛戒护code
+     * @return
+     */
+    protected Command createOuterCommand(String comId, String code) {
+        Command com = new Command();
+        com.id = comId;
+        com.code = code ;
+        com.type = CommandType.outerCommand;
+        return com ;
+    }
+
+    /**
+     * 鍒涘缓鍐呴儴
+     * @param code 鍛戒护code
+     * @return
+     */
+    protected Command createInnerCommand(String code) {
+        Command com = new Command();
+        com.id = Command.defaultId;
+        com.code = code ;
+        com.type = CommandType.innerCommand;
+        return com ;
+    }
+
+    /**
+     * 鍙戦�佸懡浠�
+     *
+     * @return
+     */
+    protected BaseResponse sendCom2Mw(RestTemplate restTemplate, String comSendUrl, Command com) {
+        String url = UriComponentsBuilder.fromUriString(comSendUrl)
+                .build()
+                .toUriString();
+        HttpHeaders headers = new HttpHeaders();
+        HttpEntity<Command> httpEntity = new HttpEntity<>(com, headers);
+        ResponseEntity<BaseResponse> response = null;
+        try {
+            // 閫氳繃Post鏂瑰紡璋冪敤鎺ュ彛
+            response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, BaseResponse.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return response.getBody();
+    }
+}
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
index 5180618..8709694 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
@@ -421,27 +421,27 @@
             LEFT JOIN pr_controller con ON con.intakeId = inta.id
             LEFT JOIN rm_on_hour_report_last hou ON hou.intake_id = inta.id
             LEFT JOIN(
-            SELECT intake_id AS intakeId,
-                   CONCAT(
-                           IF(alarm_loss = 1, IF(alarm_water_meter_fault = 1, '娴侀噺璁℃晠闅�,', ''),
-                              IF(alarm_water_meter_fault = 1, '娴侀噺璁℃晠闅�', '')),
-                           IF(alarm_battery_volt = 1, IF(alarm_loss = 1, '婕忔崯(鍋锋按)鎶ヨ,', ''),
-                              IF(alarm_loss = 1, '婕忔崯(鍋锋按)鎶ヨ', '')),
-                           IF(alarm_valve = 1, IF(alarm_battery_volt = 1, '钃勭數姹犵數鍘嬫姤璀�,', ''),
-                              IF(alarm_battery_volt = 1, '钃勭數姹犵數鍘嬫姤璀�', '')),
-                           IF(alarm_valve = 1, '闃�闂ㄦ姤璀�', '')
-                       )     AS alarm
-            FROM rm_alarm_state_last
-            WHERE (alarm_water_meter_fault = 1 OR alarm_loss = 1 OR alarm_battery_volt = 1 OR alarm_valve = 1)
-              AND dt >= DATE_SUB(NOW(), INTERVAL 12 HOUR)
-        ) alarm ON alarm.intakeId = inta.id
+                SELECT intake_id AS intakeId,
+                       CONCAT(
+                               IF(alarm_loss = 1, IF(alarm_water_meter_fault = 1, '娴侀噺璁℃晠闅�,', ''),
+                                  IF(alarm_water_meter_fault = 1, '娴侀噺璁℃晠闅�', '')),
+                               IF(alarm_battery_volt = 1, IF(alarm_loss = 1, '婕忔崯(鍋锋按)鎶ヨ,', ''),
+                                  IF(alarm_loss = 1, '婕忔崯(鍋锋按)鎶ヨ', '')),
+                               IF(alarm_valve = 1, IF(alarm_battery_volt = 1, '钃勭數姹犵數鍘嬫姤璀�,', ''),
+                                  IF(alarm_battery_volt = 1, '钃勭數姹犵數鍘嬫姤璀�', '')),
+                               IF(alarm_valve = 1, '闃�闂ㄦ姤璀�', '')
+                           )     AS alarm
+                FROM rm_alarm_state_last
+                WHERE (alarm_water_meter_fault = 1 OR alarm_loss = 1 OR alarm_battery_volt = 1 OR alarm_valve = 1)
+                  AND dt >= DATE_SUB(NOW(), INTERVAL 12 HOUR)
+            ) alarm ON alarm.intakeId = inta.id
             LEFT JOIN JSON_TABLE(
-        <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
-        #{onLineMap},
-        '$[*]' COLUMNS (
-            rtuAddr VARCHAR(20) PATH '$.rtuAddr',
-            isOnLine BOOLEAN PATH '$.isOnLine'
-            )
+                <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
+                #{onLineMap},
+                '$[*]' COLUMNS (
+                    rtuAddr VARCHAR(20) PATH '$.rtuAddr',
+                    isOnLine BOOLEAN PATH '$.isOnLine'
+                    )
             ) rtus ON con.rtuAddr = rtus.rtuAddr
         <where>
             <if test="isOnLine != null">
@@ -521,6 +521,97 @@
         </trim>
     </select>
 
+
+
+
+
+
+
+    <!--鑾峰彇鍙栨按鍙f暟閲忥紙鍦ㄧ嚎鎴栫绾挎垨涓嶈鐘舵�侊級-->
+    <select id="selectIntakesCountForOnLine" resultType="java.lang.Long">
+        SELECT COUNT(*) AS recordCount
+        FROM pr_intake inta
+        INNER JOIN pr_controller con ON con.intakeId = inta.id
+        <if test="onLineMap != null and onLineMap !='' and isOnLine != null">
+            LEFT JOIN JSON_TABLE(
+                <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
+                #{onLineMap},
+                '$[*]' COLUMNS (
+                    rtuAddr VARCHAR(20) PATH '$.rtuAddr',
+                    isOnLine BOOLEAN PATH '$.isOnLine'
+                )
+            ) rtus ON con.rtuAddr = rtus.rtuAddr
+        </if>
+        WHERE con.intakeId is not null
+        <if test="isOnLine != null">
+            AND rtus.isOnLine = #{isOnLine}
+        </if>
+        <if test="intakeNum != null and intakeNum != ''">
+            AND inta.name = #{intakeNum}
+        </if>
+    </select>
+
+
+    <!--鑾峰彇鍙栨按鍙e垪琛紙鍦ㄧ嚎鎴栫绾挎垨涓嶈鐘舵�侊級-->
+    <select id="selectIntakesForOnLine" resultType="com.dy.pipIrrGlobal.voPr.VoOnLineIntake">
+        SELECT
+        inta.id                     AS intakeId,
+        con.rtuAddr,
+        inta.name                   AS intakeNum,
+        inta.lng,
+        inta.lat,
+        IFNULL(hou.total_amount, 0) AS totalAmount,
+        alarm.alarm
+        FROM pr_intake inta
+        INNER JOIN pr_controller con ON con.intakeId = inta.id
+        LEFT JOIN rm_on_hour_report_last hou ON hou.intake_id = inta.id
+        LEFT JOIN(
+            SELECT intake_id AS intakeId,
+            CONCAT(
+                IF(alarm_loss = 1, '婕忔崯鎶ヨ锛�', ''),
+                IF(alarm_battery_volt = 1, '鐢垫睜鐢靛帇鎶ヨ锛�', ''),
+                IF(alarm_valve = 1, '闃�闂ㄦ姤璀︼紝', ''),
+                IF(alarm_water_meter_fault = 1, '娴侀噺璁℃晠闅滄姤璀︼紝', '')
+            ) AS alarm
+            FROM rm_alarm_state_last
+            WHERE (alarm_loss = 1 OR alarm_battery_volt = 1 OR alarm_valve = 1 OR alarm_water_meter_fault = 1)
+            AND dt >= DATE_SUB(NOW(), INTERVAL 12 HOUR)
+        ) alarm ON alarm.intakeId = inta.id
+        <if test="onLineMap != null and onLineMap !='' and isOnLine != null">
+            LEFT JOIN JSON_TABLE(
+                <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',-->
+                #{onLineMap},
+                '$[*]' COLUMNS (
+                    rtuAddr VARCHAR(20) PATH '$.rtuAddr',
+                    isOnLine BOOLEAN PATH '$.isOnLine'
+                )
+            ) rtus ON con.rtuAddr = rtus.rtuAddr
+        </if>
+        WHERE con.intakeId is not null
+        <if test="isOnLine != null">
+            AND rtus.isOnLine = #{isOnLine}
+        </if>
+        <if test="intakeNum != null and intakeNum != ''">
+            AND inta.name = #{intakeNum}
+        </if>
+        order by inta.id ASC
+        <trim prefix="limit ">
+            <if test="start != null and count != null">
+                #{start,javaType=Integer,jdbcType=INTEGER}, #{count,javaType=Integer,jdbcType=INTEGER}
+            </if>
+        </trim>
+    </select>
+
+
+
+
+
+
+
+
+
+
+
     <!--鏍规嵁鍙栨按鍙g紪鍙疯幏鍙栧彇姘村彛瀵硅薄-->
     <select id="getIntakeByName" resultType="com.dy.pipIrrGlobal.voPr.VoOnLineIntake">
         SELECT con.intakeId,
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java
index 55869f8..fc34bbf 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java
@@ -162,6 +162,25 @@
 			return map ;
 		}
 	}
+
+
+	/**
+	 * 寰楀埌閮ㄥ垎鍦ㄧ嚎鎯呭喌
+	 * @return
+	 */
+	public static HashMap<String, Boolean> partOnLine(String[] rtuAddrArrGrp){
+		synchronized (sessionTable){
+			HashMap<String, Boolean> map = new HashMap<String, Boolean>();
+			for(String rtuAddr : rtuAddrArrGrp){
+				TcpSession tcpSe = sessionTable.get(rtuAddr) ;
+				if(tcpSe != null){
+					map.put(rtuAddr, tcpSe.ioSession.isConnected()) ;
+				}
+			}
+			return map ;
+		}
+	}
+
 	/**
 	 * 寰楀埌鎵�鏈塕TU杩炴帴鐘舵�佹儏鍐�
 	 * @return
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/CommandInnerDeaLer.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/CommandInnerDeaLer.java
index 927c1b0..3148b1d 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/CommandInnerDeaLer.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/CommandInnerDeaLer.java
@@ -5,6 +5,8 @@
 import com.dy.common.mw.protocol.Command;
 import com.dy.rtuMw.server.local.localProtocol.*;
 
+import java.util.HashMap;
+
 /**
  * @Author liurunyu
  * @Date 2023/12/21 15:56
@@ -21,8 +23,10 @@
         String code = com.getCode() ;
         if(code.equals(CodeLocal.clock)){
             return this.clock(com) ;
-        }else if(code.equals(CodeLocal.onLine)){
-            return this.onLine(com) ;
+        }else if(code.equals(CodeLocal.onAllLine)){
+            return this.onAllLine(com) ;
+        }else if(code.equals(CodeLocal.onPartLine)){
+            return this.onPartLine(com) ;
         }else if(code.equals(CodeLocal.onLineStatistics)){
             return this.onLineStateStatistics(com) ;
         }else if(code.equals(CodeLocal.allProtocols)){
@@ -50,9 +54,23 @@
      * 鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌
      * @throws Exception
      */
-    private Command onLine(Command command) throws Exception{
-        RtuOnLineVo ol = new RtuOnLineDeal().deal() ;
-        return ReturnCommand.successed("鏌ヨ鎵�鏈夋祴绔欏湪绾挎儏鍐电粨鏋�", command.getId(), command.getCode(), ol) ;
+    private Command onAllLine(Command command) throws Exception{
+        HashMap<String, Boolean> map = new RtuOnLineDeal().dealAll() ;
+        return ReturnCommand.successed("鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌缁撴灉", command.getId(), command.getCode(), map) ;
+    }
+
+    /**
+     * 鏌ヨ閮ㄥ垎RTU鍦ㄧ嚎鎯呭喌
+     * @throws Exception
+     */
+    private Command onPartLine(Command command) throws Exception{
+        if(command.param != null && command.param instanceof String && !command.param.equals("")){
+            String[] rtuAddrGrp = ((String)command.param).split(",");
+            HashMap<String, Boolean> map = new RtuOnLineDeal().dealPart(rtuAddrGrp) ;
+            return ReturnCommand.successed("鏌ヨ閮ㄥ垎RTU鍦ㄧ嚎鎯呭喌缁撴灉", command.getId(), command.getCode(), map) ;
+        }else{
+            return ReturnCommand.errored("鍑洪敊锛屽懡浠ゅ弬鏁板簲璇ユ槸鎵�鏌ヨRTU鐨勫湴鍧�涓�",  command.getId(), command.getCode()) ;
+        }
     }
 
     /**
@@ -61,7 +79,7 @@
      */
     private Command onLineStateStatistics(Command command) throws Exception{
         RtuOnLineStateStatisticsVo vo = new RtuOnLineStateStatisticsDeal().deal() ;
-        return ReturnCommand.successed("鏌ヨ鎵�鏈夋祴绔欏湪绾挎儏鍐电粨鏋�", command.getId(), command.getCode(), vo) ;
+        return ReturnCommand.successed("鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌缁撴灉", command.getId(), command.getCode(), vo) ;
     }
 
     /**
@@ -80,7 +98,6 @@
     private Command stopTcpSv(Command command) throws Exception{
         TcpUnit.getInstance().stop(new UnitCallbackInterface(){
             public void call(Object obj) throws Exception {
-
             }
         });
         return ReturnCommand.successed("宸茬粡鍚姩鍋滄TCP鏈嶅姟", command.getId(), command.getCode(), null) ;
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/CodeLocal.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/CodeLocal.java
index 8629628..479fa99 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/CodeLocal.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/CodeLocal.java
@@ -4,9 +4,11 @@
 
 	public static final String clock = "LCD0000" ;//鏌ヨ鐩戞帶涓棿浠舵椂閽�
 
-	public static final String onLine = "LCD0001" ;//鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌
+	public static final String onAllLine = "LCD0001" ;//鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌
 
-	public static final String onLineStatistics = "LCD0002" ;//鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌
+	public static final String onPartLine = "LCD0002" ;//鏌ヨ鎵�鏈塕TU鍦ㄧ嚎鎯呭喌
+
+	public static final String onLineStatistics = "LCD0003" ;//鏌ヨ鎵�鏈塕TU鐘舵�佹儏鍐�
 
 	public static final String allProtocols = "LCD0100" ;//鏌ヨ鎵�鏈夊崗璁厤缃�
 
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java
index 15fe543..7ddfe10 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java
@@ -2,12 +2,22 @@
 
 import com.dy.rtuMw.server.forTcp.TcpSessionCache;
 
+import java.util.HashMap;
+
 public class RtuOnLineDeal {
 
 	/**
 	 * 鏌ヨ鍦ㄧ嚎涓庝笉鍦ㄧ嚎鎯呭喌
 	 */
-	public RtuOnLineVo deal(){
-		return (new RtuOnLineVo()).setOnLine(TcpSessionCache.allOnLine());
+	public HashMap<String, Boolean> dealAll(){
+		return TcpSessionCache.allOnLine();
+	}
+
+
+	/**
+	 * 鏌ヨ鍦ㄧ嚎涓庝笉鍦ㄧ嚎鎯呭喌
+	 */
+	public HashMap<String, Boolean> dealPart(String[] rtuAddrGrp){
+		return TcpSessionCache.partOnLine(rtuAddrGrp) ;
 	}
 }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineVo.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineVo.java
deleted file mode 100644
index b8ee880..0000000
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineVo.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.dy.rtuMw.server.local.localProtocol;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-public class RtuOnLineVo implements Serializable{
-	
-	private static final long serialVersionUID = 202312211559001L;
-
-	private HashMap<String , Boolean> onLineMap ;
-	
-	public String toString(){
-		String s = "" ;
-		if(onLineMap != null){
-			Iterator<Entry<String, Boolean>> it = onLineMap.entrySet().iterator() ;
-			Entry<String, Boolean> entry = null ;
-			while(it.hasNext()){
-				entry = it.next() ;
-				s += entry.getKey() + ": " + (entry.getValue().booleanValue()?"鍦ㄧ嚎":"绂荤嚎") + "\n";
-			}
-		}
-		return s ;
-	}
-	/**
-	 * 瀛樺叆RTU鍦ㄧ嚎鎯呭喌
-	 * @param onLineMap 鍦ㄧ嚎闆嗗悎
-	 */
-	public RtuOnLineVo setOnLine(HashMap<String , Boolean> onLineMap){
-		this.onLineMap = onLineMap ;
-		return this ;
-	}
-	
-	public HashMap<String, Boolean> getOnLineMap() {
-		return onLineMap;
-	}
-
-}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorCtrl.java
new file mode 100644
index 0000000..36e30e9
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorCtrl.java
@@ -0,0 +1,49 @@
+package com.dy.pipIrrRemote.monitor;
+
+import com.dy.common.aop.SsoAop;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.voPr.VoOnLineIntake;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/10/23 11:32
+ * @Description
+ */
+
+@Slf4j
+@Tag(name = "鐩戞祴鎺у埗", description = "鐩戞祴鎺у埗")
+@RestController
+@RequestMapping(path = "monitor")
+@RequiredArgsConstructor
+public class MonitorCtrl {
+    private final MonitorSv monitorSv;
+
+    /**
+     * 鑾峰彇鍙栨按鍙e垪琛紙鍦ㄧ嚎鍜屼笉鍦ㄧ嚎锛�
+     *
+     * @param qo
+     * @return
+     */
+    @GetMapping(path = "all_intakes")
+    @SsoAop()
+    public BaseResponse<QueryResultVo<List<VoOnLineIntake>>> allIntakes(QueryVo qo) {
+        try {
+            QueryResultVo<List<VoOnLineIntake>> res = monitorSv.selectOnLineIntakes(qo);
+            return BaseResponseUtils.buildSuccess(res);
+        } catch (Exception e) {
+            log.error("鏌ヨ鍙栨按鍙e紓甯�", e);
+            return BaseResponseUtils.buildException(e.getMessage());
+        }
+    }
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorSv.java
new file mode 100644
index 0000000..a85672a
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/MonitorSv.java
@@ -0,0 +1,174 @@
+package com.dy.pipIrrRemote.monitor;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.dy.common.mw.protocol.Command;
+import com.dy.common.mw.protocol.CommandBackParam;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.QueryResultVo;
+import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper;
+import com.dy.pipIrrGlobal.rtuMw.CodeLocal;
+import com.dy.pipIrrGlobal.rtuMw.ToRtuMwCom;
+import com.dy.pipIrrGlobal.voPr.VoOnLineIntake;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.common.utils.PojoUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/10/23 11:32
+ * @Description
+ */
+@Slf4j
+@Service
+public class MonitorSv extends ToRtuMwCom {
+
+    @Autowired
+    private PrIntakeMapper prIntakeMapper;
+
+    @Autowired
+    private Environment env;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    /**
+     * 鑾峰彇宸茬粡缁戝畾鎺у埗鍣ㄧ殑鍙栨按鍙e垪琛紙骞舵爣璁板湪绾夸笌涓嶅湪绾匡級
+     *
+     * @return
+     */
+    public QueryResultVo<List<VoOnLineIntake>> selectOnLineIntakes(QueryVo vo) {
+        if(vo.getIsOnLine() == null){
+            //涓嶅尯鍒嗗湪绾夸笌绂荤嚎
+            return selectIntakesIgnoreOnOffLine(vo) ;
+        }else{
+            //鍦ㄧ嚎 鎴� 绂荤嚎
+            return selectIntakesOnOrOffLine(vo) ;
+        }
+    }
+
+    /**
+     * 鏌ヨ鍙栨按鍙o紝涓嶉檺鍒跺湪绾夸笌绂荤嚎鐘舵��
+     * @param vo
+     * @return
+     */
+    private QueryResultVo<List<VoOnLineIntake>> selectIntakesIgnoreOnOffLine(QueryVo vo) {
+        QueryResultVo<List<VoOnLineIntake>> rsVo = this.queryDb(vo) ;
+        if(rsVo != null && rsVo.obj != null && (rsVo.obj.size() > 0)){
+            String rtuAddrs = "" ;
+            boolean first = true ;
+            for(VoOnLineIntake rVo : rsVo.obj){
+                if(first){
+                    first = false ;
+                    rtuAddrs += rVo.getRtuAddr() ;
+                }else{
+                    rtuAddrs += "," + rVo.getRtuAddr() ;
+                }
+            }
+            //鍚戦�氫俊涓棿浠跺彂鍏冲懡浠わ紝鏌ヨ閮ㄥ垎RTU鍦ㄧ嚎鎯呭喌
+            Command com = this.createInnerCommand(CodeLocal.onLinePart);
+            com.setParam(rtuAddrs) ;
+            String comSendUrl = this.getToMwUrl(this.env) ;
+            BaseResponse res = sendCom2Mw(restTemplate, comSendUrl, com) ;
+            if(res != null){
+                if(res.isSuccess()){
+                    Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ;
+                    CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ;
+                    if(bakParam != null){
+                        if(bakParam.getSuccess().booleanValue()){
+                            //閫氫俊涓棿浠舵垚鍔熻繑鍥炲懡浠ょ粨鏋�
+                            HashMap<String, Boolean> onLineMap = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), HashMap.class);
+                            for(VoOnLineIntake rVo : rsVo.obj){
+                                if(onLineMap.containsKey(rVo.getRtuAddr())) {
+                                    rVo.setIsOnLine(onLineMap.get(rVo.getRtuAddr()));
+                                }
+                            }
+                        }
+                    }else{
+                        log.error("閫氫俊涓棿浠惰繑鍥炲唴閮ㄥ懡浠ょ粨鏋滀腑涓嶅寘鍚獵ommandBackParam绫诲瀷鍙傛暟");
+                    }
+                }else{
+                    log.error("閫氫俊涓棿浠惰繑鍥炲唴閮ㄥ懡浠ゆ墽琛屽け璐�" + (res.getMsg() == null? "" : ("锛�" + res.getMsg()))) ;
+                }
+            }else{
+                log.error("閫氫俊涓棿浠惰繑鍥炲唴閮ㄥ懡浠ょ粨鏋滀负null");
+            }
+        }
+        return rsVo;
+    }
+
+
+    /**
+     * 鏌ヨ鍙栨按鍙o紝鍦ㄧ嚎鎴栫绾跨姸鎬�
+     * @param vo
+     * @return
+     */
+    private QueryResultVo<List<VoOnLineIntake>> selectIntakesOnOrOffLine(QueryVo vo) {
+        //鍚戦�氫俊涓棿浠跺彂鍏冲懡浠わ紝鏌ヨ閮ㄥ垎RTU鍦ㄧ嚎鎯呭喌
+        Command com = this.createInnerCommand(CodeLocal.onLineAll);
+        String comSendUrl = this.getToMwUrl(this.env) ;
+        BaseResponse res = sendCom2Mw(restTemplate, comSendUrl, com) ;
+        if(res != null){
+            if(res.isSuccess()){
+                Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ;
+                CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ;
+                if(bakParam != null){
+                    if(bakParam.getSuccess().booleanValue()){
+                        //閫氫俊涓棿浠舵垚鍔熻繑鍥炲懡浠ょ粨鏋�
+                        HashMap<String, Boolean> onLineMap = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), HashMap.class);
+                        JSONArray jsonArray = new JSONArray();
+                        for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) {
+                            JSONObject jsonObject = new JSONObject();
+                            jsonObject.put("rtuAddr", entry.getKey());
+                            jsonObject.put("isOnLine", entry.getValue());
+                            jsonArray.add(jsonObject);
+                        }
+                        vo.setOnLineMap(jsonArray.toJSONString());
+                    }
+                }else{
+                    log.error("閫氫俊涓棿浠惰繑鍥炲唴閮ㄥ懡浠ょ粨鏋滀腑涓嶅寘鍚獵ommandBackParam绫诲瀷鍙傛暟");
+                }
+            }else{
+                log.error("閫氫俊涓棿浠惰繑鍥炲唴閮ㄥ懡浠ゆ墽琛屽け璐�" + (res.getMsg() == null? "" : ("锛�" + res.getMsg()))) ;
+            }
+        }else{
+            log.error("閫氫俊涓棿浠惰繑鍥炲唴閮ㄥ懡浠ょ粨鏋滀负null");
+        }
+
+        return this.queryDb(vo) ;
+    }
+
+    /**
+     * 鏌ヨ鏁版嵁搴�
+     * @param vo
+     * @return
+     */
+    private QueryResultVo<List<VoOnLineIntake>> queryDb(QueryVo vo){
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
+        Long itemTotal = prIntakeMapper.selectIntakesCountForOnLine(params);
+
+        QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = vo.pageSize;
+        rsVo.pageCurr = vo.pageCurr;
+        rsVo.calculateAndSet(itemTotal, params);
+        List<VoOnLineIntake> records = prIntakeMapper.selectIntakesForOnLine(params) ;
+        rsVo.obj = records ;
+        for(VoOnLineIntake rVo : records){
+            if(rVo.getAlarm() != null && !rVo.getAlarm().trim().equals("") && rVo.getAlarm().endsWith("锛�")){
+                rVo.setAlarm(rVo.getAlarm().substring(0, rVo.getAlarm().length() - 1)) ;
+            }
+        }
+        return rsVo ;
+    }
+
+
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/QueryVo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/QueryVo.java
new file mode 100644
index 0000000..8b846ef
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/QueryVo.java
@@ -0,0 +1,32 @@
+package com.dy.pipIrrRemote.monitor;
+
+import com.dy.common.webUtil.QueryConditionVo;
+import lombok.Data;
+
+/**
+ * @author ZhuBaoMin
+ * @date 2024-05-27 20:32
+ * @LastEditTime 2024-05-27 20:32
+ * @Description
+ */
+
+@Data
+public class QueryVo extends QueryConditionVo {
+    /**
+     * 鍙栨按鍙g紪鍙�
+     */
+    private String intakeNum;
+
+    /**
+     * 鏄惁鍦ㄧ嚎
+     */
+
+    private Boolean isOnLine;
+
+
+    /**
+     * 闈炲墠绔缃殑鍙傛暟鎹紝涓棿浠惰繑鍥炵殑RTU鍦ㄧ嚎鎯呭喌瀵硅薄鏁扮粍
+     */
+    private String onLineMap;
+
+}

--
Gitblit v1.8.0