From d79d2f12c82cac10ba28117a9ee49bc5fdc2842d Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期三, 13 十一月 2024 16:05:28 +0800
Subject: [PATCH] 1、完善通信中间件远程升级任务模块; 2、web端实现升级任务发布执行功能; 3、web端实现升级任务执行监视功能; 4、web端添加模拟升级过程逻辑。

---
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/UgRtuController.java                                |   42 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/CurUpgradeStateVo.java           |   24 ++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java              |   35 +++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUpgradeDetail.java                                  |   36 +++
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuTaskMapper.java                                 |   15 +
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuTaskMapper.xml                                                |   37 ++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java                |   51 +++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java |  245 +++++++++++++++++++++++
 pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuControllerMapper.xml                                          |   53 ++++
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java                         |   14 
 pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java                                |    2 
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuControllerMapper.java                           |    8 
 12 files changed, 530 insertions(+), 32 deletions(-)

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
index e7ee7f7..09b02b9 100644
--- 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
@@ -37,7 +37,7 @@
     public int currentRamAddr ;// 褰撳墠涓嬪彂鍗囩骇鍖匯TU瀛樺偍鍦板潃
     public String lastDownDt ;// 鏈�鍚庝笅鍙戝崌绾ф暟鎹寘鏃堕棿锛坹yyy-mm-dd HH:HH:SS锛�
     public int reTryTimes ;//鍗囩骇涓嶆垚鍔燂紝閲嶈瘯娆℃暟
