From 29dbf6ba6409e3139e5f2e36588106945dd0cec2 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期三, 13 十一月 2024 17:29:29 +0800
Subject: [PATCH] 实现查询RTU远程升级任务执行结果功能
---
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtuUpgrage/RtuUpgradeStateReceiverCtrl.java | 245 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 238 insertions(+), 7 deletions(-)
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 ;
+ }
}
--
Gitblit v1.8.0