无人机管理后台前端(已迁走)
张含笑
2025-09-03 9090ff42fb118b91817e162718c2684cc20e042d
Merge branch 'refs/heads/feature/v5.0/5.0.5' into patch_management
8 files modified
290 ■■■■■ changed files
src/api/device/device.js 11 ●●●●● patch | view | raw | blame | history
src/page/index/tags.vue 6 ●●●● patch | view | raw | blame | history
src/utils/device-setting.js 154 ●●●● patch | view | raw | blame | history
src/views/device/airport.vue 66 ●●●● patch | view | raw | blame | history
src/views/device/components/DeviceSettingBox.vue 13 ●●●●● patch | view | raw | blame | history
src/views/device/components/DockControlPanel.vue 16 ●●●●● patch | view | raw | blame | history
src/views/device/components/use-device-setting.js 21 ●●●●● patch | view | raw | blame | history
src/views/odm/task.vue 3 ●●●●● patch | view | raw | blame | history
src/api/device/device.js
@@ -144,10 +144,19 @@
  })
}
// 设备下线
// 注销
export const deviceOffline = (dockSn) => {
  return request({
    url: `/drone-device-core/manage/api/v1/devices/deviceOffline?dockSn=${dockSn}`,
    method: 'get',
  })
}
// 设备下线
export const devicesUpdate = (param) => {
  return request({
    url: `/drone-device-core/manage/api/v1/devices/update`,
    method: 'post',
    data: param
  })
}
src/page/index/tags.vue
@@ -2,20 +2,20 @@
  <div class="avue-tags" v-if="setting.tag" @click="contextmenuFlag = false">
    <!-- tag盒子 -->
    <div v-if="contextmenuFlag" class="avue-tags__contentmenu"
      :style="{ left: contentmenuX + 'px', top: contentmenuY + 'px' }">
         :style="{ left: contentmenuX + 'px', top: contentmenuY + 'px' }">
      <div class="item" @click="closeOthersTags">{{ $t('tagsView.closeOthers') }}</div>
      <div class="item" @click="closeAllTags">{{ $t('tagsView.closeAll') }}</div>
      <div class="item" @click="clearCacheTags">{{ $t('tagsView.clearCache') }}</div>
    </div>
    <div class="avue-tags__box">
      <el-tabs v-model="active" type="card" @contextmenu="handleContextmenu" :closable="tagLen !== 1"
        @tab-click="openTag" @edit="menuTag">
               @tab-click="openTag" @edit="menuTag">
        <el-tab-pane v-for="(item, index) in bsTagList" :key="index" :label="generateTitle(item)" :name="item.fullPath">
          <template #label>
            <span>
              {{ generateTitle(item) }}
              <i class="el-icon-refresh" :class="{ turn: refresh }" @click="handleRefresh"
                v-if="active === item.fullPath"></i>
                 v-if="active === item.fullPath"></i>
            </span>
          </template>
        </el-tab-pane>
src/utils/device-setting.js
@@ -11,37 +11,38 @@
/**
 * 根据osd 更新信息
 * @param deviceSetting
 * @param deviceSetting.value
 * @param deviceInfo
 * @returns
 */