-    public boolean isOver ;
+    public boolean isOver ;//鏄惁鍗囩骇杩囩▼缁撴潫锛�1锛氱粨鏉燂紝0锛氭湭缁撴潫
 
     public String toString(){
         StringBuilder sb = new StringBuilder();
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuControllerMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuControllerMapper.java
index a40bec4..a71e642 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuControllerMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuControllerMapper.java
@@ -1,7 +1,6 @@
 package com.dy.pipIrrGlobal.daoRm;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.dy.pipIrrGlobal.pojoRm.RmWorkReportHistory;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuController;
 import com.dy.pipIrrGlobal.voPr.VoController;
 import org.apache.ibatis.annotations.Mapper;
@@ -111,4 +110,11 @@
      * @return update count
      */
     int updateByPrimaryKey(UgRtuController record);
+
+    /**
+     * 鏇存柊鍗囩骇RTU鐨勫崌绾у畬鎴愮姸鎬�
+     * @param params
+     * @return
+     */
+    int updateRtuUpgradeState(Map<?, ?> params) ;
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuTaskMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuTaskMapper.java
index fc74ad8..e3f4419 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuTaskMapper.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuTaskMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuProgram;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuTask;
+import com.dy.pipIrrGlobal.voRm.VoUpgradeDetail;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
@@ -64,12 +65,24 @@
      * */
     List<UgRtuTask> selectSome(Map<?,?> params) ;
 
-
     /**
      * 寰楀埌鎵�鏈夊崌绾х▼搴忚褰旾D鍜屾枃浠跺悕绉�
      * @return 瀹炰綋闆嗗悎
      * */
     List<UgRtuTask> selectAll() ;
+
+    /**
+     * 鏌ヨ涓�涓崌绾т换鍔℃墍鏈夋帶鍒跺櫒鍦板潃
+     * @return 涓�浜涗竴浜涙帶鍒跺櫒鍦板潃
+     */
+    List<VoUpgradeDetail> selectTaskDetail(Long taskId) ;
+
+    /**
+     * 鏌ヨ鏈�鏂颁竴鏉′换鍔�
+     * @return
+     */
+    UgRtuTask selectLastTask() ;
+
     /**
      * update record selective
      * @param record the updated record
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/UgRtuController.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/UgRtuController.java
index 60d0287..6656e9f 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/UgRtuController.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/UgRtuController.java
@@ -3,9 +3,11 @@
 import com.alibaba.fastjson2.annotation.JSONField;
 import com.alibaba.fastjson2.writer.ObjectWriterImplToString;
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.dy.common.po.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -19,7 +21,6 @@
 @Data
 @Builder
 @ToString
-@NoArgsConstructor
 @AllArgsConstructor
 @Schema(name = "RTU杩滅▼鍗囩骇鎵�鍏宠仈鐨勬祴鎺т竴浣撻榾 ")
 public class UgRtuController implements BaseEntity {
@@ -53,5 +54,44 @@
     @Schema(description = "鎺у埗鍣ㄥ湴鍧�", requiredMode = Schema.RequiredMode.REQUIRED)
     public String rtuAddr;
 
+    /**
+     * 鍗囩骇鏄惁缁撴潫
+     */
+    @Schema(description = "鍗囩骇鏄惁缁撴潫", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Byte isOver;
+
+    /**
+     * 鍗囩骇鏄惁缁撴潫
+     */
+    @Schema(description = "鍗囩骇鏄惁缁撴潫", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @TableField(exist = false)
+    public String isOverStr;
+
+    /**
+     * 鍗囩骇鐘舵��
+     */
+    @Schema(description = "鍗囩骇鐘舵��", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public Integer ugState;
+
+    /**
+     * 鍗囩骇鐘舵��
+     */
+    @Schema(description = "鍗囩骇鐘舵��", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    public String ugStateStr;
+
+    /**
+     * 鍗囩骇缁撴潫鏃堕棿
+     */
+    @Schema(description = "鍗囩骇缁撴潫鏃堕棿", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:SS")
+    public Integer overDt;
+
+    /**
+     * 鏃犲弬鏁版嵁鏋勯�犳柟娉�
+     */
+    public UgRtuController(){
+        this.isOver = 0;
+    }
+
 
 }
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUpgradeDetail.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUpgradeDetail.java
new file mode 100644
index 0000000..fdc0cd2
--- /dev/null
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUpgradeDetail.java
@@ -0,0 +1,36 @@
+package com.dy.pipIrrGlobal.voRm;
+
+import com.dy.common.softUpgrade.state.UpgradeRtu;
+import com.dy.common.softUpgrade.state.UpgradeState;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/13 13:47
+ * @Description
+ */
+@Data
+public class VoUpgradeDetail {
+    //鍗囩骇浠诲姟ID
+    public String taskId;
+
+    //浠诲姟鍒涘缓浜�
+    public String taskCreator;
+
+    //浠诲姟鍒涘缓鏃堕棿
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:SS")
+    public Date taskDt;
+
+    //绋嬪簭鏂囦欢鍚�
+    public String hexFileName;
+
+    //鍗囩骇浠诲姟鎬讳綋鐘舵��
+    public UpgradeState ugOverallState;
+
+    //鍗囩骇浠诲姟RTU鐘舵�佸垪琛�
+    public List<UpgradeRtu> ugRtuStateList;
+}
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuControllerMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuControllerMapper.xml
index 4f7c663..a0015a4 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuControllerMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuControllerMapper.xml
@@ -8,10 +8,13 @@
     <result column="task_id" jdbcType="BIGINT" property="taskId" />
     <result column="controller_id" jdbcType="BIGINT" property="controllerId" />
     <result column="rtu_addr" jdbcType="VARCHAR" property="rtuAddr" />
+    <result column="is_over" jdbcType="TINYINT" property="isOver" />
+    <result column="ug_state" jdbcType="INTEGER" property="ugState" />
+    <result column="over_dt" jdbcType="TIMESTAMP" property="overDt" />
   </resultMap>
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
-    id, task_id, controller_id, rtu_addr
+    id, task_id, controller_id, rtu_addr, is_over, ug_state, over_dt
   </sql>
   <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
     <!--@mbg.generated-->
@@ -131,8 +134,10 @@
     <!--@mbg.generated-->
     insert into ug_rtu_controller (id, task_id, controller_id, 
       rtu_addr)
-    values (#{id,jdbcType=BIGINT}, #{taskId,jdbcType=BIGINT}, #{controllerId,jdbcType=BIGINT}, 
-      #{rtuAddr,jdbcType=VARCHAR})
+    values (#{id,jdbcType=BIGINT}, #{taskId,jdbcType=BIGINT},
+    #{controllerId,jdbcType=BIGINT}, #{rtuAddr,jdbcType=VARCHAR},
+    #{isOver,jdbcType=TINYINT}, #{ugState,jdbcType=INTEGER},
+    #{overDt,jdbcType=TIMESTAMP})
   </insert>
   <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.UgRtuController">
     <!--@mbg.generated-->
@@ -150,6 +155,15 @@
       <if test="rtuAddr != null">
         rtu_addr,
       </if>
+      <if test="isOver != null">
+        is_over,
+      </if>
+      <if test="ugState != null">
+        ug_state,
+      </if>
+      <if test="overDt != null">
+        over_dt,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="id != null">
@@ -163,6 +177,15 @@
       </if>
       <if test="rtuAddr != null">
         #{rtuAddr,jdbcType=VARCHAR},
+      </if>
+      <if test="isOver != null">
+        #{isOver,jdbcType=TINYINT},
+      </if>
+      <if test="ugState != null">
+        #{ugState,jdbcType=INTEGER},
+      </if>
+      <if test="overDt != null">
+        #{overDt,jdbcType=TIMESTAMP},
       </if>
     </trim>
   </insert>
@@ -179,6 +202,15 @@
       <if test="rtuAddr != null">
         rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
       </if>
+      <if test="isOver != null">
+        is_over = #{isOver,jdbcType=TINYINT},
+      </if>
+      <if test="ugState != null">
+        ug_state = #{isOver,jdbcType=INTEGER},
+      </if>
+      <if test="overDt != null">
+        over_dt = #{isOver,jdbcType=TIMESTAMP},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -187,7 +219,20 @@
     update ug_rtu_controller
     set task_id = #{taskId,jdbcType=BIGINT},
       controller_id = #{controllerId,jdbcType=BIGINT},
-      rtu_addr = #{rtuAddr,jdbcType=VARCHAR}
+      rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
+      is_over = #{isOver,jdbcType=TINYINT},
+      ug_state = #{ugState,jdbcType=INTEGER},
+      over_dt = #{overDt,jdbcType=TIMESTAMP}
     where id = #{id,jdbcType=BIGINT}
   </update>
+  <update id="updateRtuUpgradeState" >
+    <!--@mbg.generated-->
+    update ug_rtu_controller
+    set is_over = #{isOver,jdbcType=TINYINT},
+    ug_state = #{state,jdbcType=INTEGER},
+    over_dt = #{overDt,jdbcType=TIMESTAMP}
+    where task_id = #{taskId,jdbcType=BIGINT}
+    and rtu_addr = #{rtuAddr,jdbcType=VARCHAR}
+  </update>
+
 </mapper>
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuTaskMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuTaskMapper.xml
index a8d38c4..e91d8e6 100644
--- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuTaskMapper.xml
+++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuTaskMapper.xml
@@ -17,15 +17,6 @@
     <!--@mbg.generated-->
     id, program_id, creator, remark, dt, is_execute, is_over, deleted
   </sql>
-  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
-    <!--@mbg.generated-->
-    select 
-    <include refid="Base_Column_List" />,
-    (CASE WHEN is_execute = 1 THEN '鏄�' ELSE '鍚�' END) AS isExecuteStr,
-    (CASE WHEN is_over = 1 THEN '鏄�' ELSE '鍚�' END) AS isOverStr
-    from ug_rtu_task
-    where id = #{id,jdbcType=BIGINT}
-  </select>
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     <!--@mbg.generated-->
     delete from ug_rtu_task
@@ -37,6 +28,23 @@
     where id = #{id,jdbcType=BIGINT}
   </delete>
 
+  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select 
+    <include refid="Base_Column_List" />,
+    (CASE WHEN is_execute = 1 THEN '鏄�' ELSE '鍚�' END) AS isExecuteStr,
+    (CASE WHEN is_over = 1 THEN '鏄�' ELSE '鍚�' END) AS isOverStr
+    from ug_rtu_task
+    where id = #{id,jdbcType=BIGINT}
+  </select>
+
+  <select id="selectLastTask" parameterType="java.lang.Long" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select
+    <include refid="Base_Column_List" />
+    from ug_rtu_task
+    order by id desc limit 0, 1
+  </select>
 
   <select id="selectTotal" parameterType="java.util.Map" resultType="java.lang.Long">
     <!--@mbg.generated-->
@@ -87,6 +95,17 @@
     order by bd.id DESC
   </select>
 
+  <select id="selectTaskDetail" parameterType="java.lang.Long" resultType="com.dy.pipIrrGlobal.voRm.VoUpgradeDetail">
+    <!--@mbg.generated-->
+    select
+    ttb.id as taskId,
+    ttb.creator as taskCreator,
+    ttb.dt as taskDt,
+    ptb.hex_file_name as hexFileName
+    from ug_rtu_task ttb
+    inner join ug_rtu_program ptb on ttb.program_id = ptb.id
+    where ttb.id = #{taskId,jdbcType=BIGINT}
+  </select>
 
   <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.UgRtuTask">
     <!--@mbg.generated-->
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 e0b3d13..a8a05fc 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
@@ -101,7 +101,7 @@
             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) ;
+                UpgradeRtuDev ugRtu = new UpgradeRtuDev(this, rtuAddr, this.softFileDataGrp.length, UpgradeRtuDev.STATE_OFFLINE) ;
                 this.upgradeRtus.put(rtuAddr, ugRtu) ;
             }
         }
@@ -192,18 +192,18 @@
             if(this.upgradeRtus != null && this.upgradeRtus.size() > 0){
                 Collection<UpgradeRtu> col = this.upgradeRtus.values() ;
                 for(UpgradeRtu info : col){
-                    if(info.state == UpgradeRtuDev.STATE_OFFLINE){
+                    if(info.state == UpgradeRtu.STATE_OFFLINE){
                         state.offLineTotal ++ ;
-                    }else if(info.state == UpgradeRtuDev.STATE_UNSTART){
+                    }else if(info.state == UpgradeRtu.STATE_UNSTART){
                         state.unStartTotal ++ ;
-                    }else if(info.state == UpgradeRtuDev.STATE_RUNNING){
+                    }else if(info.state == UpgradeRtu.STATE_RUNNING){
                         state.runningTotal ++ ;
-                    }else if(info.state == UpgradeRtuDev.STATE_SUCCESS) {
+                    }else if(info.state == UpgradeRtu.STATE_SUCCESS) {
                         state.successTotal++;
-                    }else if(info.state == UpgradeRtuDev.STATE_FAILONE) {
+                    }else if(info.state == UpgradeRtu.STATE_FAILONE) {
                         state.failOneTotal++;
                         state.failTotal++;
-                    }else if(info.state == UpgradeRtuDev.STATE_FAIL) {
+                    }else if(info.state == UpgradeRtu.STATE_FAIL) {
                         state.failTotal++;
                     }
                     if(info.isOver){
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/CurUpgradeStateVo.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/CurUpgradeStateVo.java
new file mode 100644
index 0000000..1f094e8
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/CurUpgradeStateVo.java
@@ -0,0 +1,24 @@
+package com.dy.pipIrrRemote.rtuUpgrage;
+
+import com.dy.common.softUpgrade.state.UpgradeRtu;
+import com.dy.common.softUpgrade.state.UpgradeState;
+import com.dy.pipIrrGlobal.voRm.VoUpgradeDetail;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/11/13 15:58
+ * @Description
+ */
+@Data
+public class CurUpgradeStateVo {
+    //鍗囩骇浠诲姟ID
+    public VoUpgradeDetail upgrade ;
+    //鍗囩骇浠诲姟鎬讳綋鐘舵��
+    public UpgradeState ugOverallState;
+    //鍗囩骇浠诲姟RTU鐘舵�佸垪琛�
+    public List<UpgradeRtu> ugRtuStateList;
+
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java
index c8436a0..8b53bb0 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java
@@ -2,13 +2,16 @@
 
 import com.dy.common.aop.SsoAop;
 import com.dy.common.multiDataSource.DataSourceContext;
+import com.dy.common.softUpgrade.state.UpgradeInfo;
 import com.dy.common.softUpgrade.state.UpgradeTaskVo;
+import com.dy.common.springUtil.SpringContextUtil;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
 import com.dy.common.webUtil.ResultCodeMsg;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuProgram;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuTask;
 import com.dy.pipIrrGlobal.rtuMw.ToRtuMwCom;
+import com.dy.pipIrrGlobal.voRm.VoUpgradeDetail;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -95,6 +98,7 @@
         BaseResponse res = sendUpgradeTask2Mw(restTemplate, ugSendUrl, vo) ;
         if(res != null){
             if(res.isSuccess()){
+                this.sv.setUpgradeTaskExecuted(id);
                 return BaseResponseUtils.buildSuccess(true) ;
             }else{
                 log.error("閫氫俊涓棿浠舵墽琛屼笅鍙戝崌绾т换鍔″け璐�" + (res.getMsg() == null? "" : ("锛�" + res.getMsg()))) ;
@@ -116,4 +120,35 @@
         vo.softByteSrc16 = ppo.programCrc16 ;
     }
 
+    /**
+     * 褰撳墠rtu杩滅▼鍗囩骇浠诲姟鎵ц鐘舵��
+     * @return 鎿嶄綔缁撴灉
+     */
+    @Operation(summary = "褰撳墠rtu杩滅▼鍗囩骇浠诲姟鎵ц鐘舵��", description = "褰撳墠rtu杩滅▼鍗囩骇浠诲姟鎵ц鐘舵��")
+    @ApiResponses(value = {
+            @ApiResponse(
+                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
+                    description = "杩斿洖鎿嶄綔鎴愬姛涓庡惁鏁版嵁锛圔aseResponse.content:Boolean锛�",
+                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
+                            schema = @Schema(implementation = Boolean.class))}
+            )
+    })
+    @GetMapping(path = "/curUpgradeState")
+    @SsoAop()
+    public BaseResponse<UpgradeInfo> curUpgradeState(){
+        if(RtuUpgradeStateReceiverCtrl.cache == null){
+            //return BaseResponseUtils.buildError("褰撳墠娌℃湁鍗囩骇浠诲姟") ;
+            //姝e紡杩愯鏃讹紝涓嬮潰涓よ鍘绘帀锛屼笂闈竴琛屾墦寮�
+            RtuUpgradeStateReceiverCtrl ctrl = SpringContextUtil.getBean(RtuUpgradeStateReceiverCtrl.class);
+            ctrl.demo();
+        }
+        CurUpgradeStateVo vo = new CurUpgradeStateVo() ;
+        List<VoUpgradeDetail> list = this.sv.selectTaskDetail(RtuUpgradeStateReceiverCtrl.cache.ugTaskId);
+        if(list != null && list.size() > 0){
+            vo.upgrade = list.get(0) ;
+        }
+        vo.ugOverallState = RtuUpgradeStateReceiverCtrl.cache.ugOverallState ;
+        vo.ugRtuStateList = RtuUpgradeStateReceiverCtrl.cache.ugRtuStateList ;
+        return BaseResponseUtils.buildSuccess(vo) ;
+    }
 }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java
index 8032651..3c7ffa2 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java
@@ -2,11 +2,23 @@
 
 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.util.Callback;
+import com.dy.common.util.CreateRandom;
+import com.dy.common.util.DateTime;
+import com.dy.common.util.ThreadJob;
 import com.dy.common.webUtil.BaseResponse;
+import com.dy.pipIrrGlobal.pojoRm.UgRtuProgram;
+import com.dy.pipIrrGlobal.pojoRm.UgRtuTask;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @Author: liurunyu
@@ -18,22 +30,241 @@
 @RestController
 @RequestMapping(path = "rtuUpgradeStateReceiver")
 public class RtuUpgradeStateReceiverCtrl {
+
+    protected static UpgradeInfo cache ;
+
+    @Autowired
+    private RtuUpgradeSv sv ;
+
     /**
      * rtu杩滅▼鍗囩骇浠诲姟閫氫俊涓棿浠舵墽琛屾儏鍐电粺璁″洖鏀�
-     * @param vo 鏁版嵁
+     * @param info 鏁版嵁
      * @return 鎿嶄綔缁撴灉
      */
     @Hidden //涓嶅叕寮�鎺ュ彛锛屽叾鍙湁閫氫俊涓棿浠惰皟鐢�
     @PostMapping(path = "/receive")
-    public BaseResponse<Boolean> receive(@RequestBody UpgradeInfo vo){
-        log.info("鎺ユ敹鍒扮殑RTU杩滅▼鍗囩骇鐘舵�佹暟鎹负锛歿}",vo.toString());
-        if(vo.ugRtuStateList != null && vo.ugRtuStateList.size() > 0){
-            if(vo.ugRtuStateList.size() < 10){
-                for (UpgradeRtu upgradeRtu : vo.ugRtuStateList) {
-                    log.info(upgradeRtu.toString());
+    public BaseResponse<Boolean> receive(@RequestBody UpgradeInfo info){
+        log.info("鎺ユ敹鍒扮殑RTU杩滅▼鍗囩骇鐘舵�佹暟鎹负锛歿}", info.toString());
+        //杩涜鎺掑簭
+        //Comparator<UpgradeRtu> comparator = Comparator.comparing(UpgradeRtu::getRtuAddr, Comparator.naturalOrder());
+        //info.ugRtuStateList = info.ugRtuStateList.stream().sorted(comparator).collect(Collectors.toList());
+
+        if(info.ugRtuStateList != null && info.ugRtuStateList.size() > 0){
+            if(info.ugRtuStateList.size() < 10){
+                for (UpgradeRtu rtuVo : info.ugRtuStateList) {
+                    log.info(rtuVo.toString());
                 }
             }
         }
+        if(cache == null){
+            //姝ゆ椂涓嶅仛浠诲姟鎿嶄綔锛屽彧淇濋殰cache涓嶄负绌猴紝 绛夊緟涓嬫鍙戞潵鏁版嵁
+            if(info.ugRtuStateList != null && info.ugRtuStateList.size() > 0){
+                List<UpgradeRtu> overList = info.ugRtuStateList.stream().filter(itemVo -> itemVo.isOver).collect(Collectors.toList()) ;
+                if(overList != null && overList.size() > 0){
+                    cache = info;
+                    this.save2Db(info.ugTaskId, overList);
+                }
+            }
+        }else{
+            //褰揷ache涓湁鍊兼椂锛岃繘琛屾瘮瀵瑰瓨鍌紝瀵规瘮鐩殑鏄槻姝㈤噸澶嶆搷浣滄暟鎹簱
+            if(info.ugRtuStateList != null && info.ugRtuStateList.size() > 0){
+                //姝ゆ椂淇濊瘉涓や釜闆嗗悎閮戒笉涓簄ull
+                this.save2Db(info.ugTaskId, info.ugRtuStateList, cache.ugRtuStateList);
+                cache = info;
+            }
+        }
         return null;
     }
+    /**
+     * 姣斿骞舵暟鎹簱瀛樺偍
+     * @param taskId
+     * @param list
+     */
+    private void save2Db(String taskId, List<UpgradeRtu> list){
+        list.stream().forEach(vo -> {
+            if(vo != null) {
+                this.sv.saveRtuUpgradeState(Long.parseLong(taskId), vo);
+            }
+        });
+    }
+
+    /**
+     * 姣斿骞舵暟鎹簱瀛樺偍
+     * @param newList
+     * @param oldList
+     */
+    private void save2Db(String taskId, List<UpgradeRtu> newList, List<UpgradeRtu> oldList){
+        List<UpgradeRtu> newOverList = newList.stream().filter(vo -> vo.isOver).collect(Collectors.toList()) ;
+        for(UpgradeRtu nvo : newOverList){
+            if(nvo != null) {
+                if(oldList.stream().anyMatch(vo -> vo.rtuAddr.equals(nvo.rtuAddr) && vo.isOver == false)){
+                    //涓婃娌℃湁鍗囩骇缁撴潫锛岃�屽綋鍓嶅崌绾х粨鏉熶簡
+                    this.sv.saveRtuUpgradeState(Long.parseLong(taskId), nvo);
+                }
+            }
+        }
+    }
+    /////////////////////////////////////////////////////
+    //
+    // 浠ヤ笅妯℃嫙鏁版嵁
+    //
+    /////////////////////////////////////////////////////
+
+    private static ThreadJob threadJob ;
+
+    protected void demo(){
+        if(cache == null){
+            UgRtuTask tpo = this.sv.selectLastTask() ;
+            if(tpo != null) {
+                UgRtuProgram ppo = this.sv.selectProgramById(tpo.programId);
+                if (ppo == null) {
+                    List<String> taskRtuAddrs = this.sv.selectAllRtuAddrByTask("" + tpo.id);
+                    if (taskRtuAddrs != null && taskRtuAddrs.size() > 0) {
+                        cache = new UpgradeInfo();
+                        cache.ugTaskId = "" + tpo.id;
+                        cache.ugOverallState = new UpgradeState() ;
+                        cache.ugOverallState.rtuTotal = taskRtuAddrs.size() ;
+                        cache.ugRtuStateList = new ArrayList<>() ;
+                        for (String addr : taskRtuAddrs) {
+                            UpgradeRtu rtu = new UpgradeRtu() ;
+                            rtu.rtuAddr = addr ;
+                            rtu.state = UpgradeRtu.STATE_UNSTART ;
+                            rtu.totalPackage = (ppo.programBytes.length / 512) + ((ppo.programBytes.length % 512)>0?1:0) ;
+                            rtu.isOver = false ;
+                            cache.ugRtuStateList.add(rtu) ;
+                        }
+                        if(threadJob == null){
+                            threadJob = new ThreadJob() {
+                                @Override
+                                public Object execute() throws Exception {
+                                    runDemo() ;
+                                    return null;
+                                }
+                            };
+                            try{
+                                threadJob.start(new Callback() {
+                                    @Override
+                                    public void call(Object obj) {
+                                    }
+                                    @Override
+                                    public void call(Object... objs) {
+                                    }
+                                    @Override
+                                    public void exception(Exception e) {
+                                    }
+                                });
+                            }catch (Exception e){
+                                e.printStackTrace();
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    private void runDemo(){
+        boolean hasRunning = true ;
+        while (true){
+            for(UpgradeRtu rtu : cache.ugRtuStateList){
+                this.rtuUpgrade(rtu) ;
+                hasRunning = this.statisticsNowUpgradeState() ;
+                if(!hasRunning){
+                    break ;
+                }
+            }
+            if(!hasRunning){
+                break ;
+            }
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+    private void rtuUpgrade(UpgradeRtu rtu){
+        if(rtu.lastDownDt == null){
+            //绗竴娆�
+            this.dealUpgradeFirstTime(rtu);
+        }else{
+            this.dealUpgrade(rtu);
+        }
+
+    }
+    private void dealUpgradeFirstTime(UpgradeRtu rtu){
+        int n = Integer.parseInt(new CreateRandom().create(1)) ;
+        if(n == 0){
+            rtu.state = UpgradeRtu.STATE_OFFLINE ;
+            rtu.currentPackage = 0 ;
+            rtu.currentRamAddr = 0x00 ;
+            rtu.lastDownDt = "" ;
+            rtu.reTryTimes = 0 ;
+            rtu.isOver = false ;
+        }else{
+            rtu.state = UpgradeRtu.STATE_RUNNING ;
+            rtu.currentPackage = 1 ;
+            rtu.currentRamAddr = 0x00 ;
+            rtu.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+            rtu.reTryTimes = 0 ;
+            rtu.isOver = false ;
+        }
+    }
+    private void dealUpgrade(UpgradeRtu rtu){
+        if(rtu.state == UpgradeRtu.STATE_OFFLINE){
+            //绂荤嚎鐨勶紝涓嶅鐞�
+            return ;
+        }
+        int n = Integer.parseInt(new CreateRandom().create(2)) ;
+        if(n == 44 || n == 45 || n == 54){
+            if(rtu.currentPackage == 1){
+                //1鍖呮
+                rtu.state = UpgradeRtu.STATE_FAILONE ;
+                return ;
+            }
+        }
+        if(rtu.currentPackage == rtu.totalPackage){
+            //鍗囩骇缁撴潫
+            rtu.state = UpgradeRtu.STATE_SUCCESS ;
+            rtu.isOver = true ;
+            return ;
+        }
+
+        rtu.state = UpgradeRtu.STATE_RUNNING ;
+        rtu.currentPackage += 1 ;
+        rtu.currentRamAddr = 0x00 + UpgradeRtu.RAMADDRADD ;
+        rtu.lastDownDt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
+        rtu.reTryTimes = 0 ;
+        rtu.isOver = false ;
+    }
+
+    /**
+     * 褰撳墠鍗囩骇鐘舵��
+     * @return
+     */
+    public boolean statisticsNowUpgradeState() {
+        boolean hasRunning = false ;
+        if(cache.ugRtuStateList != null && cache.ugRtuStateList.size() > 0){
+            for(UpgradeRtu rtu : cache.ugRtuStateList){
+                if(rtu.state == UpgradeRtu.STATE_OFFLINE){
+                    cache.ugOverallState.offLineTotal ++ ;
+                }else if(rtu.state == UpgradeRtu.STATE_UNSTART){
+                    cache.ugOverallState.unStartTotal ++ ;
+                }else if(rtu.state == UpgradeRtu.STATE_RUNNING){
+                    cache.ugOverallState.runningTotal ++ ;
+                    hasRunning = true ;
+                }else if(rtu.state == UpgradeRtu.STATE_SUCCESS) {
+                    cache.ugOverallState.successTotal++;
+                }else if(rtu.state == UpgradeRtu.STATE_FAILONE) {
+                    cache.ugOverallState.failOneTotal++;
+                    cache.ugOverallState.failTotal++;
+                }else if(rtu.state == UpgradeRtu.STATE_FAIL) {
+                    cache.ugOverallState.failTotal++;
+                }
+                if(rtu.isOver){
+                    cache.ugOverallState.overTotal++;
+                }
+            }
+        }
+        return hasRunning ;
+    }
 }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java
index 59aa42f..626af0e 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java
@@ -1,15 +1,20 @@
 package com.dy.pipIrrRemote.rtuUpgrage;
 
+import com.dy.common.softUpgrade.state.UpgradeRtu;
 import com.dy.pipIrrGlobal.daoRm.UgRtuControllerMapper;
 import com.dy.pipIrrGlobal.daoRm.UgRtuProgramMapper;
 import com.dy.pipIrrGlobal.daoRm.UgRtuTaskMapper;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuProgram;
 import com.dy.pipIrrGlobal.pojoRm.UgRtuTask;
+import com.dy.pipIrrGlobal.voRm.VoUpgradeDetail;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.common.utils.PojoUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Author: liurunyu
@@ -28,7 +33,7 @@
 
     /**
      * 閫氫俊涓婚敭鏌ヨ涓�涓崌绾т换鍔�
-     * @param id 涓婚敭
+     * @param taskId 涓婚敭
      * @return
      */
     public UgRtuTask selectTaskById(String taskId){
@@ -51,4 +56,48 @@
     public List<String> selectAllRtuAddrByTask(String taskId){
         return this.cdao.selectAllRtuAddrByTask(Long.valueOf(taskId)) ;
     }
+
+    /**
+     * 鏌ヨ涓�涓崌绾т换鍔℃湁鍏充俊鎭�
+     * @return 鍗囩骇浠诲姟鏈夊叧淇℃伅
+     */
+    public List<VoUpgradeDetail> selectTaskDetail(String taskId){
+        return this.tdao.selectTaskDetail(Long.valueOf(taskId)) ;
+    }
+
+
+    /**
+     * 淇濆瓨鍗囩骇浠诲姟涓烘墽琛岀姸鎬�
+     * @param taskId 浠诲姟ID
+     */
+    public void setUpgradeTaskExecuted(String taskId){
+        this.tdao.executeById(Long.valueOf(taskId)) ;
+    }
+
+
+    /**
+     * 淇濆瓨RTU鍗囩骇缁撴潫鐘舵��
+     * @param taskId
+     * @param rtu
+     */
+    public void saveRtuUpgradeState(Long taskId, UpgradeRtu rtu){
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(rtu) ;
+        params.put("taskId", taskId) ;
+        params.put("overDt", new Date()) ;
+        cdao.updateRtuUpgradeState(params) ;
+    }
+
+    /////////////////////////////////////////////////////
+    //
+    // 浠ヤ笅妯℃嫙鏁版嵁
+    //
+    /////////////////////////////////////////////////////
+    /**
+     * 閫氫俊涓婚敭鏌ヨ涓�涓崌绾т换鍔�
+     * @return
+     */
+    public UgRtuTask selectLastTask(){
+        return tdao.selectLastTask();
+    }
+
 }

--
Gitblit v1.8.0