From 7d123b1726d04bd4817d8014f730dd701284a892 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 12 Nov 2024 12:04:04 +0800
Subject: [PATCH] 新增固件版本回退功能

---
 src/views/device/airport.vue |  149 ++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 116 insertions(+), 33 deletions(-)

diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index 753e8e0..dcd047b 100644
--- a/src/views/device/airport.vue
+++ b/src/views/device/airport.vue
@@ -57,9 +57,12 @@
       <template #firmware_status="{ row }">
         <div
           v-if="row.firmware_status == 1"
-          style="display: flex; flex-direction: row; align-items: center"
+          style="display: flex; flex-direction: column; align-items: center"
         >
           <el-tag type="info">无需升级</el-tag>
+          <el-tag type="success" effect="dark" class="active-element" @click="rollFirmware(row)"
+            >版本回退</el-tag
+          >
           <!-- <div style="background-color: #f1f1f1; border-radius: 4px">无需升级</div> -->
         </div>
         <div
@@ -130,6 +133,26 @@
       </template>
     </el-dialog>
 
+    <el-dialog title="版本回退" append-to-body v-model="rollFirmwareBox" width="455px">
+      <div style="display: flex;flex-direction: row;align-items: center ">
+        回退版本:
+        <el-select v-model="rollFirmVersion" clearable placeholder="Select" style="width: 240px">
+          <el-option
+            v-for="item in firmList"
+            :key="item.firmware_version"
+            :label="item.firmware_version"
+            :value="item.firmware_version"
+          />
+        </el-select>
+      </div>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="rollFirmwareBox = false">取 消</el-button>
+          <el-button type="primary" @click="rollFirmwareConfirm">确 定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+
     <el-drawer
       title="机场授权管理"
       size="60%"
@@ -160,6 +183,7 @@
   getDetail,
   getDeviceUpgradeInfo,
   ota,
+  getDeviceFirmwareList,
 } from '@/api/device/device';
 
 import { getLazyTree } from '@/api/base/region';
