From aed141813bc64c7afdf3a337d631585b0a3cf42e Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Thu, 17 Jul 2025 09:39:43 +0800
Subject: [PATCH] Merge branch 'test'

---
 src/page/login/index.vue                                                     |    9 
 src/permission.js                                                            |   14 
 src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue |   37 +
 src/views/system/userinfo.vue                                                |   68 ----
 src/views/tickets/ticket.vue                                                 |   65 +++
 .env.jiangwu                                                                 |   42 ++
 .env.test                                                                    |   42 ++
 src/buildConfig/config.js                                                    |   14 
 src/buildConfig/buildConfig/config.jiangwu.js                                |   10 
 src/page/index/logo.vue                                                      |   11 
 src/views/job/components/SearchBox.vue                                       |   33 -
 src/views/job/components/TaskTop/TaskTotal.vue                               |    8 
 src/views/job/components/TaskAlgorithmBusiness.vue                           |   34 ++
 src/views/job/components/JobRelatedEvents.vue                                |    2 
 package.json                                                                 |    5 
 src/page/index/top/index.vue                                                 |    6 
 src/views/algorithmRepository/algorithmRepository.vue                        |    5 
 src/axios.js                                                                 |  393 ++++++++++++------------
 src/buildConfig/buildConfig/config.default.js                                |    5 
 src/views/license/upload.vue                                                 |  113 +++++-
 20 files changed, 559 insertions(+), 357 deletions(-)

diff --git a/.env.jiangwu b/.env.jiangwu
new file mode 100644
index 0000000..df5b435
--- /dev/null
+++ b/.env.jiangwu
@@ -0,0 +1,42 @@
+
+NODE_ENV = 'jiangwu'
+
+#生产环境配置
+VITE_APP_ENV = 'jiangwu'
+
+#接口地址
+#填写前缀 [/api] 需要用nginx进行反向代理
+#填写地址 [https://api.bladex.cn] 只需要保证接口支持跨域即可, 无需再做代理
+VITE_APP_API=/api
+
+#页面基础路径
+VITE_APP_BASE=/manage
+
+# 服务地址
+VITE_APP_URL = http://192.168.253.121:8080/api
+
+# 域名
+VITE_APP_AREA_NAME = http://192.168.253.121:8080/
+
+#新大屏地址
+VITE_APP_DASHBOARD_URL = 'http://192.168.253.121:8080/command-center-dashboard/'
+
+# ws地址
+VITE_APP_WS_API_URL = ws://192.168.253.121:8080
+
+# 航线文件地址
+VITE_APP_AIRLINE_URL = http://192.168.253.121:9000/cloud-bucket
+
+# 算法仓库图片地址
+VITE_APP_PICTURE_URL = http://192.168.253.121:9000/aiskyminio/cloud-bucket
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
+
+VITE_APP_OFFLINE_MAP_URL = http://192.168.253.121:9000/cloud-bucket/offline_map
+
+# 地形存放地址
+VITE_APP_TERRAIN_URL = http://192.168.253.121:9000/cloud-bucket/ztzf_terrain
+
+# 图片资源存放地址
+VITE_APP_IMAGESOURCE_URL = http://192.168.253.121:9000/cloud-bucket
diff --git a/.env.test b/.env.test
new file mode 100644
index 0000000..ebb4ef9
--- /dev/null
+++ b/.env.test
@@ -0,0 +1,42 @@
+NODE_ENV = 'test'
+
+#开发环境配置
+VITE_APP_ENV = 'test'
+
+#接口地址
+VITE_APP_API=/api
+
+#页面基础路径
+VITE_APP_BASE=/manage
+
+# 服务地址
+VITE_APP_URL = https://wrj.shuixiongit.com/api
+#VITE_APP_URL= http://192.168.1.168 rjg
+#VITE_APP_URL= http://192.168.1.33
+#新大屏地址
+VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
+
+# 域名
+VITE_APP_AREA_NAME = https://wrj.shuixiongit.com
+
+# ws地址
+VITE_APP_WS_API_URL = wss://wrj.shuixiongit.com
+
+# 航线文件地址
+VITE_APP_AIRLINE_URL = https://wrj.shuixiongit.com/minio/cloud-bucket
+
+# 图片存放地址
+VITE_APP_TERRAIN_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_terrain/all_terrain
+
+# 算法仓库图片地址
+VITE_APP_PICTURE_URL = https://wrj.shuixiongit.com/aiskyminio/cloud-bucket
+
+# 是否在打包时开启压缩,支持 gzip 和 brotli
+VITE_BUILD_COMPRESS = gzip
+
+#页面基础路径
+# VITE_APP_BASE_COMMAND = /drone-web-manage/
+#天地图token 浏览器端口
+VITE_APP_TDT_TOKEN = e110584a27d506da2740edca951683f4
+VITE_APP_CESIUM_TOKEN = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJkYTZlNGNlYS01NTU1LTQ1MGEtYmNlZS0yNTE2NDk5YWM2MjEiLCJpZCI6MTc5Njk2LCJpYXQiOjE3MDA1NDcwMjV9.qcl4AH2731cfFd0-I1ZLUINPXqvglLkDFD-UGR2zU5M
+
diff --git a/package.json b/package.json
index d943714..79ce0a8 100644
--- a/package.json
+++ b/package.json
@@ -5,8 +5,9 @@
         "dev": "vite --host",
         "base": "vite --host --mode localhost",
         "prod": "vite --mode production",
-        "build:test": "vite build --mode development",
+        "build:test": "vite build --mode test",
         "build:prod": "vite build --mode production",
+        "build:jiangwu": "vite build --mode jiangwu",
         "serve": "vite preview --host"
     },
     "dependencies": {
@@ -51,4 +52,4 @@
         "vite-plugin-compression": "^0.5.1",
         "vite-plugin-vue-setup-extend": "^0.4.0"
     }
-}
\ No newline at end of file
+}
diff --git a/src/axios.js b/src/axios.js
index d9ad49d..3dc3094 100644
--- a/src/axios.js
+++ b/src/axios.js
@@ -9,32 +9,17 @@
 import axios from 'axios';
 import store from '@/store/';
 import router from '@/router/';
