From 33cfed5a732ae6eb75ec82eb163557e112beb44a Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Mon, 21 Jul 2025 17:25:19 +0800
Subject: [PATCH] Merge branch 'dev' of http://139.196.74.78:10010/r/drone/drone-web-manage into dev

---
 src/views/dataCenter/components/searchData.vue |    7 ++
 src/store/modules/user.js                      |   20 ++++++
 src/views/dataCenter/dataCenter.vue            |   73 ++++++++++++++++-------
 src/page/index/top/index.vue                   |    2 
 src/assets/images/dataCenter/videoplay.png     |    0 
 src/views/wel/components/flightStatistics.vue  |    5 -
 src/assets/images/dataCenter/positionicon.png  |    0 
 src/views/wel/components/backlog.vue           |   55 +++++++++++------
 8 files changed, 111 insertions(+), 51 deletions(-)

diff --git a/src/assets/images/dataCenter/positionicon.png b/src/assets/images/dataCenter/positionicon.png
new file mode 100644
index 0000000..3890f49
--- /dev/null
+++ b/src/assets/images/dataCenter/positionicon.png
Binary files differ
diff --git a/src/assets/images/dataCenter/videoplay.png b/src/assets/images/dataCenter/videoplay.png
new file mode 100644
index 0000000..f308783
--- /dev/null
+++ b/src/assets/images/dataCenter/videoplay.png
Binary files differ
diff --git a/src/page/index/top/index.vue b/src/page/index/top/index.vue
index d3c1d93..c2a7440 100644
--- a/src/page/index/top/index.vue
+++ b/src/page/index/top/index.vue
@@ -103,10 +103,8 @@
       }).then(() => {
         this.$store.dispatch('LogOut').then(() => {
         const env = import.meta.env.VITE_APP_ENV
-          console.log(env);
           const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
            env === 'development' ? this.$router.push({ path: '/login' }):window.location.replace(`${adminUrl}#/login`)
-
         })
       })
     },
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index f22a79e..2750ef4 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -27,6 +27,7 @@
 import { encrypt } from '@/utils/sm2';
 import md5 from 'js-md5';
 
+
 const user = {
   state: {
     tenantId: getStore({ name: 'tenantId' }) || '',
@@ -269,16 +270,31 @@
       });
     },
     GetMenu({ commit, dispatch }, tenantId) {
+      const errLogOut = () => {
+        dispatch('LogOut').then(()=>{
+          const env = import.meta.env.VITE_APP_ENV
+          const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
+          env === 'development'
+            ? window.location.href = "/manage/login"
+            : window.location.replace(`${adminUrl}#/login`)
+        })
+      }
       return new Promise(resolve => {
         getRoutes(tenantId).then(res => {
           const data = res.data.data;
           let menu = deepClone(data);
-          menu?.forEach(ele => formatPath(ele, true));
+          if (!res.data?.data?.length){
+            errLogOut()
+            return
+          }
+          menu.forEach(ele => formatPath(ele, true));
           commit('SET_MENU', menu);
           commit('SET_MENU_ALL', menu);
           dispatch('GetButtons');
           resolve(menu);
-        });
+        }).catch(err =>{
+          errLogOut()
+        })
       });
     },
     GetButtons({ commit }) {
diff --git a/src/views/dataCenter/components/searchData.vue b/src/views/dataCenter/components/searchData.vue
index 8905217..301e868 100644
--- a/src/views/dataCenter/components/searchData.vue
+++ b/src/views/dataCenter/components/searchData.vue
@@ -79,6 +79,7 @@
             v-model="searchForm.photoType"
             placeholder="请选择"
             clearable
+            @clear="changePhotoType"
           >
             <el-option
               v-for="item in CategoryOption"
@@ -193,7 +194,11 @@
   },
   { deep: true }
 );
-
+const changePhotoType =(val)=>{
+if(val === undefined){
+  searchForm.photoType = ''
+}
+}
 // 部门
 let deptTreeData = ref([]);
 // 机巢
