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%; }