From 10238b43c767fba6a900680da3280f66994f3847 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期一, 11 十一月 2024 18:52:43 +0800
Subject: [PATCH] 继续实现通信中间件RTU嵌入式软件远程升级功能,并修改完善之前实现的部分。

---
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnit.java         |   53 +-
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(test测试).xml                              |   12 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(ym元谋).xml                                |   12 
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeTaskVo.java             |   36 +
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/comResult/CommandResultDeal.java    |    1 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java         |  270 +++++++++----
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java                             |    6 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml                                      |   12 
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeState.java              |   33 +
 /dev/null                                                                                                  |   29 -
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config(sp沙盘).xml                                |   12 
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/parse/HexFileParse.java              |   22 +
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java                              |   19 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnitConfigVo.java |   10 
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/com/CommandCtrl.java                |   19 +
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/webRequest/WebRequestDeal.java      |   56 ++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtuDev.java       |  194 ++++++++++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeManager.java      |  193 +++++++--
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeInfo.java               |   20 +
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java                |   78 ++++
 20 files changed, 881 insertions(+), 206 deletions(-)

diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/parse/HexFileParse.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/parse/HexFileParse.java
index 6e1bf56..9adc86b 100644
--- a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/parse/HexFileParse.java
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/parse/HexFileParse.java
@@ -4,6 +4,7 @@
 import com.dy.common.util.ByteUtil;
 
 import java.io.*;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Stream;
 
