吉安感知网项目-前端
罗广辉
2026-04-23 0a0536e37d43958cc238d5fc7086862305f97746
Merge remote-tracking branch 'origin/master'
12 files modified
1 files added
364 ■■■■■ changed files
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue 12 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue 16 ●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js 36 ●●●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/orderManage/outcomeData.vue 270 ●●●●● patch | view | raw | blame | history
uniapps/work-wx/build/config/proxy.js 11 ●●●●● patch | view | raw | blame | history
uniapps/work-wx/src/pages/register/index.vue 3 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/pages/user/index.vue 3 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/deviceRegistration/add.vue 2 ●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/deviceRegistration/details.vue 2 ●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/flightApplication/index.vue 2 ●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/userDetail/infos/index.vue 3 ●●●● patch | view | raw | blame | history
uniapps/work-wx/src/subPackages/userDetail/password/index.vue 2 ●●● patch | view | raw | blame | history
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -172,7 +172,13 @@
                                        :key="item.id"
                                        :label="item.flyerName"
                                        :value="item.flyerName"
                                    />
                                    >
                                        <template #default>
                                        <!-- 匹配区域=1 显示红星号 -->
                                        <span v-if="item.areaMatchFlag === 1" style="color: #f56c6c; margin-right: 4px;">*</span>
                                        <span>{{ item.flyerName }}</span>
                                        </template>
                                    </el-option>
                                </el-select>
                            </template>
                        </el-table-column>
@@ -386,8 +392,8 @@
        size: 999,
        current: 1,
        skilledTaskType,
        longitude: obj.longitude || '',
        latitude: obj.latitude || '',
        // longitude: obj.longitude || '',
        // latitude: obj.latitude || '',
    })
    flyerListMap.value[index] = res?.data?.data?.records ?? []
}
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -51,6 +51,7 @@
                    <!--                    <el-table-column type="selection" width="46" />-->
                    <el-table-column type="index" width="64" label="序号" />
                    <el-table-column prop="patrolTaskName" show-overflow-tooltip label="巡查任务名称" />
                    <el-table-column prop="workOrderName" show-overflow-tooltip label="关联工单" />
                    <el-table-column prop="taskNo" show-overflow-tooltip label="巡查任务编号" />
                    <el-table-column prop="patrolTaskType" show-overflow-tooltip label="巡查任务类型">
                        <template v-slot="{ row }">
@@ -65,7 +66,6 @@
                        </template>
                    </el-table-column>
                    <el-table-column prop="executeTime" show-overflow-tooltip label="任务执行时间" />
                    <el-table-column prop="workOrderName" show-overflow-tooltip label="关联工单" />
                    <el-table-column prop="createTime" show-overflow-tooltip label="巡查任务创建时间" />
                    <el-table-column prop="taskDesc" show-overflow-tooltip label="巡查任务描述" />
                    <el-table-column label="操作" class-name="operation-btns">
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -8,7 +8,13 @@
        destroy-on-close
        :close-on-click-modal="false"
    >
        <div class="content" style="display: flex">
    <el-tabs class="gd-tabs"  v-model="activeName" @tab-click="tabsClick" v-if="dialogReadonly && formData.workOrderStatus >= '30'">
            <el-tab-pane label="基础信息" name="basic"></el-tab-pane>
            <el-tab-pane label="成果数据" name="result">
                <OutcomeData :workOrderId="formData.id" />
            </el-tab-pane>
            </el-tabs>
        <div class="content" style="display: flex" v-if="activeName === 'basic'">
            <div class="processBox" v-if="dialogMode !== 'add'">
                <div class="detail-title">工单记录</div>
                <div class="process">
@@ -189,7 +195,7 @@
            </div>
        </div>
        <template #footer>
        <template #footer v-if="activeName === 'basic'">
            <el-button v-if="['11', '21', '23', '31', '60'].includes(gdStatus)" @click="viewDescription" color="#F2F3F5">
                {{ gdStatusObj[gdStatus]?.reason }}
            </el-button>