export function updateDeviceSettingInfoByOsd(deviceSetting, deviceInfo) {
  const { device, dock, gateway } = deviceInfo || {}
  if (!deviceSetting) {
  // const { device, dock, gateway } = deviceInfo.value || {}
  let device = deviceInfo?? {}
  if (!deviceSetting.value) {
    return
  }
  // 夜航灯
  let nightLightsState = ""
  if (isNil(device?.night_lights_state)) {
    deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].editable = false
    deviceSetting[
    deviceSetting.value[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].editable = false
    deviceSetting.value[
      DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
    ].value = DEFAULT_PLACEHOLDER
    nightLightsState = DEFAULT_PLACEHOLDER
  } else {
    deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].editable = true
    deviceSetting.value[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].editable = true
    nightLightsState = device?.night_lights_state
    if (nightLightsState === NightLightsStateEnum.CLOSE) {
      deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value = "关闭"
      deviceSetting.value[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value = "关闭"
    } else if (nightLightsState === NightLightsStateEnum.OPEN) {
      deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value = "开启"
      deviceSetting.value[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value = "开启"
    } else {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
      ].value = DEFAULT_PLACEHOLDER
    }
  }
  deviceSetting[
  deviceSetting.value[
    DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
  ].trueValue = nightLightsState
@@ -49,169 +50,169 @@
  let heightLimit = device?.height_limit
  if (isNil(heightLimit) || heightLimit === 0) {
    heightLimit = DEFAULT_PLACEHOLDER
    deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].editable = false
    deviceSetting.value[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].editable = false
  } else {
    deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].editable = true
    deviceSetting.value[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].editable = true
  }
  deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].trueValue = heightLimit
  deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].value =
  deviceSetting.value[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].trueValue = heightLimit
  deviceSetting.value[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].value =
    heightLimit + Unit_M
  // 限远
  let distanceLimitStatus = ""
  if (isNil(device?.distance_limit_status?.state)) {
    distanceLimitStatus = DEFAULT_PLACEHOLDER
    deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].editable = false
    deviceSetting[
    deviceSetting.value[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].editable = false
    deviceSetting.value[
      DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
    ].value = DEFAULT_PLACEHOLDER
  } else {
    deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].editable = true
    deviceSetting.value[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].editable = true
    distanceLimitStatus = device?.distance_limit_status?.state
    if (distanceLimitStatus === DistanceLimitStatusEnum.UNSET) {
      deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value = "关闭"
      deviceSetting.value[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value = "关闭"
    } else if (distanceLimitStatus === DistanceLimitStatusEnum.SET) {
      const distanceLimit = device?.distance_limit_status?.distance_limit
      if (distanceLimit) {
        deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value =
        deviceSetting.value[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value =
          distanceLimit + Unit_M
      } else {
        deviceSetting[
        deviceSetting.value[
          DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
        ].value = DEFAULT_PLACEHOLDER
      }
    } else {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
      ].value = DEFAULT_PLACEHOLDER
    }
  }
  deviceSetting[
  deviceSetting.value[
    DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
  ].trueValue = distanceLimitStatus
  // 避障
  if (isNil(device?.obstacle_avoidance)) {
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
    ].editable = false
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
    ].value = DEFAULT_PLACEHOLDER
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
    ].trueValue = DEFAULT_PLACEHOLDER
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
    ].editable = false
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
    ].value = DEFAULT_PLACEHOLDER
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
    ].trueValue = DEFAULT_PLACEHOLDER
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
    ].editable = false
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
    ].value = DEFAULT_PLACEHOLDER
    deviceSetting[
    deviceSetting.value[
      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
    ].trueValue = DEFAULT_PLACEHOLDER
  } else {
    const { horizon, upside, downside } = device.obstacle_avoidance || {}
    if (isNil(horizon)) {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
      ].editable = false
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
      ].value = DEFAULT_PLACEHOLDER
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
      ].trueValue = DEFAULT_PLACEHOLDER
    } else {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
      ].editable = false
      if (horizon === ObstacleAvoidanceStatusEnum.CLOSE) {
        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value =
        deviceSetting.value[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value =
          "关闭"
      } else if (horizon === ObstacleAvoidanceStatusEnum.OPEN) {
        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value =
        deviceSetting.value[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value =
          "开启"
      } else {
        deviceSetting[
        deviceSetting.value[
          DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
        ].value = DEFAULT_PLACEHOLDER
      }
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
      ].trueValue = horizon
    }
    if (isNil(upside)) {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
      ].editable = false
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
      ].value = DEFAULT_PLACEHOLDER
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
      ].trueValue = DEFAULT_PLACEHOLDER
    } else {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
      ].editable = false
      if (upside === ObstacleAvoidanceStatusEnum.CLOSE) {
        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value =
        deviceSetting.value[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value =
          "关闭"
      } else if (upside === ObstacleAvoidanceStatusEnum.OPEN) {
        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value =
        deviceSetting.value[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value =
          "开启"
      } else {
        deviceSetting[
        deviceSetting.value[
          DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
        ].value = DEFAULT_PLACEHOLDER
      }
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
      ].trueValue = upside
    }
    if (isNil(downside)) {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
      ].editable = false
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
      ].value = DEFAULT_PLACEHOLDER
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
      ].trueValue = DEFAULT_PLACEHOLDER
    } else {
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
      ].editable = false
      if (downside === ObstacleAvoidanceStatusEnum.CLOSE) {
        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value =
        deviceSetting.value[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value =
          "关闭"
      } else if (downside === ObstacleAvoidanceStatusEnum.OPEN) {
        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value =
        deviceSetting.value[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value =
          "开启"
      } else {
        deviceSetting[
        deviceSetting.value[
          DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
        ].value = DEFAULT_PLACEHOLDER
      }
      deviceSetting[
      deviceSetting.value[
        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
      ].trueValue = downside
    }
  }
  return deviceSetting
  return deviceSetting.value
}
// 更新formModel
@@ -219,8 +220,9 @@
  deviceSettingFormModelFromOsd,
  deviceInfo
) {
  const { device, dock, gateway } = deviceInfo || {}
  if (!deviceSettingFormModelFromOsd) {
  // const { device, dock, gateway } = deviceInfo || {}
  let device = deviceInfo?? {}
  if (!deviceSettingFormModelFromOsd.value) {
    return
  }
  // 夜航灯
@@ -229,17 +231,17 @@
    !isNil(nightLightsState) &&
    nightLightsState === NightLightsStateEnum.OPEN
  ) {
    deviceSettingFormModelFromOsd.nightLightsState = true
    deviceSettingFormModelFromOsd.value.nightLightsState = true
  } else {
    deviceSettingFormModelFromOsd.nightLightsState = false
    deviceSettingFormModelFromOsd.value.nightLightsState = false
  }
  // 限高
  const heightLimit = device?.height_limit
  if (isNil(heightLimit) || heightLimit === 0) {
    deviceSettingFormModelFromOsd.heightLimit = 20
    deviceSettingFormModelFromOsd.value.heightLimit = 20
  } else {
    deviceSettingFormModelFromOsd.heightLimit = heightLimit
    deviceSettingFormModelFromOsd.value.heightLimit = heightLimit
  }
  // 限远
@@ -248,36 +250,36 @@
    !isNil(distanceLimitStatus) &&
    distanceLimitStatus === DistanceLimitStatusEnum.SET
  ) {
    deviceSettingFormModelFromOsd.distanceLimitStatus.state = true
    deviceSettingFormModelFromOsd.distanceLimitStatus.distanceLimit =
    deviceSettingFormModelFromOsd.value.distanceLimitStatus.state = true
    deviceSettingFormModelFromOsd.value.distanceLimitStatus.distanceLimit =
      device?.distance_limit_status?.distance_limit || 15
  } else {
    deviceSettingFormModelFromOsd.distanceLimitStatus.state = false
    deviceSettingFormModelFromOsd.distanceLimitStatus.distanceLimit = 15
    deviceSettingFormModelFromOsd.value.distanceLimitStatus.state = false
    deviceSettingFormModelFromOsd.value.distanceLimitStatus.distanceLimit = 15
  }
  // 避障
  if (isNil(device?.obstacle_avoidance)) {
    deviceSettingFormModelFromOsd.obstacleAvoidanceHorizon = false
    deviceSettingFormModelFromOsd.obstacleAvoidanceUpside = false
    deviceSettingFormModelFromOsd.obstacleAvoidanceDownside = false
    deviceSettingFormModelFromOsd.value.obstacleAvoidanceHorizon = false
    deviceSettingFormModelFromOsd.value.obstacleAvoidanceUpside = false
    deviceSettingFormModelFromOsd.value.obstacleAvoidanceDownside = false
  } else {
    const { horizon, upside, downside } = device.obstacle_avoidance || {}
    if (!isNil(horizon) && horizon === ObstacleAvoidanceStatusEnum.OPEN) {
      deviceSettingFormModelFromOsd.obstacleAvoidanceHorizon = true
      deviceSettingFormModelFromOsd.value.obstacleAvoidanceHorizon = true
    } else {
      deviceSettingFormModelFromOsd.obstacleAvoidanceHorizon = false
      deviceSettingFormModelFromOsd.value.obstacleAvoidanceHorizon = false
    }
    if (!isNil(upside) && upside === ObstacleAvoidanceStatusEnum.OPEN) {
      deviceSettingFormModelFromOsd.obstacleAvoidanceUpside = true
      deviceSettingFormModelFromOsd.value.obstacleAvoidanceUpside = true
    } else {
      deviceSettingFormModelFromOsd.obstacleAvoidanceUpside = false
      deviceSettingFormModelFromOsd.value.obstacleAvoidanceUpside = false
    }
    if (!isNil(downside) && downside === ObstacleAvoidanceStatusEnum.OPEN) {
      deviceSettingFormModelFromOsd.obstacleAvoidanceDownside = true
      deviceSettingFormModelFromOsd.value.obstacleAvoidanceDownside = true
    } else {
      deviceSettingFormModelFromOsd.obstacleAvoidanceDownside = false
      deviceSettingFormModelFromOsd.value.obstacleAvoidanceDownside = false
    }
  }
  return deviceSettingFormModelFromOsd
  return deviceSettingFormModelFromOsd.value
}
src/views/device/airport.vue
@@ -74,6 +74,11 @@
                  <el-dropdown-item command="d"><el-button type="primary" text icon="el-icon-collection" v-if="permission.fly_device_offline"
                        @click.stop="rollFirmware(scope.row)">固件版本管理</el-button>
                  </el-dropdown-item>
                  <el-dropdown-item command="d">
                    <el-button type="primary" text icon="el-icon-collection" v-if="!scope.row.status" @click.stop="dockNotLine(scope.row)">
                      {{ scope.row.hidden_flag == 1 ? '设备上线' : '设备下线'}}
                    </el-button>
                  </el-dropdown-item>
                  <el-dropdown-item command="e"><el-button type="primary" text icon="el-icon-document-delete" v-if="permission.fly_device_offline"
                    @click.stop="handleDeviceOffline(scope.row)">注销</el-button>
                  </el-dropdown-item>