-import {
-	serialize
-} from '@/utils/util';
-import {
-	getToken,
-	removeToken,
-	removeRefreshToken
-} from '@/utils/auth';
-import {
-	isURL,
-	validatenull
-} from '@/utils/validate';
-import {
-	ElMessage
-} from 'element-plus';
+import { serialize } from '@/utils/util';
+import { getToken, removeToken, removeRefreshToken } from '@/utils/auth';
+import { isURL, validatenull } from '@/utils/validate';
+import { ElMessage } from 'element-plus';
 import website from '@/config/website';
 import NProgress from 'nprogress'; // progress bar
 import 'nprogress/nprogress.css'; // progress bar style
-import {
-	Base64
-} from 'js-base64';
-import {
-	baseUrl
-} from '@/config/env';
+import { Base64 } from 'js-base64';
+import { baseUrl } from '@/config/env';
 import crypto from '@/utils/crypto';
-const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
+const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL;
 // 全局未授权错误提示状态,只提示一次
 let isErrorShown = false;
 
@@ -42,193 +27,209 @@
 // 超时时间设置为10分钟,部分接口上传比较慢,如固件上传
 axios.defaults.timeout = 600000;
 //返回其他状态码
-axios.defaults.validateStatus = function(status) {
-	return status >= 200 && status <= 500; // 默认的
+axios.defaults.validateStatus = function (status) {
+  return status >= 200 && status <= 500; // 默认的
 };
 //跨域请求,允许保存cookie
 axios.defaults.withCredentials = true;
 // NProgress Configuration
 NProgress.configure({
-	showSpinner: false,
+  showSpinner: false,
 });
 //http request拦截
 axios.interceptors.request.use(
-	config => {
-		// start progress bar
-		NProgress.start();
-		// 初始化错误提示状态
-		isErrorShown = false;
-		//地址为已经配置状态则不添加前缀
-		if (!isURL(config.url) && !config.url.startsWith(baseUrl)) {
-			config.url = baseUrl + config.url;
-		}
-		//安全请求header
-		config.headers['areaCode'] = store?.state?.user?.userInfo?.detail?.areaCode
-		config.headers['Blade-Requested-With'] = 'BladeHttpRequest';
-		//headers判断是否需要
-		const authorization = config.authorization === false;
-		if (!authorization) {
-			config.headers['Authorization'] = `Basic ${Base64.encode(
+  config => {
+    // start progress bar
+    NProgress.start();
+    // 初始化错误提示状态
+    isErrorShown = false;
+    //地址为已经配置状态则不添加前缀
+    if (!isURL(config.url) && !config.url.startsWith(baseUrl)) {
+      config.url = baseUrl + config.url;
+    }
+    //安全请求header
+    config.headers['areaCode'] = store?.state?.user?.userInfo?.detail?.areaCode;
+    config.headers['Blade-Requested-With'] = 'BladeHttpRequest';
+    //headers判断是否需要
+    const authorization = config.authorization === false;
+    if (!authorization) {
+      config.headers['Authorization'] = `Basic ${Base64.encode(
         `${website.clientId}:${website.clientSecret}`
       )}`;
-		}
-		//headers判断请求是否携带token
-		const meta = config.meta || {};
-		const isToken = meta.isToken === false;
-		//headers传递token是否加密
-		const cryptoToken = config.cryptoToken === true;
-		//判断传递数据是否加密
-		const cryptoData = config.cryptoData === true;
-		const token = getToken();
-		if (token && !isToken) {
-			config.headers[website.tokenHeader] = cryptoToken ?
-				'crypto ' + crypto.encryptAES(token, crypto.cryptoKey) :
-				'bearer ' + token;
-		}
-		// 开启报文加密
-		// if (cryptoData) {
-		//   if (config.params) {
-		//     const data = crypto.encryptAES(JSON.stringify(config.params), crypto.aesKey);
-		//     config.params = { data };
-		//   }
-		//   if (config.data) {
-		//     config.text = true;
-		//     config.data = crypto.encryptAES(JSON.stringify(config.data), crypto.aesKey);
-		//   }
-		// }
-		//headers中配置text请求
-		if (config.text === true) {
-			config.headers['Content-Type'] = 'text/plain';
-		}
-		//headers中配置serialize为true开启序列化
-		if (config.method === 'post' && meta.isSerialize === true) {
-			config.data = serialize(config.data);
-		}
-		return config;
-	},
-	error => {
-		return Promise.reject(error);
-	}
+    }
+    //headers判断请求是否携带token
+    const meta = config.meta || {};
+    const isToken = meta.isToken === false;
+    //headers传递token是否加密
+    const cryptoToken = config.cryptoToken === true;
+    //判断传递数据是否加密
+    const cryptoData = config.cryptoData === true;
+    const token = getToken();
+    if (token && !isToken) {
+      config.headers[website.tokenHeader] = cryptoToken
+        ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
+        : 'bearer ' + token;
+    }
+    // 开启报文加密
+    // if (cryptoData) {
+    //   if (config.params) {
+    //     const data = crypto.encryptAES(JSON.stringify(config.params), crypto.aesKey);
+    //     config.params = { data };
+    //   }
+    //   if (config.data) {
+    //     config.text = true;
+    //     config.data = crypto.encryptAES(JSON.stringify(config.data), crypto.aesKey);
+    //   }
+    // }
+    //headers中配置text请求
+    if (config.text === true) {
+      config.headers['Content-Type'] = 'text/plain';
+    }
+    //headers中配置serialize为true开启序列化
+    if (config.method === 'post' && meta.isSerialize === true) {
+      config.data = serialize(config.data);
+    }
+    return config;
+  },
+  error => {
+    return Promise.reject(error);
+  }
 );
 //http response拦截
 axios.interceptors.response.use(
-	res => {
-		NProgress.done();
-		const status = res.data.error_code || res.data.code || res.status;
-		const statusWhiteList = website.statusWhiteList || [];
-		const message = res.data.msg || res.data.error_description || res.data.message ||'系统错误';
-		const config = res.config;
-		const cryptoData = config.cryptoData === true;
-		if (status === 511) {
-			ElMessage({
-				message: '请联系运维人员上传密钥证书!',
-				type: 'error',
-			});
-			// 获取当前路由名称
-			const currentRouteName = router.currentRoute.value.name;
-			// 如果当前路由不是登录页,则跳转到登录页
-			if (currentRouteName !== '登录页') {
-				store.dispatch('FedLogOut').then(() => router.push({
-					path: '/login'
-				}));
-			}
-			return Promise.reject(new Error(message));
-		}
-		//如果在白名单里则自行catch逻辑处理
-		if (statusWhiteList.includes(status)) return Promise.reject(res);
-		// 如果是401并且没有重试过,尝试刷新token
-		if (status === 401 && !_retry) {
-			// 标记此请求已尝试刷新token
-			_retry = true;
-			// 调用RefreshToken action来刷新token
-			return store
-				.dispatch('RefreshToken')
-				.then(() => {
-					const meta = config.meta || {};
-					const isToken = meta.isToken === false;
-					const cryptoToken = config.cryptoToken === true;
-					// 获取刷新后的token
-					const token = getToken();
-					if (token && !isToken) {
-						config.headers[website.tokenHeader] = cryptoToken ?
-							'crypto ' + crypto.encryptAES(token, crypto.cryptoKey) :
-							'bearer ' + token;
-					}
-					// 重新发送原来的请求
-					return axios(config);
-				})
-				.catch(() => {
-					// 首次报错时提示
-					if (!isErrorShown) {
-						isErrorShown = true;
-						ElMessage({
-							message: message,
-							type: 'error',
-						});
-					}
-					// 清除token信息
-					removeToken();
-					removeRefreshToken();
-					// 重定向到登录页
-					// store.dispatch('FedLogOut').then(() => router.push({
-					// 	path: '/login'
-					// }));
-					store.dispatch('FedLogOut').then(() =>  window.location.replace(`${adminUrl}#/login`));
-					return Promise.reject(new Error(message));
-				});
-		}
-		// 如果是401并且已经重试过,直接跳转到登录页面
-		if (status === 401 && _retry) {
-			// 首次报错时提示
-			if (!isErrorShown) {
-				isErrorShown = true;
-				ElMessage({
-					message: '用户令牌过期,请重新登录',
-					type: 'error',
-				});
-			}
-			// 清除token信息
-			removeToken();
-			removeRefreshToken();
-			// 重定向到登录页
-			// store.dispatch('FedLogOut').then(() => router.push({
-			// 	path: '/login'
-			// }));
-			store.dispatch('FedLogOut').then(() =>  window.location.replace(`${adminUrl}#/login`));
-			return Promise.reject(new Error(message));
-		}
-		// 如果请求为oauth2错误码则首次报错时提示
-		if (status > 2000 && !validatenull(res.data.error_description)) {
-			// 首次报错时提示
-			if (!isErrorShown) {
-				isErrorShown = true;
-				ElMessage({
-					message: message,
-					type: 'error',
-				});
-			}
-			return Promise.reject(new Error(message));
-		}
-		// 如果请求为非200默认统一处理
-		if (status !== 200 && status !== 0) {
-			if (!isErrorShown) {
-				ElMessage({
-					message: message,
-					type: 'error',
-				});
-			}
-			return Promise.reject(new Error(message));
-		}
-		// 解析加密报文
-		if (cryptoData) {
-			res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey));
-		}
-		return res;
-	},
-	error => {
-		NProgress.done();
-		return Promise.reject(new Error(error));
-	}
+  res => {
+    NProgress.done();
+    const status = res.data.error_code || res.data.code || res.status;
+    const statusWhiteList = website.statusWhiteList || [];
+    const message = res.data.msg || res.data.error_description || res.data.message || '系统错误';
+    const config = res.config;
+    const cryptoData = config.cryptoData === true;
+    if (status === 511) {
+      ElMessage({
+        message: '请联系运维人员上传密钥证书!',
+        type: 'error',
+      });
+      // 获取当前路由名称
+      const currentRouteName = router.currentRoute.value.name;
+      // 如果当前路由不是登录页,则跳转到登录页
+      if (currentRouteName !== '登录页') {
+        store.dispatch('FedLogOut').then(() =>
+          router.push({
+            path: '/login',
+          })
+        );
+      }
+      return Promise.reject(new Error(message));
+    }
+    //如果在白名单里则自行catch逻辑处理
+    if (statusWhiteList.includes(status)) return Promise.reject(res);
+    // 如果是401并且没有重试过,尝试刷新token
+    if (status === 401 && !_retry) {
+      // 标记此请求已尝试刷新token
+      _retry = true;
+      // 调用RefreshToken action来刷新token
+      return store
+        .dispatch('RefreshToken')
+        .then(() => {
+          const meta = config.meta || {};
+          const isToken = meta.isToken === false;
+          const cryptoToken = config.cryptoToken === true;
+          // 获取刷新后的token
+          const token = getToken();
+          if (token && !isToken) {
+            config.headers[website.tokenHeader] = cryptoToken
+              ? 'crypto ' + crypto.encryptAES(token, crypto.cryptoKey)
+              : 'bearer ' + token;
+          }
+          // 重新发送原来的请求
+          return axios(config);
+        })
+        .catch(() => {
+          // 首次报错时提示
+          if (!isErrorShown) {
+            isErrorShown = true;
+            ElMessage({
+              message: message,
+              type: 'error',
+            });
+          }
+          // 清除token信息
+          removeToken();
+          removeRefreshToken();
+          const env = import.meta.env.VITE_APP_ENV;
+          // 重定向到登录页
+          // store.dispatch('FedLogOut').then(() => router.push({
+          // 	path: '/login'
+          // }));
+          env === 'development'
+            ? store.dispatch('FedLogOut').then(() =>
+                router.push({
+                  path: '/login',
+                })
+              )
+            : store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
+          return Promise.reject(new Error(message));
+        });
+    }
+    // 如果是401并且已经重试过,直接跳转到登录页面
+    if (status === 401 && _retry) {
+      // 首次报错时提示
+      if (!isErrorShown) {
+        isErrorShown = true;
+        ElMessage({
+          message: '用户令牌过期,请重新登录',
+          type: 'error',
+        });
+      }
+      // 清除token信息
+      removeToken();
+      removeRefreshToken();
+      // 重定向到登录页
+      //   store.dispatch('FedLogOut').then(() => router.push({
+      //   	path: '/login'
+      //   }));
+      const env = import.meta.env.VITE_APP_ENV;
+      env === 'development'
+        ? store.dispatch('FedLogOut').then(() =>
+            router.push({
+              path: '/login',
+            })
+          )
+        : store.dispatch('FedLogOut').then(() => window.location.replace(`${adminUrl}#/login`));
+      return Promise.reject(new Error(message));
+    }
+    // 如果请求为oauth2错误码则首次报错时提示
+    if (status > 2000 && !validatenull(res.data.error_description)) {
+      // 首次报错时提示
+      if (!isErrorShown) {
+        isErrorShown = true;
+        ElMessage({
+          message: message,
+          type: 'error',
+        });
+      }
+      return Promise.reject(new Error(message));
+    }
+    // 如果请求为非200默认统一处理
+    if (status !== 200 && status !== 0) {
+      if (!isErrorShown) {
+        ElMessage({
+          message: message,
+          type: 'error',
+        });
+      }
+      return Promise.reject(new Error(message));
+    }
+    // 解析加密报文
+    if (cryptoData) {
+      res.data = JSON.parse(crypto.decryptAES(res.data, crypto.aesKey));
+    }
+    return res;
+  },
+  error => {
+    NProgress.done();
+    return Promise.reject(new Error(error));
+  }
 );
 
 export default axios;