diff --git a/src/views/dataCenter/dataCenter.vue b/src/views/dataCenter/dataCenter.vue
index c12fd85..4acc33f 100644
--- a/src/views/dataCenter/dataCenter.vue
+++ b/src/views/dataCenter/dataCenter.vue
@@ -13,7 +13,6 @@
         <el-table
           v-loading="loadings"
           element-loading-text="加载中"
-          stripe
           :data="tableData"
           class="custom-header"
           @selection-change="handleSelectionChange"
@@ -45,13 +44,21 @@
                 :src="scope.row?.smallUrl"
                 alt=""
               />
-              <img
-                v-else-if="scope.row?.resultType === 1"
-                :src="convertVideoUrlToThumbnail(scope.row?.link)"
-                alt=""
-                class="imageBox"
-                @click="enterFullScreen(scope.row)"
-              />
+              <!-- 视频 -->
+              <div v-else-if="scope.row?.resultType === 1" class="videoItem1">
+                <img
+                  :src="convertVideoUrlToThumbnail(scope.row?.link)"
+                  alt=""
+                  class="imageBox"
+                  @click="enterFullScreen(scope.row)"
+                />
+                <img
+                  class="playBox"
+                  @click="enterFullScreen(scope.row)"
+                  src="@/assets/images/dataCenter/videoplay.png"
+                  alt=""
+                />
+              </div>
               <!-- 正射 -->
               <el-image
                 v-else-if="scope.row?.resultType === 4"
@@ -71,7 +78,7 @@
           </el-table-column>
           <el-table-column prop="jobTime" label="任务时间" />
           <el-table-column property="photoType" label="文件类别">
-            <template #default="scope">   
+            <template #default="scope">
               <span>{{
                 photoTypeMap[scope.row.photoType] ? photoTypeMap[scope.row.photoType] : '--'
               }}</span>
@@ -82,21 +89,24 @@
               <span>{{ resultTypeMap[row?.resultType] }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="操作" width="150" align="center">
+          <el-table-column label="操作" width="200" align="center">
             <template #default="scope">
-              <span class="look" @click="lookDetail(scope.row)">查看</span>
-              <span
-                class="delete"
-                @click="deleteDetail(scope.row)"
-                v-if="scope.row.resultType !== 2"
-                >删除</span
+              <el-button icon="el-icon-view" type="text" @click="lookDetail(scope.row)"
+                >查看</el-button
               >
-
-              <span
-                class="location"
-                @click="positionDetail(scope.row)"
+              <el-button
+                v-if="scope.row.resultType !== 2"
+                icon="el-icon-delete"
+                type="text"
+                @click="deleteDetail(scope.row)"
+                >删除</el-button
+              >
+              <el-button
                 v-if="shouldShowLocation(scope.row)"
-                >定位</span
+                type="text"
+                @click="positionDetail(scope.row)"
+              >
+                <img :src="positionicon" class="custom-icon" />定位</el-button
               >
             </template>
           </el-table-column>
@@ -258,6 +268,8 @@
 </template>
 
 <script setup>
+import videoplay from '@/assets/images/dataCenter/videoplay.png';
+import positionicon from '@/assets/images/dataCenter/positionicon.png';
 import { useStore } from 'vuex';
 import { PublicCesium } from '@/utils/cesium/publicCesium';
 import { Cartesian3 } from 'cesium';
@@ -730,7 +742,12 @@
       cursor: pointer;
       margin-right: 10px;
     }
-
+    .custom-icon {
+      width: 14px;
+      height: 14px;
+      margin-right: 5px;
+      vertical-align: middle;
+    }
     .delete {
       color: #ff241c;
       margin-right: 10px;
@@ -756,7 +773,17 @@
     width: 76px;
     height: 72px;
   }
