This commit is contained in:
2025-12-16 12:02:33 +08:00
14 changed files with 598 additions and 107 deletions

View File

@@ -1,4 +1,4 @@
import { download, post, upload } from '@/api/request';
import { download, post, upload, get } from '@/api/request';
const env = import.meta.env;
const PREFIX = env.VITE_API_PREFIX_PROJECT;
@@ -181,3 +181,20 @@ export const deliverableApproveApi = (params: any) => {
export const editSimulationKeyResultApi = (params: any) => {
return post(`${PREFIX}run/editSimulationKeyResult`, params);
};
/**
* 查询物理量相关信息
* @returns
*/
export const listQuantitiesApi = () => {
return get(`${PREFIX}run/listQuantities`);
};
/**
* 根据物理量获取对应单位
* @param params quantityType 物理量名称
* @returns
*/
export const listUnitsApi = (params: any) => {
return get(`${PREFIX}run/listUnits`, params);
};

View File

@@ -12,6 +12,7 @@
startTime: '',
endTime: '',
}"
:full-height="true"
:actionList="actionList"
>
<template #leftOptions v-if="taskInfo.status != 3">
@@ -73,10 +74,28 @@
</template>
<template #quantityType="{ row }">
<el-input v-model="row.quantityType"></el-input>
<el-select
v-model="row.quantityType"
filterable
@change="getQuantityUnitFun(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-input v-model="row.units"></el-input>
<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>
@@ -88,28 +107,100 @@
<el-input v-model="row.description"></el-input>
</template>
<template #xQuantityType="{ row }">
<el-input v-model="row.xQuantityType"></el-input>
<el-select
v-model="row.xQuantityType"
filterable
@change="getQuantityUnitFun(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-input v-model="row.xquantityType"></el-input>
<el-select
v-model="row.xquantityType"
filterable
@change="getQuantityUnitFun(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-input v-model="row.xUnits"></el-input>
<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-input v-model="row.xunits"></el-input>
<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-input v-model="row.yQuantityType"></el-input>
<el-select
v-model="row.yQuantityType"
filterable
@change="getQuantityUnitFun(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-input v-model="row.yquantityType"></el-input>
<el-select
v-model="row.yquantityType"
filterable
@change="getQuantityUnitFun(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-input v-model="row.yUnits"></el-input>
<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-input v-model="row.yunits"></el-input>
<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>
@@ -168,7 +259,12 @@ import { formatFileSize } from '@/utils/file';
import FilePreview from '@/components/common/filePreview/index.vue';
import Dialog from '@/components/common/dialog/index.vue';
import emitter from '@/utils/eventBus';
import { batchAddSimulationKeyResultApi, deliverableApproveApi } from '@/api/project/run';
import {
batchAddSimulationKeyResultApi,
deliverableApproveApi,
listQuantitiesApi,
listUnitsApi,
} from '@/api/project/run';
import { systemApproveQueryApproveFlowTempalteApi } from '@/api/system/systemApprove';
import { ElMessage } from 'element-plus';
import { downloadFileById } from '@/utils/file';
@@ -419,8 +515,31 @@ const submitApprovalFun = async () => {
approvaVisable.value = false;
};
const quantityTypeList = ref<any>([]);
const getQuantityTypeFun = async () => {
const res: any = await listQuantitiesApi();
if (res && res.code === 200) {
quantityTypeList.value = res.data;
}
};
const getQuantityUnitFun = 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] = [];
}
};
onMounted(async () => {
await systemApproveQueryApproveFlowTempalteFun();
await getQuantityTypeFun();
getTaskRunInfoFun();
});
</script>

View File