diff --git a/src/buildConfig/buildConfig/config.default.js b/src/buildConfig/buildConfig/config.default.js
new file mode 100644
index 0000000..d34e0fa
--- /dev/null
+++ b/src/buildConfig/buildConfig/config.default.js
@@ -0,0 +1,5 @@
+export default function getBaseConfig () {
+	return {
+		loginTitle: '中图智飞低空智能感知网平台',  //登陆页面标题
+	}
+}
\ No newline at end of file
diff --git a/src/buildConfig/buildConfig/config.jiangwu.js b/src/buildConfig/buildConfig/config.jiangwu.js
new file mode 100644
index 0000000..d3457b2
--- /dev/null
+++ b/src/buildConfig/buildConfig/config.jiangwu.js
@@ -0,0 +1,10 @@
+export default function getBaseConfig () {
+	return {
+		userLoginTitle (key) {
+			return '大吉山钨业无人机安防监测平台'
+		},
+
+		loginTitle: '大吉山钨业无人机安防监测平台',
+	  hideMenuTopLogo: true, // 是否隐藏菜单顶部logo
+	}
+}
diff --git a/src/buildConfig/config.js b/src/buildConfig/config.js
new file mode 100644
index 0000000..698cc2c
--- /dev/null
+++ b/src/buildConfig/config.js
@@ -0,0 +1,14 @@
+
+// 直接导入所有配置文件
+import jiangwuConfig from '@/buildConfig/buildConfig/config.jiangwu.js'
+import defaultConfig from '@/buildConfig/buildConfig/config.default.js'
+
+// 根据环境变量选择配置
+const env = import.meta.env.VITE_APP_ENV || 'default'
+const configMap = {
+	jiangwu: jiangwuConfig,
+	default: defaultConfig
+}
+
+// 导出配置函数
+export default configMap[env] || configMap.default
\ No newline at end of file
diff --git a/src/page/index/logo.vue b/src/page/index/logo.vue
index 456fa78..0d344ab 100644
--- a/src/page/index/logo.vue
+++ b/src/page/index/logo.vue
@@ -3,13 +3,13 @@
     <transition name="fade">
       <span v-if="getScreen(isCollapse)" class="avue-logo_subtitle" key="0">
 <!--        {{ website.logo }}-->
