From 2cb7fb5ed332bc92e8164da8cc8754d32c8adcd9 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Thu, 27 Nov 2025 09:38:34 +0800
Subject: [PATCH] Merge branch 'feature/v8.0/8.0.4' into test

---
 src/views/tickets/ticket.vue                  |   64 ++++++++++----------
 src/page/index/useGlobalWS.js                 |    2 
 src/views/job/components/DeviceJobDetails.vue |   56 +++++++++---------
 src/views/layerManagement/index.vue           |   58 +++++++++---------
 4 files changed, 91 insertions(+), 89 deletions(-)

diff --git a/src/page/index/useGlobalWS.js b/src/page/index/useGlobalWS.js
index 22faf74..009bc8a 100644
--- a/src/page/index/useGlobalWS.js
+++ b/src/page/index/useGlobalWS.js
@@ -30,7 +30,7 @@
 			...downloadProgress.value,
 			[type]: setProgress,
 		})
-		if (status === 'COMPLETED' && ['dpsjzx','dplsrwxq'].includes(type)) {
+		if (status === 'COMPLETED' && ['htsjzx','htlsrwxq'].includes(type)) {
 			const name = `数据中心-${dayjs().format('YYYYMMDDHHmmss')}.zip`
 			const currentUrl = getStore({name: 'downloadUrl'})
 			if (currentUrl === download_url && download_url!== undefined) return
diff --git a/src/views/job/components/DeviceJobDetails.vue b/src/views/job/components/DeviceJobDetails.vue
index 349b529..a53d84c 100644
--- a/src/views/job/components/DeviceJobDetails.vue
+++ b/src/views/job/components/DeviceJobDetails.vue
@@ -155,7 +155,7 @@
 
 <script setup>
 import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue';
-import { getShowImg, getSmallImg, getzsSmallImg,getzsShowImg } from '@/utils/util';
+import { getShowImg, getSmallImg, getzsSmallImg, getzsShowImg, aLinkDownloadUtil } from '@/utils/util';
 import { getaiImagesPageAPI,cancelDownloadApi,getDownloadStatusApi,attachDownload,aiImagesPage} from '@/api/dataCenter/dataCenter';
 import { pxToRem } from '@/utils/rem'
 import JobRelatedEvents from './JobRelatedEvents.vue'
@@ -200,35 +200,37 @@
 	return videoUrl.replace(/\.mp4$/, '_small.jpg')
 }
 const infoList = ref([
-	{ name: '任务编号', value: '', field: 'job_info_num' },
-	{ name: '任务名称', value: '', field: 'name' },
-	{ name: '任务类型', value: '', field: 'industry_type_str' },
-	{ name: '飞行事件', value: '', field: 'event_number' },
-	{ name: '所属机巢', value: '', field: 'device_names' },
-	{ name: '所属部门', value: '', field: 'dept_name' },
-	{ name: '任务时间', value: '', field: 'cycle_time_value' },
-	{ name: '关联算法', value: '', field: 'ai_type_str' },
-	{ name: '任务描述', value: '', field: 'remark' },
+  { name: '任务编号', value: '', field: 'job_info_num' },
+  { name: '任务名称', value: '', field: 'name' },
+  { name: '任务类型', value: '', field: 'industry_type_str' },
+  { name: '飞行事件', value: '', field: 'event_number' },
+  { name: '所属机巢', value: '', field: 'device_names' },
+  { name: '所属部门', value: '', field: 'dept_name' },
+  { name: '任务时间', value: '', field: 'cycle_time_value' },
+  { name: '关联算法', value: '', field: 'ai_type_str' },
   { name: '自定义识别区', value: '', field: 'enable_custom_area' },
-	// { name: '任务执行次数', value: '', field: 'job_num' },
+  { name: '创建人', value: '', field: 'creator_name' },
+  { name: '任务描述', value: '', field: 'remark' },
+  // { name: '任务执行次数', value: '', field: 'job_num' },
 ])
 // 机巢状态
 const flystatus = ref('')
 const detailsData = ref({
-	id: null,
-	remark: null,
-	is_monitoring: null,
-	industry_type_str: null,
-	area_code: null,
-	ai_type_str: null,
-	begin_time: null,
-	end_time: null,
-	device_names: null,
-	create_time: null,
-	name: null,
-	event_number: null,
-	creator_name: null,
-	way_lines: [],
+  id: null,
+  remark: null,
+  is_monitoring: null,
+  industry_type_str: null,
+  area_code: null,
+  ai_type_str: null,
+  enable_custom_area:null,
+  begin_time: null,
+  end_time: null,
+  device_names: null,
+  create_time: null,
+  name: null,
+  event_number: null,
+  creator_name: null,
+  way_lines: [],
 })
 // 任务成果
 const total = ref(0)
@@ -335,8 +337,8 @@
 	if (!list?.length) return ElMessage.warning('请选择文件')
 	if (list.length === 1) {
 		list.forEach((item, index) => {
-			const suffix = item.url.split('.').pop()
-			aLinkDownloadUtil(item.url, item.nickName + '.' + suffix)
+			const suffix = item.link.split('.').pop()
+			aLinkDownloadUtil(item.link, item.nickName + '.' + suffix)
 		})
 	} else {
 		loadingData = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' })
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index ac819ab..6b08ab3 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -33,7 +33,7 @@
           @update:editFolder="handleFolder"
           :activeName="activeName"
           @newFencesMethods="newFencesMethods"
-          :reset-check="resetCheck" 
+          :reset-check="resetCheck"
         ></leftList>
         <rightEdit
           v-if="layerParams.addNest || layerParams.editNest"
@@ -64,7 +64,7 @@
 import * as Cesium from 'cesium';
 import { PublicCesium } from '@/utils/cesium/publicCesium';
 import _, { cloneDeep, throttle } from 'lodash';
-
+const isProd = import.meta.env.VITE_APP_ENV === 'production'
 import { provide } from 'vue';
 import { useStore } from 'vuex';
 const isProd = import.meta.env.VITE_APP_ENV === 'production'
@@ -137,7 +137,7 @@
      layerParams.value.addFolder = false
     layerParams.value.editFolder = false
     resetCheck.value = !resetCheck.value;
-    
+
 };
 const refreshMethod = () => {
   getdataFolderApi();
@@ -166,7 +166,7 @@
   viewer.entities.removeAll();
   layerParams.value.editDetailData = val;
   drawPolygonExample.editThePatch(true);
-  drawPolygonExample.drawTheArea(true); 
+  drawPolygonExample.drawTheArea(true);
   let geoDataArr = JSON.parse(val.geo_data);
   if (geoDataArr.length > 0) {
     geoDataArr.pop();
@@ -221,7 +221,7 @@
       console.warn(`数据 ${item.name} 坐标点不足,无法绘制`);
       return;
     }
-   
+
     tbJwdList.push(...positions);
     let degreesArray = [];
     positions.forEach(pos => {
@@ -236,20 +236,20 @@
     border2: Cesium.Color.fromCssColorString('#ff0000'),
     border3: Cesium.Color.fromCssColorString('#00ffea'),
   };
-   const fillColor = item.category_id === 1 
-      ? colorMap[1] 
-      : item.category_id === 2 
-        ? colorMap[2] 
-        : item.category_id === 3 
-          ? colorMap[3] 
+   const fillColor = item.category_id === 1
+      ? colorMap[1]
+      : item.category_id === 2
+        ? colorMap[2]
+        : item.category_id === 3
+          ? colorMap[3]
           : Cesium.Color.YELLOW.withAlpha(0.5);
-    
-    const borderColor = item.category_id === 1 
-      ? colorMap.border1 
-      : item.category_id === 2 
-        ? colorMap.border2 
-        : item.category_id === 3 
-          ? colorMap.border3 
+
+    const borderColor = item.category_id === 1
+      ? colorMap.border1
+      : item.category_id === 2
+        ? colorMap.border2
+        : item.category_id === 3
+          ? colorMap.border3
           : Cesium.Color.YELLOW;
       viewer.entities.add({
       id: `polygon_${item.id}`,
@@ -272,17 +272,17 @@
         material:borderColor,
         clampToGround: true,
       },
-      zIndex: 99, 
+      zIndex: 99,
     });
-  });  
+  });
  if (!layerParams.value.isSingleLocating) {
-    focusOnAllFeatures(); 
+    focusOnAllFeatures();
   }
   viewInstance.value?.addLeftClickEvent(null, handleFenceClick);
 };
 const focusOnAllFeatures = () => {
   if (tbJwdList.length === 0 || !viewer) return;
-  
+
   // 判断是否有指定定位的文件夹
   if (layerParams.value.currentLocationFolderId) {
     // 筛选当前文件夹下的所有子节点坐标
@@ -292,7 +292,7 @@
         const positions = parseGeoDataToPositions(item.geo_data, item.altitude);
         return positions.length >= 3 ? positions : [];
       });
