From 37ca88f53f2432b7f22411490b0ab2b24fbce3b3 Mon Sep 17 00:00:00 2001
From: zrj <646384940@qq.com>
Date: Wed, 11 Sep 2024 13:55:28 +0800
Subject: [PATCH] 动态读取固件升级进度

---
 src/views/device/airport.vue |  169 ++++++++++++++++++++++++++++----------------------------
 1 files changed, 84 insertions(+), 85 deletions(-)

diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index ee3bc99..753e8e0 100644
--- a/src/views/device/airport.vue
+++ b/src/views/device/airport.vue
@@ -84,13 +84,11 @@
           v-if="row.firmware_status == 4"
           style="display: flex; flex-direction: row; align-items: center"
         >
-          <div style="background-color: #a8cbfb; border-radius: 4px">
-            升级中
-            <el-progress
-              v-if="row.firmware_progress > 0 && row.firmware_progress < 100"
-              :percentage="row.firmware_progress"
-            ></el-progress>
-          </div>
+          <el-tag effect="dark" class="active-element" @click="updateFirmware(row)">升级中</el-tag>
+          <el-progress
+            v-if="row.firmware_progress > 0 && row.firmware_progress < 100"
+            :percentage="row.firmware_progress"
+          ></el-progress>
         </div>
       </template>
       <template #menu="scope">
@@ -170,19 +168,26 @@
 import FirmwareManage from './components/firmwareManage.vue';
 import DevicePerShare from './components/devicePerShare.vue';
 import DockControlPanel from './components/DockControlPanel.vue';
-
+import { getWebsocketUrl } from '@/websocket/util/config';
+import ConnectWebSocket from '@/websocket';
 export default {
   components: {
     FirmwareManage,
     DevicePerShare,
     DockControlPanel,
   },
+
   data() {
     return {
+      // 用于记录已经创建的websocket,防止重复创建
+      webSocketIdSet: new Set(),
+      // 用于保存多组websocket
+      websocketMap: new Map(),
+      scheduleNum: 0,
+      webSocket: '',
       devicePerShareVisible: false,
       remoteDebuggingShow: false,
       curDeviceInfo: {},
-
       firmwareManageVisible: false,
       percentageNum: 0,
       firmwareBox: false,
@@ -402,81 +407,6 @@
               }
             },
           },
-          // {
-          //   label: '所在市州',
-          //   prop: 'city_code',
-          //   type: 'select',
-          //   labelWidth: 130,
-          //   cascader: ['district_code'],
-          //   props: {
-          //     label: 'name',
-          //     value: 'code',
-          //   },
-          //   dicUrl: `/api/blade-system/region/select?code={{province_code}}`,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请选择所在市州',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
-          // {
-          //   label: '所在区县',
-          //   prop: 'district_code',
-          //   type: 'select',
-          //   labelWidth: 130,
-          //   cascader: ['town_code'],
-          //   props: {
-          //     label: 'name',
-          //     value: 'code',
-          //   },
-          //   dicUrl: `/api/blade-system/region/select?code={{city_code}}`,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请选择所在区县',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
-          // {
-          //   label: '所在乡镇',
-          //   prop: 'town_code',
-          //   type: 'select',
-          //   labelWidth: 130,
-          //   cascader: ['village_code'],
-          //   props: {
-          //     label: 'name',
-          //     value: 'code',
-          //   },
-          //   dicUrl: `/api/blade-system/region/select?code={{district_code}}`,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请选择所在乡镇',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
-          // {
-          //   label: '所在社区/村委会',
-          //   prop: 'village_code',
-          //   type: 'select',
-          //   labelWidth: 130,
-          //   props: {
-          //     label: 'name',
-          //     value: 'code',
-          //   },
-          //   dicUrl: `/api/blade-system/region/select?code={{town_code}}`,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请选择所在社区/村委会',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
           {
             label: '在线时间',
             prop: 'login_time',
@@ -547,7 +477,71 @@
       return ids.join(',');
     },
   },
+  destroyed() {
+    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)
+      }
+    });
+    },
+    // 连接webSocket
+    connectWebSocket(data) {
+      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);
+      }
+    },
+    useConnectWebSocket(webSocketId,url) {
+      const websocket = new ConnectWebSocket(url);
+      // 加入 webscoket map
+      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"){
+        return;
+      }
+      var data = payload.data;
+      this.data.forEach(e => {
+        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);
+        }
+      });
+    },
     init() {
       this.onLoad(this.page);
     },
@@ -728,6 +722,7 @@
       this.onLoad(this.page, this.query);
     },
     onLoad(page, params = {}) {
+      this.closeAllWebsoket()
       const { releaseTimeRange } = this.query;
       let values = {
         ...params,
@@ -748,6 +743,9 @@
         this.page.total = data.total;
         data.records.forEach(e => {
           e['hasChildren'] = e.has_children;
+          if (e.firmware_status == 4) {
+            this.connectWebSocket(e);
+          }
         });
         this.data = data.records;
         this.loading = false;
@@ -759,7 +757,8 @@
         childSn: tree.child_sn,
       };
       getList(1, 10, params).then(res => {
-        resolve(res.data.data.records);
+        const data = res.data.data.records;
+        resolve(data);
       });
     },
   },

--
Gitblit v1.9.3