-        <img class="logoImg" src="/img/bg/mainLogo.png" alt=""/>
+        <img v-if="!hideMenuTopLogo" class="logoImg" src="/img/bg/mainLogo.png" alt=""/>
       </span>
     </transition>
     <transition-group name="fade">
       <template v-if="getScreen(!isCollapse)">
         <div class="fadeStyle">
-          <img class="logoImg" src="/img/bg/mainLogo.png" alt=""/>
+          <img v-if="!hideMenuTopLogo" class="logoImg" src="/img/bg/mainLogo.png" alt=""/>
           <div class="titleName">综合管理平台</div>
           <!-- <span style="font-size: 20px;"  key="1">
               {{ this.parentDeptInfo.sysName }}
@@ -22,11 +22,14 @@
 
 <script>
 import { mapGetters } from 'vuex';
-
+import getBaseConfig from '@/buildConfig/config';
+const { hideMenuTopLogo } = getBaseConfig()
 export default {
   name: 'logo',
   data() {
-    return {};
+    return {
+      hideMenuTopLogo
+    };
   },
   created() {},
   computed: {
diff --git a/src/page/index/top/index.vue b/src/page/index/top/index.vue
index 9026c9a..d3c1d93 100644
--- a/src/page/index/top/index.vue
+++ b/src/page/index/top/index.vue
@@ -102,9 +102,11 @@
         type: 'warning',
       }).then(() => {
         this.$store.dispatch('LogOut').then(() => {
-          // this.$router.push({ path: '/login' })
+        const env = import.meta.env.VITE_APP_ENV
+          console.log(env);
           const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
-		  window.location.replace(`${adminUrl}#/login`)
+           env === 'development' ? this.$router.push({ path: '/login' }):window.location.replace(`${adminUrl}#/login`)
+
         })
       })
     },
diff --git a/src/page/login/index.vue b/src/page/login/index.vue
index 839ea1d..4453760 100644
--- a/src/page/login/index.vue
+++ b/src/page/login/index.vue
@@ -39,7 +39,8 @@
 import { getQueryString, getTopUrl } from '@/utils/util';
 import { getDetail } from '@/api/system/sysConfig'
 import website from '@/config/website';
