From 2777b59c3e1d2b9a76f7072a1ceebf7f78eddaff Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Thu, 04 Dec 2025 17:05:19 +0800
Subject: [PATCH] Merge branch 'refs/heads/feature/v8.0/8.0.4' into test

---
 src/views/job/components/SearchBox.vue           |   40 ++++++-
 src/views/resource/components/spotDetails.vue    |   28 ++++-
 src/views/device/components/DockControlPanel.vue |    2 
 src/views/dataCenter/dataCenter.vue              |   50 ++++++---
 src/axios.js                                     |   19 +++
 src/views/device/airport.vue                     |  109 ++++++++++++---------
 6 files changed, 170 insertions(+), 78 deletions(-)

diff --git a/src/axios.js b/src/axios.js
index 4acc439..3ef44cf 100644
--- a/src/axios.js
+++ b/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;
diff --git a/src/views/dataCenter/dataCenter.vue b/src/views/dataCenter/dataCenter.vue
index 40ed9c2..a1baa56 100644
--- a/src/views/dataCenter/dataCenter.vue
+++ b/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%;
diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index f0898a0..e336b6c 100644
--- a/src/views/device/airport.vue
+++ b/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) || '']
         })
diff --git a/src/views/device/components/DockControlPanel.vue b/src/views/device/components/DockControlPanel.vue
index 9a93c71..e51976b 100644
--- a/src/views/device/components/DockControlPanel.vue
+++ b/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
diff --git a/src/views/job/components/SearchBox.vue b/src/views/job/components/SearchBox.vue
index 6f6e0af..83bba63 100644
--- a/src/views/job/components/SearchBox.vue
+++ b/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()
diff --git a/src/views/resource/components/spotDetails.vue b/src/views/resource/components/spotDetails.vue
index dd0f1eb..1a923a1 100644
--- a/src/views/resource/components/spotDetails.vue
+++ b/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;

--
Gitblit v1.9.3