无人机管理后台前端(已迁走)
zhongrj
2024-11-12 7d123b1726d04bd4817d8014f730dd701284a892
新增固件版本回退功能
1 files modified
149 ■■■■ changed files
src/views/device/airport.vue 149 ●●●● patch | view | raw | blame | history
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,