-
+import getBaseConfig from '@/buildConfig/config'
+const { loginTitle} = getBaseConfig()
 export default {
   name: 'login',
   components: {
@@ -51,7 +52,7 @@
   data() {
     return {
       login:{
-        info: '中图智绘低空无人机监测网平台'
+        info: loginTitle
       },
       website: website,
       time: '',
@@ -72,7 +73,10 @@
   created() {
     this.handleLogin();
     this.getTime();
+   if(!loginTitle) { 
     this.getSysConfigInfo();
+  }
+ 
   },
   mounted() {},
   computed: {
@@ -85,6 +89,7 @@
       let sysConfigId = this.$route.query?.id || 1;
       getDetail(sysConfigId).then(res=>{
         this.login.info = res.data.data.name
+
       })
     },
     getTime() {
diff --git a/src/permission.js b/src/permission.js
index 5272458..c91ba32 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -19,6 +19,8 @@
 const lockPage = '/lock' //锁屏页
 const urlParams = getUrlParams(window.location.href)
 const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL
+const env = import.meta.env.VITE_APP_ENV
+
 function findRouteByPath (routes, targetPath) {
   // 遍历数组中的每个路由对象
   for (const route of routes) {
@@ -39,7 +41,6 @@
   // 遍历完所有路由都没找到,返回null
   return null
 }
-
 router.beforeEach((to, from, next) => {
   const meta = to.meta || {}
   const isMenu = meta.menu === undefined ? to.query.menu : meta.menu
@@ -93,10 +94,10 @@
     } else {
       const systemToken = store.getters.token || urlParams?.token
       if (systemToken === 0) {
-        // store.dispatch('FedLogOut').then(() => {
-        //   next({ path: '/login' })
-        // })
-        store.dispatch('FedLogOut').then(() =>  window.location.replace(`${adminUrl}#/login`));
+        store.dispatch('FedLogOut').then(() => {
+          next({ path: '/login' })
+        })
+        // store.dispatch('FedLogOut').then(() =>  window.location.replace(`${adminUrl}#/login`));
       } else {
         const meta = to.meta || {}
         const query = to.query || {}
@@ -121,8 +122,7 @@
     if (meta.isAuth === false) {
       next()
     } else {
-      // next('/login')
-      window.location.replace(`${adminUrl}#/login`)
+      env === 'development' ? next('/login') : window.location.replace(`${adminUrl}#/login`)
     }
   }
 })
diff --git a/src/views/algorithmRepository/algorithmRepository.vue b/src/views/algorithmRepository/algorithmRepository.vue
index bfe602c..ad3ee3a 100644
--- a/src/views/algorithmRepository/algorithmRepository.vue
+++ b/src/views/algorithmRepository/algorithmRepository.vue
@@ -73,7 +73,7 @@
               ref="imageRef"
               :src="getSmallImg(item.url)"
               show-progress
-              :preview-src-list="[getSmallImg(item.url)]"
+              :preview-src-list="[getShowImg(item.url)]"
               fit="cover"
             />
 
@@ -110,7 +110,7 @@
 
 import { getDictionaryByCode } from '@/api/system/dictbiz';
 import { getalgorithmList, selectDeviceList } from '@/api/algorithm';
-import { getSmallImg } from '@/utils/util';
+import { getSmallImg,getShowImg } from '@/utils/util';
 import { useRouter } from 'vue-router';
 const router = useRouter();
 const baseUrl = import.meta.env.VITE_APP_PICTURE_URL;
@@ -259,6 +259,7 @@
     &:hover {
       background: url('/src/assets/images/ht-sfbg-hover.png') no-repeat center;
       background-size: 100% 100%;
+      cursor: pointer;
     }
     &.active-bg {
       background: url('/src/assets/images/ht-sfbg-click.png') no-repeat center;
diff --git a/src/views/job/components/JobRelatedEvents.vue b/src/views/job/components/JobRelatedEvents.vue
index dc56dd8..6826bef 100644
--- a/src/views/job/components/JobRelatedEvents.vue
+++ b/src/views/job/components/JobRelatedEvents.vue
@@ -28,7 +28,7 @@
 			</div>
 			<div class="item">
 				<div class="itemchild">关联算法:</div>
-				<TaskAlgorithmBusiness :setWidth="186 +'px'" :showAlgorithm="true" @algorithmChange="algorithmChange" />
+				<TaskAlgorithmBusiness :setWidth="186" :showAlgorithm="true" @algorithmChange="algorithmChange" />
 			</div>
 		</div>
 		<div class="search-btn">
diff --git a/src/views/job/components/SearchBox.vue b/src/views/job/components/SearchBox.vue
index 89ccc3c..9a53df5 100644
--- a/src/views/job/components/SearchBox.vue
+++ b/src/views/job/components/SearchBox.vue
@@ -234,12 +234,15 @@
 let checked = ref('today');
 
 let timeClick = (item, index) => {
-  checked.value = item;
-  // dateRange.value = dateRanges[item];
-  dateRange.value = [];
-  // emit('change', dateRanges[item],timeListEnum[index]);
-  searchForm.date_enum = timeListEnum[index];
-  handleSearch();
+  if (checked.value === item){
+    checked.value = null
+    searchForm.date_enum = undefined
+  }else{
+    checked.value = item
+    searchForm.date_enum = timeListEnum[index]
+  }
+  dateRange.value = []
+  handleSearch()
 };
 // 搜索
 const handleSearch = () => {
@@ -265,18 +268,8 @@
   emit('search', params);
 };
 const handleDateChange = val => {
-  if (val && val.length === 2) {
-    const start = dayjs(val[0]);
-    const end = dayjs(val[1]);
-    const diff = end.diff(start, 'day');
-
-    if (diff > 31) {
-      ElMessage.warning('日期范围不能超过31天');
-      dateRange.value = [];
-      return;
-    }
-  }
-  handleSearch();
+  checked.value = null
+  searchForm.date_enum = undefined
 };
 
 // 重置
@@ -302,7 +295,7 @@
 // watch(
 //   () => store.state.task.jumpTask,
 //   newVal => {
- 
+
 //     if (newVal && Object.keys(newVal).length) {
 //       // 兼容当日任务 计划任务 历史任务传参
 //       if (newVal.clickValue) {
@@ -343,7 +336,7 @@
     const date = dayjs(calendarday.value).format(timeFormat);
 
     const dateArray = [date, date];
-  
+
     dateRange.value = dateArray;
   }
     // 查询一次
diff --git a/src/views/job/components/TaskAlgorithmBusiness.vue b/src/views/job/components/TaskAlgorithmBusiness.vue
index 427e708..c5c0a9a 100644
--- a/src/views/job/components/TaskAlgorithmBusiness.vue
+++ b/src/views/job/components/TaskAlgorithmBusiness.vue
@@ -2,6 +2,7 @@
 <template>
 	<div class="task-algorithm" v-if="showAlgorithm">
 		<el-select
+		class="ztzf-select"
 			:teleported="false"
 			:style="{ width: pxToRem(setWidth) }"
 			v-model="ai_types"
@@ -16,7 +17,7 @@
 		</el-select>
 	</div>
 	<div class="task-business" v-if="showBusiness">
-		<el-select
+		<el-select class="ztzf-select"
 			:teleported="false"
 			:style="{ width: pxToRem(setWidth) }"
 			v-model="industry_type"
@@ -31,7 +32,7 @@
 
 <script setup>
 import { getMultipleDictionary } from '@/api/job/task'
-import { pxToRem } from '@/utils/rem'
+import { pxToRem } from '@/utils/rem';
 
 // 接收父组件传参
 const props = defineProps({
@@ -88,4 +89,33 @@
 // 	--el-tag-hover-color: none !important;
 // 	color: #fff !important;
 // }
+::v-deep(.ztzf-select) {
+	.el-select__wrapper {
+		z-index: 1111;
+
+		/* 修改 Tooltip 面板样式 */
+		.el-popper.is-light {
+			background: #fff !important;
+			// box-shadow: none !important;
+			// border: none !important;
+			border-radius: 4px !important;
+
+			.el-select__selection {
+				max-width: 240px !important;
+
+				.el-select__selected-item {
+					.el-tag {
+						// background: #fff !important;
+						// color: #000;
+					}
+				}
+			}
+
+			.el-popper__arrow::before {
+				// background: #fff !important;
+				// border: 1px solid #8d8b8b !important;
+			}
+		}
+	}
+}
 </style>
diff --git a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
index 82de1e3..64fd047 100644
--- a/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
+++ b/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
@@ -50,12 +50,22 @@
 				<el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip />
 				<el-table-column label="操作" width="200" align="center">
 					<template #default="scope">
-						<div v-if="scope.row.status === 2" class="btnItem turnBack" link type="primary"
-							@click="turnBack(scope.row)">
+						<div
+							v-if="scope.row.status === 2"
+							class="btnItem"
+							link
+							type="primary"
+							@click="turnBack(scope.row)"
+						>
 							返航
 						</div>
-						<div v-if="scope.row.status === 1" class="btnItem cancelTask" link type="primary"
-							@click="cancelTask(scope.row)">
+						<div
+							v-if="scope.row.status === 1"
+							class="btnItem"
+							link
+							type="primary"
+							@click="cancelTask(scope.row)"
+						>
 							取消任务
 						</div>
 						<div class="btnItem" link type="primary" @click="handleDetail(scope.row)">查看</div>
@@ -64,10 +74,19 @@
 			</el-table>
 		</div>
 		<div class="pagination">
-			<el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown"
-				v-model:current-page="jobListParams.current" v-model:page-size="jobListParams.size"
-				:page-sizes="[10, 20, 30, 40]" layout="prev, pager, next, sizes, jumper" :total="total"
-				@size-change="handleSizeChange" @current-change="handleCurrentChange" />
+			<el-pagination
+				class="ztzf-pagination"
+				popper-class="custom-pagination-dropdown"
+				background
+				:page-sizes="[10, 20, 30, 40,50,100]"
+				:size="size"
+				v-model:current-page="jobListParams.current"
+				v-model:page-size="jobListParams.size"
+				layout="total, sizes, prev, pager, next, jumper"
+				:total="total"
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+			/>
 		</div>
 	</div>
 	<!-- 添加任务 -->
@@ -271,7 +290,7 @@
 
 	:deep(.el-pagination) {
 		display: flex;
-		justify-content: flex-end;
+		justify-content: right;
 	}
 
 	:deep(.el-pagination button) {
diff --git a/src/views/job/components/TaskTop/TaskTotal.vue b/src/views/job/components/TaskTop/TaskTotal.vue
index 84de5a7..2d5ccaa 100644
--- a/src/views/job/components/TaskTop/TaskTotal.vue
+++ b/src/views/job/components/TaskTop/TaskTotal.vue
@@ -51,13 +51,14 @@
 	totalJobNum().then(res => {
 		if (res.data.code !== 0) returen
 		total.value = res.data.data.job_total_num
-		numTotal.value = res.data.data.deal_job_num
 	})
 }
 // 获取其他任务统计
 const getJobStatistics = value => {
 	jobStatistics(value).then(res => {
 		if (res.data.code !== 0) returen
+    const {executed = 0,failed_executions = 0,go_home_executions = 0} = res.data?.data || {}
+    numTotal.value = executed + failed_executions + go_home_executions
 		list.value[0].value = res.data.data.planned_executions || 0
 		list.value[1].value = res.data.data.executed || 0
 		list.value[2].value = res.data.data.running_num || 0
@@ -79,9 +80,6 @@
 	{ immediate: true,deep: true }
 )
 
-onMounted(() => {
-	getTotalJobNum()
-})
 </script>
 
 <style scoped lang="scss">
@@ -136,7 +134,7 @@
 		height: 160px;
 		display: flex;
 		gap: 10px;
-		
+
 		flex-wrap: wrap;
 		align-content: space-evenly;
 		.total {
diff --git a/src/views/license/upload.vue b/src/views/license/upload.vue
index c9378c6..3743ac2 100644
--- a/src/views/license/upload.vue
+++ b/src/views/license/upload.vue
@@ -1,6 +1,6 @@
 <!-- filepath: /d:/work/drone-web-manage/src/views/license/upload.vue -->
 <template>
-    <basic-container>
+    <!-- <basic-container>
         <el-upload
             class="upload-demo"
             drag
@@ -12,46 +12,101 @@
             <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
             <div class="el-upload__tip">仅支持扩展名:lic</div>
         </el-upload>
-    </basic-container>
+    </basic-container> -->
+    <!-- 密钥上传 -->
+    <div class="upload-file">
+      <img v-if="isSuccess === 'success'" :src="uploadSuccess" alt="" />
+      <div v-if="isSuccess === 'success'">上传成功</div>
+      <img v-if="isSuccess === 'error'" :src="uploadError" alt="" />
+      <div v-if="isSuccess === 'error'">上传失败</div>
+      <el-upload
+        action="/upload"
+        accept=".lic"
+        :show-file-list="false"
+        :before-upload="handleUpload"
+      >
+        <div class="upload-btn">密钥上传</div>
+      </el-upload>
+      <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
+    </div>
 </template>
 
 <script>
 import { uploadLicense } from '@/api/license/uploadLicense';
+import { findLicenseDate } from '@/api/system/dict';
+import uploadSuccess from '@/assets/images/uoload-success.png';
+import uploadError from '@/assets/images/upload-error.png';
 
 export default {
+    data() {
+        return {
+            isSuccess: '', // 上传状态
+            passwordTime: '', // 密钥有效期
+            uploadSuccess, // 上传成功图片
+            uploadError, // 上传失败图片
+        };
+    },
+    mounted() {
+        this.getFindLicenseDate();
+    },
     methods: {
-        async customUpload({ file }) {
-            try {
-                const response = await uploadLicense(file);
-                if (response.data.success) {
-                    this.$message.success('文件上传成功');
-                } else {
-                    this.$message.error(response.data.message || '文件上传失败');
-                }
-            } catch (error) {
-                console.error('上传失败:', error);
-                this.$message.error('文件上传失败');
-            }
+        handleUpload(file) {
+            uploadLicense(file)
+            .then(res => {
+                console.log(res.data.code,'444')
+                if (res.data.code !== 200) return this.$message.error('上传失败');
+                this.$message.success('上传成功');
+                this.isSuccess = 'success';
+                this.getFindLicenseDate();
+            })
+            .catch(err => {
+                this.isSuccess = 'error';
+                this.$message.error('上传失败');
+            });
+        },
+        getFindLicenseDate() {
+            findLicenseDate()
+                .then(res => {
+                    if (res.data.code !== 0) return this.$message.error('上传失败');
+                    this.passwordTime = res.data.data;
+                })
+                .catch(err => {
+                    this.$message.error('获取失败失败');
+                });
         },
     },
 };
 </script>
 
-<style scoped>
-.upload-demo {
-    width: 100%;
-    border: 2px dashed #d9d9d9;
-    border-radius: 6px;
-    background-color: #fafafa;
+<style scoped lang="scss">
+.upload-file {
+  text-align: center;
+  margin-top: 60px;
+  .upload-btn {
+    width: 93px;
+    height: 38px;
+    background: #DDEBFF;
+    border-radius: 8px 8px 8px 8px;
+    border: 1px solid #409EFF;
     text-align: center;
-    padding: 40px 20px;
-}
-.el-upload__text {
-    font-size: 16px;
-    color: #606266;
-}
-.el-upload__tip {
-    font-size: 12px;
-    color: #909399;
+    font-family: Source Han Sans CN, Source Han Sans CN;
+    font-weight: bold;
+    font-size: 14px;
+    color: #228CFA;
+    line-height: 38px;
+    text-align: center;
+    margin-top: 10px;
+  }
+  .password-time {
+    margin-top: 50px;
+    width: 100%;
+    height: 16px;
+    font-family: Source Han Sans CN, Source Han Sans CN;
+    font-weight: 400;
+    font-size: 14px;
+    color: #2d9dff;
+    line-height: 16px;
+    // text-align: left;
+  }
 }
 </style>
\ No newline at end of file
diff --git a/src/views/system/userinfo.vue b/src/views/system/userinfo.vue
index acef2d7..23f8d87 100644
--- a/src/views/system/userinfo.vue
+++ b/src/views/system/userinfo.vue
@@ -108,22 +108,6 @@
         <el-button @click="reset">重置</el-button>
       </div>
     </div>
-    <!-- 密钥上传 -->
-    <div class="upload-file" v-else-if="checked === 2">
-      <img v-if="isSuccess === 'success'" :src="uploadSuccess" alt="" />
-      <div v-if="isSuccess === 'success'">上传成功</div>
-      <img v-if="isSuccess === 'error'" :src="uploadError" alt="" />
-      <div v-if="isSuccess === 'error'">上传失败</div>
-      <el-upload
-        action="/upload"
-        accept=".lic"
-        :show-file-list="false"
-        :before-upload="handleUpload"
-      >
-        <div class="upload-btn">密钥上传</div>
-      </el-upload>
-      <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
-    </div>
   </div>
 </template>
 
@@ -136,7 +120,6 @@
 import request from '@/axios';
 import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
 import { findLicenseDate } from '@/api/system/dict';
-import { uploadLicense } from '@/api/license/uploadLicense';
 import uploadSuccess from '@/assets/images/uoload-success.png';
 import uploadError from '@/assets/images/upload-error.png';
 import cancel1 from '@/assets/images/task/cancel1.png';
@@ -146,7 +129,7 @@
 const token = getToken();
 const userinforShow = defineModel('show');
 const userInfoAs = computed(() => store.state.user.userInfo);
-const titleList = ref(['个人信息', '修改密码', '密钥上传']);
+const titleList = ref(['个人信息', '修改密码']);
 const checked = ref(0);
 const uploadUrl = computed(
   () => `${import.meta.env.VITE_APP_API_URL}/blade-resource/oss/endpoint/put-file`
@@ -221,9 +204,6 @@
 
 const titleClick = (item, index) => {
   checked.value = index;
-  if (index === 2) {
-    getFindLicenseDate();
-  }
 };
 const getUserInfoData = () => {
   getUserInfo().then(res => {
@@ -285,21 +265,6 @@
 };
 const isSuccess = ref('');
 const passwordTime = ref('');
-const handleUpload = file => {
-  const formData = new FormData();
-  formData.append('file', file);
-  uploadLicense(formData)
-    .then(res => {
-      if (res.data.code !== 200) return ElMessage.error('上传失败');
-      ElMessage.success('上传成功');
-      isSuccess.value = 'success';
-      getFindLicenseDate();
-    })
-    .catch(err => {
-      isSuccess.value = 'error';
-      ElMessage.error('上传失败');
-    });
-};
 const getFindLicenseDate = () => {
   findLicenseDate()
     .then(res => {
@@ -415,34 +380,5 @@
 .passwordBox {
   margin-top: 40px;
 }
-.upload-file {
-  text-align: center;
-  margin-top: 60px;
-  .upload-btn {
-    width: 93px;
-    height: 38px;
-    background: #DDEBFF;
-    border-radius: 8px 8px 8px 8px;
-    border: 1px solid #409EFF;
-    text-align: center;
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: bold;
-    font-size: 14px;
-    color: #228CFA;
-    line-height: 38px;
-    text-align: center;
-    margin-top: 10px;
-  }
-  .password-time {
-    margin-top: 50px;
-    width: 100%;
-    height: 16px;
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: 400;
-    font-size: 14px;
-    color: #2d9dff;
-    line-height: 16px;
-    // text-align: left;
-  }
-}
+
 </style>
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 84138c0..3fe0bc4 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -33,8 +33,8 @@
           <!-- 表格部分 -->
           <avue-crud class="ztzf-public-general-avue-crud" ref="avueCrud" v-model="tableData" :option="option"
             :data="tableData" v-model:page="page" @size-change="sizeChange" @current-change="handleCurrentChange"
-            :table-loading="loading" @selection-change="handleSelectionChange" :permission="permissionList"
-            v-if="activeTab === tab.name">
+            @refresh-change="refreshChange" :table-loading="loading" @selection-change="handleSelectionChange"
+            :permission="permissionList" v-if="activeTab === tab.name">
             <template #menu-left>
               <el-button v-if="(activeTab === 'all' || activeTab === 'myTickets') && permissionList.addBtn"
                 type="primary" icon="el-icon-plus" @click="handleAdd">新建工单</el-button>
@@ -54,8 +54,11 @@
                 <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button>
               </template>
 
-              <el-button v-if="row.status === 4 && row.isReview !== 1" type="text" icon="el-icon-check"
-                @click="reCheck(row)">复核</el-button>
+              <template v-if="permission.tickets_repeat_review">
+                <el-button v-if="row.status === 4 && row.isReview !== 1" type="text" icon="el-icon-check"
+                  @click="reCheck(row)">复核</el-button>
+              </template>
+
             </template>
             <template #status="{ row }">
               <span :style="getStatusTagType(row.status) ? 'color:' + getStatusTagType(row.status) : ''">
@@ -146,11 +149,22 @@
             </el-col>
             <el-col :span="12">
               <el-form-item label="附件图片" prop="photos" required class="upload-wrapper">
-                <el-upload ref="upload" :action="'#'" :auto-upload="false" list-type="picture-card"
-                  :on-change="handleFileChange" :on-remove="handleUploadRemove" :before-upload="beforeUpload"
-                  :file-list="form.photos" :limit="1" accept="image/*" class="create-upload">
+                <el-upload v-if="createoredit === 1" ref="upload" :action="'#'" :auto-upload="false"
+                  list-type="picture-card" :on-change="handleFileChange" :on-remove="handleUploadRemove"
+                  :before-upload="beforeUpload" :file-list="form.photos" :limit="1" accept="image/*"
+                  class="create-upload">
                   <template v-if="form.photos.length < 1">
                     <!-- <i class="el-icon-plus">+</i> -->
+                    <div class="el-icon-plus">
+                      <span>+</span>
+                    </div>
+                  </template>
+                </el-upload>
+                <el-upload v-else ref="upload" :action="'#'" :auto-upload="false" list-type="picture-card"
+                  :on-change="handleFileChange" :on-remove="handleUploadRemove" :before-upload="beforeUpload"
+                  :file-list="popupShowImage(form.photos)" :limit="1" accept="image/*" class="create-upload">
+                  <template v-if="form.photos.length < 1">
+
                     <div class="el-icon-plus">
                       <span>+</span>
                     </div>
@@ -507,9 +521,11 @@
 </template>
 
 <script>
+import { getSmallImg, getShowImg } from '@/utils/util'
 import { ElMessageBox, ElLoading } from 'element-plus'
 import { calculateDefaultRange } from '@/utils/util'
 import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation'
+import _ from 'lodash'
 import {
   getList,
   createTicket,
@@ -522,7 +538,6 @@
 } from '@/api/tickets/ticket'
 import { export_json_to_excel } from '@/utils/exportExcel'
 import geoJson from '@/assets/geoJson.json'
-
 import { mapGetters } from 'vuex'
 import { getAdcodeObj } from '@/utils/disposeData'
 function regExp (label, name) {
@@ -542,6 +557,7 @@
       dispatchLoading: false,
       completeLoading: false,
       finalizeLoading: false,
+      createoredit: '',
       activeTab: 'all',
       // tabs 只保留静态结构,不做权限判断
       tabs: [
@@ -733,6 +749,11 @@
 
   mounted () {
     const href = this.$route.href
+    if (this.$route?.query?.status !== undefined && this.$route?.query?.status !== null) {
+      this.filters.status = this.$route?.query?.status + ''
+      this.$router.replace({})
+    }
+
     let curQueryParams = {}
 
     if (href.indexOf('?') != -1 && href.split('?').length > 0) {
@@ -894,7 +915,7 @@
         { label: '关联任务', value: this.currentDetail.job_name || '/' },
         { label: '任务发起人', value: this.currentDetail.creator },
         { label: '当前状态', value: this.mapStatus(this.currentDetail.status) },
-        { label: '事件地址', value: this.currentDetail.address }, // 包含经纬度信息
+        { label: '事件地址', value: this.currentDetail.address || this.currentDetail.latAndLon }, // 包含经纬度信息
         { label: '关联算法', value: this.currentDetail.aiType },
         { label: '发起单位', value: this.currentDetail.department },
         { label: '发起任务时间', value: this.currentDetail.startTime },
@@ -971,6 +992,16 @@
         return '/'
       }
     },
+
+    popupShowImage () {
+      return (list) => {
+
+        return list.map(item => ({
+          ...item,
+          url: getShowImg(item.url)
+        }))
+      }
+    }
   },
 
   methods: {
@@ -1477,6 +1508,8 @@
     },
 
     async handleCurrentChange (val) {
+
+
       // 先更新页码
       this.page.currentPage = val
       // 等待 DOM 更新后再请求数据
@@ -1485,6 +1518,7 @@
     },
 
     async sizeChange (val) {
+
       this.page.pageSize = val
       this.page.currentPage = 1 // 重置到第一页
       await this.$nextTick()
@@ -1492,6 +1526,8 @@
     },
 
     handleAdd () {
+
+      this.createoredit = 1
       this.dialogVisible = true
       this.mapParams.center = null
       this.form.location = []
@@ -1523,6 +1559,7 @@
     },
 
     async handleViewDetail (row) {
+
       // 找到当前行在tableData中的索引
       this.currentIndex = this.tableData.findIndex(item => item.id === row.id)
       // 先设置workType,直接从row读取
@@ -1586,8 +1623,13 @@
           this.stepInfos = []
         }
       }
+      console.log(detailData, 'detailDatadetailDatadetailData')
+      this.currentDetail = {
+        ...detailData,
+        address: null,
+        latAndLon: _.round(detailData.location[0], 6) + ',' + _.round(detailData.location[1], 6)
+      }
 
-      this.currentDetail = detailData
       console.log('this.currentDetail', this.currentDetail)
       this.detailVisible = true
       this.$nextTick(() => {
@@ -2002,6 +2044,7 @@
 
     // 添加编辑方法
     handleEdit (row) {
+      this.createoredit = 2
       console.log('编辑原始数据:', row)
 
       // 尝试从row.dept_id或通过部门名称查找对应的部门ID
@@ -2077,6 +2120,7 @@
         address: row.address || '',
         content: row.content,
         photos: [],
+
       }
 
       let curLocation = []
@@ -2150,6 +2194,7 @@
 
     // 添加选择变化处理方法
     handleSelectionChange (selection) {
+
       this.selections = selection
       console.log('已选择的行:', selection)
     },

--
Gitblit v1.9.3