吉安感知网项目-前端
shuishen
2026-01-23 f94c7fed05b0cbe365a7ef77736dd058c1f714ef
Merge branch 'master' of http://139.196.74.78:10010/r/jagzwxm/ja_web
26 files modified
2 files added
1481 ■■■■■ changed files
applications/task-work-order/env/.env 3 ●●●●● patch | view | raw | blame | history
applications/task-work-order/env/.env.development 8 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/App.vue 14 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/api/zkxt/index.js 9 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/axios.js 446 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/axiosXT.js 73 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue 13 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue 23 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 137 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue 12 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue 6 ●●●●● patch | view | raw | blame | history
applications/task-work-order/vite.config.mjs 10 ●●●● patch | view | raw | blame | history
uniapps/work-app/env/.env 2 ●●● patch | view | raw | blame | history
uniapps/work-app/src/api/work/index1.js 33 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/config/env.js 4 ●●● patch | view | raw | blame | history
uniapps/work-app/src/pages/work/index.vue 495 ●●●●● patch | view | raw | blame | history
uniapps/work-app/src/plugins/index.js 3 ●●●●● patch | view | raw | blame | history
uniapps/work-app/src/subPackages/workDetail/index.vue 75 ●●●● patch | view | raw | blame | history
uniapps/work-app/src/utils/requestGd/index.js 25 ●●●●● patch | view | raw | blame | history
uniapps/work-wx/src/pages/equipmentManagement/index.vue 12 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/pages/page/index.vue 9 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/pages/register/index.vue 7 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/pages/user/index.vue 10 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/static/images/user/user-bg.png patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/deviceRegistration/add.vue 13 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/flightApplication/add.vue 23 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/userDetail/infos/index.vue 12 ●●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/userDetail/password/index.vue 4 ●●●● patch | view | raw | blame | history
applications/task-work-order/env/.env
@@ -1,6 +1,9 @@
#接口地址
VITE_APP_API=/api
#接口地址-xt
VITE_APP_API_XT=/apiXT
#页面基础路径
VITE_APP_BASE=/task-work-order
applications/task-work-order/env/.env.development
@@ -4,10 +4,10 @@
 # @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'
#开发环境配置
@@ -17,6 +17,8 @@
# 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/'
applications/task-work-order/src/App.vue
@@ -2,9 +2,19 @@
  <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>
applications/task-work-order/src/api/zkxt/index.js
New file
@@ -0,0 +1,9 @@
import request from '@/axiosXT'
export const loginWithMiniProgramApi = (data) => {
    return request({
        url: `/auth/loginWithMiniProgram`,
        method: 'post',
        data,
    })
}
applications/task-work-order/src/axios.js
@@ -6,240 +6,224 @@
 * 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
applications/task-work-order/src/axiosXT.js
New file
@@ -0,0 +1,73 @@
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
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -256,19 +256,26 @@
// 获取工单列表
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 ?? []
}
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -1,5 +1,9 @@
<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
@@ -68,9 +72,7 @@
        </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">
@@ -159,7 +161,7 @@
    deviceLoadDemand: [], // 设备负载需求
    taskStatus: [], // 巡查任务状态
})
const activeName = ref('all')
provide('dictObj', dictObj)
provide('requester', requester)
@@ -168,7 +170,12 @@
    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 {
@@ -176,6 +183,12 @@
    }
}
function tabsClick(tab, event) {
    activeName.value = tab.props.name
    resetForm()
    handleSearch()
}
// 查询
function handleSearch() {
    searchParams.value.current = 1
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -179,48 +179,35 @@
        </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>
@@ -286,11 +273,27 @@
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结算完成_已结算
@@ -302,9 +305,13 @@
    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')
    })
@@ -326,24 +333,24 @@
}
// 填写说明
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,
    })
}
@@ -365,6 +372,7 @@
function loadDemandChange() {
    formData.value.recommendDeviceIds = ''
    selectedDevices.value = []
    getDeviceList()
    syncSelection()
}
@@ -380,8 +388,10 @@
    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 {
@@ -436,6 +446,8 @@
        const val = cartesian3Convert(item, viewer)
        return { ...val, lng: val.longitude, lat: val.latitude }
    })
    formData.value.recommendDeviceIds = ''
    selectedDevices.value = []
    await getDeviceList()
    syncSelection()
}
@@ -502,10 +514,11 @@
}
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: {
@@ -554,16 +567,19 @@
.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;
@@ -571,6 +587,7 @@
            color: #272e37;
        }
    }
    .processBox {
        width: 312px;
    }
applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue
@@ -100,11 +100,19 @@
}
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 })
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -107,8 +107,8 @@
                            {{ 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 }">
@@ -229,8 +229,6 @@
        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完成待验_待全部验收、
@@ -238,7 +236,7 @@
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 })
    })
}
applications/task-work-order/vite.config.mjs
@@ -6,7 +6,7 @@
// 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'
@@ -41,11 +41,17 @@
      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'],