@@ -190,7 +195,8 @@
  ota,
  getDeviceFirmwareList,
  getDevices,
  deviceOffline
  deviceOffline,
  devicesUpdate
} from '@/api/device/device'
import { deleteByOssId, addOrUpdate as addOrUpdateOssBind } from '@/api/device/ossBind'
import { getListPage as getOssList } from '@/api/resource/oss'
@@ -280,6 +286,7 @@
        searchMenuSpan: 6,
        border: true,
        index: true,
        indexLabel: '序号',
        viewBtn: true,
        delBtn: false,
        selection: true,
@@ -295,14 +302,15 @@
          {
            label: '设备类型',
            prop: 'domain',
            editDisabled: true,
            editDisabled: false,
            editDisplay: false, //编辑显示
            viewDisplay: true, //查看显示
            viewDisplay: false, //查看显示
            search: false,
            slot: true,
            searchSpan: 4,
            labelWidth: 130,
            width: 120,
            // formatter: (row) => row.domain == 3 ? '机巢' : '无人机'
            // rules: [
            //   {
            //     required: true,
@@ -310,6 +318,16 @@
            //     trigger: 'blur',
            //   },
            // ],
          },
          {
            label: '设备类型',
            prop: 'domainTxt',
            editDisabled: true,
            editDisplay: false, //编辑显示
            viewDisplay: true, //查看显示
            labelWidth: 130,
            width: 120,
            hide: true
          },
          {
            label: '设备型号',
@@ -361,7 +379,7 @@
            label: '设备名称',
            prop: 'nickname',
            labelWidth: 130,
            width: 100,
            width: 160,
            searchSpan: 4,
            search: true,
            overHidden: true,
@@ -382,7 +400,7 @@
            editDisplay: false, //编辑显示
            viewDisplay: false, //查看显示
            labelWidth: 130,
            width: 100,
            width: 200,
          },
          {
            label: '设备位置',
@@ -459,12 +477,12 @@
          //     },
          //   ],
          // },
          {
            label: '负载设备',
            prop: 'payload_str',
            labelWidth: 130,
            width: 100,
            width: 160,
            overHidden: true,
            editDisabled: true,
            // rules: [
@@ -608,13 +626,14 @@
          //     },
          //   ],
          // },
          {
            hide: true,
            // hide: true,
            label: '保险有效期',
            prop: 'duration_of_insurance',
            labelWidth: 130,
            width: 160,
            type: 'daterange',
            format: 'YYYY-MM-DD',
            valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -926,6 +945,27 @@
        that.$refs.firmwareManage.init(row)
      })
    },
    // 设备下线
    dockNotLine(row) {
      let txt = row.hidden_flag === 1?'上线':'下线'
      ElMessageBox.confirm(`确定${txt}该设备吗?`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
      })
        .then(() => {
          let hidden_flag = row.hidden_flag === 1?0:1
          devicesUpdate({id:row.id, hidden_flag:hidden_flag})
            .then(res => {
              ElMessage.success('下线成功')
              this.init()
            })
            .catch(error => {
              ElMessage.error('下线失败')
            })
        })
        .catch(() => { })
    },
    // 版本回退点击事件
    rollFirmware (row) {
      if (row.status == 0) {
@@ -1204,7 +1244,9 @@
        insure_start_time: row.duration_of_insurance[0],
        insure_expired_time: row.duration_of_insurance[1],
      }
      if (submitData.traffic_expire_time === '') {
        delete submitData.traffic_expire_time
      }
      delete submitData.duration_of_insurance
      update(submitData).then(
@@ -1306,7 +1348,8 @@
            area_code: await this.getFullAreaCode(data.area_code),
            area_name: this.form.area_name,
            cnmode_code: this.getDockModeText(this.form.mode_code),
            domain: data.domain === 0 ? '无人机' : data.domain === 3 ? '机巢' : '未知',
            // domain: data.domain === 0 ? '无人机' : data.domain === 3 ? '机巢' : '未知',
            domainTxt: data.domain === 0 ? '无人机' : data.domain === 3 ? '机巢' : '未知',
            cnstatus: this.form.status === false ? '离线' : '在线',
            duration_of_insurance: [data?.insure_start_time || '', data?.insure_expired_time || ''],
          }
@@ -1349,6 +1392,7 @@
          if (e.firmware_status == 4) {
            this.connectWebSocket(e)
          }
          e.duration_of_insurance = [e.insure_start_time || '', e.insure_expired_time || '']
        })
        this.data = data.records
        this.loading = false