@@ -9,6 +9,7 @@
hidePagination
:actionList="actionList"
:export-params="excelParams"
:full-height="fullHeight"
>
<template #leftOptions>
<div class="operate-box">
@@ -54,7 +55,12 @@
import { ref, onMounted, nextTick } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import { ElMessage } from 'element-plus';
import { getTaskPerformanceApi, batchAddTaskPerformanceApi, batchDeleteTaskPerformanceApi, getRunPerformanceApi } from '@/api/task/taskpool';
import {
getTaskPerformanceApi,
batchAddTaskPerformanceApi,
batchDeleteTaskPerformanceApi,
getRunPerformanceApi,
} from '@/api/task/taskpool';
import { FileUtil } from '@/utils/file';
import addTaskPerformance from './addTaskPerformance.vue';
import { editPerformanceApi, exportPerformanceApi } from '@/api/task/taskPerformance';
@@ -68,11 +74,11 @@ const props = defineProps({
},
runInfo: {
type: Object,
default: () => { },
default: () => {},
},
taskInfo: {
type: Object,
default: () => { },
default: () => {},
},
showSaveButton: {
type: Boolean,
@@ -82,6 +88,10 @@ const props = defineProps({
type: String,
default: 'task',
},
fullHeight: {
type: Boolean,
default: false,
},
});
const baseTableRef = ref();
const performanceVisible = ref(false);
@@ -91,7 +101,10 @@ const performanceData = ref<any>([]);
const getTaskPerformanceDataFun = async () => {
console.log(props.taskId);
console.log(props.runInfo);
const res: any = props.paramType === 'task' ? await getTaskPerformanceApi({ taskId: props.taskInfo?.id }) : await getRunPerformanceApi({ runId: props.runInfo?.uuid });
const res: any =
props.paramType === 'task'
? await getTaskPerformanceApi({ taskId: props.taskInfo?.id })
: await getRunPerformanceApi({ runId: props.runInfo?.uuid });
if (res && res.code === 200) {
performanceData.value = res.data;
@@ -99,10 +112,8 @@ const getTaskPerformanceDataFun = async () => {
if (baseTableRef.value) {
baseTableRef.value.setDataFun(performanceData.value);
}
}
// ElMessage.success('获取任务性能指标数据' + props.taskId);
};
const openAddPerformanceWindFun = () => {
@@ -110,20 +121,20 @@ const openAddPerformanceWindFun = () => {
};
const addPerformanceFun = async (data: any) => {
console.log(data, 'data');
data.flag = 'add';
const { fullData, visibleData, tableData, footerData } = baseTableRef.value.tableRef.getTableData();
const { fullData, visibleData, tableData, footerData } =
baseTableRef.value.tableRef.getTableData();
const existPerformance = fullData.find((item: any) => {
return item.nodeName === data.nodeName;
}) || null;
const existPerformance =
fullData.find((item: any) => {
return item.nodeName === data.nodeName;
}) || null;
if (existPerformance) {
ElMessage.warning('已存在该指标,无法新增!');
} else {
baseTableRef.value.tableRef.insertAt(data, -1);
}
console.log(fullData, 'fullData');
@@ -132,7 +143,6 @@ const addPerformanceFun = async (data: any) => {
console.log(footerData, 'footerData');
performanceVisible.value = false;
};
const deletePerformanceList = ref<any>([]);
@@ -141,11 +151,9 @@ const delPerformance = (row: any) => {
if (row.flag != 'add') {
deletePerformanceList.value.push(row);
}
};
const batchAddTaskPerformanceFun = async () => {
const list = baseTableRef.value.tableRef.getInsertRecords();
console.log(list, 'list');
@@ -183,7 +191,6 @@ const batchAddTaskPerformanceFun = async () => {
if (props.paramType === 'run') {
obj.runId = props.runInfo.uuid;
obj.taskId = props.runInfo.taskId;
}
console.log(obj, 'objobjobj');
@@ -211,9 +218,7 @@ const batchAddTaskPerformanceFun = async () => {
if (res && res.code === 200) {
// ElMessage.success('新增成功!');
} else {
}
};
const batchDeleteTaskPerformanceFun = async () => {
@@ -226,17 +231,13 @@ const batchDeleteTaskPerformanceFun = async () => {
}
const res: any = await batchDeleteTaskPerformanceApi(ids);
if (res && res.code === 200) {
} else {
}
};
const saveFun = async () => {
await batchAddTaskPerformanceFun();
await batchDeleteTaskPerformanceFun();
};
const uploadLocalFileFun = async (File: any) => {
@@ -323,7 +324,6 @@ const performanceInfoList = [
chineseName: 'uuid',
englishName: 'uuid',
},
];
const performanceFile = ref<any>({});
@@ -368,7 +368,6 @@ const handleLocalChangeExcelFun = async (uploadFile: any, uploadFiles: any) => {
}
for (let i = 0; i < newList.length; i++) {
if (!commonNameList.includes(newList[i].performanceName)) {
baseTableRef.value.tableRef.insertAt(newList[i]);
}
}
@@ -432,7 +431,6 @@ const getFormConfigureFun = async () => {
taskId: props.taskInfo.id,
};
}
}
};
@@ -471,11 +469,9 @@ const updatePerformanceFun = async (data: any) => {
const res: any = await editPerformanceApi(data);
if (res && res.code === 200) {
ElMessage.success('操作成功');
}
await baseTableRef.value.resetFun();
await baseTableRef.value.resetFun();
};
onMounted(async () => {

View File

@@ -41,6 +41,12 @@ export default [
name: 'ProjectDataStatistics',
component: () => import('@/views/data/statistics/index.vue'),
},
{
title: '仿真闭环看板',
path: '/project/dashboard',
name: 'SimulationClosedLoopDashboard',
component: () => import('@/views/task/dashboard/index.vue'),
},
],
},
{

View File

@@ -51,6 +51,7 @@ const lang = {
: 'All Tasks',
: 'Project Management',
: 'Project List',
仿: 'Closed-Loop Dashboard',
: 'Project Detail',
: 'Task Creation',
: 'Task Execution',

View File

@@ -51,6 +51,7 @@ const lang = {
: '所有任务',
: '项目管理',
: '项目列表',
仿: '仿真闭环看板',
: '项目详情',
: '任务创建',
: '任务执行',

View File

@@ -0,0 +1,6 @@
<template>
<Developing />
</template>
<script setup lang="ts">
import Developing from '@/views/error/developing.vue';
</script>

View File

@@ -1,6 +1,12 @@
<template>
<Dialog v-model="visible" diaTitle="生成报告" :width="'80%'" :height="'80%'" :zIndex="100" @close="handleCloseFun">
<Dialog
v-model="visible"
diaTitle="生成报告"
:width="'80%'"
:height="'80%'"
:zIndex="100"
@close="handleCloseFun"
>
<div class="report-page">
<div class="form-box">
<el-form :model="reportFormData" inline>
@@ -15,7 +21,7 @@
</el-form-item>
<el-form-item label="申请日期:">
<el-date-picker
class="w180"
class="w180"
v-model="reportFormData.date"
type="datetime"
placeholder="申请日期"
@@ -33,9 +39,24 @@
<el-input class="w180" v-model="reportFormData.workspace"></el-input>
</el-form-item>
<el-form-item label="分析类型:">
<el-select class="w180" v-model="reportFormData.taskType" >
<el-option v-for="item in taskTypeList" :key="item.value" :label="item.name" :value="item.value"></el-option>
<el-select class="w180" v-model="reportFormData.taskType" @change="taskTypeChangeFun">
<el-option
v-for="item in taskTypeList"
:key="item.value"
:label="item.name"
:value="item.value"
></el-option>
</el-select>
<el-tooltip
class="box-item"
effect="dark"
:content="
'该类型包含的图片文件名称为:' + taskTypeImgFileMap[reportFormData.taskType]
"
placement="top-start"
>
<el-icon class="ml5"><InfoFilled /></el-icon>
</el-tooltip>
</el-form-item>
<el-form-item label="报告版本:">
<el-input class="w180" v-model="reportFormData.reportVer"></el-input>
@@ -45,7 +66,7 @@
</el-form-item>
<el-form-item label="拟定时间:">
<el-date-picker
class="w180"
class="w180"
v-model="reportFormData.formulateTime"
type="datetime"
placeholder="拟定时间"
@@ -55,7 +76,7 @@
</el-form-item>
<el-form-item label="检查时间:">
<el-date-picker
class="w180"
class="w180"
v-model="reportFormData.checkTime"
type="datetime"
placeholder="检查时间"
@@ -65,7 +86,7 @@
</el-form-item>
<el-form-item label="审批时间:">
<el-date-picker
class="w180"
class="w180"
v-model="reportFormData.approveTime"
type="datetime"
placeholder="审批时间"
@@ -86,26 +107,37 @@
<el-form>
<el-form-item label="图片选择:">
<div class="img-content">
<div class="img-item" v-for="item in resultImgList" :key="item.id">
<el-checkbox v-model="item.checkImg" class="check-style" size="large" />
<el-image class="img-style" title="点击预览图片" :src="item.url" :zoom-rate="1.2" :max-scale="7"
:min-scale="0.2" :preview-src-list="[item.url]" show-progress :initial-index="4" fit="cover" />
</div>
<template v-for="item in resultImgList" :key="item.id">
<div class="img-item" v-if="item.show">
<el-checkbox v-model="item.checkImg" class="check-style" size="large" />
<el-image
class="img-style"
title="点击预览图片"
:src="item.url"
:zoom-rate="1.2"
:max-scale="7"
:min-scale="0.2"
:preview-src-list="[item.url]"
show-progress
:initial-index="4"
fit="cover"
/>
</div>
</template>
</div>
</el-form-item>
<el-form-item label="指标选择:">
<taskPerformance ref="taskPerformanceRef" :task-info="currentNodeInfo" :run-info="currentNodeInfo"
:param-type="currentNodeInfo?.nodeType"></taskPerformance>
<taskPerformance
ref="taskPerformanceRef"
:task-info="currentNodeInfo"
:run-info="currentNodeInfo"
:param-type="currentNodeInfo?.nodeType"
></taskPerformance>
</el-form-item>
</el-form>
</div>
</div>
</Dialog>
</template>
<script setup lang="ts">
@@ -120,11 +152,11 @@ const env = import.meta.env;
const props = defineProps({
currentNodeInfo: {
type: Object,
default: () => { },
default: () => {},
},
parentNodeInfo: {
type: Object,
default: () => { },
default: () => {},
},
});
@@ -139,7 +171,7 @@ const reportFormData = reactive<any>({
projectNum: '',
workspaceNum: '',
workspace: '',
taskType: '',
taskType: 'statics',
reportVer: '',
fileNum: '',
formulateTime: '',
@@ -149,25 +181,64 @@ const reportFormData = reactive<any>({
loadcaseName: '',
});
const taskTypeImgFileMap = ref<any>({
statics: [
'model.png',
'stand_distance.png',
'stand_stress.png',
'forklift_stress.png',
'forklift_distance.png',
'forklift_max_stress.png',
],
dynamics: [
'square_stress_img0.png',
'square_stress_img1.png',
'square_distance_img1.png',
'square_stress_img2.png',
'actuat_distance_img1.png',
'actuat_stress_img1.png',
'square_x_curve_distance.png',
'square_y_curve_distance.png',
'square_z_curve_distance.png',
'square_stress_img3.png',
'actuat_x_curve_distance.png',
'actuat_y_curve_distance.png',
'actuat_z_curve_distance.png',
'actuat_stress_img2.png',
],
fluid: [
'fluid_img1.png',
'fluid_img2.png',
'velocity_contour.png',
'fluid_img3.png',
'fluid_img4.png',
'fluid_img5.png',
'fluid_img6.png',
'luid_img7.png',
'luid_img8.png',
'fluid_img9.png',
],
thermal: ['img1.png', 'img2.png', 'img3.png', 'img4.png', 'img5.png'],
});
const taskTypeList = ref([
{
name:'静力学',
value:'statics'
},
{
name:'动力学',
value:'dynamics'
},
{
name:'流体 ',
value:'fluid'
},
{
name:'热分析',
value:'thermal'
},
])
name: '静力学',
value: 'statics',
},
{
name: '动力学',
value: 'dynamics',
},
{
name: '流体 ',
value: 'fluid',
},
{
name: '热分析',
value: 'thermal',
},
]);
const handleCloseFun = () => {
emits('close');
@@ -200,7 +271,6 @@ const createSuccessFun = async () => {
projecInfoReq: reportFormData,
fileName,
});
};
const resultImgList = ref<any>([]);
@@ -218,14 +288,41 @@ const queryDirDataFun = async () => {
url: `${env.VITE_API_IMAGE_PREVIEW_URL}/data/previewImage?fileId=${item.fileId}`,
};
});
showIMgFileList();
}
};
const taskTypeChangeFun = () => {
showIMgFileList();
};
const showIMgFileList = () => {
const list = taskTypeImgFileMap.value[reportFormData.taskType];
for (let i = 0; i < resultImgList.value.length; i++) {
resultImgList.value[i].checkImg = false;
if (list.includes(resultImgList.value[i].name)) {
resultImgList.value[i].show = true;
} else {
resultImgList.value[i].show = false;
}
}
console.log(resultImgList.value, 'resultImgList.value');
// const imgs = resultImgList.value.filter((item: any) => {
// return list.includes(item.name);
// });
// return imgs;
};
onMounted(async () => {
await queryDirDataFun();
reportFormData.reportName = '算例报告_' + dayjs().format('YYYY_MM_DD_HH_mm');
});
</script>
<style lang="scss" scoped>
@@ -240,7 +337,6 @@ onMounted(async () => {
}
.content-box {
.img-content {
width: 100%;
min-height: 200px;
@@ -261,23 +357,22 @@ onMounted(async () => {
position: absolute;
top: 0px;
left: 5px;
}
.img-style {
width: 150px;
height: 150px;
}
}
}
}
.w180{
.ml5{
margin-left: 5px;
}
.w180 {
width: 230px !important;
}
}
</style>

View File

@@ -1,6 +1,6 @@
<template>
<div class="run-detail-page">
<div class="run-title-box">
<div class="run-title-box" v-show="!leftFullScreen && !rightFullScreen">
<div class="task-info">
<div class="task-name">{{ currentRunNodeInfo?.runName }}</div>
<!-- <div class="task-executor">
@@ -18,11 +18,7 @@
<!-- <el-icon class="info" title="未开始" v-if="!runFlowPocesInfo?.status">
<InfoFilled />
</el-icon> -->
<el-icon
class="upload"
title="运行中"
v-if="runFlowPocesInfo?.status === 'running'"
>
<el-icon class="upload" title="运行中" v-if="runFlowPocesInfo?.status === 'running'">
<HelpFilled />
</el-icon>
<el-icon
@@ -68,7 +64,7 @@
</div>
</div>
<div class="run-flow-box">
<div class="run-flow-box" v-show="!leftFullScreen && !rightFullScreen">
<runFlowPage
v-if="runInfo.flowTemplate && showPage"
:run-info="runInfo"
@@ -77,11 +73,21 @@
</runFlowPage>
</div>
<div class="run-info-box">
<div class="info-box-left">
<div :class="leftFullScreen || rightFullScreen ? 'run-info-box is-all-page' : 'run-info-box'">
<div v-if="!rightFullScreen" :class="leftFullScreen ? 'info-box-left allpage ' : 'info-box-left'">
<div class="bottom-title">
<div class="title-name">节点详情</div>
<div class="title-operate"></div>
<div class="title-operate">
<el-icon
v-if="!leftFullScreen"
@click="leftFullScreen = !leftFullScreen"
class="icon-style"
><FullScreen
/></el-icon>
<el-icon v-else @click="leftFullScreen = !leftFullScreen" class="icon-style"
><Close
/></el-icon>
</div>
</div>
<div class="bottom-info-content">
@@ -112,10 +118,20 @@
</div>
</div>
</div>
<div class="info-box-right">
<div v-if="!leftFullScreen" :class="rightFullScreen ? 'info-box-right allpage ' : 'info-box-right'">
<div class="bottom-title">
<div class="title-name">作业相关</div>
<div class="title-operate"></div>
<div class="title-operate">
<el-icon
v-if="!rightFullScreen"
class="icon-style"
@click="rightFullScreen = !rightFullScreen"
><FullScreen
/></el-icon>
<el-icon v-else class="icon-style" @click="rightFullScreen = !rightFullScreen"
><Close
/></el-icon>
</div>
</div>
<div class="bottom-info-content">
<div class="tabs-box">
@@ -137,6 +153,7 @@
:param-type="'run'"
:run-info="runInfo"
:show-save-button="true"
:full-height="true"
></taskPerformance>
<runLogs v-if="taskActiveName === 'job-log'"></runLogs>
<ModelReview v-if="taskActiveName === '3D-model'"></ModelReview>
@@ -182,6 +199,9 @@ const statusList = ref(['未开始', '进行中', '已完成', '回传中', '异
const visible = ref(false);
const nodeActiveName = ref('param');
const taskActiveName = ref('job-list');
const leftFullScreen = ref(false);
const rightFullScreen = ref(false);
const showPage = ref(true);
const handleLeftClickFun = () => {};
@@ -304,6 +324,7 @@ watch(
.run-detail-page {
width: 100%;
height: 100%;
position: relative;
.run-title-box {
width: 100%;
@@ -410,6 +431,13 @@ watch(
display: flex;
align-items: center;
justify-content: flex-end;
padding-right: 10px;
.icon-style {
font-size: 16px;
color: var(--el-color-primary);
cursor: pointer;
}
}
}
@@ -431,6 +459,20 @@ watch(
}
}
}
.allpage {
width: 100%;
height: 100%;
}
}
.is-all-page {
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 20;
position: absolute;
}
.blue {
@@ -450,7 +492,7 @@ watch(
}
.success {
color: #67c23a;
color: #67c23a;
}
.error {

View File

@@ -19,6 +19,7 @@
keyResultType,
runId: runInfo.uuid,
}"
:full-height="true"
:action-list="actionList"
>
<template #leftOptions>
@@ -44,6 +45,79 @@
: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>
<template #footer>
<div>
<el-button @click="closeFun">关闭</el-button>
@@ -60,8 +134,10 @@ import {
addSimulationKeyResultApi,
deleteSimulationKeyResultApi,
editSimulationKeyResultApi,
listQuantitiesApi,
listUnitsApi,
} from '@/api/project/run';
import { ref, watch, nextTick, onMounted } from 'vue';
import { ref, watch, nextTick, onMounted, reactive } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import { ElMessage } from 'element-plus';
import { FILE_TYPE } from '@/utils/enum/file';
@@ -76,6 +152,16 @@ const props = defineProps({
},
});
const uploadFIleFormData = reactive<any>({
quantityType: '',
units: '',
xQuantityType: '',
xUnits: '',
yQuantityType: '',
yUnits: '',
});
const baseTableRef = ref();
const tableFormRef = ref();
const visible = ref(false);
@@ -189,6 +275,10 @@ const openFun = () => {
currentFileInfo.value = {};
nextTick(() => {
tableFormRef.value.resetFun();
for (const key in uploadFIleFormData) {
uploadFIleFormData[key] = '';
}
});
};
@@ -203,7 +293,20 @@ const submitFun = async () => {
}
}
const res: any = await editSimulationKeyResultApi(paramData);
for (const key in uploadFIleFormData) {
if (!getparamListFUn().includes(key)) {
delete uploadFIleFormData[key];
}
}
const param = {
...paramData,
...uploadFIleFormData,
};
param.quantityType = quantityTypeList.value.find((item: any) => {
return item.name === uploadFIleFormData.quantityType;
})?.label;
const res: any = await editSimulationKeyResultApi(param);
if (res && res.code === 200) {
ElMessage.success('操作成功');
visible.value = false;
@@ -240,6 +343,12 @@ const submitFun = async () => {
}
}
for (const key in uploadFIleFormData) {
if (!getparamListFUn().includes(key)) {
delete uploadFIleFormData[key];
}
}
const params = {
fileName: name,
name: name,
@@ -249,8 +358,11 @@ const submitFun = async () => {
keyResultType: keyResultType.value,
runId: runInfo.value.uuid,
...paramData,
...uploadFIleFormData,
};
params.quantityType = quantityTypeList.value.find((item: any) => {
return item.name === uploadFIleFormData.quantityType;
})?.label;
await addSimulationKeyResultApi(params).then((res: any) => {
if (res.code === 200) {
} else {
@@ -308,6 +420,10 @@ const actionList = ref([
currentFileInfo.value = row;
nextTick(() => {
tableFormRef.value.setFormDataFun(currentFileInfo.value);
for (const key in uploadFIleFormData) {
uploadFIleFormData[key] = currentFileInfo.value[key];
}
});
},
},
@@ -365,6 +481,47 @@ const chnageFun = async (data: any) => {
}
}
};
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 (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 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'];
}
};
watch(
() => props.currentRunIfno,
@@ -383,7 +540,9 @@ watch(
}
);
onMounted(() => {});
onMounted(async () => {
await getQuantityTypeFun();
});
</script>
<style lang="scss" scoped>
@@ -398,5 +557,10 @@ onMounted(() => {});
align-items: center;
justify-content: flex-end;
}
.dir-content{
width: 100%;
height: calc(100% - 50px);
}
}
</style>

