Files
SPDM/src/components/taskDetail/resultImage.vue

301 lines
7.2 KiB
Vue
Raw Normal View History

2025-10-30 19:30:06 +08:00
<template>
<div class="task-performance-page">
2026-01-10 14:00:47 +08:00
<div class="task-img-box">
<DragUploader :disabled="!canUpdate" @beforeUpload="beforeUploadFun">
<BaseTable
tableName="TASK_IMAGE_FILE"
ref="baseTableRef"
2026-02-05 09:24:21 +08:00
v-model:viewType="viewType"
:api="getSimulationTaskFilesApi"
:params="apiParam"
2026-03-09 16:03:13 +08:00
:show-checkbox="showCheckbox"
:actionList="actionList"
:full-height="true"
>
<template v-if="showLeftOptions" #leftOptions>
2026-02-05 09:24:21 +08:00
<el-form v-if="viewType === 'card'" inline class="column-form">
<el-form-item label="列数:">
<el-input-number v-model="columnCount" :min="1" :max="20" :step="1" />
</el-form-item>
</el-form>
<AddFile
ref="AddFileRef"
:accept="accept"
:api="batchAddFileInfoForTaskApi"
:fileType="FILE_TYPE.PNG_FILE"
tableName="TASK_DETAIL_UPLOAD_FILE"
callbackFlag="RESULT_IMAGE_UPLOAD_FINISHED"
:discipline="taskData?.discipline"
multiple
:data="{
dirId: nodeFIleId,
projectId: null,
uuid: taskId,
}"
@finished="uploadFinishedFun"
>
<el-button v-if="canUpdate">上传文件</el-button>
</AddFile>
<el-button type="primary" class="ml12" @click="downLoadFun">下载文件</el-button>
</template>
2026-02-05 09:24:21 +08:00
<template #cardTemplate="{ tableData }">
<ImageCard
ref="imageCardRef"
:list="tableData"
:columnCount="columnCount"
:showDelete="showLeftOptions && canUpdate"
2026-02-05 09:24:21 +08:00
@download="downloadFileFun"
@preview="previewFileFun"
@delete="deleteFun"
/>
</template>
<template #type="{ row }">
<span>{{ getfileType(row) }}</span>
</template>
<template #fileSize="{ row }">
<span>{{ row.formatFileSize }}</span>
</template>
</BaseTable>
</DragUploader>
2025-10-30 19:30:06 +08:00
</div>
2026-01-10 14:00:47 +08:00
<FilePreview v-model="previewVisible" :fileId="currentRow?.id" />
2025-10-30 19:30:06 +08:00
</div>
</template>
<script setup lang="ts">
2026-01-10 14:00:47 +08:00
import { ref, onMounted, watch } from 'vue';
import { batchAddFileInfoForTaskApi } from '@/api/project/run';
import { queryTaskRunApi } from '@/api/project/run';
import { NODE_TYPE } from '@/utils/enum/node';
import { FILE_TYPE } from '@/utils/enum/file';
2026-01-21 10:59:18 +08:00
import {
downloadFileById,
downloadFileByStream,
getFileUploadAcceptFun,
queryFileIdByNodeIdFun,
} from '@/utils/file';
2026-01-10 14:00:47 +08:00
import BaseTable from '@/components/common/table/baseTable.vue';
import FilePreview from '@/components/common/filePreview/index.vue';
import AddFile from '@/components/common/addFile/index.vue';
2026-02-05 09:24:21 +08:00
import ImageCard from './imageCard.vue';
import { dataOverViewDeleteSimulationNodeFilesApi } from '@/api/data/dataOverView';
import { getSimulationTaskFilesApi } from '@/api/data/dataAnalysis';
import DragUploader from '@/components/common/dragUploader/index.vue';
2025-10-30 19:30:06 +08:00
const props = defineProps({
taskId: {
type: String,
default: '',
},
showLeftOptions: {
type: Boolean,
default: true,
},
taskData: {
type: Object,
default: () => ({}),
},
// 是否可以更新
canUpdate: {
type: Boolean,
default: true,
},
2026-03-09 16:03:13 +08:00
showCheckbox: {
type: Boolean,
default: true,
},
});
2026-02-05 09:24:21 +08:00
2026-01-10 14:00:47 +08:00
const baseTableRef = ref();
2026-02-05 09:24:21 +08:00
const imageCardRef = ref();
const viewType = ref('card');
const columnCount = ref(4);
2025-10-30 19:30:06 +08:00
const exampleList = ref<any>([]);
2026-01-05 19:55:41 +08:00
const nodeFIleId = ref<any>('');
const accept = ref<any>('');
2025-10-30 19:30:06 +08:00
const queryTaskRunFun = async (id: any) => {
const res: any = await queryTaskRunApi({ taskId: id });
if (res && res.code === 200) {
const list = res.data.map((item: any) => {
return {
...item,
name: item.runName,
type: NODE_TYPE.RUN,
};
});
return list;
} else {
return [];
}
};
2026-01-10 14:00:47 +08:00
const currentRow = ref();
const previewVisible = ref(false);
const previewFileFun = (row: any) => {
currentRow.value = row;
previewVisible.value = true;
};
2026-02-05 09:24:21 +08:00
const downloadFileFun = (row: any) => {
downloadFileById(row.id);
};
2026-01-10 14:00:47 +08:00
const actionList = ref([
{
title: '下载',
type: 'primary',
click: (row: any) => {
2026-02-05 09:24:21 +08:00
downloadFileFun(row);
2026-01-10 14:00:47 +08:00
},
},
{
title: '预览',
type: 'primary',
click: (row: any) => {
previewFileFun(row);
},
},
{
title: '删除',
type: 'danger',
needConfirm: true,
confirmTip: '删除后不可恢复,确认删除吗?',
click: (row: any) => {
deleteFun(row);
},
hide: () => {
return !props.showLeftOptions || !props.canUpdate;
},
},
2026-01-10 14:00:47 +08:00
]);
const deleteFun = async (row: any) => {
const param = {
deleteId: row.id,
dataType: 2,
};
try {
const res: any = await dataOverViewDeleteSimulationNodeFilesApi(param);
if (res && res.code === 200) {
baseTableRef.value.resetFun();
}
2026-01-16 16:40:54 +08:00
} catch {}
};
2026-01-10 14:00:47 +08:00
const getfileType = (data: any) => {
const fileType = data.originalName.split('.').pop();
return fileType;
};
const apiParam = ref<any>({});
watch(
() => props.taskId,
async (newVal) => {
const task = [
{
name: '当前任务',
id: newVal,
uuid: newVal,
type: NODE_TYPE.TASK,
},
];
apiParam.value = {
uuid: newVal,
fileBizType: FILE_TYPE.PNG_FILE,
fileName: '',
startTime: '',
endTime: '',
level: NODE_TYPE.TASK,
};
const runList = await queryTaskRunFun(newVal);
exampleList.value = task.concat(runList);
},
{
immediate: true,
}
);
2026-02-04 15:20:36 +08:00
const uploadFinishedFun = (data: any) => {
if (data.callbackFlag === 'RESULT_IMAGE_UPLOAD_FINISHED') {
2026-02-04 15:20:36 +08:00
baseTableRef.value.resetFun();
2026-02-05 09:24:21 +08:00
if (imageCardRef.value) {
imageCardRef.value.reloadFailedImages();
}
2026-02-04 15:20:36 +08:00
}
2026-01-05 19:55:41 +08:00
};
const downLoadFun = async () => {
2026-02-05 09:24:21 +08:00
if (viewType.value === 'card' && imageCardRef.value) {
const selectedIds = imageCardRef.value.getSelectedIds() || [];
if (selectedIds.length) {
for (let i = 0; i < selectedIds.length; i++) {
downloadFileByStream(selectedIds[i]);
}
}
return;
}
2026-01-10 14:00:47 +08:00
const data: any = baseTableRef.value.tableRef.getCheckboxRecords() || [];
if (data.length) {
for (let i = 0; i < data.length; i++) {
2026-01-21 10:59:18 +08:00
downloadFileByStream(data[i].id);
2026-01-05 19:55:41 +08:00
}
}
};
const AddFileRef = ref<any>();
const beforeUploadFun = (file: any) => {
AddFileRef.value.addFileFun(file);
};
2026-01-05 19:55:41 +08:00
onMounted(async () => {
accept.value = await getFileUploadAcceptFun('PNG_FILE_FORMAT');
nodeFIleId.value = await queryFileIdByNodeIdFun(props.taskId);
2025-10-30 19:30:06 +08:00
});
</script>
<style lang="scss" scoped>
.task-performance-page {
width: 100%;
height: 100%;
// height: 450px;
.task-img-box {
width: 100%;
2026-01-10 14:00:47 +08:00
height: 100%;
2025-10-30 19:30:06 +08:00
.img-item {
margin-right: 10px;
margin-bottom: 10px;
2025-12-02 19:31:45 +08:00
min-height: 100px;
2025-10-30 19:30:06 +08:00
.task-img {
width: 100%;
border: 1px solid #ddd;
2026-01-05 19:55:41 +08:00
cursor: pointer;
}
.check {
border: 1px solid var(--el-color-primary);
2025-10-30 19:30:06 +08:00
}
}
}
}
2026-01-05 19:55:41 +08:00
.ml12 {
margin-left: 12px;
}
2026-02-05 09:24:21 +08:00
.column-form {
.el-form-item {
margin-bottom: 0;
margin-right: 12px;
}
}
2025-10-30 19:30:06 +08:00
</style>