src/views/device/components/DeviceSettingBox.vue
@@ -312,7 +312,7 @@
</template>
<script setup>
import { defineProps, ref, watch } from 'vue';
import { defineProps, inject, ref, watch } from 'vue';
import { ELocalStorageKey } from '@/types'
import { cloneDeep } from 'lodash';
import { initDeviceSetting, initDeviceSettingFormModel, DeviceSettingKeyEnum } from '@/types/device-setting';
@@ -326,16 +326,19 @@
// const props = defineProps();
const props = defineProps(['sn', 'deviceInfo'])
const deviceSetting = ref(cloneDeep(initDeviceSetting));
const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
// const deviceSetting = ref(cloneDeep(initDeviceSetting));
// const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
const deviceSettingFormModel = ref(cloneDeep(initDeviceSettingFormModel)); // 真实使用的formModel
const deviceSetting = inject('deviceSetting')
const deviceSettingFormModelFromOsd = inject('deviceSettingFormModelFromOsd')
// 根据设备osd信息更新信息
watch(
  () => props.deviceInfo,
  value => {
    updateDeviceSettingInfoByOsd(deviceSetting.value, value);
    updateDeviceSettingFormModelByOsd(deviceSettingFormModelFromOsd.value, value);
    // console.log('9999',value)
    // updateDeviceSettingInfoByOsd(deviceSetting, value);
    // updateDeviceSettingFormModelByOsd(deviceSettingFormModelFromOsd, value);
    // console.log('deviceInfo', value)
  },
  {
src/views/device/components/DockControlPanel.vue
@@ -82,6 +82,8 @@
import { cmdList as baseCmdList } from '@/types/device-cmd'
import { useDockControl } from './use-dock-control'
import { EDockModeCode } from '@/types/device'
import { updateDeviceSettingFormModelByOsd, updateDeviceSettingInfoByOsd } from '@/utils/device-setting';
import { initDeviceSetting, initDeviceSettingFormModel } from '@/types/device-setting';
import { updateDeviceCmdInfoByOsd, updateDeviceCmdInfoByExecuteInfo } from '@/utils/device-cmd'
import { setThermalCurrentPaletteStyle, setPhotoStorageSet, setVideoStorageSet, getLiveStatus, setStreamsSwitch, photoAndVideoCmd } from '@/api/device-setting'
import DeviceSettingBox from './DeviceSettingBox.vue'
@@ -89,12 +91,21 @@
import { useConnectWebSocket } from '@/utils/websocket/connect-websocket';
import { getWebsocketUrl } from '@/utils/websocket/config';
import EventBus from '@/utils/eventBus';
import { cloneDeep } from 'lodash';
const valueStyle = ref(0)
const cameraModeValue = ref(0)
const videoValue = ref("zoom")
const photo_storage_settings = ref([])
const video_storage_settings = ref([])
let deviceSetting = ref(cloneDeep(initDeviceSetting));
const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
provide('deviceSetting', deviceSetting)
provide('deviceSettingFormModelFromOsd', deviceSettingFormModelFromOsd)
// 定义一个数据videoList
const videoList = reactive([])
@@ -222,7 +233,7 @@
watch(
  () => Store.getters.deviceState,
  value => {
    // console.log('设备状态变化', value)
    // console.log('设备状态变化', value.deviceInfo[props.deviceInfo.child_sn])
    if (props.sn && (value.currentSn === props.deviceInfo.child_sn || value.currentSn === props.deviceInfo.device_sn)) {
      debugStatus.value = value.dockInfo[props.deviceInfo.device_sn]?.basic_osd?.mode_code === EDockModeCode.Remote_Debugging
      const devices = {}
@@ -240,6 +251,9 @@
      }
      deviceInfo = ref(value.deviceInfo[props.deviceInfo.child_sn])
      updateDeviceCmdInfoByOsd(cmdList.value, devices)
      // by cpz
      updateDeviceSettingInfoByOsd(deviceSetting, value.deviceInfo[props.deviceInfo.child_sn]);
      updateDeviceSettingFormModelByOsd(deviceSettingFormModelFromOsd, value.deviceInfo[props.deviceInfo.child_sn])
    }
  },
  {
src/views/device/components/use-device-setting.js
@@ -52,20 +52,15 @@
  // 设置设备属性
  async function setDeviceProps(sn, body) {
    try {
      const { code, message: msg } = await putDeviceProps(sn, body);
      console.log(code,messages)
      if (code === 0) {
        ElMessage({
          message: '设备属性设置成功!',
          type: 'success',
        });
      }
      throw msg;
       await putDeviceProps(sn, body).then(res => {
         if (res.data.code === 0) {
           ElMessage({
             message: '设备属性设置成功!',
             type: 'success',
           });
         }
      });
    } catch (e) {
      // ElMessage({
      //   message: '设备属性设置失败',
      //   type: 'error',
      // });
      return false;
    }
  }
src/views/odm/task.vue
@@ -100,6 +100,7 @@
            label: '任务名称',
            prop: 'taskName',
            search: true,
            labelWidth: 130,
            searchSpan: 4,
            searchLabelWidth: 100,
            //labelWidth: 130,
@@ -176,6 +177,7 @@
            prop: 'airportName',
            searchSpan: 4,
            searchLabelWidth: 100,
            labelWidth: 130,
            //search: true,
          },
          {
@@ -204,6 +206,7 @@
            searchSpan: 4,
            searchLabelWidth: 100,
            searchPlaceholder: '任务状态',
            labelWidth: 130,
            width: 90,
            dicData: [
              { label: '待启动', value: 0 },