View File

@@ -13,6 +13,7 @@
// uuid:nodeInfo.uuid
}"
:show-checkbox="true"
:action-list="actionList"
>
<template #leftOptions>
<el-upload :show-file-list="false" :before-upload="beforeUploadFun">
@@ -20,7 +21,13 @@
</el-upload>
<el-button type="primary" class="ml10" @click="downLoadFileFun">下载文件</el-button>
</template>
<template #fileSize="{ row }">
<span>{{ formatFileSize(row.fileSize) }}</span>
</template>
</BaseTable>
<FilePreview v-model="previewVisible" :fileId="currentRow?.id" />
</div>
</template>
@@ -29,6 +36,9 @@ import { ref, watch } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import { queryRunDirApi, uploadRunFilesApi } from '@/api/project/run';
import { ElMessage } from 'element-plus';
import { downloadFileById } from '@/utils/file';
import FilePreview from '@/components/common/filePreview/index.vue';
import { formatFileSize } from '@/utils/file';
const env = import.meta.env;
@@ -89,6 +99,32 @@ const reloadFun = async () => {
}
};
const currentRow = ref();
const previewVisible = ref(false);
const previewFileFun = (row: any) => {
currentRow.value = row;
previewVisible.value = true;
};
const actionList = ref([
{
title: '下载',
type: 'primary',
click: (row: any) => {
downloadFileById(row.id);
},
},
{
title: '预览',
type: 'primary',
click: (row: any) => {
previewFileFun(row);
},
},
]);
watch(
() => props.nodeInfo,
(newVal) => {

View File

@@ -15,7 +15,7 @@
<div class="task-content">
<div class="tabs-component" v-if="activeName === 'performance'">
<taskPerformance :task-id="currentTaskInfo?.id" :show-save-button="true" :task-info="currentTaskInfo" ></taskPerformance>
<taskPerformance :task-id="currentTaskInfo?.id" :show-save-button="true" :task-info="currentTaskInfo" :full-height="true" ></taskPerformance>
</div>
<div class="tabs-component" v-if="activeName === 'picture'">
<resultImage :task-id="currentTaskInfo?.uuid"></resultImage>

View File

@@ -84,6 +84,7 @@
<template #progress="{ row }"> {{ row.progress || 0 }}% </template>
<template #approvalStatus="{ row }">
<StatusDot
class="clcik-approval"
:status="getApproveStyleClass(row.approvalStatus || TASK_APPROVE_STATUS_ENUM.NOT_APPROVED)"
:title="TASK_APPROVE_STATUS.O[row.approvalStatus || TASK_APPROVE_STATUS_ENUM.NOT_APPROVED]"
@click="seeApproveDetailFun(row)"
@@ -133,6 +134,7 @@ import { NODE_TYPE } from '@/utils/enum/node';
import { CommonStore } from '@/stores/common';
import attachments from '@/views/task/simulationTask/components/attachments.vue';
import { disposeMemberList } from '../../projectDetail/components/project';
// import { useDict } from '@/utils/useDict';
// import { disposeSimType } from '@/utils/task';
import {
TASK_PROCESS_STATUS_OBJ,
@@ -459,4 +461,8 @@ onMounted(() => {
color: var(--el-color-primary);
cursor: pointer;
}
.clcik-approval {
cursor: pointer;
}
</style>

View File

@@ -203,6 +203,7 @@ const confirmFun = async () => {
achieveStatus: string;
progress: number;
finishTime?: string;
extras: any[];
};
} = {
taskIds: [fromData.uuid],
@@ -210,6 +211,7 @@ const confirmFun = async () => {
exeStatus: fromData.exeStatus,
achieveStatus: fromData.achieveStatus,
progress: fromData.progress,
extras: fromData.extras,
},
};
if (fromData.exeStatus === TASK_PROCESS_STATUS.COMPLETED) {