You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/drawer-htmlroot/components/WellGroupDataHandle.vue

145 lines
4.5 KiB
Vue

1 month ago
<!--
description: 井组数据导出组件
author: RYG
date: 2025年6月25日11:31:29
-->
<template>
1 month ago
<el-dialog v-model="visible" title="井组数据" style="width: 1180px; height: 600px; z-index: 1000"
header-cell-class-name="custom-header" @close="handleClose" :close-on-click-modal="false">
<el-table :data="tableData" style="width: 100%; height: 480px; border: 1px solid #dcdfe6">
1 month ago
<el-table-column prop="井号" label="井号" width="60" />
<el-table-column prop="入靶点" label="入靶点" width="80" />
<el-table-column prop="入靶点X" label="入靶点X" width="140" />
<el-table-column prop="入靶点Y" label="入靶点Y" width="140" />
<el-table-column prop="出靶点" label="出靶点" width="80" />
<el-table-column prop="出靶点X" label="出靶点X" width="140" />
<el-table-column prop="出靶点Y" label="出靶点Y" width="140" />
<el-table-column prop="靶前位移" label="靶前位移" width="100" />
<el-table-column prop="垂直靶前距" label="垂直靶前距" width="100" />
<el-table-column prop="井支长度" label="井支长度" width="80" />
<el-table-column prop="井支角度" label="井支角度" width="80" />
</el-table>
<!-- <el-divider /> -->
<div style="float: right; margin-top: 10px">
1 month ago
<el-button type="primary" @click="handleExportData" style="width: 80px">导出</el-button>
1 month ago
</div>
1 month ago
<LoadingDialog v-model="loading" ref="loadingRef" :timeout="3000" message="正在加载井组数据……" @timeout="onTimeout" />
1 month ago
</el-dialog>
</template>
<script setup>
import { ref, watch, onMounted } from "vue";
1 month ago
import { useWebSocket } from '@/composables/useWebSocket'
const { messages, onMessage, send } = useWebSocket();
const { exportToCSV } = useCSVExport();
const { $toastMessage } = useNuxtApp();
import { STORAGE_KEYS } from "~/utils/storageKeys"
import { COMMAND } from '~/utils/commandTypes'
// 当前页图件token的 key
const currentTokenKey = STORAGE_KEYS.WELL_RECOMMAND_TOKEN;
const loading = ref(false);
const loadingRef = ref(null);
1 month ago
const props = defineProps({
showDialog: {
type: Boolean,
required: true,
default: false,
},
});
const tableData = ref([]);
const emit = defineEmits(["update:showDialog"]);
const visible = ref(props.showDialog);
// 监听父组件传递的 showDialog 变化
watch(
() => props.showDialog,
(newVal) => {
visible.value = newVal;
}
);
// 监听visible的变化并通知父组件
watch(visible, (val) => {
emit("update:showDialog", val);
if (val) {
1 month ago
loading.value = true;
1 month ago
sendCommand(); // 当对话框打开时发送命令
}
});
const sendCommand = () => {
1 month ago
let drawerToken = localStorage.getItem(currentTokenKey);
1 month ago
if (!drawerToken) {
return;
}
1 month ago
send(COMMAND.GET_WELL_GROUP_DATA, "", drawerToken);
1 month ago
};
1 month ago
const onTimeout = () => {
$toastMessage.error("获取井组数据超时,请稍后重试!");
}
1 month ago
1 month ago
const unsubscribe = onMessage((data) => {
1 month ago
try {
1 month ago
if (!data) return; // 如果没有新消息,直接返回
// console.log("WellGroupDataHandle Data", data);
const json = JSON.parse(data);
1 month ago
const evtType = json.type;
switch (evtType) {
1 month ago
case COMMAND.WELL_GROUP_DATA:
1 month ago
let jsonData = parseXMLWithNoAttr(json.data);
tableData.value = jsonData.ROOT.Item;
1 month ago
loadingRef.value.close();
1 month ago
break;
}
} finally {
}
});
const handleClose = () => {
visible.value = false;
emit("update:showDialog", false);
};
const handleExportData = () => {
try {
1 month ago
const csvName = `井组数据_${Date.now()}.csv`;
const columns = [
{ key: "井号", label: "井号" },
{ key: "入靶点", label: "入靶点" },
{ key: "入靶点X", label: "入靶点X" },
{ key: "入靶点Y", label: "入靶点Y" },
{ key: "出靶点", label: "出靶点" },
{ key: "出靶点X", label: "出靶点X" },
{ key: "出靶点Y", label: "出靶点Y" },
{ key: "靶前位移", label: "靶前位移" },
{ key: "垂直靶前距", label: "垂直靶前距" },
{ key: "井支长度", label: "井支长度" },
{ key: "井支角度", label: "井支角度" }
];
exportToCSV(tableData.value, columns, csvName);
1 month ago
} catch (error) {
console.error("导出数据时发生错误:", error);
this.$message.error("导出数据失败" + error.message);
}
};
1 month ago
onUnmounted(() => {
unsubscribe();
});
1 month ago
</script>
<style scoped>
:deep(.custom-header) {
background-color: #f6f5fa;
color: #606266;
font-weight: bold;
}
</style>