无人机管理后台前端(已迁走)
张含笑
2025-12-04 2777b59c3e1d2b9a76f7072a1ceebf7f78eddaff
Merge branch 'refs/heads/feature/v8.0/8.0.4' into test
6 files modified
248 ■■■■■ changed files
src/axios.js 19 ●●●●● patch | view | raw | blame | history
src/views/dataCenter/dataCenter.vue 50 ●●●●● patch | view | raw | blame | history
src/views/device/airport.vue 109 ●●●●● patch | view | raw | blame | history
src/views/device/components/DockControlPanel.vue 2 ●●● patch | view | raw | blame | history
src/views/job/components/SearchBox.vue 40 ●●●● patch | view | raw | blame | history
src/views/resource/components/spotDetails.vue 28 ●●●● patch | view | raw | blame | history
src/axios.js
@@ -50,6 +50,25 @@
        `${website.clientId}:${website.clientSecret}`
      )}`;
    }
    // 后端的要求
    if (router.currentRoute.value.path === '/job/jobstatistics'){
      const userAreaCode = store?.state?.user?.userInfo?.detail?.areaCode
      const paramsKey = config.method === 'get' ? 'params' : 'data';
      const codeKey = config.method === 'get' ? 'areaCode' : 'area_code';
      const paramCode = config?.params?.areaCode || config?.data?.area_code
      try {
        if (paramCode){
          if (paramCode === userAreaCode) {
            config[paramsKey][codeKey] = config.method === 'get' ? '' : undefined;
          } else {
            if (!Array.isArray(config[paramsKey])){
              config[paramsKey] = {...config[paramsKey],[codeKey]: paramCode}
            }
          }
        }
      }catch (e) {}
    }
    //headers判断请求是否携带token
    const meta = config.meta || {};
    const isToken = meta.isToken === false;
src/views/dataCenter/dataCenter.vue
@@ -93,13 +93,15 @@
          <el-table-column property="link" label="缩略图" width="120">
            <template #default="scope">
              <img
             <div v-if="scope.row?.resultType === 5" class="videoItem1">
               <img
                class="quanjing"
                @click="clickpanorama(scope.row)"
                v-if="scope.row?.resultType === 5"
                :src="scope.row?.smallUrl"
                alt=""
              />
             </div>
              <!-- 视频 -->
              <div v-else-if="scope.row?.resultType === 1" class="videoItem1">
                <img
@@ -116,20 +118,23 @@
                />
              </div>
              <!-- 正射 -->
              <el-image
                v-else-if="scope.row?.resultType === 4"
              <div v-else-if="scope.row?.resultType === 4" class="videoItem1">
                <el-image
                :src="getzsSmallImg(scope.row?.link)"
                :preview-src-list="[getzsSmallImg(scope.row?.link)]"
                fit="cover"
                preview-teleported
              />
              <el-image
                v-else
              </div>
              <div v-else class="videoItem1">
                <el-image
                :src="scope.row?.smallUrl"
                :preview-src-list="[scope.row?.showUrl]"
                fit="cover"
                preview-teleported
              />
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="jobTime" label="任务时间" />
@@ -1027,17 +1032,30 @@
    width: 76px;
    height: 72px;
  }
  .videoItem1 {
    .playBox {
      width: 20px;
      height: 20px;
      position: absolute;
      top: 46%;
      left: 43%;
      transform: translate(-50%, -50%);
      cursor: pointer;
    }
  }
  position: relative;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100%;
  min-height: 80px;
}
.playBox {
  position: absolute;
  width: 20px;
  height: 20px;
  cursor: pointer;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 1;
}
  .videoDialog :deep(.el-dialog) {
    height: 600px;
    width: 54%;
src/views/device/airport.vue
@@ -26,18 +26,18 @@
      <template #firmware_status="{ row }">
        <div v-if="row.firmware_status == 1" class="onlineStatus1">
          <el-tag type="info">无需升级</el-tag>
          <el-tag type="primary" effect="dark" class="active-element" @click="rollFirmware(row)">版本管理</el-tag>
<!--          <el-tag type="primary" effect="dark" class="active-element" @click="rollFirmware(row)">版本管理</el-tag>-->
          <!-- <div style="background-color: #f1f1f1; border-radius: 4px">无需升级</div> -->
        </div>
        <div v-if="row.firmware_status == 2" class="onlineStatus1">
          <!-- <el-tag type="success" effect="dark" class="active-element" @click="updateFirmware(row)"
            >升级固件</el-tag
          > -->
          <el-tag type="primary" effect="dark" class="active-element" @click="rollFirmware(row)">版本管理</el-tag>
<!--          <el-tag type="primary" effect="dark" class="active-element" @click="rollFirmware(row)">版本管理</el-tag>-->
          <!-- <div @click="updateFirmware(row)" class="firmware_status">升级固件</div> -->
        </div>
        <div v-if="row.firmware_status == 3" class="onlineStatus">
          <el-tag type="success" effect="dark" class="active-element" @click="updateFirmware(row)">一致性升级</el-tag>
<!--          <el-tag type="success" effect="dark" class="active-element" @click="updateFirmware(row)">一致性升级</el-tag>-->
          <!-- <div @click="updateFirmware(row)" class="firmware_status">一致性升级</div> -->
        </div>
        <div v-if="row.firmware_status == 4" class="onlineStatus">
@@ -409,7 +409,6 @@
              },
            ],
          },
          {
            label: '4G增强',
            prop: 'link_workmode',
@@ -532,7 +531,18 @@
              },
            ],
          },
          {
            label: '固件升级',
            prop: 'firmware_status',
            labelWidth: 145,
            width: 100,
            // hide: true,
            viewDisabled: true,
            addDisabled: true,
            editDisplay: false, //编辑显示
            addDisplay: false,
            viewDisplay: false,
          },
          {
            label: '设备SN',
            prop: 'device_sn',
@@ -627,18 +637,6 @@
            labelWidth: 145,
            width: 110,
            editDisplay: false, //编辑显示
          },
          {
            label: '固件升级',
            prop: 'firmware_status',
            labelWidth: 145,
            width: 100,
            hide: true,
            viewDisabled: true,
            addDisabled: true,
            editDisplay: false, //编辑显示
            addDisplay: false,
            viewDisplay: false,
          },
          {
            label: '所属部门',
@@ -869,21 +867,30 @@
      websocket?.initSocket()
    },
    async messageHandler(payload) {
      if (!payload) {
      let loadData = JSON.parse(payload)
      if (!loadData) {
        return
      }
      if (payload.biz_code != 'ota_progress') {
      if (loadData.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
      console.log(loadData.data.output.progress.percent, '6666')
      this.data.forEach((e, index) => {
        if ((e.device_sn == loadData.data.sn || e.child_sn == loadData.data.sn) && loadData.data.output.status == 'in_progress') {
          e.firmware_progress = loadData.data.output.progress.percent
          if (e.children[0]) {
            e.children[0].firmware_progress = loadData.data.output.progress.percent;
          }
          console.log('是否更新中2',e.children[0])
        }
        if (e.device_sn == data.sn && data.output.status == 'ok') {
        if ((e.device_sn == loadData.data.sn || e.child_sn == loadData.data.sn) && loadData.data.output.status == 'ok') {
          // 升级完成修改状态
          e.firmware_status = 1
          if (e.children[0]) {
            e.children[0].firmware_status = 1
          }
          const webscoket = this.websocketMap.get(e.workspace_id)
          // 关闭
          webscoket?.close()
@@ -892,6 +899,7 @@
          this.webSocketIdSet.delete(e.workspace_id)
        }
      })
      // this.$forceUpdate()
    },
    init() {
      (this.page = {
@@ -1133,7 +1141,7 @@
          message: '操作成功!',
        })
        this.onLoad(this.page)
        done()
        // done()
      })
    },
    // 升级固件按钮事件
@@ -1372,25 +1380,25 @@
          this.$refs.crud.toggleSelection()
        })
    },
    async getFullAreaCode(areaCode) {
      console.log('getFullAreaCode', areaCode)
      if (!areaCode) return ''
      const code = areaCode.toString()
      if (code.includes(',')) return code
      if (code.endsWith('0000000000')) {
        return code
      } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
        const provinceCode = code.substring(0, 2) + '0000000000'
        return `${provinceCode},${code}`
      } else {
        const provinceCode = code.substring(0, 2) + '0000000000'
        const cityCode = code.substring(0, 4) + '00000000'
        return `${provinceCode},${cityCode},${code}`
      }
    },
    // async getFullAreaCode(areaCode) {
    //   console.log('getFullAreaCode', areaCode)
    //   if (!areaCode) return ''
    //
    //   const code = areaCode.toString()
    //
    //   if (code.includes(',')) return code
    //
    //   if (code.endsWith('0000000000')) {
    //     return code
    //   } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
    //     const provinceCode = code.substring(0, 2) + '0000000000'
    //     return `${provinceCode},${code}`
    //   } else {
    //     const provinceCode = code.substring(0, 2) + '0000000000'
    //     const cityCode = code.substring(0, 4) + '00000000'
    //     return `${provinceCode},${cityCode},${code}`
    //   }
    // },
    beforeOpen(done, type) {
      if (['edit', 'view'].includes(type)) {
        getDetail(this.form.id).then(async res => {
@@ -1443,12 +1451,16 @@
        this.page.total = data.total
        data.records.forEach(e => {
          e['hasChildren'] = e.has_children
          if (e.firmware_status == 4) {
          if (e.firmware_status == 4 || e.mode_code === 3) {
            console.log('监听了没')// 机巢升级 firmware_status === 4
            this.connectWebSocket(e)
          }
          e.duration_of_insurance = [e?.insure_start_time?.slice(0, 10) || '', e?.insure_expired_time?.slice(0, 10) || '']
        })
        this.data = data.records
        this.data = data.records.map(item => ({
          ...item,
          firmware_progress: 0
        }));
        this.loading = false
        this.selectionClear()
      })
@@ -1460,7 +1472,10 @@
        childSn: tree.child_sn,
      }
      getList(1, 10, params).then(res => {
        const data = res.data.data.records
        const data = res.data.data.records.map(item =>({
          ...item,
          firmware_progress: 0
        }))
        data.forEach(e => {
          e.duration_of_insurance = [e?.insure_start_time?.slice(0, 10) || '', e?.insure_expired_time?.slice(0, 10) || '']
        })
src/views/device/components/DockControlPanel.vue
@@ -233,7 +233,7 @@
watch(
  () => Store.getters.deviceState,
  value => {
    console.log(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
src/views/job/components/SearchBox.vue
@@ -320,27 +320,47 @@
let timeListEnum = ['TODAY', 'CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
let checked = ref('month');
// 根据 周期 获取时间段
function getDateRange(date_enum) {
  // 设置对应的日期范围
  switch (date_enum) {
    case 'today':
      dateRange.value = [dayjs().startOf('day').format(timeFormat), dayjs().endOf('day').format(timeFormat)]
      break
    case 'week':
      dateRange.value = [dayjs().startOf('week').format(timeFormat), dayjs().format(timeFormat)]
      break
    case 'month':
      dateRange.value = [dayjs().startOf('month').format(timeFormat), dayjs().format(timeFormat)]
      break
    case 'year':
      dateRange.value = [dayjs().startOf('year').format(timeFormat), dayjs().format(timeFormat)]
      break
  }
}
let timeClick = (item, index) => {
  if (checked.value === item){
  if (checked.value === item) {
    checked.value = null
    searchForm.date_enum = undefined
  }else{
    dateRange.value = []
  } else {
    checked.value = item
    searchForm.date_enum = timeListEnum[index]
    getDateRange(item)
  }
  dateRange.value = []
  handleSearch()
};
}
// 搜索
const handleSearch = () => {
  if (!dateRange.value) {
    dateRange.value = [];
  }
  if (dateRange.value && dateRange.value.length) {
    // 有值时 清除 日 本周 本月 本年状态
    checked.value = '';
    searchForm.date_enum = '';
  }
  // if (dateRange.value && dateRange.value.length) {
  //   // 有值时 清除 日 本周 本月 本年状态
  //   checked.value = '';
  //   searchForm.date_enum = '';
  // }
  // 提交至store
  let params = {
    ...searchForm,
@@ -446,6 +466,8 @@
    dateRange.value = dateArray;
    const find = store.state.tags.bsTagList.find(i => i.path === '/job/jobstatistics')
          find && (find.query = {})
  } else {
    getDateRange('month')
  }
      // 查询一次
    handleSearch()
src/views/resource/components/spotDetails.vue
@@ -30,6 +30,7 @@
                      v-model="item.value"
                      placeholder="请选择图斑类型"
                      style="width: 102%"
                      :disabled="item.value ==='综合类'"
                    >
                      <el-option
                        v-for="opt in spotTypeOptions"
@@ -60,7 +61,14 @@
        <div class="table-overlay">
          <div class="table-content">
            <div class="tabname">图斑列表</div>
            <el-table
       <div class="tabBoxLoading"
        v-loading="tableLoading"
            element-loading-text="加载中..."
            element-loading-background="rgba(0, 0, 0, 0.1)"
            >
             <el-table
             v-if="tableData.length > 0"
              ref="polygonTableEle"
              highlight-current-row
              :row-class-name="tableRowClassName"
@@ -108,6 +116,7 @@
                </template>
              </el-table-column>
            </el-table>
       </div>
           
          </div>
        </div>
@@ -160,6 +169,7 @@
const homeViewer = shallowRef(null);
let tbJwdList = [];
const loading = ref(false);
const tableLoading = ref(true);
const tableData = ref([]);
const AlltableData = ref([]);
let total = ref(0);
@@ -260,9 +270,9 @@
const isInit = ref(true);
// 图斑管理表格
const getTableList = () => {
  tableLoading.value = true;
  const requestParams = {
    patchesInfoId: props.detailid,
  };
  AlltableMapListApi(requestParams).then(res => {
    tableData.value = res.data.data?.map(item => ({
@@ -277,6 +287,8 @@
    } else {
      entitiesAddSpot();
    }
  }).finally(() => {
    tableLoading.value = false;
  });
};
@@ -640,7 +652,7 @@
      getspotManagementTableApi(); 
    }, 0);
  } else {
 tableLoading.value = false;
    tableData.value = []; 
    isEditing.value = false;
    handleUpDateDrawState(false);
@@ -907,9 +919,15 @@
  z-index: 9999 !important;
  max-width: 300px;
}
.tabBoxLoading {
height: 100%;
}
.el-table {
  flex: 1;
  overflow: auto;
height: 98%;
overflow: auto;
}
.btnGroups {
  position: absolute;