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.

322 lines
10 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-container class="container">
<el-aside class="data-tree">
<div class="oper">
<el-button type="primary" :icon="Refresh" @click="handleSetDrawParam(true)"></el-button>
<el-button v-show="true" type="danger" style="margin-left: 36px;" :disabled="!isDeleteEnabled"
@click="handleDeleteSelected">删除</el-button>
</div>
<div class="scrollable-container">
<el-table ref="drawResults" :data="resultData" @selection-change="updateSelectedResults" width="280"
row-key="ParamName" @row-click="handleRowClick">
<el-table-column type="selection" :selectable="isSelectable" width="40" fixed></el-table-column>
<el-table-column prop="ParamName" label="名称" width="*" show-overflow-tooltip>
<template #default="scope">
<el-link @click="handleOpenFile(scope.row)">
<div :style="{ padding: '0' }">{{ scope.row.ParamName }}</div>
</el-link>
</template>
</el-table-column>
<el-table-column prop="State" label="状态" width="70">
<template #default="scope">
<span :style="{ color: getStateColor(scope.row.State) }">{{
getStateText(scope.row.State) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="60">
<template #default="scope">
<el-tooltip content="删除" placement="top" :disabled="scope.row.State === 1">
<Delete style="width: 1em;height: 1em;color:red;cursor: pointer;"
@click="handleDelete(scope.row)" />
</el-tooltip>
</template>
</el-table-column>
</el-table>
</div>
</el-aside>
<el-main class="main">
<WellRecommend :tokenKey="currentTokenKey" :showRight="false" />
</el-main>
</el-container>
<DrawParamDialog @changeShowSetParam="handleSetDrawParam" :showSetParam="showParamDialog" v-model="showParamDialog"
class="draw-param-dialog" />
<ProgressTracker ref="progressRef" v-model="progressVisible" title="计算进度" :initialProgress="currentProgress"
message="正在计算……" @complete="onComplete" />
</template>
<script setup>
definePageMeta({
requiresAuth: true
});
import { ref, onMounted, onUnmounted, onBeforeUnmount } from 'vue'
import { Refresh, Delete, View } from "@element-plus/icons-vue";
import { emitter } from "~/utils/eventBus";
import { ElMessageBox } from 'element-plus';
const { $toastMessage } = useNuxtApp();
import { generateGUID } from "~/utils/common";
import { fetchFlatResultData, fetchRefreshResult, deleteFlatResults } from '~/services/drawParamService'
import { STORAGE_KEYS } from "~/utils/storageKeys"
import { EMIT_COMMAND } from '~/utils/commandTypes';
// 当前页图件token的 key
const currentTokenKey = STORAGE_KEYS.DRAW_PARAM_IMG_TOKEN;
const showParamDialog = ref(false);
// 实时刷新结果
const refreshTimer = ref(null);
const resultData = ref([]);
const isDeleteEnabled = ref(false);
const selectedResultRows = ref([]);
const showDeleteDialog = ref(false);
const drawResults = ref(null);
const progressRef = ref(null);
const progressVisible = ref(false);
const currentProgress = ref(0);
const updateSelectedResults = (val) => {
selectedResultRows.value = val;
if (val.length > 0) {
isDeleteEnabled.value = true;
} else {
isDeleteEnabled.value = false;
}
};
// 获取结果
const getResults = async () => {
try {
const response = await fetchFlatResultData();
if (response) {
// resultData.value = response;
resultData.value.splice(0, resultData.value.length, ...response);
}
} catch (error) {
console.error("获取结果数据失败:", error);
// 如果连续多次获取失败,可以考虑停止自动刷新
}
};
// 行点击
const handleRowClick = async (item) => {
if (item.State === 0) {
return;
}
else if (item.State === 1) {
emitter.emit(EMIT_COMMAND.SOURCE_CHANGED);
clearSelection();
drawResults.value.toggleRowSelection(item, true);
}
};
// 打开结果文件
const handleOpenFile = (item) => {
try {
if (item.State === 0) {
$toastMessage.info("正在生成中……");
return;
}
else if (item.State === 1) {
clearSelection();
let fileUrl = item.AreaId + '/' + item.ParamName + '.kev';
emitter.emit(EMIT_COMMAND.EVT_TYPE, { type: EMIT_COMMAND.OPEN_FILE, cmdID: currentTokenKey, data: JSON.stringify({ fileName: fileUrl, drawerToken: generateGUID() }) });
drawResults.value.toggleRowSelection(item, true);
} else {
$toastMessage.error("生成失败!");
return;
}
} finally {
emitter.emit(EMIT_COMMAND.SOURCE_CHANGED);
}
}
const clearSelection = () => {
if (selectedResultRows.value) {
selectedResultRows.value.forEach(item => {
drawResults.value.toggleRowSelection(item, false);
});
}
// drawResults.value.toggleAllSelection(false);
// drawResults.value.toggleAllSelection();
};
const handleSetDrawParam = (val) => {
showParamDialog.value = val;
};
const isSelectable = (row) => {
// 如果该行的状态为 "生成中" (State === 0),则不允许选择
return row.State !== 0;
};
const getStateText = (state) => {
switch (state) {
case 0: return "生成中";
case 1: return "成功";
case 2: return "失败";
default: return "错误";
}
};
const getStateColor = (state) => {
switch (state) {
case 0: return "orange";
case 1: return "green";
case 2: return "red";
default: return "gray";
}
};
// 添加一个启动自动刷新的函数
const startAutoRefresh = () => {
// 如果已经有定时器在运行,先清除它
if (refreshTimer.value) {
clearInterval(refreshTimer.value);
refreshTimer.value = null;
}
// 设置新的定时器每5秒刷新一次结果
refreshTimer.value = setInterval(async () => {
await getResults();
const totalCount = resultData.value.length;
const finished = resultData.value.filter(item => item.State !== 0).length;
currentProgress.value = parseFloat((finished / totalCount).toFixed(2)) * 100;
// 检查是否所有任务都已完成
const hasRunningTasks = resultData.value.some(item => item.State === 0);
// 如果没有正在运行的任务,可以降低刷新频率或停止刷新
if (!hasRunningTasks && refreshTimer.value) {
clearInterval(refreshTimer.value);
// 降低频率继续刷新每15秒一次或完全停止
// refreshTimer.value = setInterval(getResults, 15000);
}
}, 5000);
};
const handleDeleteSelected = () => {
ElMessageBox.confirm(`您确定要删除所选数据吗?`, "删除确认", {
confirmButtonText: "确认删除",
cancelButtonText: "取消",
type: "warning",
draggable: true,
}).then(async () => {
if (selectedResultRows.value) {
const paramNames = selectedResultRows.value.map(item => item.ParamName);
if (paramNames.length > 0) {
await deleteFlatResults(paramNames);
await getResults();
}
}
}).catch(() => {
});
};
const handleDelete = (row) => {
ElMessageBox.confirm(`您确定要删除所选数据吗?`, "删除确认", {
confirmButtonText: "确认删除",
cancelButtonText: "取消",
type: "warning",
draggable: true,
}).then(async () => {
if (row) {
const paramNames = [];
paramNames.push(row.ParamName);
if (paramNames.length > 0) {
await deleteFlatResults(paramNames);
await getResults();
}
}
}).catch(() => {
});
}
onMounted(async () => {
nextTick();
await getResults();
await onConfirmDraw();
// 添加初始化时的自动刷新机制
// startAutoRefresh();
});
const onConfirmDraw = async () => {
emitter.on(EMIT_COMMAND.CONFIRM_DRAW, (data) => {
showParamDialog.value = false;
progressVisible.value = true;
data.forEach(item => {
const paramName = item.PillarName;
const existingRecord = resultData.value.find(item => item.ParamName === paramName);
if (existingRecord) {
existingRecord.State = 0;
} else {
// const workArea = localStorage.getItem(STORAGE_KEYS.GLOBAL_WORK_AREA);
// console.log("工区:", workAreaStr)
// let areaId = '1';
// if (workAreaStr) {
// const workarea = JSON.parse(workAreaStr);
// areaId = workarea?.AreaID || '1';
// }
resultData.value.push({
AreaId: '1',
ParamName: paramName,
State: 0
});
}
});
startAutoRefresh();
});
};
onUnmounted(() => {
if (refreshTimer.value) {
clearInterval(refreshTimer.value);
}
});
onBeforeUnmount(() => {
emitter.off(EMIT_COMMAND.CONFIRM_DRAW);
})
const onComplete = () => {
// progressRef.value.close();
$toastMessage.success("计算完成!");
}
</script>
<style scoped>
.data-tree {
padding-top: 10px;
width: 280px;
border: solid 1px #ccc;
overflow-y: auto;
overflow-x: hidden;
}
.main {
display: inline;
width: 100%;
height: 100%;
padding: 0;
}
.draw-param-dialog {
width: calc(100% - 300px);
min-width: 800px;
height: calc(100vh - 500px);
min-height: 500px;
z-index: 1002;
}
.oper {
width: 100%;
height: 40px;
margin: 0;
padding-left: 10px;
border-bottom: solid 1px #ccc;
}
</style>