-
+  .videoItem1 {
+    .playBox {
+      width: 20px;
+      height: 20px;
+      position: absolute;
+      top: 46%;
+      left: 43%;
+      transform: translate(-50%, -50%);
+      cursor: pointer;
+    }
+  }
   .videoDialog :deep(.el-dialog) {
     height: 600px;
     width: 54%;
diff --git a/src/views/wel/components/backlog.vue b/src/views/wel/components/backlog.vue
index 19ad663..9c52e74 100644
--- a/src/views/wel/components/backlog.vue
+++ b/src/views/wel/components/backlog.vue
@@ -9,13 +9,13 @@
             <div>
               {{ item.name }}
               <div class="dots">{{ item.number >= 100 ? '99+' : item.number }}</div>
-              <!-- <div class="dots">99+</div> -->
+              
             </div>
           </div>
         </div>
       </div>
 
-      <div class="todo-items" v-if="todos.length > 0" v-loading="loading">
+      <div class="todo-items" v-if="todos.length > 0" v-loading="loading" element-loading-background="rgba(255, 255, 255, 0.5)">
         <div v-for="(item, index) in todos" :key="index" class="todo-item" :style="getStatusStyle(item.status)"
           @click="jumporder(item)">
           <div class="status-indicator"><img :src="getStatus(item.status)" alt=""></div>
@@ -65,6 +65,10 @@
 const store = useStore()
 const permission = computed(() => store.getters.permission)
 const checked = ref('事件工单')
+const todosCache = reactive({
+  '事件工单': [],
+  '智飞工单': []
+})
 const titleList = ref([
   {
     label: 'event_order_count',
@@ -77,11 +81,11 @@
     number: 0,
   },
 ])
-const titleClick = (item, index) => {
-  checked.value = item.name
-  getListMatter()
-}
 
+const titleClick = async (item, index) => {
+  checked.value = item.name
+  await getListMatter()
+}
 const userInfo = computed(() => store.getters.userInfo)
 const todos = ref([])
 const loading = ref(false)
@@ -203,24 +207,25 @@
   })
 }
 // 获取事件工单或者智飞工单的信息
+
 const getListMatter = async () => {
-  if (checked.value === '事件工单') {
-    loading.value = true
-    const type = 1
+  loading.value = true
+  const type = checked.value === '事件工单' ? 1 : 2
+  
+  // 使用缓存数据
+  if (todosCache[checked.value].length > 0) {
+    todos.value = todosCache[checked.value]
+  }
+  
+  try {
     const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode)
-    todos.value = res.data.data || []
+    const data = res.data.data || []
+    todos.value = data
+    todosCache[checked.value] = data
+  } finally {
     loading.value = false
-      //  console.log('事件工单', todos.value);
-  } else if (checked.value === '智飞工单') {
-    loading.value = true
-    const type = 2
-    const res = await getOrderOrEventApi(type, userInfo.value.detail.areaCode)
-    todos.value = res.data.data || []
-    loading.value = false
-      //  console.log('智飞工单', todos.value);
   }
 }
-
 onMounted(() => {
   getListMatter()
   getOrderCount()
@@ -313,12 +318,19 @@
 
     .todo-items {
       margin-top: 10px;
-      // height: 250px;
+  transition: opacity 0.3s ease;
       height: pxToVh(250);
       overflow-y: scroll;
+       &:empty {
+    display: none;
+  }
     }
 
     .todo-item {
+      transition: 
+    transform 0.2s ease,
+    box-shadow 0.2s ease,
+    opacity 0.3s ease;
       margin: 6px 0;
       display: flex;
       align-items: center;
@@ -415,5 +427,8 @@
     font-size: 14px;
     color: #7c8091;
   }
+  .el-empty {
+  transition: opacity 0.3s ease;
+}
 }
 </style>
diff --git a/src/views/wel/components/flightStatistics.vue b/src/views/wel/components/flightStatistics.vue
index c6fe262..3d324ac 100644
--- a/src/views/wel/components/flightStatistics.vue
+++ b/src/views/wel/components/flightStatistics.vue
@@ -89,8 +89,7 @@
 const getFlyTimeList = () => {
   getFlyTime(params.value).then(res => {
     const resList = res?.data?.data || [];
-    console.log('飞行',resList);
-    
+
     lineCharts(resList);
   });
 };
@@ -177,7 +176,7 @@
         },
       },
       axisLabel: {
-        interval: 0,
+        // interval: 0,
         color: '#383838',
       },
     },

--
Gitblit v1.9.3