Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web
26 files modified
2 files added
| | |
| | | #接口地址 |
| | | VITE_APP_API=/api |
| | | |
| | | #接口地址-xt |
| | | VITE_APP_API_XT=/apiXT |
| | | |
| | | #页面基础路径 |
| | | VITE_APP_BASE=/task-work-order |
| | | |
| | |
| | | # @LastEditors : yuan |
| | | # @LastEditTime : 2026-01-16 11:02:24 |
| | | # @FilePath : \applications\task-work-order\env\.env.development |
| | | # @Description : |
| | | # Copyright 2026 OBKoro1, All Rights Reserved. |
| | | # @Description : |
| | | # Copyright 2026 OBKoro1, All Rights Reserved. |
| | | # 2026-01-07 14:58:30 |
| | | ### |
| | | ### |
| | | NODE_ENV = 'development' |
| | | |
| | | #开发环境配置 |
| | |
| | | # VITE_APP_URL = https://wrj.shuixiongit.com/api |
| | | VITE_APP_URL= http://192.168.1.204 |
| | | |
| | | VITE_APP_URL_XT=http://218.202.104.82:8200 |
| | | |
| | | #新大屏地址 |
| | | VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/' |
| | | |
| | |
| | | <router-view /> |
| | | </template> |
| | | |
| | | |
| | | |
| | | <script setup> |
| | | import { loginWithMiniProgramApi } from '@/api/zkxt' |
| | | |
| | | |
| | | function getToken() { |
| | | loginWithMiniProgramApi({username: 'admin'}).then(res => { |
| | | console.log(res) |
| | | }) |
| | | } |
| | | getToken() |
| | | setInterval(() => { |
| | | getToken() |
| | | }, 600000) |
| | | </script> |
| | | |
| | | <style> |
| New file |
| | |
| | | import request from '@/axiosXT' |
| | | |
| | | export const loginWithMiniProgramApi = (data) => { |
| | | return request({ |
| | | url: `/auth/loginWithMiniProgram`, |
| | | method: 'post', |
| | | data, |
| | | }) |
| | | } |
| | |
| | | * isToken是否需要token |
| | | */ |
| | | |
| | | 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 website from '@/config/website'; |
| | | import { Base64 } from 'js-base64'; |
| | | import { baseUrl } from '@/config/env'; |
| | | import crypto from '@/utils/crypto'; |
| | | const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL; |
| | | 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 website from '@/config/website' |
| | | import { Base64 } from 'js-base64' |
| | | import { baseUrl } from '@/config/env' |
| | | import crypto from '@/utils/crypto' |
| | | const adminUrl = import.meta.env.VITE_APP_DASHBOARD_URL |
| | | // 全局未授权错误提示状态,只提示一次 |
| | | let isErrorShown = false; |
| | | let isErrorShown = false |
| | | |
| | | let _retry = false; |
| | | // 超时时间设置为10分钟,部分接口上传比较慢,如固件上传 |
| | | axios.defaults.timeout = 600000; |
| | | //返回其他状态码 |
| | | axios.defaults.validateStatus = function (status) { |
| | | return status >= 200 && status <= 500; // 默认的 |
| | | }; |
| | | //跨域请求,允许保存cookie |
| | | axios.defaults.withCredentials = true; |
| | | let _retry = false |
| | | |
| | | // 创建作用域的 axios 实例 |
| | | const service = axios.create({ |
| | | // 超时时间设置为10分钟,部分接口上传比较慢,如固件上传 |
| | | timeout: 600000, |
| | | //返回其他状态码 |
| | | validateStatus: function (status) { |
| | | return status >= 200 && status <= 500 // 默认的 |
| | | }, |
| | | //跨域请求,允许保存cookie |
| | | withCredentials: true, |
| | | }) |
| | | |
| | | //http request拦截 |
| | | axios.interceptors.request.use( |
| | | config => { |
| | | // 初始化错误提示状态 |
| | | isErrorShown = false; |
| | | //地址为已经配置状态则不添加前缀 |
| | | if (!isURL(config.url) && !config.url.startsWith(baseUrl)) { |
| | | config.url = baseUrl + config.url; |
| | | } |
| | | //安全请求header |
| | | config.headers['areaCode'] = config?.params?.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}` |
| | | )}`; |
| | | } |
| | | // 后端的要求 |
| | | 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) {} |
| | | } |
| | | service.interceptors.request.use( |
| | | config => { |
| | | // 初始化错误提示状态 |
| | | isErrorShown = false |
| | | //地址为已经配置状态则不添加前缀 |
| | | if (!isURL(config.url) && !config.url.startsWith(baseUrl)) { |
| | | config.url = baseUrl + config.url |
| | | } |
| | | //安全请求header |
| | | config.headers['areaCode'] = config?.params?.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 => { |
| | | 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 => { |
| | | return Promise.reject(new Error(error)); |
| | | } |
| | | ); |
| | | window._request = axios |
| | | export default axios; |
| | | service.interceptors.response.use( |
| | | res => { |
| | | 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 service(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 => { |
| | | return Promise.reject(new Error(error)) |
| | | } |
| | | ) |
| | | window._request = service |
| | | export default service |
| New file |
| | |
| | | import axios from 'axios' |
| | | import store from '@/store/' |
| | | 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 { Base64 } from 'js-base64' |
| | | import { baseUrl } from '@/config/env' |
| | | import crypto from '@/utils/crypto' |
| | | // 全局未授权错误提示状态,只提示一次 |
| | | const { VITE_APP_API_XT } = import.meta.env |
| | | |
| | | // 创建作用域的 axios 实例 |
| | | const serviceXT = axios.create({ |
| | | // 超时时间设置为10分钟,部分接口上传比较慢,如固件上传 |
| | | timeout: 600000, |
| | | baseURL: VITE_APP_API_XT, |
| | | //返回其他状态码 |
| | | validateStatus: function (status) { |
| | | return status >= 200 && status <= 500 // 默认的 |
| | | }, |
| | | //跨域请求,允许保存cookie |
| | | withCredentials: true, |
| | | }) |
| | | |
| | | //http request拦截 |
| | | serviceXT.interceptors.request.use( |
| | | config => { |
| | | //headers判断是否需要 |
| | | const authorization = config.authorization === false |
| | | if (!authorization) { |
| | | config.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}` |
| | | } |
| | | const meta = config.meta || {} |
| | | |
| | | //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拦截 |
| | | serviceXT.interceptors.response.use( |
| | | res => { |
| | | const status = res.data.error_code || res.data.code || res.status |
| | | const statusWhiteList = website.statusWhiteList || [] |
| | | const message = res?.data?.msg || res?.data?.message || '系统错误' |
| | | //如果在白名单里则自行catch逻辑处理 |
| | | if (statusWhiteList.includes(status)) return Promise.reject(res) |
| | | // 如果请求为非200默认统一处理 |
| | | if (status !== 200 && status !== 0) { |
| | | ElMessage({ |
| | | message: message, |
| | | type: 'error', |
| | | }) |
| | | return Promise.reject(new Error(message)) |
| | | } |
| | | return res |
| | | }, |
| | | error => { |
| | | return Promise.reject(new Error(error)) |
| | | } |
| | | ) |
| | | export default serviceXT |
| | |
| | | |
| | | // 获取工单列表 |
| | | async function getWorkOrderList() { |
| | | const res = await gdWorkOrderPageApi({ size: 999 }) |
| | | const res = await gdWorkOrderPageApi({ size: 999, }) |
| | | workOrderList.value = res?.data?.data?.records ?? [] |
| | | } |
| | | |
| | | // 获取飞手列表 |
| | | async function getFlyerList() { |
| | | const res = await gdFlyerPageApi({ size: 999 }) |
| | | const res = await gdFlyerPageApi({ |
| | | size: 999, |
| | | // todo 需要传入前面的巡查类型 |
| | | // patrolTaskType: '1', |
| | | }) |
| | | flyerList.value = res?.data?.data?.records ?? [] |
| | | } |
| | | |
| | | // 获取设备列表 |
| | | async function getDeviceList() { |
| | | const res = await gdManageDeviceListApi() |
| | | const res = await gdManageDeviceListApi({ |
| | | // TODO 需要传入ids设备 |
| | | // ids: |
| | | }) |
| | | deviceList.value = res?.data?.data ?? [] |
| | | } |
| | | |
| | |
| | | <template> |
| | | <basic-container> |
| | | <el-tabs class="gd-tabs" v-model="activeName" @tab-click="tabsClick"> |
| | | <el-tab-pane label="全部 " name="all"></el-tab-pane> |
| | | <el-tab-pane label="我的任务工单" name="my"></el-tab-pane> |
| | | </el-tabs> |
| | | <el-form ref="queryParamsRef" :model="searchParams" class="gd-search-form"> |
| | | <el-form-item label="任务名称" prop="patrolTaskName"> |
| | | <el-input |
| | |
| | | </el-form> |
| | | |
| | | <div class="gd-table-toolbar"> |
| | | <!-- <el-button color="#F2F3F5" @click="requester = !requester">我是{{ requester ? '需求方' : '服务方' }}</el-button>--> |
| | | <el-button :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">新增</el-button> |
| | | <!-- <el-button :icon="Delete" color="#4C34FF" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>--> |
| | | <el-button v-if="requester" :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">新增</el-button> |
| | | </div> |
| | | |
| | | <div class="gd-table-container" v-loading="loading"> |
| | |
| | | deviceLoadDemand: [], // 设备负载需求 |
| | | taskStatus: [], // 巡查任务状态 |
| | | }) |
| | | |
| | | const activeName = ref('all') |
| | | provide('dictObj', dictObj) |
| | | provide('requester', requester) |
| | | |
| | |
| | | const range = dateRangeFormat(dateRange.value) |
| | | loading.value = true |
| | | try { |
| | | const res = await gdPatrolTaskPageApi({ ...searchParams.value, startTime: range[0], endTime: range[1] }) |
| | | const res = await gdPatrolTaskPageApi({ |
| | | ...searchParams.value, |
| | | startTime: range[0], |
| | | endTime: range[1], |
| | | createUser: activeName.value === 'my' ? store.state.user.userInfo.user_id : '', |
| | | }) |
| | | list.value = res?.data?.data?.records ?? [] |
| | | total.value = res?.data?.data?.total ?? 0 |
| | | } finally { |
| | |
| | | } |
| | | } |
| | | |
| | | function tabsClick(tab, event) { |
| | | activeName.value = tab.props.name |
| | | resetForm() |
| | | handleSearch() |
| | | } |
| | | |
| | | // 查询 |
| | | function handleSearch() { |
| | | searchParams.value.current = 1 |
| | |
| | | </div> |
| | | |
| | | <template #footer> |
| | | <!-- <el-button color="#F2F3F5" @click="visible = false">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>--> |
| | | <el-button |
| | | class="save-btn" |
| | | color="#4C34FF" |
| | | v-if="(!dialogReadonly && !formData.id) || suddenlyEdit" |
| | | :loading="submitting" |
| | | :disabled="submitting" |
| | | @click="handleSubmit" |
| | | > |
| | | 发布 |
| | | </el-button> |
| | | <template v-if="requester"> |
| | | <el-button |
| | | v-if="['11', '31'].includes(gdStatus) || suddenlyEdit || (!dialogReadonly && !formData.id)" |
| | | :loading="submitting" |
| | | :disabled="submitting" |
| | | @click="handleSubmit" |
| | | > |
| | | {{ gdStatus === '11' ? '发布' : '提交修改' }} |
| | | 发布 |
| | | </el-button> |
| | | <el-button v-if="['11', '21', '23', '24', '25', '31', '60'].includes(gdStatus)" @click="viewDescription"> |
| | | {{ gdStatusObj[gdStatus].reason }} |
| | | </el-button> |
| | | <el-button @click="addDescription" v-if="['20', '24', '25', '50'].includes(gdStatus)"> |
| | | {{ gdStatus === '50' ? '结算' : '申请取消' }} |
| | | </el-button> |
| | | <el-button @click="requestModification" v-if="['20', '25'].includes(gdStatus)">申请修改</el-button> |
| | | </template> |
| | | <template v-else> |
| | | <template v-if="requester"> |
| | | <el-button |
| | | class="save-btn" |
| | | color="#4C34FF" |
| | | v-if="editStatus.includes(gdStatus)" |
| | | :loading="submitting" |
| | | :disabled="submitting" |
| | | @click="handleSubmit" |
| | | > |
| | | 发布 |
| | | </el-button> |
| | | <el-button color="#F2F3F5" v-if="gdStatus === '11'" @click="addDescription(2, 'view')">拒单原因</el-button> |
| | | <el-button color="#F2F3F5" @click="statusChange(3)" v-if="gdStatus === '20'">申请取消</el-button> |
| | | <el-button color="#4C34FF" @click="requestModification" v-if="gdStatus === '20'" class="save-btn"> |
| | | 申请修改 |
| | | </el-button> |
| | | </template> |
| | | <template v-else> |
| | | <el-button color="#F2F3F5" v-if="gdStatus === '10'" @click="addDescription(2)">拒绝接单</el-button> |
| | | <el-button color="#4C34FF" v-if="gdStatus === '10'" @click="statusChange(1)" class="save-btn">接单</el-button> |
| | | <el-button color="#F2F3F5" v-if="gdStatus === '22'" @click="statusChange(7)">同意修改</el-button> |
| | | <el-button color="#4C34FF" v-if="gdStatus === '22'" @click="statusChange(8)" class="save-btn"> |
| | | 不同意修改 |
| | | </el-button> |
| | | <el-button color="#F2F3F5" v-if="gdStatus === '21'" @click="statusChange(5)">同意取消</el-button> |
| | | <el-button color="#4C34FF" v-if="gdStatus === '21'" @click="statusChange(6)" class="save-btn"> |
| | | 不同意取消 |
| | | </el-button> |
| | | <el-button color="#F2F3F5" v-if="gdStatus === '30'" @click="addDescription(9)">协商修改</el-button> |
| | | </template> |
| | | <el-button v-if="['21', '23'].includes(gdStatus)" @click="viewDescription"> |
| | | {{ gdStatusObj[gdStatus].reason }} |
| | | </el-button> |
| | | <el-button v-if="gdStatus === '10'" @click="addDescription">拒绝接单</el-button> |
| | | <el-button v-if="gdStatus === '10'" @click="statusChange(1)">接单</el-button> |
| | | <el-button v-if="gdStatus === '22'" @click="statusChange(7)">同意修改</el-button> |
| | | <el-button v-if="gdStatus === '22'" @click="statusChange(8)">不同意修改</el-button> |
| | | <el-button v-if="gdStatus === '21'" @click="statusChange(5)">同意取消</el-button> |
| | | <el-button v-if="gdStatus === '21'" @click="statusChange(6)">不同意取消</el-button> |
| | | <el-button v-if="gdStatus === '30'" @click="addDescription">协商修改</el-button> |
| | | </template> |
| | | </template> |
| | | |
| | |
| | | let drawPolygonExample |
| | | let pointList = ref([]) |
| | | const requester = inject('requester') |
| | | const editStatus = inject('editStatus') |
| | | const suddenlyEdit = ref(false) |
| | | const processList = ref([]) |
| | | let viewPlane |
| | | const hasPatrolTaskList = computed(() => ['30', '40', '50', '60'].includes(String(formData.value.workOrderStatus))) |
| | | |
| | | const gdStatusObj = { |
| | | '0': { reason: '' }, |
| | | '10': { reason: '拒绝原因', operationType: '2' }, |
| | | '11': { reason: '拒绝原因' }, |
| | | '20': { reason: '取消原因', operationType: '3' }, |
| | | '21': { reason: '取消原因' }, |
| | | '22': { reason: '驳回原因' }, |
| | | '23': { reason: '取消原因' }, |
| | | '24': { reason: '驳回原因', operationType: '3' }, |
| | | '25': { reason: '驳回原因', operationType: '3' }, |
| | | '30': { reason: '修改原因', operationType: '9' }, |
| | | '31': { reason: '修改原因' }, |
| | | '40': { reason: '' }, |
| | | '50': { reason: '情况说明', operationType: '10' }, |
| | | '60': { reason: '情况说明' }, |
| | | } |
| | | |
| | | // 工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、21响应中_申请取消、22响应中_申请修改、23响应中_已取消、 |
| | | // 24响应中_拒绝取消、25响应中_拒绝修改 30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、50验收通过_待结算、60结算完成_已结算 |
| | |
| | | executeStartTime: fieldRules(true), |
| | | deviceLoadDemand: fieldRules(true), |
| | | } |
| | | |
| | | // 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 9.协商修改 |
| | | function statusChange(operationType) { |
| | | gdWorkOrderHandleStatusApi({ operationType: operationType, workOrderId: formData.value.id }).then(res => { |
| | | gdWorkOrderHandleStatusApi({ |
| | | operationType: operationType, |
| | | workOrderId: formData.value.id, |
| | | }).then(res => { |
| | | visible.value = false |
| | | emit('success') |
| | | }) |
| | |
| | | } |
| | | |
| | | // 填写说明 |
| | | function addDescription(type, mode = 'add') { |
| | | let formLabel = '' |
| | | switch (type) { |
| | | case 2: |
| | | formLabel = '拒绝原因' |
| | | break |
| | | case 9: |
| | | formLabel = '修改原因' |
| | | break |
| | | } |
| | | function addDescription() { |
| | | rejectVisible.value = true |
| | | nextTick(() => { |
| | | refuseOrderDialogRef.value.open({ |
| | | mode, |
| | | mode: 'add', |
| | | row: formData.value, |
| | | type, |
| | | formLabel, |
| | | type: gdStatusObj[gdStatus.value].operationType, |
| | | formLabel: gdStatusObj[gdStatus.value].reason, |
| | | }) |
| | | }) |
| | | } |
| | | |
| | | function viewDescription() { |
| | | rejectVisible.value = true |
| | | refuseOrderDialogRef.value.open({ |
| | | mode: 'view', |
| | | row: formData.value, |
| | | formLabel: gdStatusObj[gdStatus.value].reason, |
| | | }) |
| | | } |
| | | |
| | |
| | | |
| | | function loadDemandChange() { |
| | | formData.value.recommendDeviceIds = '' |
| | | selectedDevices.value = [] |
| | | getDeviceList() |
| | | syncSelection() |
| | | } |
| | |
| | | const isValid = await formRef.value?.validate().catch(() => false) |
| | | if (!isValid) return |
| | | if (!pointList.value.length) { |
| | | ElMessage.warning('请绘制范围') |
| | | return |
| | | return ElMessage.warning('请绘制范围') |
| | | } |
| | | if (!formData.value.recommendDeviceIds) { |
| | | return ElMessage.warning('请选择设备') |
| | | } |
| | | submitting.value = true |
| | | try { |
| | |
| | | const val = cartesian3Convert(item, viewer) |
| | | return { ...val, lng: val.longitude, lat: val.latitude } |
| | | }) |
| | | formData.value.recommendDeviceIds = '' |
| | | selectedDevices.value = [] |
| | | await getDeviceList() |
| | | syncSelection() |
| | | } |
| | |
| | | } |
| | | |
| | | import droneIcon from '@/assets/images/orderView/orderManage/drone.png' |
| | | |
| | | function renderingDevice(list) { |
| | | // 渲染红点 |
| | | // 渲染红点 |
| | | list.forEach(item => { |
| | | const position = Cesium.Cartesian3.fromDegrees(item.longitude || 115.00, item.latitude || 27.11) |
| | | const position = Cesium.Cartesian3.fromDegrees(item.longitude || 115.0, item.latitude || 27.11) |
| | | viewer.entities.add({ |
| | | position: position, |
| | | billboard: { |
| | |
| | | .content { |
| | | display: flex; |
| | | gap: 0 20px; |
| | | |
| | | .leftBox { |
| | | width: 0; |
| | | flex: 1; |
| | | display: flex; |
| | | flex-direction: column; |
| | | |
| | | .gd-cesium { |
| | | width: 100%; |
| | | height: 423px; |
| | | } |
| | | } |
| | | |
| | | .rightBox { |
| | | .title { |
| | | font-weight: 500; |
| | |
| | | color: #272e37; |
| | | } |
| | | } |
| | | |
| | | .processBox { |
| | | width: 312px; |
| | | } |
| | |
| | | } |
| | | |
| | | let formLabelStr = ref('原因') |
| | | // 打开弹框 |
| | | |
| | | |
| | | // 操作类型:1接单,2拒接接单,3申请取消,4申请修改, 5同意取消 6不同意取消 7.同意修改 8.不同意修改 9.协商修改 |
| | | async function open({ mode = 'add', row, formLabel, type } = {}) { |
| | | dialogMode.value = mode |
| | | formLabelStr.value = formLabel |
| | | formData.value = { workOrderId: row.id, operationType: type, rejectReason: row.rejectReason } |
| | | formData.value = { |
| | | workOrderId: row.id, |
| | | operationType: type, |
| | | } |
| | | if (dialogMode.value !== 'add'){ |
| | | formData.value.rejectReason = row.rejectReason |
| | | } |
| | | } |
| | | |
| | | defineExpose({ open }) |
| | |
| | | {{ dayjs(row.executeEndTime).format('YYYY-MM-DD') }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="serviceParty" show-overflow-tooltip label="服务方名称" /> |
| | | <el-table-column prop="createUserName" show-overflow-tooltip label="需求方名称" /> |
| | | <el-table-column prop="serviceParty" show-overflow-tooltip label="服务方名称" /> |
| | | <el-table-column prop="createTime" show-overflow-tooltip label="工单创建时间" /> |
| | | <el-table-column label="操作" class-name="operation-btns"> |
| | | <template v-slot="{ row }"> |
| | |
| | | dialogRef.value?.open({ mode, row }) |
| | | }) |
| | | } |
| | | const editStatus = ['0','11','24','25'] |
| | | provide('editStatus', editStatus) |
| | | // 工单状态:0草稿、10发布中_接单中、11发布中_拒绝接单、20响应中_待拆分、 |
| | | // 21响应中_申请取消、22响应中_申请修改、23响应中_已取消、24响应中_拒绝取消、 |
| | | // 25响应中_拒绝修改 30执行中_待全部完成、31执行中_协商修改、40完成待验_待全部验收、 |
| | |
| | | function openFormChange(row) { |
| | | dialogVisible.value = true |
| | | nextTick(() => { |
| | | const mode = editStatus.includes(row.workOrderStatus) && requester.value ? 'edit' : 'view' |
| | | const mode = ['11','25'].includes(row.workOrderStatus) && requester.value ? 'edit' : 'view' |
| | | dialogRef.value?.open({ mode, row }) |
| | | }) |
| | | } |
| | |
| | | // https://vitejs.dev/config/ |
| | | export default ({ mode, command }) => { |
| | | const env = loadEnv(mode, fileURLToPath(new URL("./env", import.meta.url))) |
| | | const { VITE_APP_ENV, VITE_APP_BASE, VITE_APP_URL } = env |
| | | const { VITE_APP_ENV, VITE_APP_BASE, VITE_APP_URL,VITE_APP_API_XT,VITE_APP_URL_XT } = env |
| | | // 判断是打生产环境包 |
| | | const isProd = VITE_APP_ENV === 'production' |
| | | |
| | |
| | | port: 5178, |
| | | // host: '192.168.1.178', |
| | | proxy: { |
| | | '/apiXT': { |
| | | target: VITE_APP_URL_XT, |
| | | changeOrigin: true, |
| | | rewrite: path => path.replace(/^\/apiXT/, ''), |
| | | }, |
| | | '/api': { |
| | | target: VITE_APP_URL, |
| | | changeOrigin: true, |
| | | rewrite: path => path.replace(/^\/api/, ''), |
| | | } |
| | | }, |
| | | |
| | | }, |
| | | }, |
| | | assetsInclude: ['**/*.gltf','**/*.docx','**/*.pdf'], |
| | |
| | | |
| | | # API代理前缀 |
| | | VITE_API_PREFIX=/api |
| | | VITE_API_PREFIX_GD=/api-gd |
| | | VITE_API_PREFIX_GD=/droneWork |
| | | |
| | | # 删除console |
| | | VITE_DROP_CONSOLE=false |
| | |
| | | import { request } from "@/utils/requestGd/index.js" |
| | | import website from '@/config/website' |
| | | |
| | | // 获取工单列表 |
| | | export const getGdList = data => { |
| | | return request({ |
| | | url: '/system/user/profile/update', |
| | | method: 'post', |
| | | data, |
| | | }); |
| | | }; |
| | | |
| | | // 工单用户登录接口 |
| | | export const ticketLoginInterfaceApi = (tenantId, deptId, roleId, username, password, type, key, code) => { |
| | | return request({ |
| | |
| | | }, |
| | | }) |
| | | } |
| | | // 获取工单列表 |
| | | export const getGdList = data => { |
| | | return request({ |
| | | url: '/drone-gd/workOrder/gdClueEvent/list', |
| | | method: 'get', |
| | | data, |
| | | }); |
| | | }; |
| | | // 获取详情 |
| | | export const getGddetailedData = data => { |
| | | return request({ |
| | | url: '/drone-gd/workOrder/gdClueEvent/detail', |
| | | method: 'get', |
| | | data, |
| | | }); |
| | | }; |
| | | // 获取数量 |
| | | export const getstatusCount = (params) => { |
| | | return request({ |
| | | url: '/drone-gd/workOrder/gdClueEvent/count', |
| | | method: 'get', |
| | | params, |
| | | }) |
| | | } |
| | |
| | | VITE_APP_WEBVIEW_URL: 'https://wrj.shuixiongit.com/drone-app-web-view/#/webViewWrapper', |
| | | // VITE_APP_WEBVIEW_URL: 'https://192.168.1.157:5176/mobile-web-view/#/webViewWrapper', |
| | | VITE_API_BASE_URL: 'http://218.202.104.82:8200', |
| | | VITE_API_BASE_URL_GD: 'https://wrj.shuixiongit.com/api', |
| | | VITE_API_BASE_URL_GD: 'http://192.168.1.168', |
| | | // VITE_API_BASE_URL: 'https://aisky.org.cn/api', |
| | | VITE_APP_WS_API_URL:'wss://wrj.shuixiongit.com/drone-wss/api/v1/ws', |
| | | |
| | |
| | | VITE_APP_ENV: 'test', |
| | | VITE_APP_WEBVIEW_URL: 'https://wrj.shuixiongit.com/drone-app-web-view/#/webViewWrapper', |
| | | VITE_API_BASE_URL: 'https://wrj.shuixiongit.com/api', |
| | | VITE_API_BASE_URL_GD: 'https://wrj.shuixiongit.com/api', |
| | | VITE_APP_WS_API_URL: 'wss://wrj.shuixiongit.com/drone-wss/api/v1/ws', |
| | | // 静态资源存放地址' |
| | | VITE_APP_ASSETS_URL: 'https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_app_assets' |
| | |
| | | VITE_APP_ENV: 'production', |
| | | VITE_APP_WEBVIEW_URL: 'https://aisky.org.cn/drone-app-web-view/#/webViewWrapper', |
| | | VITE_API_BASE_URL: 'https://aisky.org.cn/api', |
| | | VITE_API_BASE_URL_GD: 'https://aisky.org.cn/api', |
| | | VITE_APP_WS_API_URL: 'wss://aisky.org.cn/drone-wss/api/v1/ws', |
| | | // 静态资源存放地址' |
| | | VITE_APP_ASSETS_URL: 'https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ztzf_app_assets' |
| | |
| | | <div class="tabs-container"> |
| | | <up-tabs :list="tabList" @click="handleClick"></up-tabs> |
| | | </div> |
| | | |
| | | <scroll-view class="eventBox" scroll-y :lower-threshold="80" @scrolltolower="loadMore"> |
| | | <!-- @scrolltolower="loadMore" --> |
| | | <scroll-view class="eventBox" scroll-y :lower-threshold="80" > |
| | | <div class="eventList"> |
| | | <div class="eventItem" v-for="(item,index) in dataList" :key="index"> |
| | | <img :src="item.photo_url" alt="" @click="detailHandle(item)" /> |
| | | <img :src="item.eventImageUrl" alt="" @click="detailHandle(item)" /> |
| | | <div class="informationDisplay"> |
| | | <!-- <div class="itemTitle">{{item.event_name}}</div>--> |
| | | <div class="itemContent">{{formatDate(item.create_time) }}</div> |
| | | <div class="itemContent">{{formatDate(item.createTime) }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <script setup> |
| | | |
| | | import { useUserStore } from '@/store/index.js' |
| | | import {getList,getstatusCount} from '/src/api/work/index.js' |
| | | import {getGdList,getstatusCount} from '/src/api/work/index1.js' |
| | | import dayjs from 'dayjs'; |
| | | import { getStatusBarHeight } from '@/utils/common'; |
| | | const userStore = useUserStore() |
| | | const userInfo = userStore.userInfo |
| | | const dataList = ref([ |
| | | { |
| | | "id": 8474, |
| | | "wayline_job_id": "51835088-cd94-42f8-b2ec-a9069ced4e7b", |
| | | "event_name": "测试", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260113/f090f03fdc52499473ab9cbfcdc0876d.jpeg", |
| | | "file_path": "upload/20260113/f090f03fdc52499473ab9cbfcdc0876d.jpeg", |
| | | "longitude": "115.85649472222222", |
| | | "latitude": "28.624301527777778", |
| | | "create_time": "2026-01-13 16:51:57", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260113002", |
| | | "ai_types": "道路裂缝", |
| | | "ai_type_key_list": [ |
| | | "DLLFSB" |
| | | ], |
| | | "work_order_type_dict_key": "ZHZLL", |
| | | "work_order_type": "交通运输与交管", |
| | | "create_user": "曾超杰", |
| | | "update_user": "管理员", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "2009140684346388482", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1123598821738675201", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1806号南昌台湾健康产业城", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260113/f090f03fdc52499473ab9cbfcdc0876d.jpeg", |
| | | "content": "测试", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照2", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-13 16:51:57" |
| | | }, |
| | | { |
| | | "id": 8472, |
| | | "wayline_job_id": "6beae73e-2d5d-47e5-859b-e2a1955d6e3b", |
| | | "event_name": "车事件", |
| | | "event_dict_key": "Traffic_flow", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket//6beae73e-2d5d-47e5-859b-e2a1955d6e3b/DJI_202601091336_002_6beae73e-2d5d-47e5-859b-e2a1955d6e3b/车AI20260112144421001.jpeg", |
| | | "file_path": "/6beae73e-2d5d-47e5-859b-e2a1955d6e3b/DJI_202601091336_002_6beae73e-2d5d-47e5-859b-e2a1955d6e3b/车AI20260112144421001.jpeg", |
| | | "longitude": "115.85502433333333", |
| | | "latitude": "28.623021472222224", |
| | | "create_time": "2026-01-12 14:44:25", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "AI20260112144421001", |
| | | "remark": "江西省南昌市西湖区朝农街道翠菊路银燕物流基地发生车事件", |
| | | "ai_types": "车", |
| | | "ai_type_key_list": [ |
| | | "CGL_CLLTJ" |
| | | ], |
| | | "work_order_type_dict_key": "ZHZLL", |
| | | "work_order_type": "交通运输与交管", |
| | | "create_user": "曾超杰", |
| | | "update_user": "空间大厦管理员", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "2009140684346388482", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1979075301412524033", |
| | | "address": "江西省南昌市西湖区朝农街道翠菊路银燕物流基地", |
| | | "content": "测试", |
| | | "work_type": "2", |
| | | "job_name": "马上智飞202601091336", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-09 13:36:42" |
| | | }, |
| | | { |
| | | "id": 8464, |
| | | "wayline_job_id": "8b4b7529-13ee-4885-a7b8-4a52667444fb", |
| | | "event_name": "1212", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260107/5e6bc6ecedd830f2415a959667b3841a.jpeg", |
| | | "file_path": "upload/20260107/5e6bc6ecedd830f2415a959667b3841a.jpeg", |
| | | "longitude": "115.85803208048642", |
| | | "latitude": "28.625135341676483", |
| | | "create_time": "2026-01-07 11:18:35", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260107003", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "罗广辉", |
| | | "update_user": "空间大厦管理员", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1896495271624384514", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1979075301412524033", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路世纪吉的堡幼儿园", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260107/5e6bc6ecedd830f2415a959667b3841a.jpeg", |
| | | "content": "2121", |
| | | "work_type": "3", |
| | | "job_name": "马上智飞202601051720", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-07 11:18:35" |
| | | }, |
| | | { |
| | | "id": 8463, |
| | | "wayline_job_id": "8b4b7529-13ee-4885-a7b8-4a52667444fb", |
| | | "event_name": "122112", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260107/a52b1adda405b94a4f9436e43e1b3185.jpeg", |
| | | "file_path": "upload/20260107/a52b1adda405b94a4f9436e43e1b3185.jpeg", |
| | | "longitude": "115.85780692063119", |
| | | "latitude": "28.624775436656122", |
| | | "create_time": "2026-01-07 11:17:47", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260107002", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "罗广辉", |
| | | "update_user": "空间大厦管理员", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1896495271624384514", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1979075301412524033", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路世纪吉的堡幼儿园", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260107/a52b1adda405b94a4f9436e43e1b3185.jpeg", |
| | | "content": "1", |
| | | "work_type": "3", |
| | | "job_name": "马上智飞202601051720", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-07 11:17:48" |
| | | }, |
| | | { |
| | | "id": 8462, |
| | | "wayline_job_id": "8b4b7529-13ee-4885-a7b8-4a52667444fb", |
| | | "event_name": "1", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260107/a138491d214cc0ce7a5a3eedf6b79680.jpeg", |
| | | "file_path": "upload/20260107/a138491d214cc0ce7a5a3eedf6b79680.jpeg", |
| | | "longitude": "115.85763536212585", |
| | | "latitude": "28.626095211224335", |
| | | "create_time": "2026-01-07 11:14:41", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260107001", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "罗广辉", |
| | | "update_user": "江西融媒", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1896495271624384514", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1993119267150655490", |
| | | "address": "江西省南昌市西湖区朝农街道国贸天琴湾东区", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260107/a138491d214cc0ce7a5a3eedf6b79680.jpeg", |
| | | "content": "1", |
| | | "work_type": "3", |
| | | "job_name": "马上智飞202601051720", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-07 11:14:42" |
| | | }, |
| | | { |
| | | "id": 8461, |
| | | "wayline_job_id": "038b8f48-1704-4adc-abb7-7deb85eba101", |
| | | "event_name": "测试", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/c94dca50d34e13f53fd5a5c05abfe03f.jpeg", |
| | | "file_path": "upload/20260106/c94dca50d34e13f53fd5a5c05abfe03f.jpeg", |
| | | "longitude": "115.85623975", |
| | | "latitude": "28.624919472222224", |
| | | "create_time": "2026-01-06 13:38:03", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106018", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "张含笑", |
| | | "update_user": "张含笑", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1909067460995813377", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1818号国贸天琴湾", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/c94dca50d34e13f53fd5a5c05abfe03f.jpeg", |
| | | "content": "123", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照-1-5", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 13:38:03" |
| | | }, |
| | | { |
| | | "id": 8460, |
| | | "wayline_job_id": "8b4b7529-13ee-4885-a7b8-4a52667444fb", |
| | | "event_name": "11", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/6ef9355b143d4e89d83c77d18f4e312f.jpeg", |
| | | "file_path": "upload/20260106/6ef9355b143d4e89d83c77d18f4e312f.jpeg", |
| | | "longitude": "115.85763536212585", |
| | | "latitude": "28.626095211224335", |
| | | "create_time": "2026-01-06 11:08:51", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106017", |
| | | "ai_types": "建筑垃圾", |
| | | "ai_type_key_list": [ |
| | | "GCL_JZLJSB" |
| | | ], |
| | | "work_order_type_dict_key": "CGL", |
| | | "work_order_type": "城市管理与综合执法", |
| | | "create_user": "张含笑", |
| | | "update_user": "罗广辉", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1896495271624384514", |
| | | "address": "江西省南昌市西湖区朝农街道国贸天琴湾东区", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/6ef9355b143d4e89d83c77d18f4e312f.jpeg", |
| | | "content": "12", |
| | | "work_type": "3", |
| | | "job_name": "马上智飞202601051720", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 11:08:52" |
| | | }, |
| | | { |
| | | "id": 8459, |
| | | "wayline_job_id": "038b8f48-1704-4adc-abb7-7deb85eba101", |
| | | "event_name": "122", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/96c7769b12f2e55b7e788e8f35b0364b.jpeg", |
| | | "file_path": "upload/20260106/96c7769b12f2e55b7e788e8f35b0364b.jpeg", |
| | | "longitude": "115.85623975", |
| | | "latitude": "28.624919472222224", |
| | | "create_time": "2026-01-06 11:08:00", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106016", |
| | | "ai_types": "水生植物漂浮物", |
| | | "ai_type_key_list": [ |
| | | "SMPFWSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "张含笑", |
| | | "update_user": "张含笑", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1909067460995813377", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1818号国贸天琴湾", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/96c7769b12f2e55b7e788e8f35b0364b.jpeg", |
| | | "content": "1", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照-1-5", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 11:08:00" |
| | | }, |
| | | { |
| | | "id": 8458, |
| | | "wayline_job_id": "8b4b7529-13ee-4885-a7b8-4a52667444fb", |
| | | "event_name": "12", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/2e065c4f0e78d4fa1cfdd15f65397b85.jpeg", |
| | | "file_path": "upload/20260106/2e065c4f0e78d4fa1cfdd15f65397b85.jpeg", |
| | | "longitude": "115.85677911492691", |
| | | "latitude": "28.62569394530331", |
| | | "create_time": "2026-01-06 11:00:53", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106015", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "张含笑", |
| | | "update_user": "罗广辉", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1896495271624384514", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1836号国贸天琴湾东区", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/2e065c4f0e78d4fa1cfdd15f65397b85.jpeg", |
| | | "content": "22", |
| | | "work_type": "3", |
| | | "job_name": "马上智飞202601051720", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 11:00:54" |
| | | }, |
| | | { |
| | | "id": 8457, |
| | | "wayline_job_id": "038b8f48-1704-4adc-abb7-7deb85eba101", |
| | | "event_name": "发布事件", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/ecdfe6c661dba2fa03efcc19a5863680.jpeg", |
| | | "file_path": "upload/20260106/ecdfe6c661dba2fa03efcc19a5863680.jpeg", |
| | | "longitude": "115.85623975", |
| | | "latitude": "28.624919472222224", |
| | | "create_time": "2026-01-06 10:43:29", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106014", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "张含笑", |
| | | "update_user": "张含笑", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1909067460995813377", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1818号国贸天琴湾", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/ecdfe6c661dba2fa03efcc19a5863680.jpeg", |
| | | "content": "11", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照-1-5", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 10:43:30" |
| | | }, |
| | | { |
| | | "id": 8456, |
| | | "wayline_job_id": "038b8f48-1704-4adc-abb7-7deb85eba101", |
| | | "event_name": "122", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/fc9820c440da478fa5312e8647e1e311.jpeg", |
| | | "file_path": "upload/20260106/fc9820c440da478fa5312e8647e1e311.jpeg", |
| | | "longitude": "115.85623975", |
| | | "latitude": "28.624919472222224", |
| | | "create_time": "2026-01-06 10:38:20", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106013", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "张含笑", |
| | | "update_user": "张含笑", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1909067460995813377", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1818号国贸天琴湾", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/fc9820c440da478fa5312e8647e1e311.jpeg", |
| | | "content": "3", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照-1-5", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 10:38:20" |
| | | }, |
| | | { |
| | | "id": 8455, |
| | | "wayline_job_id": "038b8f48-1704-4adc-abb7-7deb85eba101", |
| | | "event_name": "122", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/d9a152ab1484348be5e126f854eca86a.jpeg", |
| | | "file_path": "upload/20260106/d9a152ab1484348be5e126f854eca86a.jpeg", |
| | | "longitude": "115.85623975", |
| | | "latitude": "28.624919472222224", |
| | | "create_time": "2026-01-06 10:38:18", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260106012", |
| | | "ai_types": "水体污染", |
| | | "ai_type_key_list": [ |
| | | "STWLSB" |
| | | ], |
| | | "work_order_type_dict_key": "SLL", |
| | | "work_order_type": "生态环境与水务", |
| | | "create_user": "张含笑", |
| | | "update_user": "张含笑", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "1909067460995813377", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1909067460995813377", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1818号国贸天琴湾", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260106/d9a152ab1484348be5e126f854eca86a.jpeg", |
| | | "content": "3", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照-1-5", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-06 10:38:18" |
| | | } |
| | | ]) |
| | | const dataList = ref([]) |
| | | const currentTab=ref('all') |
| | | const loading = ref(false) |
| | | const hasMore = ref(true) |
| | |
| | | name: '全部工单', |
| | | key: 'all', |
| | | badge: { |
| | | value: 2 |
| | | value: 0 |
| | | }, |
| | | status: null |
| | | }, |
| | |
| | | name: '我的工单', |
| | | key: 'myTickets', |
| | | badge: { |
| | | value: 1 |
| | | value: 0 |
| | | } |
| | | } |
| | | |
| | |
| | | const params = { |
| | | current: listParams.value.current, |
| | | size: listParams.value.size, |
| | | source: 1, |
| | | status:listParams.value.status, |
| | | event_name:listParams.value.keyword, |
| | | user_id:currentTab.value=== 'myTickets' ?userInfo.user_id : undefined |
| | | // event_name:listParams.value.keyword, |
| | | onlyMine:currentTab.value=== 'myTickets' ? 1 : 0 |
| | | } |
| | | getList(params).then(res => { |
| | | |
| | | getGdList(params).then(res => { |
| | | const response = res.data.data |
| | | const records = response.records || [] |
| | | |
| | | dataList.value = response |
| | | // 根据当前页码决定是替换还是追加数据 |
| | | if (listParams.value.current === 1) { |
| | | dataList.value = records |
| | | } else { |
| | | dataList.value = [...dataList.value, ...records] |
| | | } |
| | | // if (listParams.value.current === 1) { |
| | | // dataList.value = response |
| | | // } else { |
| | | // dataList.value = [...dataList.value, ...response] |
| | | // } |
| | | |
| | | // 判断是否还有更多数据 |
| | | if (records.length < listParams.value.size || response.current >= response.pages) { |
| | | hasMore.value = false |
| | | } else { |
| | | hasMore.value = true |
| | | } |
| | | // // 判断是否还有更多数据 |
| | | // if (response.length < listParams.value.size || response.current >= response.pages) { |
| | | // hasMore.value = false |
| | | // } else { |
| | | // hasMore.value = true |
| | | // } |
| | | }).finally(() => { |
| | | loading.value = false |
| | | }) |
| | |
| | | |
| | | |
| | | |
| | | // const getstatusCountData=()=>{ |
| | | // getstatusCount().then(res=>{ |
| | | // const response = res.data.data |
| | | // const { statusCount, totalCount, userCount } = response |
| | | // tabList.value.forEach(tab=>{ |
| | | // |
| | | // if(tab.key === 'all'){ |
| | | // tab.badge.value = totalCount || 0 |
| | | // |
| | | // }else if(tab.key === 'myTickets'){ |
| | | // tab.badge.value = userCount || 0 |
| | | // }else{ |
| | | // tab.badge.value=statusCount[String(tab.status)] || 0 |
| | | // } |
| | | // }) |
| | | // |
| | | // }) |
| | | // } |
| | | const getstatusCountData=()=>{ |
| | | getstatusCount().then(res=>{ |
| | | const response = res.data.data |
| | | const { totalCount,myCount } = response |
| | | tabList.value.forEach(tab=>{ |
| | | |
| | | if(tab.key === 'all'){ |
| | | tab.badge.value = totalCount || 0 |
| | | |
| | | }else if(tab.key === 'myTickets'){ |
| | | tab.badge.value = myCount || 0 |
| | | }else{ |
| | | tab.badge.value=statusCount[String(tab.status)] || 0 |
| | | } |
| | | }) |
| | | |
| | | }) |
| | | } |
| | | |
| | | const handleClick = (item) => { |
| | | currentTab.value = item.key |
| | |
| | | |
| | | const detailHandle = (val) => { |
| | | uni.navigateTo({ |
| | | url: `/subPackages/workDetail/index?eventNum=${val.event_num}`, |
| | | url: `/subPackages/workDetail/index?id=${val.id}`, |
| | | }) |
| | | } |
| | | const topMargin = getStatusBarHeight() |
| | | onShow(() => { |
| | | // listParams.value.current = 1 |
| | | // hasMore.value = true |
| | | // dataList.value = [] |
| | | // getDataList() |
| | | listParams.value.current = 1 |
| | | hasMore.value = true |
| | | dataList.value = [] |
| | | getDataList() |
| | | getstatusCountData() |
| | | }) |
| | | </script> |
| | | |
| | |
| | | import setupI18n from "@/locales" |
| | | import setupStore from "@/store" |
| | | import setupRequest from "@/utils/request" |
| | | import setupRequestGd from "@/utils/requestGd" |
| | | import setupPermission from "./permission" |
| | | import setupUI from "./ui" |
| | | |
| | |
| | | setupPermission() |
| | | // 网络请求 |
| | | setupRequest() |
| | | // 工单网络请求 |
| | | setupRequestGd() |
| | | } |
| | | } |
| | |
| | | <div class="workOrderContainer"> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">工单编号</div> |
| | | <div>{{ workDetailData.event_num }}</div> |
| | | <div>{{ workDetailData.eventCode }}</div> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">工单处置人</div> |
| | | <div>{{ workDetailData.event_num?.slice(0, 2) === 'AI' ? 'AI 小飞' : workDetailData.creator }}</div> |
| | | <div>{{ workDetailData.disposeUserName }}</div> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">处置部门</div> |
| | | <div>{{ workDetailData.dept_name }}</div> |
| | | <div>{{ workDetailData.disposeDept }}</div> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">拍摄时间</div> |
| | | <div>{{ workDetailData.create_time }}</div> |
| | | <div>{{ workDetailData.shootTime }}</div> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">分发人员</div> |
| | | <div>{{ workDetailData.remark }}</div> |
| | | <div>{{ workDetailData.distributeUserName }}</div> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">分发部门</div> |
| | | <div>{{ workDetailData.remark }}</div> |
| | | <div>{{ workDetailData.distributeDeptName }}</div> |
| | | </div> |
| | | |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">分发时间</div> |
| | | <div>{{ workDetailData.create_time }}</div> |
| | | <div>{{ workDetailData.distributeTime }}</div> |
| | | </div> |
| | | <div class="orderRow"> |
| | | <div class="rowTitle">工单位置</div> |
| | | <div class="rowAddress" @click="jumpMap(workDetailData)">{{ workDetailData.address }}</div> |
| | | <div class="rowAddress" @click="jumpMap(workDetailData)">{{ workDetailData.eventLocation }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <script setup> |
| | | // import { getShowImg, getSmallImg } from '@/utils/util' |
| | | import { ref, computed } from 'vue' |
| | | import { getList, flowEvent } from '/src/api/work/index.js' |
| | | import {getGddetailedData} from '/src/api/work/index1.js' |
| | | import dayjs from 'dayjs' |
| | | |
| | | const formatDate = dateString => { |
| | | return dayjs(dateString).format('MM/DD HH:mm') |
| | | } |
| | | const eventNum = ref('') |
| | | // 工单内容 |
| | | const workDetailData = ref({ |
| | | "id": 8474, |
| | | "wayline_job_id": "51835088-cd94-42f8-b2ec-a9069ced4e7b", |
| | | "event_name": "测试", |
| | | "device_sn": "7CTDM5E00B3H61", |
| | | "status": 3, |
| | | "photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260113/f090f03fdc52499473ab9cbfcdc0876d.jpeg", |
| | | "file_path": "upload/20260113/f090f03fdc52499473ab9cbfcdc0876d.jpeg", |
| | | "longitude": "115.85649472222222", |
| | | "latitude": "28.624301527777778", |
| | | "create_time": "2026-01-13 16:51:57", |
| | | "media_type": "PHOTO_TYPE", |
| | | "event_num": "BHJC20260113002", |
| | | "ai_types": "道路裂缝", |
| | | "ai_type_key_list": [ |
| | | "DLLFSB" |
| | | ], |
| | | "work_order_type_dict_key": "ZHZLL", |
| | | "work_order_type": "交通运输与交管", |
| | | "create_user": "曾超杰", |
| | | "update_user": "管理员", |
| | | "dept_name": "中图智飞(江西省)", |
| | | "create_user_id": "2009140684346388482", |
| | | "user_id": "1991745495648227330", |
| | | "handle_user_id": "1123598821738675201", |
| | | "address": "江西省南昌市西湖区朝农街道抚生南路1806号南昌台湾健康产业城", |
| | | "update_photo_url": "https://wrj.shuixiongit.com/minio/cloud-bucket/upload/20260113/f090f03fdc52499473ab9cbfcdc0876d.jpeg", |
| | | "content": "测试", |
| | | "work_type": "3", |
| | | "job_name": "定向拍照2", |
| | | "is_review": 0, |
| | | "job_create_time": "2026-01-13 16:51:57" |
| | | },) |
| | | const workDetailData = ref({}) |
| | | onLoad(async options => { |
| | | eventNum.value = options.eventNum |
| | | // await getDataList(eventNum.value) |
| | | eventNum.value = options.id |
| | | await getDataList(options.id) |
| | | }) |
| | | const getDataList = async val => { |
| | | const params = { |
| | | current: 1, |
| | | size: 9999, |
| | | source: 1, |
| | | event_name: val, |
| | | id: val, |
| | | } |
| | | const res = await getList(params) |
| | | const response = res.data.data.records |
| | | workDetailData.value = response[0] |
| | | const res = await getGddetailedData(params) |
| | | const response = res.data.data |
| | | workDetailData.value = response |
| | | console.log('详情', workDetailData.value) |
| | | |
| | | console.log('详情', response) |
| | | |
| | | } |
| | | // 图片预览 |
| | | |
| | |
| | | const getImageList = computed(() => { |
| | | const imageArr = [] |
| | | const detail = workDetailData.value |
| | | if (detail.photo_url) { |
| | | const smallUrl = detail.photo_url |
| | | if (detail.eventImageUrl) { |
| | | const smallUrl = detail.eventImageUrl |
| | | imageArr.push(smallUrl) |
| | | } |
| | | if (detail.update_photo_url) { |
| | |
| | | import website from '@/config/website' |
| | | import { Base64} from 'js-base64' |
| | | |
| | | const http = new Request() |
| | | const httpGd = new Request() |
| | | |
| | | export function request (config) { |
| | | return new Promise((resolve, reject) => { |
| | | http |
| | | httpGd |
| | | .request(config) |
| | | .then(res => { |
| | | resolve(res) |
| | |
| | | |
| | | |
| | | // 请求拦截器 |
| | | function requestInterceptors(http) { |
| | | function requestInterceptors(httpGd) { |
| | | |
| | | http.interceptors.request.use((config) => { |
| | | httpGd.interceptors.request.use((config) => { |
| | | const {detail} = useUserStore().$state?.userInfo || {} |
| | | // 假设有token值需要在头部需要携带 |
| | | let accessToken = useUserStore()?.$state?.userInfo?.gd_access_token; |
| | | // let accessToken = useUserStore()?.$state?.userInfo?.gd_access_token; |
| | | let accessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRfaWQiOiIwMDAwMDAiLCJ1c2VyX25hbWUiOiJ5ankiLCJyZWFsX25hbWUiOiJ5ankiLCJhdmF0YXIiOiIiLCJhdXRob3JpdGllcyI6WyJrZmpzIl0sImNsaWVudF9pZCI6InNhYmVyIiwicm9sZV9uYW1lIjoia2ZqcyIsImxpY2Vuc2UiOiJwb3dlcmVkIGJ5IGJsYWRleCIsInBvc3RfaWQiOiIiLCJ1c2VyX2lkIjoiMjAwODc5MzU1MDA1OTkyNTUwNSIsInJvbGVfaWQiOiIyMDA4NzMzNDY5MTg3MzY2OTE0Iiwic2NvcGUiOlsiYWxsIl0sIm5pY2tfbmFtZSI6InlqeSIsIm9hdXRoX2lkIjoiIiwiZGV0YWlsIjp7ImFyZWFDb2RlIjpudWxsLCJhcmVhTmFtZSI6Iuaxn-ilv-ecgSIsImFjdGl2ZUxvYW5zQXJlYUNvZGUiOltdfSwiZXhwIjoxNzY5MDc1MzY1LCJkZXB0X2lkIjoiMTEyMzU5ODgxMzczODY3NTIwMSIsImp0aSI6ImUwMGFhNzIzLTU5YjgtNDNmNy1hZmU2LTNiMjZlNTM5NTUxMiIsImFjY291bnQiOiJ5ankifQ.CJTDqgL2wu2KgrUNncBz34VYPoxUfKXxgScBUUE-BhM' |
| | | if (accessToken) { |
| | | config.header['Blade-Auth'] = 'bearer ' + accessToken; |
| | | } |
| | |
| | | // 安全请求header |
| | | config.header['Blade-Requested-With'] = 'BladeHttpRequest'; |
| | | // 客户端认证参数 |
| | | config.header['Authorization'] = 'Basic ' + Base64.encode(website.clientId + ':' + website.clientSecret); |
| | | // config.header['Authorization'] = 'Basic ' + Base64.encode(website.clientId + ':' + website.clientSecret); |
| | | config.header['Authorization'] = 'Basic ' + 'c2FiZXI6c2FiZXJfc2VjcmV0'; |
| | | return config |
| | | }, config => { // 可使用async await 做异步操作 |
| | | return Promise.reject(config) |
| | | }) |
| | | } |
| | | |
| | | function responseInterceptors(http) { |
| | | http.interceptors.response.use((response) => { |
| | | function responseInterceptors(httpGd) { |
| | | httpGd.interceptors.response.use((response) => { |
| | | let res = response |
| | | const status = res.data.error_code || res.data.code || res.statusCode |
| | | const message = res?.data?.msg || res?.data?.error_description || res?.data?.message || '系统错误' |
| | |
| | | |
| | | // 引入拦截器配置 |
| | | export function setupRequest () { |
| | | http.setConfig(defaultConfig => { |
| | | httpGd.setConfig(defaultConfig => { |
| | | |
| | | /* defaultConfig 为默认全局配置 */ |
| | | defaultConfig.baseURL = getEnvObj().VITE_API_BASE_URL_GD |
| | | // #ifdef H5 |
| | |
| | | // #endif |
| | | return defaultConfig |
| | | }) |
| | | requestInterceptors(http) |
| | | responseInterceptors(http) |
| | | requestInterceptors(httpGd) |
| | | responseInterceptors(httpGd) |
| | | } |
| | | |
| | | |
| | |
| | | <view class="name">{{ item.name }}</view> |
| | | <view class="txt">飞行器类型:{{ item.type }}</view> |
| | | <view class="txt">飞行器型号:{{ item.model }}</view> |
| | | <view class="txt">飞行器sn:{{ item.sn }}</view> |
| | | <view class="txt">飞行器sn:{{ item.sn }}</view> |
| | | </view> |
| | | </view> |
| | | </u-list> |
| | |
| | | } |
| | | .card { |
| | | display: flex; |
| | | padding: 20rpx; |
| | | padding: 44rpx; |
| | | border-bottom: 1px solid #EBEEF3; |
| | | .left { |
| | | width: 70px; |
| | |
| | | flex-direction: column; |
| | | justify-content: space-between; |
| | | .name { |
| | | height: 21px; |
| | | font-weight: 500; |
| | | font-size: 28rpx; |
| | | color: #1D2129; |
| | | margin-bottom: 14rpx; |
| | | } |
| | | .txt { |
| | | height: 18px; |
| | | font-weight: 400; |
| | | font-size: 24rpx; |
| | | color: #86909C; |
| | | margin-bottom: 14rpx; |
| | | } |
| | | } |
| | | } |
| | | // 第一个card 不添加下边框 |
| | | .card:first-child { |
| | | padding-top: 0; |
| | | } |
| | | .add-btn { |
| | | position: absolute; |
| | | bottom: 40rpx; |
| | |
| | | :keyName="'image'" |
| | | :height="200" |
| | | :indicator="true" |
| | | mode="round" |
| | | indicatorMode="dot" |
| | | indicatorActiveColor="#4C85FF" |
| | | indicatorInactiveColor="#fff" |
| | | indicatorPosition="center" |
| | | ></u-swiper> |
| | | <u-grid :col="4" :border="false" class="grid" @click="gridClick"> |
| | | <u-grid-item v-for="(baseListItem,baseListIndex) in baseList" :key="baseListIndex"> |
| | |
| | | overflow-y: auto; |
| | | box-sizing: border-box; |
| | | .title { |
| | | padding: 40rpx 40rpx 0rpx 20rpx; |
| | | padding: 40rpx 40rpx 0rpx 0rpx; |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 500; |
| | | font-size: 14px; |
| | | font-size: 16px; |
| | | color: #222324; |
| | | } |
| | | } |
| | |
| | | align-items: center; |
| | | position: relative; |
| | | .pageBg { |
| | | // position: fixed; |
| | | // top: 0; |
| | | // left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/user-bg.png") no-repeat ; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png") no-repeat ; |
| | | background-size: 100%; |
| | | } |
| | | .detailBox { |
| | | position: absolute; |
| | | top: 180rpx; |
| | | top: 30rpx; |
| | | width: 702rpx; |
| | | |
| | | min-height: 326rpx; |
| | |
| | | height: 100%; |
| | | } |
| | | .pageUser { |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/user-bg.png") no-repeat ; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png") no-repeat ; |
| | | background-size: 100%; |
| | | } |
| | | .userBox { |
| | | padding-top: 212rpx; |
| | | padding-top: 90rpx; |
| | | } |
| | | .userName { |
| | | font-weight: 700; |
| | |
| | | } |
| | | .goOutStyle { |
| | | width: 670rpx; |
| | | height: 100rpx; |
| | | height: 76rpx; |
| | | background: #1D6FE9; |
| | | border-radius: 8rpx 8rpx 8rpx 8rpx; |
| | | font-family: "Source Han Sans CN"; |
| | | font-weight: 400; |
| | | font-size: 36rpx; |
| | | font-size: 28rpx; |
| | | color: #ffffff; |
| | | text-align: center; |
| | | line-height: 100rpx; |
| | | line-height: 76rpx; |
| | | margin: auto; |
| | | margin-top: 114rpx; |
| | | |
| | |
| | | <u-input |
| | | v-model="formParams.deviceImageText" |
| | | border="none" |
| | | placeholder="请输入" |
| | | placeholder="请上传" |
| | | ></u-input> |
| | | <template #right> |
| | | <u-upload |
| | |
| | | /> |
| | | <!-- 所属区域 --> |
| | | <u-cascader |
| | | :show="isShowRegion" |
| | | v-model:show="isShowRegion" |
| | | v-model="formParams.regionCode" |
| | | :data="areaData" |
| | | value-key="code" |
| | |
| | | :auto-close="true" |
| | | @confirm="onRegionConfirm" |
| | | @close="isShowRegion = false" |
| | | @cancel="isShowRegion = false" |
| | | ></u-cascader> |
| | | </u-form> |
| | | <u-button :disabled="isSubmitDisabled" @click="submitForm" color="#1D6FE9">提交</u-button> |
| | |
| | | color: #1D6FE9; |
| | | } |
| | | |
| | | :deep(.u-tabs__wrapper__nav__line) { |
| | | background-color: #265CFD; |
| | | } |
| | | |
| | | :deep(.u-button--primary) { |
| | | background-color: #265CFD; |
| | | } |
| | | |
| | | :deep(.u-form) { |
| | | flex: 1; |
| | | display: flex; |
| | |
| | | <template> |
| | | <view class="flightApplication-add"> |
| | | <view class="title"> |
| | | 基本信息 |
| | | </view> |
| | | |
| | | <u-form labelPosition="top" :model="formParams" :rules="rules" ref="formRef"> |
| | | <view class="title form-title">基本信息</view> |
| | | <u-form-item |
| | | label="飞行计划" |
| | | labelWidth="200rpx" |
| | |
| | | :borderBottom="true" |
| | | ref="item1" |
| | | > |
| | | <u-input v-model="formParams.tempAirspaceApprovalText" border="none" readonly placeholder="(建议文件大小100M内,仅支持pdf、jpg、jpeg、png等格式)"></u-input> |
| | | <template #label> |
| | | <view class="custom-label"> |
| | | <text>临时空域批件</text> |
| | | <text class="label-tip">(建议文件大小100M内,仅支持pdf、jpg、jpeg、png等格式)</text> |
| | | </view> |
| | | </template> |
| | | <u-input v-model="formParams.tempAirspaceApprovalText" border="none" readonly placeholder="请选择"></u-input> |
| | | <template #right> |
| | | <u-upload |
| | | @afterRead="afterRead" |
| | |
| | | width: 80%; |
| | | padding: 28rpx; |
| | | border-radius: 8rpx 8rpx 8rpx 8rpx; |
| | | margin-bottom: 20rpx; |
| | | // margin-bottom: 20rpx; |
| | | } |
| | | .label-tip { |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 10px; |
| | | color: #3A3A3A; |
| | | } |
| | | .attention { |
| | | font-family: Source Han Sans CN, Source Han Sans CN; |
| | | font-weight: 400; |
| | | font-size: 12px; |
| | | color: #1D6FE9; |
| | | // margin-top: 24rpx; |
| | | margin: 40rpx 0; |
| | | text-align: center; |
| | | } |
| | | .select-wrapper { |
| | |
| | | position: relative; |
| | | } |
| | | .pageBg { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/user-bg.png") no-repeat ; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png") no-repeat ; |
| | | background-size: 100%; |
| | | z-index: -1; |
| | | } |
| | | .avatarBox { |
| | | position: absolute; |
| | | top: 30rpx; |
| | | width: 228rpx; |
| | | height: 228rpx; |
| | | margin: 76rpx 0; |
| | | } |
| | | |
| | | .detailBox { |
| | | position: absolute; |
| | | top: 360rpx; |
| | | // left: 0; |
| | | top: 280rpx; |
| | | width: 702rpx; |
| | | min-height: 430rpx; |
| | | background: #FFFFFF; |
| | |
| | | // left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/user-bg.png") no-repeat ; |
| | | background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png") no-repeat ; |
| | | background-size: 100%; |
| | | } |
| | | |
| | | .detailBox { |
| | | position: absolute; |
| | | top: 180rpx; |
| | | top: 30rpx; |
| | | width: 702rpx; |
| | | |
| | | min-height: 326rpx; |