@@ -156,6 +157,27 @@
 
     /**
      * 浠�512涓哄崟浣嶅垎鍓叉暟鎹寘
+     * @param bytes
+     */
+    public List<byte[]> splitBytesByUnit512(byte[] bytes){
+        List<byte[]> listByte512 = new ArrayList<>();
+        if(bytes != null && bytes.length > 0){
+            int index = 0 ;
+            while (true){
+                if(index < bytes.length){
+                    byte[] bs = ByteUtil.bytesSplit(bytes, index, bytesSplitUnit512) ;
+                    listByte512.add(bs) ;
+                }else{
+                    break ;
+                }
+                index += bytesSplitUnit512;
+            }
+        }
+        return listByte512 ;
+    }
+
+    /**
+     * 浠�512涓哄崟浣嶅垎鍓叉暟鎹寘
      * @param vo
      */
     private void split(HexFileVo vo){
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeInfo.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeInfo.java
new file mode 100644
index 0000000..7102291
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeInfo.java
@@ -0,0 +1,20 @@
+package com.dy.common.softUpgrade.state;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/11 17:32
+ * @Description
+ */
+@Data
+public class UpgradeInfo {
+    //鍗囩骇浠诲姟ID
+    public String ugTaskId;
+    //鍗囩骇浠诲姟鎬讳綋鐘舵��
+    public UpgradeState ugOverallState;
+    //鍗囩骇浠诲姟RTU鐘舵�佸垪琛�
+    public List<UpgradeRtu> ugRtuStateList;
+}
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java
new file mode 100644
index 0000000..0c9b42b
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java
@@ -0,0 +1,78 @@
+package com.dy.common.softUpgrade.state;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.dy.common.mw.protocol.Command;
+import com.dy.common.util.Callback;
+import lombok.Data;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/11 17:33
+ * @Description
+ */
+@Data
+public class UpgradeRtu {
+
+    @JSONField(serialize = false)
+    public static final int STATE_OFFLINE = -1 ;//-1-绂荤嚎
+    @JSONField(serialize = false)
+    public static final int STATE_UNSTART = 0 ;//0-鏈紑濮�
+    @JSONField(serialize = false)
+    public static final int STATE_RUNNING = 1 ;//1-鍗囩骇涓�
+    @JSONField(serialize = false)
+    public static final int STATE_SUCCESS = 2 ;//2-鍗囩骇鎴愬姛
+    @JSONField(serialize = false)
+    public static final int STATE_FAILONE = 3 ;//3-鍗囩骇澶辫触锛�1鍖呮锛�
+    @JSONField(serialize = false)
+    public static final int STATE_FAIL = 4 ;//4-鍗囩骇澶辫触锛堥潪1鍖呮锛�
+    @JSONField(serialize = false)
+    public static final int STATE_FAILOFFLINE = 5 ;//4-鍗囩骇澶辫触锛堢绾匡級
+    @JSONField(serialize = false)
+    public static final int RAMADDRADD = 0x20 ;//绋嬪簭瀛樺偍鍐呭瓨鍦ㄥ潃澧為噺
+
+    public String rtuAddr ;
+    public int state ;// -1-绂荤嚎锛�0-鏈紑濮嬶紝1-鍗囩骇涓紝2-鍗囩骇鎴愬姛锛�3-鍗囩骇澶辫触锛�1鍖呮锛夛紝4-鍗囩骇澶辫触锛堥潪1鍖呮锛夛紝5-鍗囩骇澶辫触锛堢绾匡級
+    public int totalPackage ;// 鎬诲寘鏁�
+    public int currentPackage ;// 褰撳墠涓嬪彂鍗囩骇鍖呮暟
+    public int currentRamAddr ;// 褰撳墠涓嬪彂鍗囩骇鍖匯TU瀛樺偍鍦板潃
+    public String lastDownDt ;// 鏈�鍚庝笅鍙戝崌绾ф暟鎹寘鏃堕棿锛坹yyy-mm-dd HH:HH:SS锛�
+    public int reTryTimes ;//鍗囩骇涓嶆垚鍔燂紝閲嶈瘯娆℃暟
+    public boolean isOver ;
+
+    /**
+     * 瑙﹀彂鍗囩骇
+     * @param code
+     * @param softData
+     * @param callbackCom
+     */
+    public void trigger(String code,
+                        String protocolName,
+                        Short protocolVersion,
+                        byte[][] softData,
+                        Callback callbackCom){
+        return ;
+    }
+
+    public Command createCommand1601(String protocolName,
+                                     Short protocolVersion){
+        return null ;
+    }
+
+    public Command createCommand1602(String protocolName,
+                                     Short protocolVersion,
+                                     int currentPackage,
+                                     Integer ramAddr,
+                                     byte[][] softData){
+        return null ;
+    }
+
+    public Command createCommand1603(String protocolName,
+                                     Short protocolVersion){
+        return null ;
+    }
+
+    public Command createCommand1600(String protocolName,
+                                     Short protocolVersion){
+        return null ;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeState.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeState.java
new file mode 100644
index 0000000..6e354ce
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeState.java
@@ -0,0 +1,33 @@
+package com.dy.common.softUpgrade.state;
+
+import lombok.Data;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/4 15:14
+ * @Description
+ */
+@Data
+public class UpgradeState {
+
+    public int rtuTotal ;//璁剧疆鍗囩骇RTU鏁�
+    public int offLineTotal ;//鎵�鏈夌绾跨殑
+    public int unStartTotal ;//鎵�鏈夋湭寮�濮�
+    public int runningTotal ;//鎵�鏈夋鍦ㄥ崌绾�
+    public int overTotal ;//鎵�鏈夌粨鏉燂紙鍖呮嫭鎴愬姛涓庢墍鏈夊け璐ワ級
+    public int successTotal ;//鎵�鏈夋垚鍔�
+    public int failTotal ;//鎵�鏈夊け璐�
+    public int failOneTotal ;//鎵�鏈変竴鍖呮澶辫触
+
+    public UpgradeState() {
+        this.rtuTotal = 0;
+        this.offLineTotal = 0;
+        this.unStartTotal = 0;
+        this.runningTotal = 0;
+        this.overTotal = 0;
+        this.successTotal = 0;
+        this.failTotal = 0;
+    }
+
+
+}
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeTaskVo.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeTaskVo.java
new file mode 100644
index 0000000..172cae9
--- /dev/null
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeTaskVo.java
@@ -0,0 +1,36 @@
+package com.dy.common.softUpgrade.state;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/8 13:40
+ * @Description
+ */
+@Data
+public class UpgradeTaskVo {
+    public String id ;//鍗囩骇浠诲姟ID
+    public String softFileName ;//鍗囩骇绋嬪簭鏂囦欢鍚�
+    public String softStoreAddr ;//鍗囩骇绋嬪簭瀛樻斁鍦板潃
+    public String softStartAddr ;//绋嬪簭瑕嗙洊璧峰鍦板潃
+    public byte[] softFileData ;//鏈夋晥鍗囩骇绋嬪簭瀛楄妭鏁扮粍
+    public Integer softBytesCalculate ;//鏍规嵁鍏紡璁$畻寰楀埌鐨勬湁鏁堝崌绾х▼搴忓瓧鑺傛暟
+    public Integer softByteSrc16 ;//鏈夋晥鍗囩骇绋嬪簭瀛楄妭鏁癈RC16鏍¢獙鍊�
+    public List<String> rtuAddrList ;//鎵�鍦ㄥ崌绾х殑鎺у埗鍣ㄥ湴鍧�
+    public String callbackWebUrl ;//鍥炶皟URL
+
+    public String toString(){
+        return "鍗囩骇浠诲姟:" +
+                "   鍗囩骇浠诲姟ID=" + id + "\n" +
+                "   鍗囩骇绋嬪簭鏂囦欢鍚�=" + softFileName + "\n" +
+                "   鍗囩骇绋嬪簭瀛樻斁鍦板潃=" + softStoreAddr + "\n" +
+                "   绋嬪簭瑕嗙洊璧峰鍦板潃=" + softStartAddr + "\n" +
+                "   鏈夋晥鍗囩骇绋嬪簭瀛楄妭鏁�=" + softFileData.length + "\n" +
+                "   鍏紡璁$畻绋嬪簭瀛楄妭鏁�=" + softBytesCalculate +
+                "   绋嬪簭CRC16鏍¢獙鍊�=" + softByteSrc16 + "\n" +
+                "   鍗囩骇鎺у埗鍣ㄦ暟閲�=" + rtuAddrList.size() + "\n" +
+                "   鍗囩骇鐘舵�侀�氱煡URL=" + callbackWebUrl + "\n" ;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java
index aa3d138..35c75e0 100644
--- a/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java
+++ b/pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ThreadJob.java
@@ -3,8 +3,19 @@
 
 @SuppressWarnings("unused")
 public abstract class ThreadJob {
-    public void start(Callback callback){
-        new Thread(() -> {
+    protected Thread thread ;
+    protected boolean stop = false ;
+    public void stop(){
+        this.stop = true ;
+    }
+    public boolean isStop(){
+        return this.stop ;
+    }
+    public Thread getThread(){
+        return this.thread ;
+    }
+    public void start(Callback callback) throws Exception {
+        this.thread = new Thread(() -> {
             Exception[] exe = {null} ;
             Object[] obj = {null} ;
             try {
@@ -21,9 +32,9 @@
                     }
                 }
             }
-        }).start();
+        });
+        thread.start() ;
     }
-
     public abstract Object execute() throws Exception ;
 }
 
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
index 5813c26..e8edcb1 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -337,7 +337,11 @@
 			UpgradeUnitConfigVo ugVo = new UpgradeUnitConfigVo();
 			ugVo.enable = conf.getSetAttrBoolean(doc, "config.upgrade", "enable", null, null) ;
 			ugVo.failTryTimes = conf.getSetAttrPlusInt(doc, "config.upgrade", "failTryTimes", null, 0, 100, null);
-			ugVo.ugMaxRtuSameTime = conf.getSetAttrPlusInt(doc, "config.upgrade", "ugMaxRtuSameTime", null, 1, 1000000, null);
+			ugVo.ugMaxRtuAtOnce = conf.getSetAttrPlusInt(doc, "config.upgrade", "ugMaxRtuSameTime", null, 0, 1000000, null);
+			ugVo.rtuOffLineWaitDuration = conf.getSetAttrPlusInt(doc, "config.upgrade", "rtuOffLineWaitDuration", null, 1, 36000, null);
+			ugVo.rtuOffLineWaitDuration = ugVo.rtuOffLineWaitDuration + 1000;//鍙樻垚姣
+			ugVo.notifyStateInterval = conf.getSetAttrPlusInt(doc, "config.upgrade", "notifyStateInterval", null, 1, 300, null);
+			ugVo.notifyStateInterval = ugVo.notifyStateInterval + 1000;//鍙樻垚姣
 			ugVo.showStartInfo = showStartInfo ;
 			AdapterImp_UpgradeUnit ugAdap = new AdapterImp_UpgradeUnit();
 			ugAdap.setConfig(ugVo);
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeManager.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeManager.java
index aff5c1b..540e811 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeManager.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeManager.java
@@ -1,6 +1,16 @@
 package com.dy.rtuMw.server.upgrade;
 
+import com.dy.common.softUpgrade.state.UpgradeInfo;
+import com.dy.common.softUpgrade.state.UpgradeRtu;
+import com.dy.common.softUpgrade.state.UpgradeState;
+import com.dy.common.softUpgrade.state.UpgradeTaskVo;
+import com.dy.common.springUtil.SpringContextUtil;
 import com.dy.common.util.Callback;
+import com.dy.common.util.DateTime;
+import com.dy.common.util.ThreadJob;
+import com.dy.rtuMw.web.webRequest.WebRequestDeal;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.List;
 
@@ -9,7 +19,9 @@
  * @Date: 2024/11/4 16:03
  * @Description
  */
-public class UpgradeManager {
+public class UpgradeManager extends ThreadJob implements Callback {
+
+    private static final Logger log = LogManager.getLogger(UpgradeManager.class.getName());
 
     private static final UpgradeManager INSTANCE = new UpgradeManager();
 
@@ -17,9 +29,6 @@
     private Integer ugMaxRtuSameTime ;//鍚屾椂鍗囩骇RTU鏈�澶т釜鏁�
 
     private UpgradeTask task ;//鍗囩骇浠诲姟
-
-    private boolean taskIsOver = false ;//鍗囩骇浠诲姟鏄惁缁撴潫
-    private int triggerTimes = 0 ;//杩炴帴瑙﹀彂娆℃暟
 
     private UpgradeManager(){}
 
@@ -32,46 +41,33 @@
      */
     public void initOption(UpgradeUnitConfigVo configVo) {
         this.failTryTimes = configVo.failTryTimes;
-        this.ugMaxRtuSameTime = configVo.ugMaxRtuSameTime;
+        this.ugMaxRtuSameTime = configVo.ugMaxRtuAtOnce;
     }
 
     /**
      * 璁剧疆鍗囩骇浠诲姟
-     * @param softFileName 鍗囩骇绋嬪簭鏂囦欢鍚�
-     * @param softStoreAddr 鍗囩骇绋嬪簭瀛樻斁鍦板潃
-     * @param softStartAddr 绋嬪簭瑕嗙洊璧峰鍦板潃
-     * @param softFileData 鍗囩骇绋嬪簭瀛楄妭鏁扮粍
-     * @param softBytesCalculate 鍗囩骇绋嬪簭瀛楄妭鏁�(鎸夊叕寮忚绠�)
-     * @param rtuAddrList 鍗囩骇RTU
+     * @param vo UpgradeTaskVo 鍗囩骇浠诲姟瀵硅薄
      * @throws Exception
      */
-    public void setUpgradeTask(String softFileName,
-                               String softStoreAddr,
-                               String softStartAddr,
-                               byte[] softFileData,
-                               Integer softBytesCalculate,
-                               List<String> rtuAddrList) throws Exception {
-        if(this.task != null && !this.task.isOver()){
-            throw new Exception("褰撳墠瀛樺湪鍗囩骇浠诲姟锛岃绛夊緟褰撳墠浠诲姟鎵ц瀹屾垨寮哄埗鍋滄褰撳墠浠诲姟");
-        }else{
+    public void setUpgradeTask(UpgradeTaskVo vo) throws Exception {
+        if(this.task != null && !this.task.taskIsOver){
+            throw new Exception("褰撳墠瀛樺湪鍗囩骇浠诲姟锛岃绛夊緟褰撳墠浠诲姟鎵ц瀹屾垨寮哄埗缁撴潫褰撳墠浠诲姟");
+        }else {
             this.task.forceOver();
             this.task = new UpgradeTask();
             this.task.initOption(this.failTryTimes, this.ugMaxRtuSameTime);
-            this.task.setTask(softFileName,
-                    softStoreAddr,
-                    softStartAddr,
-                    softFileData,
-                    softBytesCalculate,
-                    rtuAddrList);
+            this.task.setTask(vo);
+            this.start(this);
         }
     }
 
     /**
-     * 鍋滄褰撳墠鍗囩骇浠诲姟
+     * 缁撴潫褰撳墠鍗囩骇浠诲姟
      * @throws Exception
      */
-    public void stopUpgradeTask() throws Exception {
+    public void overUpgradeTask() throws Exception {
         if(this.task != null){
+            this.stop();
             this.task.forceOver();
         }
         this.task = null ;
@@ -83,20 +79,11 @@
      * @param code
      * @param protocolName
      * @param protocolVersion
-     * @param callback
+     * @param callbackCom
      */
-    public void trigger(String rtuAddr, String code, String protocolName, Short protocolVersion, Callback callback){
-        if(task != null && !taskIsOver){
-            triggerTimes ++ ;
-            if(triggerTimes == 100){
-                triggerTimes = 0 ;
-                if(this.task.isOver()){
-                    taskIsOver = true ;
-                }
-            }
-            if(!taskIsOver){
-                this.task.trigger(rtuAddr, code, protocolName, protocolVersion, callback);
-            }
+    public void trigger(String rtuAddr, String code, String protocolName, Short protocolVersion, Callback callbackCom){
+        if(task != null && !task.taskIsOver){
+            this.task.trigger(rtuAddr, code, protocolName, protocolVersion, callbackCom);
         }
     }
 
@@ -122,7 +109,7 @@
      * @param rtuAddr
      * @return
      */
-    public UpgradeRtu upgradeInfos(String rtuAddr){
+    public UpgradeRtu upgradeRtuInfo(String rtuAddr){
         if(task != null){
             return task.upgradeInfos(rtuAddr) ;
         }else{
@@ -135,7 +122,7 @@
      * @param rtuAddrList
      * @return
      */
-    public List<UpgradeRtu> upgradeInfos(List<String> rtuAddrList){
+    public List<UpgradeRtu> upgradeRtuInfos(List<String> rtuAddrList){
         if(task != null){
             return task.upgradeInfos(rtuAddrList) ;
         }else{
@@ -144,4 +131,124 @@
     }
 
 
+    /**
+     * Rtu鍗囩骇淇℃伅
+     * @return
+     */
+    public List<UpgradeRtu> upgradeRtuInfoAll(){
+        if(task != null){
+            return task.upgradeInfoAll() ;
+        }else{
+            return null ;
+        }
+    }
+
+
+    ////////////////////////////////////////////////////
+    //
+    // 鍗囩骇鏈嶅姟宸ヤ綔绾跨▼鎵ц鐨勬柟娉�
+    // 缁熻鐘舵�� + 鐘舵�侀�氱煡
+    //
+    ////////////////////////////////////////////////////
+    @Override
+    public Object execute() throws Exception {
+        boolean first = true ;
+        while (true){
+            if(this.isStop()){
+                break ;
+            }
+            if(first){
+                try{
+                    //棣栨鍚姩锛屽仠1绉�
+                    Thread.sleep(1000L);
+                }catch (Exception e){
+                }
+            }else{
+                try{
+                    //鍋淴姣
+                    Thread.sleep(UpgradeUnit.confVo.notifyStateInterval);
+                }catch (Exception e){
+                }
+            }
+            if(this.task == null
+                    || this.task.taskVo == null
+                    || this.task.taskVo.rtuAddrList == null
+                    || this.task.taskVo.rtuAddrList.size() == 0){
+                //浠诲姟涓虹┖
+                break ;
+            }else{
+                if(!this.task.taskIsOver){
+                    //鍗囩骇浠诲姟鏈畬鎴�
+                    //宸ヤ綔1锛氱粺璁″綋鍓嶆鍦ㄥ崌绾х殑RTU鏁伴噺锛屼负鍙楅檺鍚屾椂鍗囩骇鏁伴噺鍋氬噯澶�
+                    this.task.statisticsRunningRtuCount() ;
+
+                    //宸ヤ綔2锛氱粺璁¢渶瑕佸崌绾т絾褰撳墠绂荤嚎RTU鐨勬儏鍐�
+                    this.task.statisticsOffRtuCountAndSet() ;
+
+                    //宸ヤ綔3锛氱粺璁℃槸鍚﹀叏閮ㄥ崌绾у畬鎴�
+                    this.task.taskIsOver = this.task.statisticsIsAllOver() ;
+
+                    if(this.task.taskIsOver){
+                        if(!this.task.taskOverType.equals(UpgradeTask.TaskOverType_Force)){
+                            //浠诲姟涓嶆槸寮哄埗缁撴潫鐨�
+                            this.task.taskOverType = UpgradeTask.TaskOverType_Natural ;//浠诲姟瀹屾垚鏂瑰紡锛堣嚜鐒讹紝寮哄埗锛�
+                            this.task.taskOverDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;//浠诲姟瀹屾垚鏃堕棿(yyyy-mm-dd HH:MM:SS)
+                        }
+                        //浠诲姟瀹屾垚锛屾墽琛屾渶鍚庝竴娆″崌绾х姸鎬侀�氱煡
+                        //宸ヤ綔4锛氬崌绾х姸鎬侀�氱煡
+                        if(!first){
+                            this.notifyUpgradeStatus() ;
+                        }
+                    }else{
+                        //浠诲姟鏈畬鎴愶紝缁х画鎵ц鍗囩骇鐘舵�侀�氱煡
+                        //宸ヤ綔4锛� 鍗囩骇鐘舵�侀�氱煡
+                        if(!first){
+                            this.notifyUpgradeStatus() ;
+                        }
+                    }
+                }else{
+                    //浠诲姟宸茬粡瀹屾垚
+                    this.stop();
+                }
+            }
+            if(first){
+                first = false ;
+            }
+        }
+        return true ;
+    }
+
+    /**
+     * 鍗囩骇鐘舵�侀�氱煡
+     */
+    private void notifyUpgradeStatus(){
+        if(this.task.taskVo.callbackWebUrl != null && this.task.taskVo.callbackWebUrl.length() > 0){
+            UpgradeInfo info = new UpgradeInfo() ;
+            info.ugTaskId = this.task.taskVo.id ;//浠诲姟ID
+            info.ugOverallState = this.currentUpgradeState() ;
+            info.ugRtuStateList = this.upgradeRtuInfoAll() ;
+            WebRequestDeal deal = SpringContextUtil.getBean(WebRequestDeal.class) ;
+            deal.deal(this.task.taskVo.callbackWebUrl, info);
+        }
+    }
+
+    ////////////////////////////////////////////////////
+    //
+    // 鍗囩骇鐘舵�侀�氱煡宸ヤ綔绾跨▼鎵ц瀹屾垚鍚庡洖璋冪殑鏂规硶锛�
+    // 涔熷氨鏄笂闈xecute鏂规硶鎵ц瀹屾垚杩斿洖鎴栨姏鍑哄紓甯稿悗锛屾墽琛屼笅闈笁涓柟娉�
+    //
+    ////////////////////////////////////////////////////
+    @Override
+    public void call(Object obj) {
+        //绾跨▼宸ヤ綔鎵ц瀹屼簡锛宱bj = Boolean(true)
+        this.thread = null ;//璧嬪�间负null锛屼娇绾跨▼瀵硅薄琚瀮鍦惧洖鏀跺櫒鍥炴敹
+    }
+    @Override
+    public void call(Object... objs) {
+    }
+    @Override
+    public void exception(Exception e) {
+        log.error("杩滅▼鍗囩骇浼烘湇绾跨▼鍙戠敓寮傚父", e);
+    }
+
 }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtu.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtu.java
deleted file mode 100644
index 20bd36a..0000000
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtu.java
+++ /dev/null
@@ -1,178 +0,0 @@
-package com.dy.rtuMw.server.upgrade;
-
-import com.alibaba.fastjson2.annotation.JSONField;
-import com.dy.common.mw.protocol.Command;
-import com.dy.common.mw.protocol.CommandType;
-import com.dy.common.softUpgrade.Com1601Vo;
-import com.dy.common.util.Callback;
-import com.dy.common.util.DateTime;
-import lombok.Data;
-
-/**
- * @Author: liurunyu
- * @Date: 2024/11/4 15:00
- * @Description
- */
-@Data
-public class UpgradeRtu {
-
-    @JSONField(serialize = false)
-    public static final int STATE_UNSTART = 0 ;
-    @JSONField(serialize = false)
-    public static final int STATE_RUNNING = 1 ;
-    @JSONField(serialize = false)
-    public static final int STATE_SUCCESS = 2 ;
-    @JSONField(serialize = false)
-    public static final int STATE_FAILONE = 3 ;
-    @JSONField(serialize = false)
-    public static final int STATE_FAIL = 4 ;
-    @JSONField(serialize = false)
-    public static final int RAMADDRADD = 0x20 ;//绋嬪簭瀛樺偍鍐呭瓨鍦ㄥ潃澧為噺
-
-    @JSONField(serialize = false)
-    private UpgradeTask task ;
-
-    public String rtuAddr ;
-    public int state ;// 0-鏈紑濮嬶紝1-鍗囩骇涓紝2-鍗囩骇鎴愬姛锛�3-鍗囩骇澶辫触锛�1鍖呮锛夛紝4-鍗囩骇澶辫触锛堥潪1鍖呮锛�
-    public int totalPackage ;// 鎬诲寘鏁�
-    public int currentPackage ;// 褰撳墠涓嬪彂鍗囩骇鍖呮暟
-    public int currentRamAddr ;// 褰撳墠涓嬪彂鍗囩骇鍖匯TU瀛樺偍鍦板潃
-    public String lastDownDt ;// 鏈�鍚庝笅鍙戝崌绾ф暟鎹寘鏃堕棿锛坹yyy-mm-dd HH:HH:SS锛�
-    public int reTryTimes ;//鍗囩骇涓嶆垚鍔燂紝閲嶈瘯娆℃暟
-
-    private UpgradeRtu(){
-    }
-
-    public UpgradeRtu(UpgradeTask task, String rtuAddr, int totalPackage) {
-        this.task = task ;
-        this.rtuAddr = rtuAddr ;
-        this.state = STATE_UNSTART ;
-        this.totalPackage = totalPackage ;
-        this.currentPackage = 0 ;
-        this.currentRamAddr = 0 ;
-        this.lastDownDt = "" ;
-        this.reTryTimes = 0 ;
-    }
-
-    /**
-     * 瑙﹀彂鍗囩骇
-     * @param code
-     * @param softData
-     * @param callback
-     */
-    public void trigger(String code, String protocolName, Short protocolVersion, byte[][] softData, Callback callback){
-        if(this.state == STATE_UNSTART){
-            //褰撳墠鏈紑濮嬪崌绾ц繃绋�
-            this.state = STATE_RUNNING;
-            this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-            callback.call(createCommand1601(protocolName, protocolVersion));//涓嬪彂閰嶇疆鎸囦护
-        }else if(this.state == STATE_RUNNING){
-            //褰撳墠鍗囩骇杩囩▼涓�
-            if(code.equals(UpgradeCode.cd_1601)){
-                //涓嬪彂閰嶇疆杩斿洖
-                this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-                callback.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));//涓嬪彂鏁版嵁鍖呮寚浠�
-            }else if(code.equals(UpgradeCode.cd_1602)){
-                //涓嬪彂鏁版嵁鍖呰繑鍥�
-                currentPackage++ ;
-                currentRamAddr += RAMADDRADD ;
-                if(currentPackage < totalPackage){
-                    this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-                    callback.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));
-                }else{
-                    this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-                    callback.call(createCommand1603(protocolName, protocolVersion));//涓嬪彂鏍¢獙鎸囦护
-                }
-            }else if(code.equals(UpgradeCode.cd_1603)){
-                //涓嬪彂鏍¢獙杩斿洖
-                this.state = STATE_SUCCESS ;
-                this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-                callback.call(createCommand1600(protocolName, protocolVersion));//涓嬪彂澶嶄綅鎸囦护锛屾鎸囦护鏃犲簲绛�
-            }else{
-                if(this.state == STATE_FAILONE || this.state == STATE_FAIL){
-                    //宸茬粡鏄崌绾уけ璐ユ��
-                    if(this.reTryTimes < task.failTryTimes){
-                        //褰撳墠鏈紑濮嬪崌绾ц繃绋�
-                        this.reTryTimes += 1 ;
-                        this.state = STATE_RUNNING;
-                        this.currentPackage = 0 ;
-                        this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-                        callback.call(createCommand1601(protocolName, protocolVersion));//涓嬪彂閰嶇疆鎸囦护
-                    }
-                }else{
-                    //闈炲崌绾у姛鑳界爜锛屽鏋滃湪鍗囩骇杩囩▼涓敹鍒拌繖涓姛鑳界爜鐨勪笂琛屾暟鎹紝璇存槑鍗囩骇澶辫触浜�
-                    if(currentPackage == 0 || currentPackage == 1){
-                        //1鍖呮锛屽崌绾уけ璐�
-                        this.state = STATE_FAILONE ;
-                    }else{
-                        //闈�1鍖呮锛屽崌绾уけ璐�
-                        this.state = STATE_FAIL ;
-                    }
-                }
-            }
-        }else{
-            //鍦ㄥ叾浠栫姸鎬佷笅锛屼笉瑙﹀彂浠诲姟宸ヤ綔
-        }
-    }
-
-    public Command createCommand1601(String protocolName, Short protocolVersion){
-        Command com = new Command() ;
-        com.id = Command.defaultId ;
-        com.type = CommandType.outerCommand ;
-        com.rtuAddr = this.rtuAddr ;
-        com.code = UpgradeCode.cd_1601 ;
-        com.protocol = protocolName ;
-        com.protocolVersion = protocolVersion ;
-        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
-
-        Com1601Vo vo = new Com1601Vo() ;
-        vo.softStoreAddr = this.task.softStoreAddr ;
-        vo.softStartAddr = this.task.softStartAddr ;
-        vo.totalByte =  this.task.softBytesCalculate ;
-        vo.softCrc = this.task.softByteSrc16;
-        com.param = vo ;
-        return com ;
-    }
-
-    public Command createCommand1602(String protocolName, Short protocolVersion, int currentPackage, Integer ramAddr, byte[][] softData){
-        Command com = new Command() ;
-        com.id = Command.defaultId ;
-        com.type = CommandType.outerCommand ;
-        com.rtuAddr = this.rtuAddr ;
-        com.code = UpgradeCode.cd_1602 ;
-        com.protocol = protocolName ;
-        com.protocolVersion = protocolVersion ;
-
-        com.param = ramAddr ;
-
-        if(currentPackage < softData.length){
-            com.attachment = softData[currentPackage] ;
-        }
-        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
-        return com ;
-    }
-
-    public Command createCommand1603(String protocolName, Short protocolVersion){
-        Command com = new Command() ;
-        com.id = Command.defaultId ;
-        com.type = CommandType.outerCommand ;
-        com.rtuAddr = this.rtuAddr ;
-        com.code = UpgradeCode.cd_1603 ;
-        com.protocol = protocolName ;
-        com.protocolVersion = protocolVersion ;
-        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
-        return com ;
-    }
-
-    public Command createCommand1600(String protocolName, Short protocolVersion){
-        Command com = new Command() ;
-        com.id = Command.defaultId ;
-        com.type = CommandType.outerCommand ;
-        com.rtuAddr = this.rtuAddr ;
-        com.code = UpgradeCode.cd_1600 ;
-        com.protocol = protocolName ;
-        com.protocolVersion = protocolVersion ;
-        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
-        return com ;
-    }
-}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtuDev.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtuDev.java
new file mode 100644
index 0000000..08b0b4f
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeRtuDev.java
@@ -0,0 +1,194 @@
+package com.dy.rtuMw.server.upgrade;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import com.dy.common.mw.protocol.Command;
+import com.dy.common.mw.protocol.CommandType;
+import com.dy.common.softUpgrade.Com1601Vo;
+import com.dy.common.softUpgrade.state.UpgradeRtu;
+import com.dy.common.util.Callback;
+import com.dy.common.util.DateTime;
+import lombok.Data;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/4 15:00
+ * @Description
+ */
+@Data
+public class UpgradeRtuDev extends UpgradeRtu {
+
+    @JSONField(serialize = false)
+    private UpgradeTask task ;
+
+    private UpgradeRtuDev(){
+    }
+
+    public UpgradeRtuDev(UpgradeTask task, String rtuAddr, int totalPackage) {
+        super();
+        this.task = task ;
+        this.rtuAddr = rtuAddr ;
+        this.state = STATE_UNSTART ;
+        this.totalPackage = totalPackage ;
+        this.currentPackage = 0 ;
+        this.currentRamAddr = 0 ;
+        this.lastDownDt = "" ;
+        this.reTryTimes = 0 ;
+        this.isOver = false ;
+    }
+
+    public UpgradeRtuDev(UpgradeTask task, String rtuAddr, int totalPackage, int state) {
+        super();
+        this.task = task ;
+        this.rtuAddr = rtuAddr ;
+        this.state = state ;
+        this.totalPackage = totalPackage ;
+        this.currentPackage = 0 ;
+        this.currentRamAddr = 0 ;
+        this.lastDownDt = "" ;
+        this.reTryTimes = 0 ;
+        this.isOver = false ;
+    }
+
+    /**
+     * 瑙﹀彂鍗囩骇
+     * @param code
+     * @param softData
+     * @param callbackCom
+     */
+    @Override
+    public void trigger(String code, String protocolName, Short protocolVersion, byte[][] softData, Callback callbackCom){
+        if(this.state == STATE_OFFLINE || this.state == STATE_UNSTART){
+            //褰撳墠鏈紑濮嬪崌绾ц繃绋嬶紝涓嬪彂鍗囩骇閰嶇疆鎸囦护
+            this.setStateAtCom1601Time();
+            callbackCom.call(createCommand1601(protocolName, protocolVersion));
+        }else if(this.state == STATE_RUNNING){
+            //褰撳墠鍗囩骇杩囩▼涓�
+            if(code.equals(UpgradeCode.cd_1601)){
+                //涓嬪彂閰嶇疆杩斿洖
+                this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+                callbackCom.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));//涓嬪彂鏁版嵁鍖呮寚浠�
+            }else if(code.equals(UpgradeCode.cd_1602)){
+                //涓嬪彂鏁版嵁鍖呰繑鍥�
+                currentPackage++ ;
+                currentRamAddr += RAMADDRADD ;
+                if(currentPackage < totalPackage){
+                    this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+                    callbackCom.call(createCommand1602(protocolName, protocolVersion, currentPackage, currentRamAddr, softData));
+                }else{
+                    this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+                    callbackCom.call(createCommand1603(protocolName, protocolVersion));//涓嬪彂鏍¢獙鎸囦护
+                }
+            }else if(code.equals(UpgradeCode.cd_1603)){
+                //涓嬪彂鏍¢獙杩斿洖
+                this.isOver = true ;//鍗囩骇瀹屾垚
+                this.state = STATE_SUCCESS ;
+                this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+                callbackCom.call(createCommand1600(protocolName, protocolVersion));//涓嬪彂澶嶄綅鎸囦护锛屾鎸囦护鏃犲簲绛�
+            }else{
+                if(!this.isOver){
+                    //鍗囩骇鏈畬鎴�
+                    if(this.state == STATE_FAILONE || this.state == STATE_FAIL){
+                        //宸茬粡鏄崌绾уけ璐ユ��
+                        if(this.reTryTimes < task.failTryTimes){
+                            //閲嶈瘯娆℃暟鏈揪鍒颁笂闄愶紝缁х画閲嶈瘯
+                            this.reTryTimes += 1 ;
+                            this.setStateAtCom1601Time();
+                            callbackCom.call(createCommand1601(protocolName, protocolVersion));//涓嬪彂閰嶇疆鎸囦护
+                        }else{
+                            this.isOver = true ;//鍗囩骇瀹屾垚
+                        }
+                    }else{
+                        //闈炲崌绾у姛鑳界爜锛屽鏋滃湪鍗囩骇杩囩▼涓敹鍒拌繖涓姛鑳界爜鐨勪笂琛屾暟鎹紝璇存槑鍗囩骇澶辫触浜�
+                        if(currentPackage == 0 || currentPackage == 1){
+                            //1鍖呮锛屽崌绾уけ璐�
+                            this.state = STATE_FAILONE ;
+                        }else{
+                            //闈�1鍖呮锛屽崌绾уけ璐�
+                            this.state = STATE_FAIL ;
+                        }
+                    }
+                }else{
+                    //鍗囩骇瀹屾垚锛屾棤涓氬姟閫昏緫
+                }
+            }
+        }else{
+            //鍦ㄥ叾浠栫姸鎬佷笅锛屼笉瑙﹀彂浠诲姟宸ヤ綔
+        }
+    }
+
+    /**
+     * 璁剧疆鍙戦�侀厤缃懡浠ゆ椂鍒荤殑鐘舵��
+     */
+    private void setStateAtCom1601Time(){
+        this.state = STATE_RUNNING;
+        this.currentPackage = 0 ;
+        this.currentRamAddr = 0 ;
+        this.isOver = false ;
+        this.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+    }
+
+    @Override
+    public Command createCommand1601(String protocolName, Short protocolVersion){
+        Command com = new Command() ;
+        com.id = Command.defaultId ;
+        com.type = CommandType.outerCommand ;
+        com.rtuAddr = this.rtuAddr ;
+        com.code = UpgradeCode.cd_1601 ;
+        com.protocol = protocolName ;
+        com.protocolVersion = protocolVersion ;
+        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
+
+        Com1601Vo vo = new Com1601Vo() ;
+        vo.softStoreAddr = this.task.taskVo.softStoreAddr ;
+        vo.softStartAddr = this.task.taskVo.softStartAddr ;
+        vo.totalByte =  this.task.taskVo.softBytesCalculate ;
+        vo.softCrc = this.task.taskVo.softByteSrc16;
+        com.param = vo ;
+        return com ;
+    }
+
+    @Override
+    public Command createCommand1602(String protocolName, Short protocolVersion, int currentPackage, Integer ramAddr, byte[][] softData){
+        Command com = new Command() ;
+        com.id = Command.defaultId ;
+        com.type = CommandType.outerCommand ;
+        com.rtuAddr = this.rtuAddr ;
+        com.code = UpgradeCode.cd_1602 ;
+        com.protocol = protocolName ;
+        com.protocolVersion = protocolVersion ;
+
+        com.param = ramAddr ;
+
+        if(currentPackage < softData.length){
+            com.attachment = softData[currentPackage] ;
+        }
+        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
+        return com ;
+    }
+
+    @Override
+    public Command createCommand1603(String protocolName, Short protocolVersion){
+        Command com = new Command() ;
+        com.id = Command.defaultId ;
+        com.type = CommandType.outerCommand ;
+        com.rtuAddr = this.rtuAddr ;
+        com.code = UpgradeCode.cd_1603 ;
+        com.protocol = protocolName ;
+        com.protocolVersion = protocolVersion ;
+        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
+        return com ;
+    }
+
+    @Override
+    public Command createCommand1600(String protocolName, Short protocolVersion){
+        Command com = new Command() ;
+        com.id = Command.defaultId ;
+        com.type = CommandType.outerCommand ;
+        com.rtuAddr = this.rtuAddr ;
+        com.code = UpgradeCode.cd_1600 ;
+        com.protocol = protocolName ;
+        com.protocolVersion = protocolVersion ;
+        com.rtuResultSendWebUrl = Command.ignoreRtuResultSendWebUrl ;
+        return com ;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeState.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeState.java
deleted file mode 100644
index 5832d6a..0000000
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeState.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.dy.rtuMw.server.upgrade;
-
-import lombok.Data;
-
-/**
- * @Author: liurunyu
- * @Date: 2024/11/4 15:14
- * @Description
- */
-@Data
-public class UpgradeState {
-
-    public int rtuTotal ;
-    public int unStartTotal ;
-    public int runningTotal ;
-    public int overTotal ;//缁撴潫锛堝寘鎷垚鍔熶笌鎵�鏈夊け璐ワ級
-    public int successTotal ;//鎵�鏈夋垚鍔�
-    public int failTotal ;//鎵�鏈夊け璐�
-    public int failOneTotal ;//涓�鍖呮澶辫触
-
-    public UpgradeState() {
-        this.rtuTotal = 0;
-        this.unStartTotal = 0;
-        this.runningTotal = 0;
-        this.overTotal = 0;
-        this.successTotal = 0;
-        this.failTotal = 0;
-    }
-}
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java
index 631aacd..e0b3d13 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java
@@ -2,7 +2,9 @@
 
 import com.alibaba.fastjson2.annotation.JSONField;
 import com.dy.common.softUpgrade.parse.HexFileParse;
-import com.dy.common.softUpgrade.parse.HexFileVo;
+import com.dy.common.softUpgrade.state.UpgradeRtu;
+import com.dy.common.softUpgrade.state.UpgradeState;
+import com.dy.common.softUpgrade.state.UpgradeTaskVo;
 import com.dy.common.util.Callback;
 import com.dy.common.util.DateTime;
 import lombok.Data;
@@ -17,30 +19,37 @@
 @Data
 public class UpgradeTask {
 
+    protected static final String TaskOverType_Natural = "鑷劧" ;
+    protected static final String TaskOverType_Force = "寮哄埗" ;
+
     @JSONField(serialize = false)
     protected Integer failTryTimes ;//鍗囩骇澶辫触鍚庯紝閲嶆柊鍋胯瘯鍗囩骇娆℃暟锛�0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
     @JSONField(serialize = false)
     protected Integer ugMaxRtuSameTime ;//鍚屾椂鍗囩骇RTU鏈�澶т釜鏁�
 
     public String setupDt ;//璁剧疆鏃堕棿(yyyy-mm-dd HH:MM:SS)
+    @JSONField(serialize = false)
+    private Long setupDtLong ;//璁剧疆鏃堕棿
 
-    public String softFileName ;//鍗囩骇杞欢锛坔ex锛夋枃浠跺悕绉�
-    public String softStoreAddr ;//鍗囩骇绋嬪簭瀛樻斁鍦板潃(4瀛楄妭锛�8瀛楃HEX瀛楃涓�)锛屽崌绾х▼搴忓湪FLASH涓瓨鏀惧湴鍧�
-    public String softStartAddr ;//绋嬪簭瑕嗙洊璧峰鍦板潃(4瀛楄妭锛�8瀛楃HEX瀛楃涓�)锛岃鍒锋柊绋嬪簭鐨勮捣濮嬪湴鍧�楂樺瓧鑺傚湪鍓� 锛屼綆瀛楄妭鍦ㄥ悗
+    public UpgradeTaskVo taskVo ;//鍗囩骇浠诲姟鍊煎璞�
 
     @JSONField(serialize = false)
-    public byte[][] softData ;//鍗囩骇绋嬪簭鏁版嵁(姣忓寘鏁版嵁鏄�512瀛楄妭)
-    @JSONField(serialize = false)
-    public int softByteSrc16;//鍗囩骇绋嬪簭鏍¢獙鐮� CRC16
-
-    public int softBytesCalculate;//鍗囩骇绋嬪簭瀛楄妭鏁�(鎸夊叕寮忚绠�)
-
-    public List<String> rtuAddrList ;//闇�瑕佸崌绾х殑RTU鍦板潃闆嗗悎
+    protected byte[][] softFileDataGrp ;//浠�512瀛楄妭涓哄崟浣嶆妸鍗囩骇绋嬪簭鏁版嵁鍒嗙粍
 
     @JSONField(serialize = false)
-    public Map<String, UpgradeRtu> upgradeState ;//鍗囩骇鐘舵��
+    protected Map<String, UpgradeRtu> upgradeRtus;//鍗囩骇鐘舵��
+
+    public boolean taskIsOver = false ;//浠诲姟鏄惁瀹屾垚
+    public String taskOverType = "" ;//浠诲姟瀹屾垚鏂瑰紡锛堣嚜鐒讹紝寮哄埗锛�
+    public String taskOverDt = "" ;//浠诲姟瀹屾垚鏃堕棿(yyyy-mm-dd HH:MM:SS)
+
+    ///////////////////////////////////////////////////
+    //浠ヤ笅鍐呴儴鎺у埗鐢�
+    @JSONField(serialize = false)
+    private int curUgRunningRtuTotal = 0 ;//褰撳墠姝e湪鍗囩骇鐨凴TU涓暟
 
     public UpgradeTask() {
+        this.curUgRunningRtuTotal = 0 ;
     }
     /**
      *  鍒濆鍖栭厤缃俊鎭�
@@ -51,70 +60,112 @@
     }
     /**
      * 璁剧疆鍗囩骇浠诲姟
-     * @param softFileName 鍗囩骇绋嬪簭鏂囦欢鍚�
-     * @param softStoreAddr 鍗囩骇绋嬪簭瀛樻斁鍦板潃
-     * @param softStartAddr 绋嬪簭瑕嗙洊璧峰鍦板潃
-     * @param softFileData 鍗囩骇绋嬪簭瀛楄妭鏁扮粍
-     * @param softBytesCalculate 鍗囩骇绋嬪簭瀛楄妭鏁�(鎸夊叕寮忚绠�)
-     * @param rtuAddrList 鍗囩骇RTU
+     * @param taskVo UpgradeTaskVo 鍗囩骇浠诲姟瀵硅薄
      * @throws Exception
      */
-    public void setTask(String softFileName,
-                       String softStoreAddr,
-                       String softStartAddr,
-                       byte[] softFileData,
-                       Integer softBytesCalculate,
-                       List<String> rtuAddrList) throws Exception {
-        if(softFileName == null || softFileName.trim().length() == 0){
+    public void setTask(UpgradeTaskVo taskVo) throws Exception {
+        if(taskVo.id == null || taskVo.id.trim().length() == 0){
+            throw new Exception("鍗囩骇浠诲姟id蹇呴』鎻愪緵") ;
+        }
+       if(taskVo.softFileName == null || taskVo.softFileName.trim().length() == 0){
             throw new Exception("鍗囩骇杞欢锛坔ex锛夋枃浠跺悕绉板繀椤绘彁渚�") ;
         }
-        if(softStoreAddr == null || softStoreAddr.trim().length() != 8){
+        if(taskVo.softStoreAddr == null || taskVo.softStoreAddr.trim().length() != 8){
             throw new Exception("鍗囩骇绋嬪簭瀛樻斁鍦板潃涓嶅悎娉曪紝蹇呴』鏄�8瀛楃锛堝崄鍏繘鍒讹級鐨勫瓧绗︿覆") ;
         }
-        if(softStartAddr == null || softStartAddr.trim().length() != 8){
+        if(taskVo.softStartAddr == null || taskVo.softStartAddr.trim().length() != 8){
             throw new Exception("绋嬪簭瑕嗙洊璧峰鍦板潃涓嶅悎娉曪紝蹇呴』鏄�8瀛楃锛堝崄鍏繘鍒讹級鐨勫瓧绗︿覆") ;
         }
-        if(softFileData == null || softFileData.length <= 0){
+        if(taskVo.softFileData == null || taskVo.softFileData.length <= 0){
             throw new Exception("鍗囩骇绋嬪簭鍐呭蹇呴』鎻愪緵") ;
         }
-        if(rtuAddrList == null || rtuAddrList.size() <= 0){
+        if(taskVo.softBytesCalculate == null){
+            throw new Exception("鍏紡璁$畻鍗囩骇绋嬪簭鏈夋晥搴忓瓧鑺傛暟蹇呴』鎻愪緵") ;
+        }
+       if(taskVo.softByteSrc16 == null){
+            throw new Exception("鏈夋晥鍗囩骇绋嬪簭瀛楄妭鏁癈RC16鏍¢獙鍊煎繀椤绘彁渚�") ;
+        }
+        if(taskVo.rtuAddrList == null || taskVo.rtuAddrList.size() <= 0){
             throw new Exception("鍗囩骇璁惧RTU鍦板潃蹇呴』鎻愪緵") ;
         }
+        if(taskVo.callbackWebUrl == null || taskVo.callbackWebUrl.trim().equals("")){
+            throw new Exception("鍥炶皟缃戝潃蹇呴』鎻愪緵") ;
+        }
         this.setupDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
-        this.softFileName = softFileName;
-        this.softStoreAddr = softStoreAddr;
-        this.softStartAddr = softStartAddr;
-        this.softBytesCalculate = softBytesCalculate;
-        this.rtuAddrList = rtuAddrList;
+        this.setupDtLong = System.currentTimeMillis() ;
+        this.taskVo = taskVo ;
 
-        this.upgradeState = new HashMap<>();
-        if(softFileData != null && softFileData.length >0){
-            HexFileVo vo = new HexFileParse().doParse(softFileData);
-            this.softData = vo.listByte512.toArray(new byte[0][]);
-            this.softByteSrc16 = vo.bytesCrc16 ;
+        this.upgradeRtus = new HashMap<>();
+        if(taskVo.softFileData != null && taskVo.softFileData.length >0){
+            List<byte[]> listBytes = new HexFileParse().splitBytesByUnit512(taskVo.softFileData);
+            this.softFileDataGrp = listBytes.toArray(new byte[0][]);
+            for(String rtuAddr : this.taskVo.rtuAddrList){
+                //姝ゆ椂鐘舵�佽缃垚绂荤嚎鐘舵��
+                UpgradeRtuDev ugRtu = new UpgradeRtuDev(this, rtuAddr, this.taskVo.softFileData.length, UpgradeRtuDev.STATE_OFFLINE) ;
+                this.upgradeRtus.put(rtuAddr, ugRtu) ;
+            }
         }
     }
     /**
      * RTU鏈変笂琛屾暟鎹簡锛岃Е鍙戜笅鍙戝崌绾ф暟鎹�
      * @param rtuAddr
      * @param code
-     * @param callback
+     * @param callbackCom
      */
-    public void trigger(String rtuAddr, String code, String protocolName, Short protocolVersion, Callback callback){
-        if(upgradeState != null && upgradeState.size() > 0
-                && rtuAddrList != null && rtuAddrList.size() > 0){
-            UpgradeRtu info = upgradeState.get(rtuAddr) ;
-            if(info == null){
-                if(rtuAddrList.contains(rtuAddr)){
-                    info = new UpgradeRtu(this, rtuAddr, softData.length) ;
-                    upgradeState.put(rtuAddr, info) ;
+    public void trigger(String rtuAddr, String code, String protocolName, Short protocolVersion, Callback callbackCom){
+        if(this.upgradeRtus != null && this.upgradeRtus.size() > 0
+                && this.taskVo.rtuAddrList != null && this.taskVo.rtuAddrList.size() > 0){
+            UpgradeRtu ugRtu = this.upgradeRtus.get(rtuAddr) ;
+            if(ugRtu == null){
+                //鏍规嵁鏂规硶setTask鐨勯�昏緫锛屽彧瑕丷TU鍦ㄥ崌绾т箣鍒楋紝姝ゅugRtuState涓�瀹氫笉涓簄ull
+                //涓轰繚闄╋紝瀹炵幇涓嬮潰閫昏緫
+                if(taskVo.rtuAddrList.contains(rtuAddr)){
+                    ugRtu = new UpgradeRtuDev(this, rtuAddr, this.taskVo.softFileData.length) ;
+                    upgradeRtus.put(rtuAddr, ugRtu) ;
                 }else{
                     //rtu涓嶅湪鍗囩骇涔嬪垪
                     return ;
                 }
             }
-            if(info != null){
-                info.trigger(code, protocolName, protocolVersion, this.softData, callback) ;
+            if(ugRtu != null){
+                if(ugRtu.isOver){
+                    //褰撳墠RTU宸茬粡鍗囩骇瀹屾垚锛屾棤闇�鍐嶅崌绾�
+                    return;
+                }else{
+                    if(UpgradeUnit.confVo.ugMaxRtuAtOnce > 0){
+                        //璁剧疆浜嗗悓鏃跺崌绾х殑RTU鏈�澶ф暟閲忕殑闄愬埗
+                        if(ugRtu.state == UpgradeRtuDev.STATE_OFFLINE){
+                            //鍒濆鎬侊紝璇存槑鍗囩骇浠诲姟璁剧疆浠ユ潵锛岃RTU绗竴娆′笂琛屾暟鎹�
+                            if(this.curUgRunningRtuTotal <= UpgradeUnit.confVo.ugMaxRtuAtOnce){
+                                //褰撳墠姝e湪鍗囩骇鐨凴TU鏁伴噺杩樻湭鍙楅檺
+                                ugRtu.trigger(code, protocolName, protocolVersion, this.softFileDataGrp, callbackCom) ;
+                            }else{
+                                //鍚屾椂鍗囩骇鐨凴TU鏁伴噺鍙楅檺锛岀瓑寰呬笅娆℃満浼�
+                                //浣嗗厛琛ㄦ槑涓�涓嬬姸鎬�
+                                ugRtu.state = UpgradeRtuDev.STATE_UNSTART ;
+                                return ;
+                            }
+                        }else if(ugRtu.state == UpgradeRtuDev.STATE_UNSTART){
+                            //鏍规嵁涓婇潰閫昏緫锛� 璇存槑蹇呯劧鍦ㄧ嚎浜�
+                            if(this.curUgRunningRtuTotal <= UpgradeUnit.confVo.ugMaxRtuAtOnce){
+                                //褰撳墠姝e湪鍗囩骇鐨凴TU鏁伴噺杩樻湭鍙楅檺
+                                ugRtu.trigger(code, protocolName, protocolVersion, this.softFileDataGrp, callbackCom) ;
+                            }else{
+                                //鍚屾椂鍗囩骇鐨凴TU鏁伴噺鍙楅檺锛岀瓑寰呬笅娆℃満浼�
+                                return ;
+                            }
+                        }else{
+                            //RTU宸茬粡澶勪簬鍗囩骇杩囩▼涓�
+                            ugRtu.trigger(code, protocolName, protocolVersion, this.softFileDataGrp, callbackCom) ;
+                        }
+                    }else{
+                        //娌℃湁璁剧疆鍚屾椂鍗囩骇鐨凴TU鏈�澶ф暟閲忕殑闄愬埗
+                         ugRtu.trigger(code, protocolName, protocolVersion, this.softFileDataGrp, callbackCom) ;
+                    }
+                }
+            }else{
+                //rtu涓嶅湪鍗囩骇涔嬪垪
+                return ;
             }
         }
     }
@@ -123,29 +174,11 @@
      * 寮哄埗缁撴潫鍗囩骇浠诲姟
      */
     public void forceOver(){
-        this.rtuAddrList.clear();
-        this.upgradeState.clear();
-    }
-
-    /**
-     * 鍗囩骇浠诲姟鏄惁瀹屾垚
-     * @return
-     */
-    public boolean isOver() {
-        boolean isOver = true ;
-        if(upgradeState != null && upgradeState.size() > 0){
-            Collection<UpgradeRtu> col = upgradeState.values() ;
-            for(UpgradeRtu info : col){
-                if(info.state == UpgradeRtu.STATE_UNSTART){
-                    isOver = false ;
-                    break ;
-                }else if(info.state == UpgradeRtu.STATE_RUNNING){
-                    isOver = false ;
-                    break ;
-                }
-            }
-        }
-        return isOver ;
+        this.taskIsOver = true ;//寮哄埗璁剧疆浠诲姟瀹屾垚
+        this.taskOverType = TaskOverType_Force ;//浠诲姟瀹屾垚鏂瑰紡锛堣嚜鐒讹紝寮哄埗锛�
+        this.taskOverDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;//浠诲姟瀹屾垚鏃堕棿(yyyy-mm-dd HH:MM:SS)
+        //this.taskVo.rtuAddrList.clear();
+        //this.upgradeState.clear();
     }
 
     /**
@@ -154,24 +187,26 @@
      */
     public UpgradeState currentUpgradeState() {
         UpgradeState state = new UpgradeState() ;
-        if(rtuAddrList != null && rtuAddrList.size() > 0){
-            state.rtuTotal = rtuAddrList.size() ;
-            if(upgradeState != null && upgradeState.size() > 0){
-                Collection<UpgradeRtu> col = upgradeState.values() ;
+        if(this.taskVo.rtuAddrList != null && this.taskVo.rtuAddrList.size() > 0){
+            state.rtuTotal = this.taskVo.rtuAddrList.size() ;
+            if(this.upgradeRtus != null && this.upgradeRtus.size() > 0){
+                Collection<UpgradeRtu> col = this.upgradeRtus.values() ;
                 for(UpgradeRtu info : col){
-                    if(info.state == UpgradeRtu.STATE_UNSTART){
+                    if(info.state == UpgradeRtuDev.STATE_OFFLINE){
+                        state.offLineTotal ++ ;
+                    }else if(info.state == UpgradeRtuDev.STATE_UNSTART){
                         state.unStartTotal ++ ;
-                    }else if(info.state == UpgradeRtu.STATE_RUNNING){
+                    }else if(info.state == UpgradeRtuDev.STATE_RUNNING){
                         state.runningTotal ++ ;
-                    }else if(info.state == UpgradeRtu.STATE_SUCCESS) {
+                    }else if(info.state == UpgradeRtuDev.STATE_SUCCESS) {
                         state.successTotal++;
-                        state.overTotal++;
-                    }else if(info.state == UpgradeRtu.STATE_FAILONE) {
+                    }else if(info.state == UpgradeRtuDev.STATE_FAILONE) {
                         state.failOneTotal++;
                         state.failTotal++;
-                        state.overTotal++;
-                    }else if(info.state == UpgradeRtu.STATE_FAIL) {
+                    }else if(info.state == UpgradeRtuDev.STATE_FAIL) {
                         state.failTotal++;
+                    }
+                    if(info.isOver){
                         state.overTotal++;
                     }
                 }
@@ -186,23 +221,84 @@
      * @return
     */
     public UpgradeRtu upgradeInfos(String rtuAddr){
-        return upgradeState.get(rtuAddr) ;
+        return this.upgradeRtus.get(rtuAddr) ;
     }
 
     /**
-     * Rtu鍗囩骇淇℃伅
+     * 涓�浜汻tu鍗囩骇淇℃伅
      * @param rtuAddrList
      * @return
      */
     public List<UpgradeRtu> upgradeInfos(List<String> rtuAddrList){
         List<UpgradeRtu> list = new ArrayList<>() ;
         for(String rtuAddr : rtuAddrList){
-            UpgradeRtu info = upgradeState.get(rtuAddr) ;
+            UpgradeRtu info = this.upgradeRtus.get(rtuAddr) ;
             if(info != null){
                 list.add(info) ;
             }
         }
         return list ;
     }
+    /**
+     * 鍏ㄩ儴Rtu鍗囩骇淇℃伅
+     * @return
+     */
+    public List<UpgradeRtu> upgradeInfoAll(){
+        if(this.upgradeRtus != null && this.upgradeRtus.size() > 0){
+            return this.upgradeRtus.values().stream().toList();
+        }else{
+            return null ;
+        }
+    }
 
+    ///////////////////////////////////////////////////////////
+    //浠ヤ笅鏂规硶涓哄唴閮ㄦ湇鍔★紝涓嶅澶栨彁渚涙湇鍔�
+    ///////////////////////////////////////////////////////////
+    /**
+     * 缁熻褰撳墠姝e湪鍗囩骇鐨凴TU鏁伴噺锛屼负鍙楅檺鍚屾椂鍗囩骇鏁伴噺鍋氬噯澶�
+     */
+    protected void statisticsRunningRtuCount(){
+        int runningTotal = 0 ;
+        Collection<UpgradeRtu> col = this.upgradeRtus.values() ;
+        for(UpgradeRtu info : col){
+            if(info.state == UpgradeRtu.STATE_RUNNING){
+                runningTotal ++ ;
+            }
+        }
+        this.curUgRunningRtuTotal = runningTotal ;
+    }
+
+    /**
+     * 缁熻闇�瑕佸崌绾т絾褰撳墠绂荤嚎RTU鐨勬儏鍐�
+     */
+    protected void statisticsOffRtuCountAndSet() {
+        Long now = System.currentTimeMillis() ;
+        if(now - this.setupDtLong > UpgradeUnit.confVo.rtuOffLineWaitDuration){
+            //rtu绂荤嚎锛岀瓑寰呭叾鍗囩骇鐨勬椂闀�(姣)锛岃秴杩囬厤缃殑鏈�澶ф椂闀匡紝璁剧疆鍏跺崌绾уけ璐ワ紝涓旇缃崌绾т换鍔″畬鎴�
+            if (this.taskVo.rtuAddrList != null && this.taskVo.rtuAddrList.size() > 0) {
+                Collection<UpgradeRtu> col = this.upgradeRtus.values() ;
+                for(UpgradeRtu info : col){
+                    if(info.state == UpgradeRtu.STATE_OFFLINE){
+                        info.isOver = true ;
+                        info.state = UpgradeRtu.STATE_FAILOFFLINE ;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 缁熻鏄惁鍗囩骇鍏ㄩ儴缁撴潫
+     */
+    protected boolean statisticsIsAllOver() {
+        if (this.taskVo.rtuAddrList != null && this.taskVo.rtuAddrList.size() > 0) {
+            Collection<UpgradeRtu> col = this.upgradeRtus.values() ;
+            for(UpgradeRtu info : col){
+                if(info.isOver == false){
+                    return false ;
+                }
+            }
+        }
+        return true ;
+    }
 }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnit.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnit.java
index 9308d9d..e923f27 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnit.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnit.java
@@ -3,9 +3,8 @@
 import com.dy.common.mw.UnitAdapterInterface;
 import com.dy.common.mw.UnitCallbackInterface;
 import com.dy.common.mw.UnitInterface;
+import com.dy.common.softUpgrade.state.UpgradeTaskVo;
 import com.dy.common.util.Callback;
-
-import java.util.List;
 
 /**
  * @Author: liurunyu
@@ -57,34 +56,19 @@
 
     @Override
     public void stop(UnitCallbackInterface callback) throws Exception {
-        stopUpgradeTask() ;
+        overUpgradeTask() ;
     }
 
 
 
     /**
      * 璁剧疆鍗囩骇浠诲姟
-     * @param softFileName 鍗囩骇绋嬪簭鏂囦欢鍚�
-     * @param softStoreAddr 鍗囩骇绋嬪簭瀛樻斁鍦板潃
-     * @param softStartAddr 绋嬪簭瑕嗙洊璧峰鍦板潃
-     * @param softFileData 鍗囩骇绋嬪簭瀛楄妭鏁扮粍
-     * @param softBytesCalculate 鍗囩骇绋嬪簭瀛楄妭鏁�(鎸夊叕寮忚绠�)
-    * @param rtuAddrList 鍗囩骇RTU
+     * @param vo UpgradeTaskVo 鍗囩骇浠诲姟瀵硅薄
      * @throws Exception
      */
-    public void setUpgradeTask(String softFileName,
-                               String softStoreAddr,
-                               String softStartAddr,
-                               byte[] softFileData,
-                               Integer softBytesCalculate,
-                               List<String> rtuAddrList) throws Exception {
+    public void setUpgradeTask(UpgradeTaskVo vo) throws Exception {
         if(manager != null ){
-            manager.setUpgradeTask(softFileName,
-                    softStoreAddr,
-                    softStartAddr,
-                    softFileData,
-                    softBytesCalculate,
-                    rtuAddrList) ;
+            manager.setUpgradeTask(vo) ;
         }
     }
 
@@ -92,9 +76,9 @@
      * 鍋滄褰撳墠鍗囩骇浠诲姟
      * @throws Exception
      */
-    public void stopUpgradeTask() throws Exception {
+    public void overUpgradeTask() throws Exception {
         if(manager != null ){
-            manager.stopUpgradeTask() ;
+            manager.overUpgradeTask() ;
         }
     }
 
@@ -118,37 +102,44 @@
     /**
      * 褰撳墠鍗囩骇鐘舵��
      * @return
-     */
     public UpgradeState currentUpgradeState() {
         if(manager != null ){
             return manager.currentUpgradeState();
         }
         return null ;
-    }
+    }*/
 
     /**
      * Rtu鍗囩骇淇℃伅
      * @param rtuAddr
      * @return
-     */
-    public UpgradeRtu upgradeInfos(String rtuAddr){
+    public UpgradeRtuDev upgradeRtuInfo(String rtuAddr){
         if(manager != null ){
             return manager.upgradeInfos(rtuAddr);
         }
         return null ;
-    }
+    }*/
 
     /**
      * Rtu鍗囩骇淇℃伅
      * @param rtuAddrList
      * @return
-     */
-    public List<UpgradeRtu> upgradeInfos(List<String> rtuAddrList){
+    public List<UpgradeRtuDev> upgradeRtuInfos(List<String> rtuAddrList){
         if(manager != null ){
             return manager.upgradeInfos(rtuAddrList);
         }
         return null ;
-    }
+    }*/
+
+    /**
+     * Rtu鍗囩骇淇℃伅
+     * @return
+    public List<UpgradeRtuDev> upgradeRtuInfoAll(){
+        if(manager != null ){
+            return manager.upgradeInfoAll();
+        }
+        return null ;
+    }*/
 
 }
 
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnitConfigVo.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnitConfigVo.java
index 13e8350..5cc3ea9 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnitConfigVo.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeUnitConfigVo.java
@@ -9,12 +9,16 @@
 
     public Boolean showStartInfo ;
     public Boolean enable ;//妯″潡鏄惁鍚姩
-    public Integer failTryTimes ;//鍗囩骇澶辫触鍚庯紝閲嶆柊鍋胯瘯鍗囩骇娆℃暟锛�0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
-    public Integer ugMaxRtuSameTime ;//鍚屾椂鍗囩骇RTU鏈�澶т釜鏁�
+    public Integer failTryTimes ;//鍗囩骇澶辫触鍚庯紙閽堝鐨勬槸鍦ㄧ嚎杩涜浜嗗崌绾т笅鍙戝懡浠わ級锛岄噸鏂板伩璇曞崌绾ф鏁帮紝0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
+    public Integer ugMaxRtuAtOnce;//涓轰簡缂撹В閫氫俊涓棿浠剁殑鍘嬪姏锛屽悓鏃舵敮鎸佸崌绾х殑RTU鍙版暟
+    public Integer rtuOffLineWaitDuration;//rtu绂荤嚎锛岀瓑寰呭叾鍗囩骇鐨勬椂闀�(姣)锛岃秴杩囪繖涓椂闂达紝璁剧疆鍏跺崌绾уけ璐ワ紝涓旇缃崌绾т换鍔″畬鎴�
+    public Integer notifyStateInterval;//鍗囩骇鐘舵�侀�氱煡闂撮殧锛堟绉掞級
 
     public UpgradeUnitConfigVo(){
         this.enable = false ;
         this.failTryTimes = 0 ;
-        this.failTryTimes = 1000000 ;
+        this.ugMaxRtuAtOnce = Integer.MAX_VALUE ;
+        this.rtuOffLineWaitDuration = 10 * 60 * 60 * 1000 ;
+        this.notifyStateInterval = 2000 ;
     }
 }
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/com/CommandCtrl.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/com/CommandCtrl.java
index 3541104..46ad9d1 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/com/CommandCtrl.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/com/CommandCtrl.java
@@ -1,5 +1,6 @@
 package com.dy.rtuMw.web.com;
 
+import com.dy.common.softUpgrade.state.UpgradeTaskVo;
 import com.dy.rtuMw.resource.ResourceUnit;
 import com.dy.rtuMw.server.ServerProperties;
 import com.dy.rtuMw.server.forTcp.TcpSessionCache;
@@ -11,6 +12,7 @@
 import com.dy.common.mw.protocol.CommandType;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.rtuMw.server.upgrade.UpgradeUnit;
 import jakarta.servlet.ServletOutputStream;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -142,6 +144,23 @@
         }
     }
     /**
+     * 鎺ユ敹web绯荤粺鍙戞潵鍗囩骇浠诲姟
+     * @param vo
+     * @return
+     */
+    @PostMapping(path = "upgradeRtu", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public BaseResponse<Boolean> upgradeRtu(@RequestBody UpgradeTaskVo vo) {
+        log.info("鏀跺埌RTU鍗囩骇浠诲姟锛歕n" + vo.toString()) ;
+        try{
+            UpgradeUnit.getInstance().setUpgradeTask(vo);
+        }catch (Exception e){
+            log.error("璁剧疆RTU鍗囩骇浠诲姟鏃跺彂鐢熷紓甯�", e);
+            return BaseResponseUtils.buildError("璁剧疆RTU鍗囩骇浠诲姟鏃跺彂鐢熷紓甯�" + (e.getMessage() == null?"":("锛�" + e.getMessage())));
+        }
+        return BaseResponseUtils.buildSuccess(true);
+    }
+
+    /**
      * 鎺ユ敹web绯荤粺鍙戞潵鐨勫懡浠�
      * @param com
      * @return
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/comResult/CommandResultDeal.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/comResult/CommandResultDeal.java
index 58b046e..4049247 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/comResult/CommandResultDeal.java
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/comResult/CommandResultDeal.java
@@ -47,6 +47,7 @@
                 // 閫氳繃Post鏂瑰紡璋冪敤鎺ュ彛
                 response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, WebResponseVo.class);
             } catch (Exception e) {
+                log.error("鍛戒护缁撴灉鍥炶皟鍙戠敓寮傚父", e);
                 e.printStackTrace();
             }
             //assert response != null;
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/webRequest/WebRequestDeal.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/webRequest/WebRequestDeal.java
new file mode 100644
index 0000000..5a422e2
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/web/webRequest/WebRequestDeal.java
@@ -0,0 +1,56 @@
+package com.dy.rtuMw.web.webRequest;
+
+import com.dy.common.mw.protocol.Command;
+import com.dy.rtuMw.web.comResult.WebResponseVo;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/11 16:29
+ * @Description
+ */
+@Component()
+public class WebRequestDeal {
+
+    private static final Logger log = LogManager.getLogger(WebRequestDeal.class.getName());
+
+    private RestTemplate restTemplate;
+
+    @Autowired
+    public void setRestTemplate(RestTemplate restTemplate){
+        this.restTemplate = restTemplate ;
+    }
+
+    public void deal(String webUrl, Object obj) {
+        if (webUrl != null
+                && !webUrl.trim().equals("")
+                && !webUrl.trim().equals(Command.ignoreRtuResultSendWebUrl)) {
+            String url = UriComponentsBuilder.fromUriString(webUrl)
+                    .build()
+                    .toUriString();
+            restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8));
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
+            HttpEntity<?> httpEntity = new HttpEntity<>(obj, headers);
+            ResponseEntity<WebResponseVo> response = null;
+            try {
+                // 閫氳繃Post鏂瑰紡璋冪敤鎺ュ彛
+                response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, WebResponseVo.class);
+            } catch (Exception e) {
+                log.error("web璁块棶璇锋眰鍙戠敓寮傚父", e);
+            }
+            //assert response != null;
+        } else {
+            log.error("涓ラ噸閿欒锛寃eb璁块棶鐨刄RL涓虹┖");
+        }
+    }
+}
diff --git "a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050sp\346\262\231\347\233\230\051.xml" "b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050sp\346\262\231\347\233\230\051.xml"
index c6199ea..50849b5 100644
--- "a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050sp\346\262\231\347\233\230\051.xml"
+++ "b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050sp\346\262\231\347\233\230\051.xml"
@@ -56,9 +56,17 @@
 
 	<!-- RTU 杞欢鍗囩骇
 	enable: 妯″潡鏄惁鍚姩
-	failTryTimes锛氬崌绾уけ璐ュ悗锛岄噸鏂板伩璇曞崌绾ф鏁帮紝0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
+	failTryTimes锛氬崌绾уけ璐ュ悗锛堥拡瀵圭殑鏄湪绾胯繘琛屼簡鍗囩骇涓嬪彂鍛戒护锛夛紝閲嶆柊鍋胯瘯鍗囩骇娆℃暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉閲嶆柊鍋胯瘯鍗囩骇
+	ugMaxRtuAtOnce锛氫负浜嗙紦瑙i�氫俊涓棿浠剁殑鍘嬪姏锛屽悓鏃舵敮鎸佸崌绾х殑RTU鍙版暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉鍙楅檺鍒�
+	rtuOffLineWaitDuration: rtu绂荤嚎锛岀瓑寰呭叾鍗囩骇鐨勬椂闀匡紙绉掞級锛岃秴杩囪繖涓椂闂达紝璁剧疆鍏跺崌绾уけ璐ワ紝涓旇缃崌绾т换鍔″畬鎴�
+	notifyStateInterval: 鍗囩骇鐘舵�侀�氱煡闂撮殧锛堢锛�
 	-->
-	<upgrade enable="true" failTryTimes="0" ugMaxRtuSameTime="1000" />
+	<upgrade enable="true"
+			 failTryTimes="1"
+			 ugMaxRtuAtOnce="1000"
+			 rtuOffLineWaitDuration="1200"
+			 notifyStateInterval="2"
+	/>
 
 	<!--
     鏀寔妯″潡
diff --git "a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050test\346\265\213\350\257\225\051.xml" "b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050test\346\265\213\350\257\225\051.xml"
index 1d9e0bb..7270793 100644
--- "a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050test\346\265\213\350\257\225\051.xml"
+++ "b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050test\346\265\213\350\257\225\051.xml"
@@ -56,9 +56,17 @@
 
 	<!-- RTU 杞欢鍗囩骇
 	enable: 妯″潡鏄惁鍚姩
-	failTryTimes锛氬崌绾уけ璐ュ悗锛岄噸鏂板伩璇曞崌绾ф鏁帮紝0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
+	failTryTimes锛氬崌绾уけ璐ュ悗锛堥拡瀵圭殑鏄湪绾胯繘琛屼簡鍗囩骇涓嬪彂鍛戒护锛夛紝閲嶆柊鍋胯瘯鍗囩骇娆℃暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉閲嶆柊鍋胯瘯鍗囩骇
+	ugMaxRtuAtOnce锛氫负浜嗙紦瑙i�氫俊涓棿浠剁殑鍘嬪姏锛屽悓鏃舵敮鎸佸崌绾х殑RTU鍙版暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉鍙楅檺鍒�
+	rtuOffLineWaitDuration: rtu绂荤嚎锛岀瓑寰呭叾鍗囩骇鐨勬椂闀匡紙绉掞級锛岃秴杩囪繖涓椂闂达紝璁剧疆鍏跺崌绾уけ璐ワ紝涓旇缃崌绾т换鍔″畬鎴�
+	notifyStateInterval: 鍗囩骇鐘舵�侀�氱煡闂撮殧锛堢锛�
 	-->
-	<upgrade enable="true" failTryTimes="0" ugMaxRtuSameTime="1000" />
+	<upgrade enable="true"
+			 failTryTimes="1"
+			 ugMaxRtuAtOnce="1000"
+			 rtuOffLineWaitDuration="1200"
+			 notifyStateInterval="2"
+	/>
 
 	<!--
     鏀寔妯″潡
diff --git "a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050ym\345\205\203\350\260\213\051.xml" "b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050ym\345\205\203\350\260\213\051.xml"
index 271c312..b061c20 100644
--- "a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050ym\345\205\203\350\260\213\051.xml"
+++ "b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config\050ym\345\205\203\350\260\213\051.xml"
@@ -56,9 +56,17 @@
 
 	<!-- RTU 杞欢鍗囩骇
 	enable: 妯″潡鏄惁鍚姩
-	failTryTimes锛氬崌绾уけ璐ュ悗锛岄噸鏂板伩璇曞崌绾ф鏁帮紝0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
+	failTryTimes锛氬崌绾уけ璐ュ悗锛堥拡瀵圭殑鏄湪绾胯繘琛屼簡鍗囩骇涓嬪彂鍛戒护锛夛紝閲嶆柊鍋胯瘯鍗囩骇娆℃暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉閲嶆柊鍋胯瘯鍗囩骇
+	ugMaxRtuAtOnce锛氫负浜嗙紦瑙i�氫俊涓棿浠剁殑鍘嬪姏锛屽悓鏃舵敮鎸佸崌绾х殑RTU鍙版暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉鍙楅檺鍒�
+	rtuOffLineWaitDuration: rtu绂荤嚎锛岀瓑寰呭叾鍗囩骇鐨勬椂闀匡紙绉掞級锛岃秴杩囪繖涓椂闂达紝璁剧疆鍏跺崌绾уけ璐ワ紝涓旇缃崌绾т换鍔″畬鎴�
+	notifyStateInterval: 鍗囩骇鐘舵�侀�氱煡闂撮殧锛堢锛�
 	-->
-	<upgrade enable="true" failTryTimes="0" ugMaxRtuSameTime="1000" />
+	<upgrade enable="true"
+			 failTryTimes="1"
+			 ugMaxRtuAtOnce="1000"
+			 rtuOffLineWaitDuration="1200"
+			 notifyStateInterval="2"
+	/>
 
 	<!--
     鏀寔妯″潡
diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
index 037768a..d004b59 100644
--- a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
@@ -56,9 +56,17 @@
 
 	<!-- RTU 杞欢鍗囩骇
 	enable: 妯″潡鏄惁鍚姩
-	failTryTimes锛氬崌绾уけ璐ュ悗锛岄噸鏂板伩璇曞崌绾ф鏁帮紝0琛ㄧず涓嶉噸鏂板伩璇曞崌绾�
+	failTryTimes锛氬崌绾уけ璐ュ悗锛堥拡瀵圭殑鏄湪绾胯繘琛屼簡鍗囩骇涓嬪彂鍛戒护锛夛紝閲嶆柊鍋胯瘯鍗囩骇娆℃暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉閲嶆柊鍋胯瘯鍗囩骇
+	ugMaxRtuAtOnce锛氫负浜嗙紦瑙i�氫俊涓棿浠剁殑鍘嬪姏锛屽悓鏃舵敮鎸佸崌绾х殑RTU鍙版暟锛屽綋璁剧疆涓�0鏃惰〃绀轰笉鍙楅檺鍒�
+	rtuOffLineWaitDuration: rtu绂荤嚎锛岀瓑寰呭叾鍗囩骇鐨勬椂闀匡紙绉掞級锛岃秴杩囪繖涓椂闂达紝璁剧疆鍏跺崌绾уけ璐ワ紝涓旇缃崌绾т换鍔″畬鎴�
+	notifyStateInterval: 鍗囩骇鐘舵�侀�氱煡闂撮殧锛堢锛�
 	-->
-	<upgrade enable="true" failTryTimes="0" ugMaxRtuSameTime="1000" />
+	<upgrade enable="true"
+			 failTryTimes="1"
+			 ugMaxRtuAtOnce="1000"
+			 rtuOffLineWaitDuration="1200"
+			 notifyStateInterval="2"
+	/>
 
 	<!--
     鏀寔妯″潡

--
Gitblit v1.8.0