uniapps/work-app/env/.env
@@ -12,7 +12,7 @@
# API代理前缀
VITE_API_PREFIX=/api
VITE_API_PREFIX_GD=/api-gd
VITE_API_PREFIX_GD=/droneWork
# 删除console
VITE_DROP_CONSOLE=false
uniapps/work-app/src/api/work/index1.js
@@ -1,14 +1,7 @@
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({
@@ -31,3 +24,27 @@
        },
    })
}
// 获取工单列表
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,
  })
}
uniapps/work-app/src/config/env.js
@@ -15,7 +15,7 @@
  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',
@@ -27,6 +27,7 @@
  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'
@@ -36,6 +37,7 @@
  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'
uniapps/work-app/src/pages/work/index.vue
@@ -8,14 +8,14 @@
      <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>
@@ -35,410 +35,12 @@
<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)
@@ -447,7 +49,7 @@
    name: '全部工单',
    key: 'all',
    badge: {
      value: 2
      value: 0
    },
    status: null
  },
@@ -455,7 +57,7 @@
    name: '我的工单',
    key: 'myTickets',
    badge: {
      value: 1
      value: 0
    }
  }
@@ -480,29 +82,25 @@
  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
  })
@@ -510,24 +108,24 @@
// 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
@@ -545,15 +143,16 @@
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>
uniapps/work-app/src/plugins/index.js
@@ -1,6 +1,7 @@
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"
@@ -16,5 +17,7 @@
    setupPermission()
    // 网络请求
    setupRequest()
    // 工单网络请求
    setupRequestGd()
  }
}
uniapps/work-app/src/subPackages/workDetail/index.vue
@@ -61,36 +61,36 @@
        <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>
@@ -108,63 +108,28 @@
<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)
}
// 图片预览
@@ -179,8 +144,8 @@
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) {
uniapps/work-app/src/utils/requestGd/index.js
@@ -5,11 +5,11 @@
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)
@@ -22,12 +22,13 @@
// 请求拦截器
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;
    }
@@ -37,15 +38,16 @@
    // 安全请求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 || '系统错误'
@@ -72,7 +74,8 @@
// 引入拦截器配置
export function setupRequest () {
  http.setConfig(defaultConfig => {
  httpGd.setConfig(defaultConfig => {
    /* defaultConfig 为默认全局配置 */
    defaultConfig.baseURL = getEnvObj().VITE_API_BASE_URL_GD
    // #ifdef H5
@@ -82,8 +85,8 @@
    // #endif
    return defaultConfig
  })
  requestInterceptors(http)
  responseInterceptors(http)
  requestInterceptors(httpGd)
  responseInterceptors(httpGd)
}
uniapps/work-wx/src/pages/equipmentManagement/index.vue
@@ -12,7 +12,7 @@
            <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>
@@ -123,7 +123,7 @@
  }
  .card {
    display: flex;
    padding: 20rpx;
    padding: 44rpx;
    border-bottom: 1px solid #EBEEF3;
    .left {
      width: 70px;
@@ -135,17 +135,25 @@
      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;
uniapps/work-wx/src/pages/page/index.vue
@@ -5,6 +5,11 @@
            :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">
@@ -261,10 +266,10 @@
    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;
    }
  }
uniapps/work-wx/src/pages/register/index.vue
@@ -244,17 +244,14 @@
    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;
uniapps/work-wx/src/pages/user/index.vue
@@ -97,11 +97,11 @@
  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;
@@ -161,15 +161,15 @@
}
.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;
uniapps/work-wx/src/static/images/user/user-bg.png

uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
@@ -194,7 +194,7 @@
            <u-input
                    v-model="formParams.deviceImageText"
                    border="none"
                    placeholder="请输入"
                    placeholder="请上传"
            ></u-input>
            <template #right>
                <u-upload
@@ -261,7 +261,7 @@
        />
        <!-- 所属区域 -->
        <u-cascader 
            :show="isShowRegion"
            v-model:show="isShowRegion"
            v-model="formParams.regionCode"
            :data="areaData"
            value-key="code"
@@ -270,7 +270,6 @@
            :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>
@@ -634,6 +633,14 @@
        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;
uniapps/work-wx/src/subPackages/flightApplication/add.vue
@@ -1,9 +1,8 @@
<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"
@@ -172,7 +171,13 @@
                :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"
@@ -780,14 +785,20 @@
        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 {
uniapps/work-wx/src/subPackages/userDetail/infos/index.vue
@@ -251,25 +251,21 @@
        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;
uniapps/work-wx/src/subPackages/userDetail/password/index.vue
@@ -259,13 +259,13 @@
            // 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;