-    
+
     if (targetFolderPositions.length > 0) {
       const positionsData = targetFolderPositions.map(pos => [
         pos.lng,
@@ -326,16 +326,16 @@
 const handleFenceClick = movement => {
   if (!viewer) return;
   layerParams.value.editDetailData = null;
-  
+
 if(activeName.value !== '国土空间规划') {
-    const pickedObjects = viewer.scene.drillPick(movement.position, 10); 
+    const pickedObjects = viewer.scene.drillPick(movement.position, 10);
   // 遍历所有被点击的实体,找到围栏类型(customType: 'fence_polygon')
   let selectedEntity = null;
   for (let i = 0; i < pickedObjects.length; i++) {
     const pick = pickedObjects[i];
     if (Cesium.defined(pick.id) && pick.id?.customType === 'fence_polygon') {
       selectedEntity = pick.id;
-      break; 
+      break;
     }
   }
     // viewer.entities.values.forEach(entity => {
@@ -403,7 +403,7 @@
       let cartographic = Cesium.Cartographic.fromCartesian(item);
       let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
       let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
-      let height = Cesium.Math.toDegrees(cartographic.height); //高度 
+      let height = Cesium.Math.toDegrees(cartographic.height); //高度
       return {
         lng: _.round(lng, 6),
         lat: _.round(lat, 6),
@@ -420,7 +420,7 @@
   }else {
     showToolTipText.value = '点击地图生成测绘区域'
   }
-  
+
  if(polygon.length > 0){
       polygon.push([curPolygonPosition[0]?.lng, curPolygonPosition[0]?.lat])
  }
@@ -476,7 +476,7 @@
 // 添加loading
 const isPageLoading = ref(false);
 const handleLoadingChange = (status) => {
-  isPageLoading.value = status; 
+  isPageLoading.value = status;
 };
 provide('layerParams', layerParams);
 onMounted(() => {
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 344db58..7f4703a 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -131,7 +131,7 @@
               >
                 批量审核
               </el-button>
-            
+
               <el-button
                 v-if="permissionList.exportBtn"
                 type="success"
@@ -149,7 +149,7 @@
            class="ztzf-public-general-el-table custom-header"
           ref="elTable"
           :data="tableData"
-          v-loading="loading"    
+          v-loading="loading"
           @selection-change="handleSelectionChange"
           border
           style="width: 100%"
@@ -171,40 +171,40 @@
               </el-tooltip-copy>
             </template>
           </el-table-column>
-          
+
           <el-table-column prop="department" label="所属部门" show-overflow-tooltip />
-          
+
           <el-table-column prop="startTime" label="发起任务时间" width="160" show-overflow-tooltip />
-          
+
           <el-table-column prop="aiType" label="关联算法" show-overflow-tooltip />
-          
+
           <el-table-column prop="type" label="工单类型" width="110" show-overflow-tooltip>
             <template #default="{ row }">
               {{ getTypeLabel(row.type) }}
             </template>
           </el-table-column>
-          
+
           <el-table-column prop="content" label="工单内容" width="132" show-overflow-tooltip>
             <template #default="{ row }">
               {{ row.address || row.content }}
             </template>
           </el-table-column>
-          
+
           <el-table-column prop="creator" label="创建人" width="120" show-overflow-tooltip />
-          
+
           <el-table-column prop="handler" label="处理人" width="120" show-overflow-tooltip />
-          
-          <el-table-column 
-            v-if="['all', 'completed', 'myTickets'].includes(activeTab)" 
-            label="复核状态" 
-            prop="isReview" 
+
+          <el-table-column
+            v-if="['all', 'completed', 'myTickets'].includes(activeTab)"
+            label="复核状态"
+            prop="isReview"
             width="90"
           >
             <template #default="{ row }">
               <span>{{ showIsReviewText(row) }}</span>
             </template>
           </el-table-column>
-          
+
           <el-table-column label="工单状态" prop="status" width="90">
             <template #default="{ row }">
               <span :style="getStatusTagType(row.status) ? 'color:' + getStatusTagType(row.status) : ''">
@@ -212,7 +212,7 @@
               </span>
             </template>
           </el-table-column>
-          
+
           <!-- 操作列 -->
           <el-table-column label="操作" width="200" align="center">
             <template #default="{ row }">
@@ -222,15 +222,15 @@
                   删除
                 </el-button>
               </template>
-              
+
               <template v-else>
                 <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button>
               </template>
-              
+
               <template v-if="row.status === 4 && !isProd">
                 <el-button type="text" icon="el-icon-download" @click="exportTheTick(row)">导出</el-button>
               </template>
-              
+
               <template v-if="permission.tickets_repeat_review">
                 <el-button
                   v-if="row.status === 4 && row.isReview !== 1"
@@ -510,7 +510,7 @@
 const checkedKeys = ref([])
 const inputMapShowDefaultCenter = ref(null)
 const userInfo = computed(() => store.state.user.userInfo)
-const permission = computed(() => store.state.user.permission); 
+const permission = computed(() => store.state.user.permission);
 
 // 计算属性
 const firstRowData = computed(() => {
@@ -521,7 +521,7 @@
   const tabPending = permission.value?.tickets_tab_pending === true//待审核
   const tabMyTickets = permission.value?.tickets_tab_mytickets === true  //我的工单
   const tabALL = permission.value?.tickets_allWorkOrders === true //全部工单
-  const tabInProgress= permission.value?.tickets_inProgress === true //处理中 
+  const tabInProgress= permission.value?.tickets_inProgress === true //处理中
   const tabProcessing= permission.value?.tickets_pending === true //待处理
   const tabCompleted= permission.value?.tickets_wasDone === true //已完成
   return tabs.value
@@ -558,7 +558,7 @@
 const defaultActiveTab = computed(() => {
   const hasAllTab = filteredTabs.value.some(tab => tab.name === 'all')
   const hasPendingTab = filteredTabs.value.some(tab => tab.name === 'pending')
-  
+
   // 如果没有全部工单权限,但有待审核权限,则默认显示待审核
   if (!hasAllTab && hasPendingTab) {
     return 'pending'
@@ -710,7 +710,7 @@
         }
       })
       dataList.value = filteredData
-      
+
     }
   })
 }
@@ -825,7 +825,7 @@
     })) || []
 
     algorithms2.value = _.cloneDeep(algorithms.value)
-    
+
     userNameToIdMap.value = {}
     dept_data.forEach(dept => {
       (dept.user_data || []).forEach(user => {
@@ -864,7 +864,7 @@
 
 function mapStatus(status) {
   const statusTextMap = {
-  
+
     2: '待审核',
     0: '待处理',
     3: '处理中',
@@ -890,8 +890,8 @@
   }
   try {
     const response = await getstatusCount(params)
-    const statusCount = response.data.data || {}  
-    const totalCount = Object.values(statusCount).reduce((sum, count) => sum + (count || 0), 0)  
+    const statusCount = response.data.data || {}
+    const totalCount = Object.values(statusCount).reduce((sum, count) => sum + (count || 0), 0)
     tabs.value.forEach(tab => {
       if (tab.name === 'all') {
         tab.count = totalCount
@@ -1000,7 +1000,7 @@
 
   await getStepInfoData(row.orderNumber)
   currentDetail.value.status = row.status
- 
+
   currentDetail.value = {
     ...detailData,
     showQR: false,
@@ -1436,7 +1436,7 @@
         }
       })
     }
-    
+
     if (tab) {
       const isTabValid = filteredTabs.value.some(t => t.name === tab)
       if (isTabValid) {
@@ -1483,7 +1483,7 @@
   right: 0;
   padding: 0 30px;
 
-  z-index: 1000; 
+  z-index: 1000;
 }
 :deep(.custom-header th.el-table__cell) {
   color: rgba(0, 0, 0, 0.85);
@@ -1518,13 +1518,13 @@
   :deep(.el-table__header-wrapper) {
     background-color: #f5f7fa;
   }
-  
+
   :deep(.el-table th) {
     background-color: #f5f7fa;
     color: #606266;
     font-weight: 600;
   }
-  
+
   :deep(.el-table--border) {
     border: 1px solid #ebeef5;
   }

--
Gitblit v1.9.3