Files
SPDM/src/views/task/execution/components/runDetailPage/runPagecomponent/resultData.vue

1528 lines
41 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 关键结果 -->
<template>
<div class="result-page">
<div class="tab-title-box">
<el-radio-group v-model="currentDirName" @change="runResultDirChangeFun">
<el-radio v-for="item in runDirNameList" :key="item.id" :value="item.id">{{
item.name
}}</el-radio>
</el-radio-group>
</div>
<div class="dir-content" v-if="currentDirName === 'performance'">
<taskPerformance
v-if="currentDirName === 'performance'"
:full-height="true"
:show-save-button="true"
:param-type="'run'"
:run-info="currentRunIfno"
:show-left-options="showLeftOption"
></taskPerformance>
</div>
<div class="dir-content" v-else>
<div class="table-box">
<FileTable
v-if="tableShow"
showIndex
ref="baseTableRef"
:tableName="tableName"
:show-checkbox="true"
:api="queryDirDataFun"
:params="apiParam"
:full-height="true"
:action-list="showLeftOption ? actionList : []"
:default-actions="showLeftOption ? ['rename', 'refresh'] : []"
fileNameField="name"
fileIdField="fileId"
>
<template #leftOptions v-if="showLeftOption">
<el-button @click="ArchiveRunDataFun">归档</el-button>
<el-button type="primary" v-if="getdirNameFun() != '报告结果'" @click="viewFun"
>查看</el-button
>
<el-button @click="openFun">上传</el-button>
<el-button type="danger" @click="batchDeleteFun" :disabled="isDelete"
>批量删除</el-button
>
</template>
</FileTable>
</div>
<!-- <div class="operate-box">
<el-button @click="ArchiveRunDataFun">归档</el-button>
<el-button type="primary" v-if="getdirNameFun() != '报告结果'" @click="viewFun"
>查看</el-button
>
<el-button @click="openFun">上传文件</el-button>
</div> -->
</div>
<FilePreview v-model="previewVisible" :fileId="currentRow?.fileId" />
</div>
<el-drawer
v-model="visible"
title="编辑文件"
:size="600"
:close-on-click-modal="false"
@close="closeFun"
>
<TableForm
ref="tableFormRef"
:tableName="tableName"
:show-disabled="currentFileInfo?.uuid || isCsv"
@change="chnageFun"
/>
<el-form :model="uploadFIleFormData" labelPosition="right" labelWidth="90">
<el-form-item label="物理量" v-if="getdirNameFun() === '图片结果'">
<el-select
v-model="uploadFIleFormData.quantityType"
filterable
@change="getQuantityUnitFun('quantityType', 'unitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="单位" v-if="getdirNameFun() === '图片结果'">
<el-select v-model="uploadFIleFormData.units" filterable>
<el-option
v-for="item in uploadFIleFormData.unitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="x轴物理量" v-if="getdirNameFun() === '曲线结果'">
<el-select
v-model="uploadFIleFormData.xQuantityType"
filterable
@change="getQuantityUnitFun('xQuantityType', 'xUnitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="x轴结果单位" v-if="getdirNameFun() === '曲线结果'">
<el-select v-model="uploadFIleFormData.xUnits" filterable>
<el-option
v-for="item in uploadFIleFormData.xUnitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="y轴物理量" v-if="getdirNameFun() === '曲线结果'">
<el-select
v-model="uploadFIleFormData.yQuantityType"
filterable
@change="getQuantityUnitFun('yQuantityType', 'yUnitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="y轴结果单位" v-if="getdirNameFun() === '曲线结果'">
<el-select v-model="uploadFIleFormData.yUnits" filterable>
<el-option
v-for="item in uploadFIleFormData.yUnitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option> </el-select
></el-form-item>
<el-form-item label="当前文件" v-if="fileList?.length">
<div class="file-list">
<div class="file-content" v-for="item in fileList" :key="item.id">
<div class="file-name" :title="item.originalName">
<!-- <el-icon class="icon-style"><Document /></el-icon> {{ item.originalName }} -->
<img :src="fileUploadAllocationIconFun(item.originalName)" class="img" />
{{ item.originalName }}
</div>
</div>
</div>
</el-form-item>
</el-form>
<template #footer>
<div>
<el-button @click="closeFun">关闭</el-button>
<el-button type="primary" @click="submitFun">确定</el-button>
</div>
</template>
</el-drawer>
<Dialog
v-model="diaPngVisible"
diaTitle="云图对比"
:width="'90%'"
:height="'90%'"
:confirm-closable="false"
:zIndex="100"
>
<div class="compare-container">
<div class="compare-container-left">
<BaseTable
v-if="diaPngVisible"
ref="tableComparePngRef"
tableName="RUN_RESULT_IMAGE_TABLE"
:data="pngTableData"
showIndex
showCheckbox
hidePagination
:full-height="true"
@checkbox-change="checkBoxPngChangeFun"
@checkbox-all="checkBoxPngChangeFun"
>
<template #leftOptions>
<div class="compare-container-left-options">
<span>设置列数据</span>
<el-input-number v-model="columnPngData" :min="1" :max="10" />
</div>
</template>
</BaseTable>
</div>
<div class="compare-container-right">
<div
class="chart-container"
:style="{
// eslint-disable-next-line
display: 'grid',
gridTemplateColumns: `repeat(${columnPngData} ,${100 / columnPngData}%)`,
}"
>
<div class="chart-box-png" v-for="(item, index) in comparePngData" :key="index">
<div class="png-container">
<div class="png-title">{{ item.name }}</div>
<div class="png-image">
<el-image :src="item.url" fit="scale-down" />
</div>
</div>
</div>
</div>
</div>
</div>
<template #footer>
<div>
<el-button @click="closePngFun">关闭</el-button>
</div>
</template>
</Dialog>
<Dialog
v-model="diaVisible"
diaTitle="曲线对比"
:width="'90%'"
:height="'90%'"
:confirm-closable="false"
:zIndex="100"
>
<div class="compare-container">
<div class="compare-container-left">
<BaseTable
v-if="diaVisible"
ref="tableCompareRef"
:data="csvCompareData"
tableName="RUN_RESULT_CANVAS_TABLE"
showIndex
showCheckbox
hidePagination
@checkbox-change="checkBoxChangeFun"
@checkbox-all="checkBoxChangeFun"
:full-height="true"
>
<template #leftOptions>
<div class="compare-container-left-options">
<span>设置列数据</span>
<el-input-number v-model="columnData" :min="1" :max="10" />
</div>
</template>
<template #operate="{ row }">
<span></span>
<el-input
class="image-number-input"
v-model="row.imageNumber"
@blur="changeImageNumberFun"
/>
</template>
</BaseTable>
</div>
<div class="compare-container-right">
<div
class="chart-container"
v-show="showChart"
:style="{
// eslint-disable-next-line
display: 'grid',
gridTemplateColumns: `repeat(${columnData} ,${100 / columnData}%)`,
}"
>
<div class="chart-box" v-for="(value, key) in compareData" :key="key">
<EchartCard
:title="`图${key}`"
:ref="(el) => (projectStorageSpaceStatisticsRef[`chart-${key}`] = el)"
:charts-id="'chart-' + key"
:bar-type="'lineChart'"
>
</EchartCard>
</div>
</div>
</div>
</div>
<template #footer>
<div>
<el-button @click="canvasCloseFun">关闭</el-button>
</div>
</template>
</Dialog>
<Dialog
v-model="uploadFileVisible"
diaTitle="上传文件"
:width="'70%'"
:height="'70%'"
:zIndex="101"
@close="closeFun"
show-footer
>
<BaseTable
v-if="uploadFileVisible"
:tableName="tableName"
ref="baseUploadTableRef"
:actionList="uploadActionList"
:hidePagination="true"
:full-height="true"
>
<template #leftOptions>
<el-form class="select-form" :model="formData" inline>
<el-form-item label="学科">
<el-select class="select-style" v-model="formData.discipline">
<el-option
v-for="item in disciplineList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="文件类型">
<el-select class="select-style" v-model="formData.fileType" multiple>
<el-option
v-for="item in fileTypeList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<el-upload
:show-file-list="false"
:accept="accept"
multiple
:before-upload="beforeUploadFun"
>
<el-button>上传文件</el-button>
</el-upload>
</template>
<template #quantityType="{ row }">
<el-select
v-model="row.quantityType"
filterable
@change="getQuantityUnitFun2(row, 'quantityType', 'unitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</template>
<template #units="{ row }">
<el-select v-model="row.units" filterable>
<el-option
v-for="item in row.unitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</template>
<template #max="{ row }">
<el-input v-model="row.max"></el-input>
</template>
<template #min="{ row }">
<el-input v-model="row.min"></el-input>
</template>
<template #description="{ row }">
<el-input v-model="row.description"></el-input>
</template>
<template #xQuantityType="{ row }">
<el-select
v-model="row.xQuantityType"
filterable
@change="getQuantityUnitFun2(row, 'xQuantityType', 'xUnitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</template>
<template #xquantityType="{ row }">
<el-select
v-model="row.xquantityType"
filterable
@change="getQuantityUnitFun2(row, 'xquantityType', 'xunitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</template>
<template #xUnits="{ row }">
<el-select v-model="row.xUnits" filterable>
<el-option
v-for="item in row.xUnitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</template>
<template #xunits="{ row }">
<el-select v-model="row.xunits" filterable>
<el-option
v-for="item in row.xunitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</template>
<template #yQuantityType="{ row }">
<el-select
v-model="row.yQuantityType"
filterable
@change="getQuantityUnitFun2(row, 'yQuantityType', 'yUnitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</template>
<template #yquantityType="{ row }">
<el-select
v-model="row.yquantityType"
filterable
@change="getQuantityUnitFun2(row, 'yquantityType', 'yunitsList')"
>
<el-option
v-for="item in quantityTypeList"
:key="item.id"
:label="item.label"
:value="item.name"
></el-option>
</el-select>
</template>
<template #yUnits="{ row }">
<el-select v-model="row.yUnits" filterable>
<el-option
v-for="item in row.yUnitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</template>
<template #yunits="{ row }">
<el-select v-model="row.yunits" filterable>
<el-option
v-for="item in row.yunitsList"
:key="item.id"
:label="item.label"
:value="item.label"
></el-option>
</el-select>
</template>
</BaseTable>
<template #footer>
<div>
<el-button @click="closeFun">关闭</el-button>
<el-button type="primary" @click="submitFun2">确定</el-button>
</div>
</template>
</Dialog>
</template>
<script setup lang="ts">
import {
queryRunDirApi,
listSimulationKeyResultApi,
addSimulationKeyResultApi,
deleteSimulationKeyResultApi,
editSimulationKeyResultApi,
listQuantitiesApi,
listUnitsApi,
syncKeyResultToTaskApi,
} from '@/api/project/run';
import { ref, watch, nextTick, onMounted, reactive } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import FileTable from '@/components/common/fileTable/index.vue';
import { ElMessage } from 'element-plus';
import { FILE_TYPE } from '@/utils/enum/file';
import TableForm from '@/components/common/table/tableForm.vue';
import FilePreview from '@/components/common/filePreview/index.vue';
import { downloadFileById, fileUploadAllocationIconFun } from '@/utils/file';
import Dialog from '@/components/common/dialog/index.vue';
import { groupBy } from 'lodash-es';
import { getFileBaseInfoApi } from '@/api/data/data';
import EchartCard from '@/components/common/echartCard/index.vue';
import taskPerformance from '@/components/taskDetail/taskPerformance.vue';
import { getCSVDataApi } from '@/api/data/dataAnalysis';
import { useDict } from '@/utils/useDict';
const env = import.meta.env;
const props = defineProps({
currentRunIfno: {
type: Object,
default: () => {},
},
showLeftOption: {
type: Boolean,
default: true,
},
});
const uploadFIleFormData = reactive<any>({
quantityType: '',
units: '',
xQuantityType: '',
xUnits: '',
yQuantityType: '',
yUnits: '',
});
const { ALL_FILE_TYPE, DISCIPLINE_TYPE }: any = useDict('ALL_FILE_TYPE', 'DISCIPLINE_TYPE');
const baseTableRef = ref();
const tableFormRef = ref();
const visible = ref(false);
const runInfo = ref<any>({});
const currentDirName = ref<any>('');
const currentFileInfo = ref<any>({});
const diaPngVisible = ref(false);
const columnPngData = ref<number>(1);
const comparePngData = ref<any>([]);
const tableComparePngRef = ref();
const pngTableData = ref<any>([]);
const runDirs = ref<any>([]);
const runDirNameList = ref<any>([]);
const showPage = ref(false);
const diaVisible = ref(false);
const csvCompareData = ref<any>([]);
const columnData = ref<number>(1);
const tableCompareRef = ref();
const isCsv = ref(false);
const uploadFileVisible = ref(false);
const baseUploadTableRef = ref();
const formData = reactive<any>({
fileType: [],
discipline: '',
});
const fileTypeList = ref<any>(ALL_FILE_TYPE.value['A']);
const disciplineList = ref<any>(DISCIPLINE_TYPE.value['A']);
const getRunInfoDirsFun = async () => {
showPage.value = false;
const res: any = await queryRunDirApi({
uuid: runInfo.value.uuid,
size: 999,
current: 1,
});
if (res && res.code === 200) {
runDirs.value =
res.data?.data.filter((item: any) => {
// '报告结果'
return item.dataType === 1 && ['图片结果', '曲线结果'].includes(item.originalName);
}) || [];
runDirNameList.value =
runDirs.value.map((item: any) => {
return { name: item.originalName, id: item.id };
}) || [];
runDirNameList.value.unshift({
name: '数值结果',
id: 'performance',
});
if (runDirNameList.value.length) {
currentDirName.value = runDirNameList.value[0].id;
}
}
showPage.value = true;
};
const queryDirDataFun = async (param: any) => {
const res: any = await listSimulationKeyResultApi({
...param,
});
if (res && res.code === 200) {
return res;
}
};
const apiParam = ref<any>({
runId: '',
keyResultType: '1',
});
const reloadFun = () => {
if (baseTableRef.value) {
baseTableRef.value.resetFun();
}
};
const tableName = ref('RUN_RESULT_IMAGE_TABLE');
const tableShow = ref(false);
const fileType = ref(FILE_TYPE.PNG_FILE);
const runResultDirChangeFun = () => {
tableShow.value = false;
nextTick(() => {
const name = runDirNameList.value.find((item: any) => {
return item.id === currentDirName.value;
})?.name;
if (name === '图片结果') {
tableName.value = 'RUN_RESULT_IMAGE_TABLE';
apiParam.value.keyResultType = '1';
accept.value = '.jpg,.jpeg,.png,.gif';
fileType.value = FILE_TYPE.PNG_FILE;
formData.fileType = [`${FILE_TYPE.PNG_FILE}`];
tableShow.value = true;
}
if (name === '曲线结果') {
tableName.value = 'RUN_RESULT_CANVAS_TABLE';
apiParam.value.keyResultType = '2';
accept.value = '.csv';
fileType.value = FILE_TYPE.CANVAS_FILE;
formData.fileType = [`${FILE_TYPE.CANVAS_FILE}`];
tableShow.value = true;
}
if (name === '报告结果') {
tableName.value = 'RUN_RESULT_REPORT_TABLE';
apiParam.value.keyResultType = '3';
accept.value = '.ppt(x),.pptx,.doc(x),.docx,.pdf';
fileType.value = FILE_TYPE.REPORT_FILE;
tableShow.value = true;
}
});
};
const accept = ref<any>('.jpg,.jpeg,.png,.gif');
const getFileType = () => {
let type: any = FILE_TYPE.CALCULATION_FILE;
const dirName = runDirNameList.value.find((item: any) => {
return item.id === currentDirName.value;
})?.name;
if (dirName === '图片结果') {
type = FILE_TYPE.PNG_FILE;
}
if (dirName === '曲线结果') {
type = FILE_TYPE.CANVAS_FILE;
}
if (dirName === '报告结果') {
type = FILE_TYPE.REPORT_FILE;
}
return type;
};
const closeFun = () => {
visible.value = false;
isCsv.value = false;
uploadFileVisible.value = false;
};
const openFun = () => {
// visible.value = true;
currentFileInfo.value = {};
// nextTick(() => {
// tableFormRef.value.resetFun();
// for (const key in uploadFIleFormData) {
// uploadFIleFormData[key] = '';
// }
// });
tableData.value = [];
uploadFileVisible.value = true;
};
const submitFun = async () => {
if (currentFileInfo.value?.uuid) {
const fromData = tableFormRef.value.getFormDataFun();
const paramData: any = {};
const fileList: any = fromData.uploadFile || [];
if (fileList.length > 1) {
ElMessage.warning('只允许更新一个文件!');
return;
}
for (const key in fromData) {
if (key != 'extras' && key != 'uploadFile' && key != 'X_ROW_KEY') {
paramData[key] = fromData[key];
}
}
for (const key in uploadFIleFormData) {
if (!getparamListFUn().includes(key)) {
delete uploadFIleFormData[key];
}
}
const param = {
...paramData,
...uploadFIleFormData,
};
if (fileList.length) {
const file = fromData.uploadFile[0].raw;
// const name = file.name;
// param.fileName = name;
// param.name = name;
// param.dirId = currentDirName.value;
param.file = file;
// param.fileType = getFileType();
// param.keyResultType = keyResultType.value;
// param.runId = runInfo.value.uuid;
param.dirId = currentDirName.value;
}
param.quantityType = quantityTypeList.value.find((item: any) => {
return item.name === uploadFIleFormData.quantityType;
})?.label;
param.xQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === uploadFIleFormData.xQuantityType;
})?.label;
param.yQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === uploadFIleFormData.yQuantityType;
})?.label;
param.xquantityType = param.xQuantityType;
param.xunits = param.xUnits;
param.yquantityType = param.yQuantityType;
param.yunits = param.yUnits;
delete param.xUnitsList;
delete param.yunitsList;
const res: any = await editSimulationKeyResultApi(param);
if (res && res.code === 200) {
ElMessage.success('操作成功');
visible.value = false;
reloadFun();
}
}
isCsv.value = false;
};
const deleteFile = async (data: any) => {
const res: any = await deleteSimulationKeyResultApi({
uuid: data.uuid,
fileId: data.fileId,
});
if (res && res.code === 200) {
ElMessage.success('删除成功');
reloadFun();
} else {
ElMessage.error('删除失败');
}
};
const currentRow = ref();
const previewVisible = ref(false);
const previewFileFun = (row: any) => {
currentRow.value = row;
previewVisible.value = true;
};
const fileList = ref<any>([]);
const actionList = ref([
{
title: '编辑',
type: 'primary',
click: (row: any) => {
visible.value = true;
currentFileInfo.value = row;
nextTick(async () => {
tableFormRef.value.setFormDataFun(currentFileInfo.value);
fileList.value = [];
for (const key in uploadFIleFormData) {
uploadFIleFormData[key] = currentFileInfo.value[key];
}
// uploadFIleFormData.xQuantityType = currentFileInfo.value?.xquantityType;
// uploadFIleFormData.xUnits = currentFileInfo.value?.xunits;
// uploadFIleFormData.yQuantityType = currentFileInfo.value?.yquantityType;
// uploadFIleFormData.yUnits = currentFileInfo.value?.yunits;
// 物理量转换赋值
uploadFIleFormData.quantityType = quantityTypeList.value.find((item: any) => {
return item.label === currentFileInfo.value.quantityType;
})?.name;
if (getdirNameFun() === '图片结果') {
getQuantityUnitFun('quantityType', 'unitsList');
}
uploadFIleFormData.units = currentFileInfo.value?.units;
// x轴物理量 转换赋值
uploadFIleFormData.xQuantityType = quantityTypeList.value.find((item: any) => {
return item.label === currentFileInfo.value.xquantityType;
})?.name;
if (getdirNameFun() === '曲线结果') {
getQuantityUnitFun('xQuantityType', 'xUnitsList');
}
uploadFIleFormData.xUnits = currentFileInfo.value?.xunits;
// y轴物理量 转换赋值
uploadFIleFormData.yQuantityType = quantityTypeList.value.find((item: any) => {
return item.label === currentFileInfo.value.yquantityType;
})?.name;
if (getdirNameFun() === '曲线结果') {
getQuantityUnitFun('yQuantityType', 'yUnitsList');
}
uploadFIleFormData.yUnits = currentFileInfo.value?.yunits;
const res: any = await getFileBaseInfoApi({ fileId: row.fileId });
if (res && res.code === 200) {
fileList.value = [res.data];
}
});
},
},
{
title: '预览',
type: 'primary',
click: (row: any) => {
previewFileFun(row);
},
},
{
title: '下载',
type: 'primary',
click: (row: any) => {
downloadFileById(row.fileId);
},
},
{
title: '删除',
type: 'danger',
needConfirm: true,
confirmTip: '确认删除吗?',
click: (row: any) => {
deleteFile(row);
},
},
]);
const isDelete = ref(false);
const batchDeleteFun = async () => {
const checkDatas = baseTableRef.value.tableRef.getCheckboxRecords();
if (checkDatas?.length) {
isDelete.value = true;
for (let i = 0; i < checkDatas?.length; i++) {
await deleteSimulationKeyResultApi({
uuid: checkDatas[i].uuid,
fileId: checkDatas[i].fileId,
});
}
ElMessage.success('删除成功');
isDelete.value = false;
reloadFun();
}
};
const chnageFun = async (data: any) => {
const name = runDirNameList.value.find((item: any) => {
return item.id === currentDirName.value;
})?.name;
if (data.key === 'uploadFile' && name === '曲线结果') {
isCsv.value = true;
const file: any = data.val.raw;
const { name } = file;
const res: any = await addSimulationKeyResultApi({
file,
dirId: currentDirName.value,
fileName: name,
name: name,
fileType: getFileType(),
keyResultType: apiParam.value.keyResultType,
runId: runInfo.value.uuid,
onlyFile: true,
});
if (res && res.code === 200) {
const fromData = tableFormRef.value.getFormDataFun();
fromData.max = res.data.max;
fromData.min = res.data.min;
fromData.unit = res.data.unit;
}
}
};
const quantityTypeList = ref<any>([]);
const getQuantityTypeFun = async () => {
const res: any = await listQuantitiesApi();
if (res && res.code === 200) {
quantityTypeList.value = res.data;
}
};
const getQuantityUnitFun = async (name: any, flag: any) => {
// 清空关联的值
if (flag === 'unitsList') {
uploadFIleFormData.units = '';
} else if (flag === 'xUnitsList') {
uploadFIleFormData.xUnits = '';
} else if (flag === 'yUnitsList') {
uploadFIleFormData.yUnits = '';
}
if (name) {
const res: any = await listUnitsApi({ quantityType: uploadFIleFormData[name] });
if (res && res.code === 200) {
uploadFIleFormData[flag] = res.data;
} else {
uploadFIleFormData[flag] = [];
}
} else {
uploadFIleFormData[flag] = [];
}
};
const getQuantityUnitFun2 = async (row: any, name: any, flag: any) => {
if (name) {
const res: any = await listUnitsApi({ quantityType: row[name] });
if (res && res.code === 200) {
row[flag] = res.data;
} else {
row[flag] = [];
}
} else {
row[flag] = [];
}
};
const getdirNameFun = () => {
const name: any = runDirNameList.value.find((item: any) => {
return item.id === currentDirName.value;
})?.name;
return name;
};
const getparamListFUn = () => {
const name = getdirNameFun();
if (name === '图片结果') {
return ['quantityType', 'units'];
} else if (name === '曲线结果') {
return ['xQuantityType', 'xUnits', 'yQuantityType', 'yUnits'];
} else {
return ['description'];
}
};
const viewFiles = ref<any>([]);
const viewFun = () => {
viewFiles.value = baseTableRef.value.tableRef.getCheckboxRecords();
if (viewFiles.value.length) {
const name = getdirNameFun();
const data = viewFiles.value.map((item: any) => {
return {
...item,
imageNumber: 1,
};
});
if (name === '图片结果') {
comparePngData.value = []; // 清空
diaPngVisible.value = true;
pngTableData.value = data;
// nextTick(() => {
// tableComparePngRef.value.setDataFun(data);
// });
} else if (name === '曲线结果') {
diaVisible.value = true;
compareData.value = {};
csvCompareData.value = data;
// nextTick(() => {
// tableCompareRef.value.setDataFun(data);
// });
}
} else {
ElMessage.warning('请选择文件进行对比查看');
}
};
const checkBoxPngChangeFun = () => {
comparePngData.value = tableComparePngRef.value?.tableRef?.getCheckboxRecords();
comparePngData.value.forEach((item: any) => {
item.url = `${env.VITE_API_IMAGE_PREVIEW_URL}/data/previewImage?fileId=${item.fileId}`;
});
};
const closePngFun = () => {
diaPngVisible.value = false;
};
const canvasCloseFun = () => {
diaVisible.value = false;
showChart.value = false;
};
const showChart = ref(false);
const changeImageNumberFun = () => {
setChartFun();
};
const checkBoxChangeFun = () => {
setChartFun();
};
const compareData = ref<any>({});
const projectStorageSpaceStatisticsRef = ref<any>({});
// 初始化图表chart-1
const initProjectTaskAchievementStatistics = async ({
dom,
seriesData,
XData,
titleList,
key,
}: any) => {
dom.commonChartRef.disposeEchartsByKey('chart-' + key);
dom.commonChartRef.option = {
title: {
show: false,
},
tooltip: {
trigger: 'axis',
},
legend: {
top: '0%',
left: 'center',
data: titleList,
},
grid: {
top: '10%',
bottom: '10%',
left: '5%',
right: '5%',
},
xAxis: {
type: 'value',
data: XData,
axisLabel: {
show: true,
interval: XData.length > 10 ? Math.floor(XData.length / 10) : 1,
},
splitLine: {
show: true,
},
axisLine: {
show: true,
},
axisTick: {
show: true,
},
},
yAxis: {
type: 'value',
axisLine: {
show: true,
},
axisTick: {
show: true,
},
minorTick: {
show: true,
splitNumber: 5, // 大刻度之间分割成5份
length: 3, // 小刻度长度
},
minorSplitLine: {
show: true,
lineStyle: {
type: 'dotted',
},
},
},
series: seriesData,
};
dom.commonChartRef.initChart();
};
const setChartFun = () => {
const selectedRows = tableCompareRef.value?.tableRef?.getCheckboxRecords();
if (selectedRows.length) {
showChart.value = true;
} else {
showChart.value = false;
}
if (selectedRows.length) {
compareData.value = groupBy(selectedRows, 'imageNumber');
nextTick(() => {
for (const key in compareData.value) {
getCSVDataApi({
fileId: compareData.value[key].map((item: any) => item.fileId).join(','),
}).then((res: any) => {
const seriesData: any = [];
const titleList: any = [];
let XData: any = [];
if (res.code === 200) {
res.data.xData.forEach((item: any, index: number) => {
const data = res.data.xData[index].map((item_1: any, index_1: number) => {
return [item_1, res.data.yData[index][index_1]];
});
XData = res.data.xData[index];
const title = compareData.value[key][index].name;
titleList.push(title);
seriesData.push({
name: title,
type: 'line',
data,
showSymbol: false, // 默认不显示数据点
symbolSize: 6, // 悬停时数据点的大小
itemStyle: {
opacity: 0, // 默认数据点透明度
borderWidth: 2,
},
emphasis: {
scale: true, // 悬停时放大
focus: 'series', // 悬停时高亮整个系列
itemStyle: {
opacity: 1, // 悬停时显示数据点
},
},
});
});
}
initProjectTaskAchievementStatistics({
dom: projectStorageSpaceStatisticsRef.value[`chart-${key}`],
seriesData,
XData,
titleList,
key,
});
});
}
});
}
};
const tableData = ref<any>([]);
const uploadActionList = ref([
{
title: '删除',
type: 'danger',
click: (row: any) => {
tableData.value = tableData.value.filter((item: any) => {
return item.id != row.id;
});
baseUploadTableRef.value.setDataFun(tableData.value);
},
},
]);
const num = ref(1);
const beforeUploadFun = async (file: any) => {
num.value++;
const { name, size } = file;
let result: any = false;
const list = accept.value.split(',');
for (let i = 0; i < list.length; i++) {
if (name.endsWith(list[i])) {
result = true;
}
}
if (!result) {
ElMessage.warning(name + '文件不符合文件上传要求');
return false;
}
const obj: any = {
name: name,
fileName: name,
fileSize: size,
size,
file,
id: new Date().getTime() + num.value,
quantityType: '',
units: '',
max: '',
min: '',
description: '',
xQuantityType: '',
xquantityType: '',
xUnits: '',
xunits: '',
yQuantityType: '',
yquantityType: '',
yUnits: '',
yunits: '',
fileType: fileType.value,
keyResultType: apiParam.value.keyResultType,
// 云图类型5
fileTypeDictValue: '5', // 这里写死的,后面要调用打标签上传组件
disciplineDictValue: '',
fileTypeDictClass: 'ALL_FILE_TYPE',
disciplineTypeDictClass: 'DISCIPLINE_TYPE',
dictTags: ['fileTypeDictClass', 'fileTypeDictValue'],
};
if (getdirNameFun() === '曲线结果') {
const res: any = await addSimulationKeyResultApi({
file,
dirId: currentDirName.value,
fileName: name,
name: name,
fileType: getFileType(),
keyResultType: apiParam.value.keyResultType,
runId: runInfo.value.uuid,
onlyFile: true,
});
if (res && res.code === 200) {
obj.xQuantityType = res.data.xPhysics;
obj.xquantityType = res.data.xPhysics;
obj.yQuantityType = res.data.yPhysics;
obj.yquantityType = res.data.yPhysics;
obj.max = res.data.max;
obj.min = res.data.min;
obj.xUnits = res.data.xUnit;
obj.xunits = res.data.xUnit;
obj.yUnits = res.data.yUnit;
obj.yunits = res.data.yUnit;
// 曲线类型4
obj.fileTypeDictValue = '4'; // TODO 这里写死的,后面要调用打标签上传组件
}
}
tableData.value.push(obj);
nextTick(() => {
baseUploadTableRef.value.setDataFun(tableData.value);
});
return false;
};
const submitFun2 = async () => {
if (!formData.fileType?.length) {
ElMessage.warning('请选择文件类型!');
return;
}
let isSubmit: any = true;
for (let i = 0; i < tableData.value.length; i++) {
const file = tableData.value[i].file;
const name = file.name;
const paramData: any = {};
tableData.value[i].fileTypeDictValue = formData.fileType.join(',');
tableData.value[i].disciplineDictValue = formData.discipline;
if (tableData.value[i].disciplineDictValue) {
tableData.value[i].dictTags.push('disciplineTypeDictClass');
tableData.value[i].dictTags.push('disciplineDictValue');
}
tableData.value[i].dictTags = tableData.value[i].dictTags.join(',');
for (const key in tableData.value[i]) {
if (key != '_X_ROW_KEY' && key != 'unitsList') {
paramData[key] = tableData.value[i][key];
}
}
const params: any = {
fileName: name,
name: name,
dirId: currentDirName.value,
file: file,
fileType: getFileType(),
keyResultType: apiParam.value.keyResultType,
runId: runInfo.value.uuid,
...paramData,
};
const paramQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === tableData.value[i].quantityType;
})?.label;
const paramXQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === tableData.value[i].xQuantityType;
})?.label;
const paramYQuantityType = quantityTypeList.value.find((item: any) => {
return item.name === tableData.value[i].yQuantityType;
})?.label;
if (paramQuantityType) {
params.quantityType = paramQuantityType;
}
if (paramXQuantityType) {
params.xQuantityType = paramXQuantityType;
}
if (paramYQuantityType) {
params.yQuantityType = paramYQuantityType;
}
delete params.xUnitsList;
delete params.yunitsList;
delete params.xunitsList;
await addSimulationKeyResultApi(params).then((res: any) => {
if (res.code === 200) {
} else {
isSubmit = false;
}
});
}
if (isSubmit) {
ElMessage.success('上传成功');
reloadFun();
}
uploadFileVisible.value = false;
};
const ArchiveRunDataFun = async () => {
const list = baseTableRef.value.tableRef?.getCheckboxRecords() || [];
if (list.length) {
const keyResultIdList = list.map((item: any) => {
return item.uuid;
});
const param = {
keyResultIdList,
runId: props.currentRunIfno.uuid,
};
try {
const res: any = await syncKeyResultToTaskApi(param);
if (res && res.code === 200) {
ElMessage.success('归档成功');
} else {
ElMessage.warning('归档未成功');
}
} catch (error) {
console.error(error);
}
} else {
ElMessage.warning('请选择文件进行归档');
}
};
watch(
() => props.currentRunIfno,
async (newVal) => {
if (newVal) {
runInfo.value = newVal;
apiParam.value.runId = runInfo.value.uuid;
nextTick(async () => {
await getRunInfoDirsFun();
});
}
},
{
immediate: true,
deep: true,
}
);
onMounted(async () => {
await getQuantityTypeFun();
});
</script>
<style lang="scss" scoped>
.result-page {
width: 100%;
height: 100%;
.tab-title-box {
width: 100%;
height: 50px;
display: flex;
align-items: center;
justify-content: flex-end;
}
.dir-content {
width: 100%;
height: calc(100% - 50px);
.table-box {
width: 100%;
height: 100%;
// height: calc(100% - 50px);
}
.operate-box {
width: 100%;
height: 50px;
display: flex;
justify-content: flex-end;
align-items: center;
}
}
}
:deep(.el-form-item__label) {
width: 90px !important;
}
.compare-container {
height: 100%;
width: 100%;
display: flex;
justify-content: space-between;
.compare-container-left {
height: 100%;
width: 49%;
.compare-container-left-options {
display: flex;
align-items: center;
& > span {
white-space: nowrap;
}
}
}
.compare-container-right {
height: 100%;
width: 50%;
.image-number-input {
width: 50px;
}
.chart-container {
height: 100%;
width: 100%;
// overflow-y: auto;
// display: grid;
.chart-box {
height: 350px;
width: 100%;
}
.chart-box-png {
height: 50%;
width: 100%;
.png-container {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
.png-title {
margin-bottom: 12px;
width: 100%;
}
.png-image {
flex: 1;
width: 100%;
.el-image {
height: 100%;
width: 100%;
}
}
}
}
}
}
}
.file-list {
width: 100%;
.file-content {
width: 100%;
height: 32px;
font-size: 14px;
display: flex;
align-items: center;
justify-content: space-between;
.file-name {
width: 80%;
display: flex;
align-items: center;
text-overflow: ellipsis;
/* 当内容溢出容器时显示省略号 */
overflow: hidden;
/* 隐藏溢出容器的内容 */
white-space: nowrap;
color: #606266;
.icon-style {
margin-right: 5px;
color: #606266;
}
.img {
width: 20px;
height: 20px;
margin-right: 8px;
}
}
.file-operate {
display: none;
cursor: pointer;
padding-right: 10px;
}
}
.file-content:hover {
background-color: #f5f7fa;
.file-operate {
display: block;
}
}
}
.select-form {
width: 100%;
.el-form-item {
margin-bottom: 0;
margin-right: 10px !important;
.select-style {
width: 250px;
}
}
}
</style>