From 6b69eb5b2559bb5aa1735be2c5f04d58023692ea Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Tue, 14 Apr 2026 17:29:38 +0800
Subject: [PATCH] feat:成果数据demo

---
 applications/task-work-order/src/views/orderView/orderManage/orderManage/outcomeData.vue   |  232 ++++++++++++++++++++++++++++++++++++++++++++++
 applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue    |   16 ++
 applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js |    9 +
 3 files changed, 253 insertions(+), 4 deletions(-)

diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
index f422371..d790c73 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
+++ b/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">
+			<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;
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js b/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
index b373365..7e180d9 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
@@ -65,3 +65,12 @@
 		params:{ descs: 'create_time', ...params },
 	})
 }
+
+// 成果数据分页
+export function gdTaskResultPageApi(data) {
+	return request({
+		url: `/drone-gd/workOrder/gdTaskResult/page`,
+		method: 'get',
+		params: data
+	})
+}
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/outcomeData.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/outcomeData.vue
new file mode 100644
index 0000000..c8e84b3
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/outcomeData.vue
@@ -0,0 +1,232 @@
+<template>
+  <div class="outcome-container">
+    <el-form ref="searchRef" :model="searchParams" class="gd-search-form">
+      <el-form-item label="巡查任务名称" prop="patrolTaskName">
+        <el-select
+         class="gd-select"
+		popper-class="gd-select-popper"
+          v-model="searchParams.patrolTaskName"
+          placeholder="请选择"
+          clearable
+          filterable
+          @change="handleSearch"
+        >
+          <el-option
+            v-for="item in patrolTaskList"
+            :key="item.id"
+            :label="item.patrolTaskName"
+            :value="item.patrolTaskName"
+          />
+        </el-select>
+      </el-form-item>
+      
+      <el-form-item >
+        <!-- <el-button :icon="RefreshRight" @click="resetForm"></el-button>
+        <el-button class="search-btn" :icon="Search" @click="handleSearch"></el-button> -->
+        <el-button :icon="Download" color="#4C34FF"  @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="图片" width="120">
+            <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;"
+              />
+              <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="150">
+            <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}from './orderManageApi'
+import { Search, RefreshRight, Download } from '@element-plus/icons-vue'
+import { ref, onMounted, inject } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { getDictLabel } from '@ztzf/utils'
+import { gdPatrolTaskPageApi } from '@/views/orderView/orderManage/inspectionRequest/inspectionRequestApi'
+import dayjs from 'dayjs'
+
+const props = defineProps({
+  workOrderId: {
+    type: String,
+    required: true
+  }
+})
+
+const emit = defineEmits(['success'])
+
+// 初始化查询参数
+const initSearchParams = () => ({
+  patrolTaskName: '',
+  current: 1,
+  size: 10,
+})
+
+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')
+
+// 获取巡查任务列表
+async function getPatrolTaskList() {
+  try {
+    const res = await gdTaskResultPageApi({
+      current: 1,
+      size: 1000,
+      id: props.workOrderId
+    })
+    patrolTaskList.value = res?.data?.data?.records || []
+    console.log('patrolTaskList.value', patrolTaskList.value)
+  } catch (error) {
+    console.error('获取巡查任务列表失败:', error)
+  }
+}
+
+// 获取成果数据列表
+async function getList() {
+  loading.value = true
+  try {
+    const res = await gdTaskResultPageApi({
+      ...searchParams.value,
+      id: props.workOrderId
+    })
+    list.value = res?.data?.data?.records || []
+    total.value = res?.data?.data?.total || 0
+		console.log('list.value', list.value)
+  } finally {
+    loading.value = false
+  }
+}
+
+// 搜索
+function handleSearch() {
+  searchParams.value.current = 1
+  getList()
+}
+
+// 重置搜索
+function resetForm() {
+  searchRef.value?.resetFields()
+  searchParams.value.current = 1
+  getList()
+}
+
+// 选择变化
+function handleSelectionChange(rows) {
+  selectedRows.value = rows
+}
+
+// 下载
+function handleDownload(row) {
+  if (!row.resultUrl) {
+    ElMessage.warning('暂无图片可下载')
+    return
+  }
+  const a = document.createElement('a')
+  a.href = row.resultUrl
+  a.download = `成果数据_${row.patrolTaskName}_${dayjs().format('YYYYMMDDHHmmss')}`
+  document.body.appendChild(a)
+  a.click()
+  document.body.removeChild(a)
+  ElMessage.success('下载成功')
+}
+
+// 批量下载
+function handleBatchDownload() {
+  if (selectedRows.value.length === 0) {
+    ElMessage.warning('请选择要下载的数据')
+    return
+  }
+  selectedRows.value.forEach(row => {
+    if (row.resultUrl) {
+      const a = document.createElement('a')
+      a.href = row.resultUrl
+      a.download = `成果数据_${row.patrolTaskName}_${dayjs().format('YYYYMMDDHHmmss')}`
+      document.body.appendChild(a)
+      a.click()
+      document.body.removeChild(a)
+    }
+  })
+  ElMessage.success('批量下载完成')
+}
+
+// 删除
+async function handleDelete(row) {
+  await ElMessageBox.confirm('确认删除该条记录吗?', '提示', {
+    type: 'warning',
+    customClass: 'gd-confirm-custom',
+    confirmButtonClass: 'gd-confirm-button',
+    cancelButtonClass: 'gd-confirm-cancel-button',
+  })
+  try {
+    // 这里需要调用删除接口,暂时模拟成功
+    ElMessage.success('删除成功')
+    getList()
+  } catch (error) {
+    ElMessage.error('删除失败')
+  }
+}
+
+onMounted(() => {
+  getPatrolTaskList()
+  getList()
+})
+</script>
+
+<style scoped lang="scss">
+.outcome-container {
+  height: 679px;
+  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>
\ No newline at end of file

--
Gitblit v1.9.3