@@ -179,6 +203,9 @@
 
   data() {
     return {
+      rollFirmVersion:'',
+      firmList: [],
+      rollFirmwareBox: false,
       // 用于记录已经创建的websocket,防止重复创建
       webSocketIdSet: new Set(),
       // 用于保存多组websocket
@@ -478,67 +505,65 @@
     },
   },
   destroyed() {
-    this.websocketMap.forEach((k,v)=>{
-      if(null!=v){
-        v.close()
-        this.websocketMap.delete(k)
-        this.webSocketIdSet.delete(k)
+    this.websocketMap.forEach((k, v) => {
+      if (null != v) {
+        v.close();
+        this.websocketMap.delete(k);
+        this.webSocketIdSet.delete(k);
       }
     });
   },
   methods: {
     // 关闭所有的webscoket
-    closeAllWebsoket(){
-      this.websocketMap.forEach((k,v)=>{
-      if(null!=v){
-        v.close()
-        this.websocketMap.delete(k)
-        this.webSocketIdSet.delete(k)
-      }
-    });
+    closeAllWebsoket() {
+      this.websocketMap.forEach((k, v) => {
+        if (null != v) {
+          v.close();
+          this.websocketMap.delete(k);
+          this.webSocketIdSet.delete(k);
+        }
+      });
     },
     // 连接webSocket
     connectWebSocket(data) {
-      const webSocketId = data.workspace_id
+      const webSocketId = data.workspace_id;
       if (!this.webSocketIdSet.has(webSocketId)) {
         // 防止重复连接
         this.webSocketIdSet.add(webSocketId);
         const webSorketUrl = getWebsocketUrl() + '&workspace-id=' + data.workspace_id;
         // 监听ws 消息
-        this.useConnectWebSocket(webSocketId,webSorketUrl);
+        this.useConnectWebSocket(webSocketId, webSorketUrl);
       }
     },
-    useConnectWebSocket(webSocketId,url) {
+    useConnectWebSocket(webSocketId, url) {
       const websocket = new ConnectWebSocket(url);
       // 加入 webscoket map
-      this.websocketMap.set(webSocketId, websocket)
+      this.websocketMap.set(webSocketId, websocket);
       websocket?.registerMessageHandler(this.messageHandler);
       websocket?.initSocket();
     },
     async messageHandler(payload) {
-      console.log(payload, 7777);
-      
       if (!payload) {
         return;
       }
-      if(payload.biz_code!="ota_progress"){
+      if (payload.biz_code != 'ota_progress') {
         return;
       }
       var data = payload.data;
       this.data.forEach(e => {
-        if (e.device_sn==data.sn && data.output.status=='in_progress'){
+        if (e.device_sn == data.sn && data.output.status == 'in_progress') {
           e.firmware_progress = data.output.progress.percent;
         }
 
-        if (e.device_sn==data.sn && data.output.status=='ok') {
-            // 升级完成修改状态
-            e.firmware_status = 1
-            const webscoket = this.websocketMap.get(e.workspace_id);
-            // 关闭
-            webscoket?.close();
-            //删除对应的webscoket
-            this.websocketMap.delete(e.workspace_id);
-            this.webSocketIdSet.delete(e.workspace_id);
+        if (e.device_sn == data.sn && data.output.status == 'ok') {
+          // 升级完成修改状态
+          e.firmware_status = 1;
+          const webscoket = this.websocketMap.get(e.workspace_id);
+          // 关闭
+          webscoket?.close();
+          //删除对应的webscoket
+          this.websocketMap.delete(e.workspace_id);
+          this.webSocketIdSet.delete(e.workspace_id);
         }
       });
     },
@@ -567,6 +592,64 @@
         that.$refs.firmwareManage.init(row);
       });
     },
+    // 版本回退点击事件
+    rollFirmware(row) {
+      if (row.status == 0) {
+        this.$message({
+          type: 'warning',
+          message: '设备不在线!',
+        });
+        return;
+      }
+      var that = this;
+      this.rollFirmwareBox = true;
+      const param = {
+        device_name: row.device_name,
+      };
+      // 获取固件最新版本信息
+      getDeviceFirmwareList(1, 20, param).then(res => {
+        that.firmList = [];
+        const data = res.data.data.records;
+        if (data.length === 0) {
+          return;
+        }
+        data.forEach(e => {
+          if (e.firmware_version != row.firmware_version) {
+            that.firmList.push(e);
+          }
+        });
+        that.firmwareInfo['device_name'] = row.device_name;
+        that.firmwareInfo['sn'] = row.device_sn;
+        // 3-普通升级,2-一致性升级;
+        that.firmwareInfo['firmware_upgrade_type'] = 3;
+        that.firmwareInfo['workspaceId'] = row.workspace_id;
+      });
+    },
+    // 版本回退
+    rollFirmwareConfirm() {
+      if(this.rollFirmVersion==''){
+        this.$message({
+          type: 'warning',
+          message: '请先选择回退的固件版本!',
+        });
+        return;
+      }
+      var that = this;
+      var arr = [];
+      that.firmwareInfo['product_version'] = this.rollFirmVersion;
+      arr.push(that.firmwareInfo);
+      ota(that.firmwareInfo.workspaceId, arr).then(res => {
+        that.firmwareVersion = '';
+        that.firmwareInfo = {};
+        that.rollFirmwareBox = false;
+        this.$message({
+          type: 'success',
+          message: '操作成功!',
+        });
+        this.onLoad(this.page);
+        done();
+      });
+    },
     // 升级固件按钮事件
     updateFirmware(row) {
       if (row.status == 0) {
@@ -591,7 +674,7 @@
         that.firmwareInfo['device_name'] = row.device_name;
         that.firmwareInfo['sn'] = row.device_sn;
         that.firmwareInfo['product_version'] = data[0].product_version;
-        // 1-普通升级,2-一致性升级;
+        // 3-普通升级,2-一致性升级;
         that.firmwareInfo['firmware_upgrade_type'] =
           row.firmware_status === that.DeviceFirmwareStatusEnum.ToUpgraded
             ? that.DeviceFirmwareTypeEnum.ToUpgraded
@@ -722,7 +805,7 @@
       this.onLoad(this.page, this.query);
     },
     onLoad(page, params = {}) {
-      this.closeAllWebsoket()
+      // this.closeAllWebsoket();
       const { releaseTimeRange } = this.query;
       let values = {
         ...params,

--
Gitblit v1.9.3