zhubaomin
2024-11-13 9312cee2191aabf6043356e2927ca692a57921ec
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
10个文件已修改
2个文件已添加
562 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuControllerMapper.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/UgRtuTaskMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoRm/UgRtuController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUpgradeDetail.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuControllerMapper.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/UgRtuTaskMapper.xml 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/upgrade/UpgradeTask.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/CurUpgradeStateVo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeCtrl.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeSv.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/softUpgrade/state/UpgradeRtu.java
@@ -37,7 +37,7 @@
    public int currentRamAddr ;// 当前下发升级包RTU存储地址
    public String lastDownDt ;// 最后下发升级数据包时间(yyyy-mm-dd HH:HH:SS)
    public int reTryTimes ;//升级不成功,重试次数
    public boolean isOver ;
    public boolean isOver ;//是否升级过程结束,1:结束,0:未结束
    public String toString(){
        StringBuilder sb = new StringBuilder();
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) ;
}
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) ;
    /**
     * 得到所有升级程序记录ID和文件名称
     * @return 实体集合
     * */
    List<UgRtuTask> selectAll() ;
    /**
     * 查询一个升级任务所有控制器地址
     * @return 一些一些控制器地址
     */
    List<VoUpgradeDetail> selectTaskDetail(Long taskId) ;
    /**
     * 查询最新一条任务
     * @return
     */
    UgRtuTask selectLastTask() ;
    /**
     * update record selective
     * @param record the updated record
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;
    }
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUpgradeDetail.java
New file
@@ -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;
}
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>
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-->
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){
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/CurUpgradeStateVo.java
New file
@@ -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;
}
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 = "返回操作成功与否数据(BaseResponse.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("当前没有升级任务") ;
            //正式运行时,下面两行去掉,上面一行打开
            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) ;
    }
}
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{
            //当cache中有值时,进行比对存储,对比目的是防止重复操作数据库
            if(info.ugRtuStateList != null && info.ugRtuStateList.size() > 0){
                //此时保证两个集合都不为null
                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 ;
    }
}
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();
    }
}