@@ -274,13 +280,15 @@
import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue'
import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue'
import { gdPatrolTaskPageApi } from '@/views/orderView/orderManage/inspectionRequest/inspectionRequestApi'
import { Check } from '@element-plus/icons-vue'
import { Check, Search, RefreshRight } from '@element-plus/icons-vue'
import droneIcon from '@/assets/images/orderView/orderManage/drone.png'
import droneActiveIcon from '@/assets/images/orderView/orderManage/droneActive.png'
import { useStore } from 'vuex'
import OrderStepBar from '@/views/orderView/orderManage/orderManage/OrderStepBar.vue'
import OutcomeData from './outcomeData.vue'
const store = useStore()
const permission = computed(() => store.state.user.permission)
const activeName = ref('basic')
// 初始化表单数据
const initForm = () => ({
@@ -699,7 +707,7 @@
.content {
    display: flex;
    gap: 0 20px;
    height: 680px;
    height: 630px;
    .leftBox {
        width: 0;
applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
@@ -65,3 +65,39 @@
        params:{ descs: 'create_time', ...params },
    })
}
// 成果数据分页
export function gdTaskResultPageApi(data) {
    return request({
        url: `/drone-gd/workOrder/gdTaskResult/page`,
        method: 'get',
        params: data
    })
}
// 批量下载成果文件
export function gdTaskResultDownloadApi(params) {
    return request({
        url: `/drone-gd/workOrder/gdTaskResult/download`,
        method: 'get',
        params,
        responseType: 'blob'
    })
}
// 逻辑删除成果数据
export function gdTaskResultRemoveApi(params) {
    return request({
        url: `/drone-gd/workOrder/gdTaskResult/remove`,
        method: 'post',
        params
    })
}
// 根据工单ID查询巡查任务列表
export function listByWorkOrderId(params) {
    return request({
        url: `/drone-gd/workOrder/gdPatrolTask/listByWorkOrderId`,
        method: 'get',
        params
    })
}
applications/task-work-order/src/views/orderView/orderManage/orderManage/outcomeData.vue
New file
@@ -0,0 +1,270 @@
<template>
  <div class="outcome-container">
    <el-form ref="searchRef" :model="searchParams" class="gd-search-form">
      <el-form-item label="巡查任务名称" prop="patrolTaskIds">
        <el-select
          class="gd-select"
              popper-class="gd-select-popper"
          collapse-tags
          collapse-tags-tooltip
          v-model="searchParams.patrolTaskIds"
          placeholder="请选择"
          clearable
          multiple
          @change="handleSearch"
        >
          <el-option
            v-for="item in patrolTaskList"
            :key="item.id"
            :label="item.patrolTaskName"
            :value="item.id"
          />
        </el-select>
      </el-form-item>
      <el-form-item >
        <el-button :icon="RefreshRight" @click="resetForm"></el-button>
        <el-button :icon="Search" color="#383874" @click="handleSearch"></el-button>
        <el-button :icon="Download" color="#4C34FF" :loading="exportLoading" :disabled="exportLoading" @click="handleBatchDownload">下载</el-button>
      </el-form-item>
    </el-form>
    <div class="gd-table-container" v-loading="loading">
      <div class="gd-table-content gd-table-content-bg">
        <el-table class="gd-table" :data="list" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="46" />
          <el-table-column type="index" label="序号" width="80" />
          <el-table-column label="图片" >
            <template v-slot="{ row }">
              <el-image
                v-if="row.resultUrl"
                :src="row.resultUrl"
                :preview-src-list="[row.resultUrl]"
                fit="cover"
                style="width: 80px; height: 80px; border-radius: 4px;"
                                preview-teleported
              />
              <span v-else>-</span>
            </template>
          </el-table-column>
          <el-table-column prop="patrolTaskName" show-overflow-tooltip label="巡查任务名称" />
          <el-table-column prop="shootTime" show-overflow-tooltip label="拍摄时间" />
          <el-table-column label="操作" class-name="operation-btns" width="120">
            <template v-slot="{ row }">
              <!-- <el-link type="primary" @click="handleDownload(row)">下载</el-link> -->
              <el-link type="primary" @click="handleDelete(row)">删除</el-link>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <div class="gd-pagination-parent">
        <el-pagination
          popper-class="gd-select-popper"
          v-model:current-page="searchParams.current"
          v-model:page-size="searchParams.size"
          layout="total, prev, pager, next, sizes"
          :total="total"
          @change="getList"
        />
      </div>
    </div>
  </div>
</template>
<script setup>
import {gdTaskResultPageApi, gdTaskResultDownloadApi, gdTaskResultRemoveApi,listByWorkOrderId}from './orderManageApi'
import { Search, RefreshRight, Download } from '@element-plus/icons-vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getDictLabel } from '@ztzf/utils'
import dayjs from 'dayjs'
const props = defineProps({
  workOrderId: {
    type: String,
    required: true
  }
})
const emit = defineEmits(['success'])
// 初始化查询参数
const initSearchParams = () => ({
  current: 1,
  size: 10,
  patrolTaskIds: []
})
const searchParams = ref(initSearchParams())
const total = ref(0)
const loading = ref(true)
const list = ref([])
const searchRef = ref(null)
const selectedRows = ref([])
const patrolTaskList = ref([])
const dictObj = inject('dictObj')
// 导出加载状态
const exportLoading = ref(false)
// 获取巡查任务列表
async function getPatrolTaskList() {
  try {
    const res = await listByWorkOrderId({ workOrderId: props.workOrderId })
    patrolTaskList.value = res?.data?.data || []
  } catch (error) {
    console.error('获取巡查任务列表失败:', error)
  }
}
// 获取成果数据列表
async function getList() {
  loading.value = true
  try {
    const res = await gdTaskResultPageApi({
      ...searchParams.value,
      workOrderId: props.workOrderId,
      patrolTaskIds: searchParams.value.patrolTaskIds.length
        ? searchParams.value.patrolTaskIds.join(',')
        : ''
    })
    list.value = res?.data?.data?.records || []
    total.value = res?.data?.data?.total || 0
  } finally {
    loading.value = false
  }
}
// 搜索
function handleSearch() {
  searchParams.value.current = 1
  getList()
}
// 重置搜索
function resetForm() {
    searchRef.value?.resetFields()
    searchParams.value = { ...initSearchParams() }
    selectedRows.value = []
    getList()
}
// 选择变化
function handleSelectionChange(rows) {
  selectedRows.value = rows
}
// 下载
async function handleDownload(row) {
  if (!row.id) {
    ElMessage.warning('暂无数据可下载')
    return
  }
    exportLoading.value = true
  try {
    const res = await gdTaskResultDownloadApi({ ids: row.id })
    const blob = res.data
    const url = URL.createObjectURL(blob)
    const a = document.createElement('a')
    a.href = url
    a.download = `成果数据_${row.patrolTaskName}_${dayjs().format('YYYYMMDDHHmmss')}`
    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
    URL.revokeObjectURL(url)
    ElMessage.success('下载成功')
  } catch (error) {
    console.error('下载失败:', error)
    ElMessage.error('下载失败')
  }finally {
    exportLoading.value = false
  }
}
// 批量下载
async function handleBatchDownload() {
  if (selectedRows.value.length === 0) {
    ElMessage.warning('请选择要下载的数据')
    return
  }
  const ids = selectedRows.value.map(row => row.id).join(',')
  exportLoading.value = true
  try {
    const res = await gdTaskResultDownloadApi({ ids })
    const blob = res.data
    const url = URL.createObjectURL(blob)
    const a = document.createElement('a')
    a.href = url
    a.download = `成果数据_${dayjs().format('YYYYMMDDHHmmss')}`
    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
    URL.revokeObjectURL(url)
    ElMessage.success('下载完成')
  } catch (error) {
    console.error('下载失败:', error)
    ElMessage.error('下载失败')
  } finally {
    exportLoading.value = false
  }
}
// 删除
async function handleDelete(row) {
  await ElMessageBox.confirm('确认删除该条记录吗?', '提示', {
    type: 'warning',
    customClass: 'gd-confirm-custom',
    confirmButtonClass: 'gd-confirm-button',
    cancelButtonClass: 'gd-confirm-cancel-button',
  })
  try {
    const res = await gdTaskResultRemoveApi({ ids: row.id })
    if (res?.data?.success) {
      ElMessage.success('删除成功')
      getList()
    } else {
      ElMessage.error('删除失败')
    }
  } catch (error) {
    ElMessage.error('删除失败')
  }
}
// 监听 workOrderId 变化
watch(
    () => props.workOrderId,
    (newWorkOrderId) => {
        if (newWorkOrderId) {
            resetForm()
            getList()
            getPatrolTaskList()
        }
    },
    { immediate: true }
)
onMounted(() => {
})
</script>
<style scoped lang="scss">
.outcome-container {
  height: 680px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  .gd-table-container {
    flex: 1;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    .gd-table-content {
      flex: 1;
      overflow: auto;
    }
  }
}
</style>
uniapps/work-wx/build/config/proxy.js
@@ -20,6 +20,17 @@
      changeOrigin: true,
      rewrite: path => path.replace(new RegExp(`^${VITE_API_PREFIX}`), ''),
    },
    '/work-wx-static': {
      target: 'http://220.177.172.27:8100/',  // 替换为实际地址
      changeOrigin: true,
      secure: false,
      // 如果需要查看代理日志,添加以下配置
      configure: (proxy, options) => {
        proxy.on('proxyReq', (proxyReq, req, res) => {
          console.log('代理请求:', req.method, req.url, '->', proxyReq.path);
        });
      }
    }
  }
  return proxy
}
uniapps/work-wx/src/pages/register/index.vue
@@ -246,7 +246,8 @@
    .pageBg {
        width: 100%;
        height: 100%;
        background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
        //background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
        background: url("/work-wx-static/images/user/userBg1.png")  no-repeat ;
        background-size: 100%;
    }
    .detailBox {
uniapps/work-wx/src/pages/user/index.vue
@@ -97,7 +97,8 @@
  height: 100%;
}
.pageUser {
  background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
  //background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
  background: url("/work-wx-static/images/user/userBg1.png")  no-repeat ;
  background-size: 100%;
}
.userBox {
uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
@@ -662,7 +662,7 @@
    // const text = await response.text()
    // areaData.value = JSON.parse(text)
    const response = await uni.request({
        url: 'https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/xzqh/index.json',
        url: `/work-wx-static/xzqh/index.json`,
        method: 'GET',
        timeout: 10000, // 10秒超时
        dataType: 'json'
uniapps/work-wx/src/subPackages/deviceRegistration/details.vue
@@ -339,7 +339,7 @@
    // const { xzqhData } = await import('@/static/xzqh/index')
    // areaData.value = xzqhData
    const response = await uni.request({
        url: 'https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/xzqh/index.json',
        url: `/work-wx-static/xzqh/index.json`,
        method: 'GET',
        timeout: 10000, // 10秒超时
        dataType: 'json'
uniapps/work-wx/src/subPackages/flightApplication/index.vue
@@ -198,7 +198,7 @@
    overflow-y: hidden;
    .header-top {
        height: 480rpx;
        background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/fxsq-bg.png")  no-repeat ;
        background: url("/work-wx-static/images/fxsq-bg.png")  no-repeat ;
          background-size: 100%;
        position: relative;
        .ht-content {
uniapps/work-wx/src/subPackages/userDetail/infos/index.vue
@@ -254,7 +254,8 @@
    .pageBg {
        width: 100%;
        height: 100%;
        background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
        //background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
        background: url("/work-wx-static/images/user/userBg1.png")  no-repeat ;
          background-size: 100%;
    }
    .avatarBox {
uniapps/work-wx/src/subPackages/userDetail/password/index.vue
@@ -260,7 +260,7 @@
            // left: 0;
            width: 100%;
            height: 100%;
            background: url("https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/images/user/userBg1.png")  no-repeat ;
            background: url("/work-wx-static/images/user/userBg1.png")  no-repeat ;
              background-size: 100%;
        }