This commit is contained in:
weibl
2025-11-28 14:05:10 +08:00
26 changed files with 301 additions and 293 deletions

View File

@@ -37,3 +37,9 @@ npm run build
```sh
npm run lint
```
### 部署到 161 测试环境
```sh
npm run deploy:test
```

View File

@@ -1,39 +0,0 @@
# spdm
This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
## Type Support for `.vue` Imports in TS
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
## Customize configuration
See [Vite Configuration Reference](https://vite.dev/config/).
## Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Type-Check, Compile and Minify for Production
```sh
npm run build
```
### Lint with [ESLint](https://eslint.org/)
```sh
npm run lint
```

View File

@@ -38,14 +38,14 @@
</div>
</el-tooltip>
</template>
<el-tooltip :content="$t('表格.导出')" placement="top" >
<el-tooltip v-if="exportApi" :content="$t('表格.导出')" placement="top" >
<div v-if="exportApi" class="icon-btn" @click="exportFun">
<el-icon :size="18">
<Download />
</el-icon>
</div>
</el-tooltip>
<el-tooltip :content="$t('表格.导入')" placement="top" >
<el-tooltip v-if="showImport" :content="$t('表格.导入')" placement="top" >
<div v-if="showImport" class="icon-btn" @click="formDiaVisible = true">
<el-icon :size="18">
<Upload />

View File

@@ -181,3 +181,9 @@ const removeFun = (key: string, val: any) => {
});
};
</script>
<style lang="scss" scoped>
.upload-btn {
width: 100%;
}
</style>

View File

@@ -22,14 +22,14 @@
<div class="item">
<div class="btns">
<slot name="leftOptions" />
<el-tooltip :content="$t('表格.导出')" placement="top" >
<el-tooltip v-if="exportApi" :content="$t('表格.导出')" placement="top" >
<div v-if="exportApi" class="icon-btn" @click="exportFun">
<el-icon :size="18">
<Download />
</el-icon>
</div>
</el-tooltip>
<el-tooltip :content="$t('表格.导入')" placement="top" >
<el-tooltip v-if="showImport" :content="$t('表格.导入')" placement="top" >
<div v-if="showImport" class="icon-btn" @click="formDiaVisible = true">
<el-icon :size="18">
<Upload />

View File

@@ -55,7 +55,7 @@ import emitter from '@/utils/eventBus';
const taskStatusObj: any = {}; // 更具uploadTaskId和businessId记录所以任务文件的上传状态
const listVisible = ref(false);
const listData = ref<any>([]);
const chunkSize = 1024 * 1024 * 5; // 每片5MB
const chunkSize = 1024 * 1024 * 10; // 每片10MB
const UPLOAD_FILE_STATUS: any = { // TODO
'-1': '上传失败',
'0': '待上传',

View File

@@ -95,9 +95,9 @@ onMounted(() => {
.operate-form {
width: 100%;
height: 40px;
display: flex;
align-items: center;
justify-content: flex-end;
.el-form {
display: flex;
@@ -114,7 +114,7 @@ onMounted(() => {
.task-img-box {
width: 100%;
height: calc(100% - 50px);
height: calc(100% - 60px);
margin-top: 10px;
display: flex;
flex-wrap: wrap;

View File

@@ -58,8 +58,8 @@ import { initEcharts } from '../common/echartCard/echartsOptions';
const props = defineProps({
taskId: {
type: Number,
default: 100,
type: String,
default: '',
},
});
const runTreeData = ref<any>([]);
@@ -130,16 +130,19 @@ const getCheckedNodesCurveFun = async () => {
});
if (res && res.code === 200) {
curveList.value = res.data.data.map((item: any, index: any) => {
curveList.value = res.data?.data?.map((item: any, index: any) => {
return {
...item,
num: index + 1,
};
});
}
const list = curveList.value.map((item: any) => item.num);
curveNumData.value = Array.from(new Set(list));
getCommonNumCurveFun();
if (curveList.value.length) {
const list = curveList.value.map((item: any) => item.num);
curveNumData.value = Array.from(new Set(list));
getCommonNumCurveFun();
}
console.log(curveNumData.value, 'curveNumData.value');
};
@@ -260,7 +263,7 @@ onMounted(() => {
width: 100%;
height: 100%;
display: flex;
align-items: center;
// align-items: center;
justify-content: space-between;
// :deep(.is-disabled) {

View File

@@ -34,8 +34,13 @@
<FilePreview v-model="previewVisible" :fileId="currentRow?.id" />
<uploadDeliverableFilePage v-if="uploadFileVisible" :curentTaskInfo="taskInfo" @close="uploadFileVisible = false" @update="updateTableDataFun"></uploadDeliverableFilePage>
</div>
<Teleport to="body">
<uploadDeliverableFilePage v-if="uploadFileVisible" :curentTaskInfo="taskInfo" @close="uploadFileVisible = false" @update="updateTableDataFun"></uploadDeliverableFilePage>
</Teleport>
</template>
<script setup lang="ts">

View File

@@ -1,168 +1,132 @@
<template>
<div class="task-performance-page">
<el-form class="form-style" :model="taskFormData" labelPosition="left" labelWidth="120">
<el-form-item label="任务名称">
<el-input v-model="taskFormData.nodeName"></el-input>
</el-form-item>
<el-form-item label="英文名">
<el-input v-model="taskFormData.englishName"></el-input>
</el-form-item>
<el-form-item label="任务状态">
<el-select v-model="taskFormData.exeStatus">
<el-option v-for="item in exeStatusList" :label="item.name" :value="item.value" :key="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="风险状态">
<el-select v-model="taskFormData.achieveStatus">
<el-option
v-for="item in achieveStatusList"
:label="item.name"
:value="item.value"
:key="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="任务编号">
<el-input v-model="taskFormData.nodeCode"></el-input>
</el-form-item>
<el-form-item label="任务描述">
<el-input type="textarea" v-model="taskFormData.description" :rows="4"></el-input>
</el-form-item>
<el-form-item label="计划开始时间">
<el-date-picker
v-model="taskFormData.beginTime"
type="date"
placeholder="选择计划开始时间"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item label="计划完成时间">
<el-date-picker
v-model="taskFormData.endTime"
type="date"
placeholder="选择计划开完成时间"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-form>
<TableForm
ref="tableFormRef"
tableName="PROJECT_TASK_MODAL"
showDisabled
:colNum="2"
:rule-data="ruleData"
>
<template #form-flowTemplate>
<flowTemplateSelect v-model="selectedFlowTemplate" />
</template>
<template #form-standard>
<knowledgeSelect v-model="standard"/>
</template>
</TableForm>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive } from 'vue';
import { ref, onMounted, reactive, watch, nextTick } from 'vue';
import TableForm from '@/components/common/table/tableForm.vue';
import { getTagKeyMap, NODE_TYPE } from '@/utils/enum/node';
import { getMemberListIds } from '@/utils/task';
import flowTemplateSelect from '@/components/common/treeCaseTable/flowTemplateSelect.vue';
import knowledgeSelect from '@/components/common/treeCaseTable/knowledgeSelect.vue';
import { disposeTagKey } from '@/views/task/projectDetail/components/project';
const props = defineProps({
taskId: {
type: Number,
default: 100,
},
taskInfo: {
type: Object,
default: () => { },
},
});
const tableFormRef = ref();
const taskFormData = reactive<any>({
id: '',
nodeName: '',
englishName: '',
exeStatus: '',
achieveStatus: '',
nodeType: '',
nodeCode: '',
memberList: '',
beginTime: '',
endTime: '',
flowTemplateName: '',
workRate: '',
standard: '',
days: '',
performanceType: '',
difficult: '',
analyseSoftware: '',
imageFileId: '',
bCapacity: '',
method: '',
highValue: '',
value: '',
unit: '',
department: '',
section: '',
group: '',
description: '',
operation: '',
const localDetail = ref<any>({});
const ruleData = ref<any>({
highValue: [
{
message: '指标类型为数值时,目标值应为数字',
trigger: 'change',
validator: (val: unknown) => {
if (val === null || val === undefined || val === '') {
return true;
}
const formData = tableFormRef.value?.getFormDataFun();
if (formData.nodeType === NODE_TYPE.PERFORMANCE) {
if (formData.performanceType === '1') {
const s = String(val ?? '').trim();
return s !== '' && Number.isFinite(Number(s));
} else if (formData.performanceType === '2') {
return true;
} else {
return true;
}
}
return true;
},
},
],
});
const exeStatusList = ref([
{
name: '未开始',
value: '0',
},
{
name: '进行中',
value: '1',
},
{
name: '已完成',
value: '2',
},
{
name: '延期',
value: '3',
},
{
name: '终止',
value: '4',
},
]);
const achieveStatusList = ref([
{
name: '不合格',
value: 1,
},
{
name: '风险可控',
value: 2,
},
{
name: '未分析',
value: 3,
},
{
name: '合格',
value: 4,
},
]);
const getTaskInfoFun = () => {
if (props.taskInfo) {
for (const key in taskFormData) {
taskFormData[key] = props.taskInfo[key];
}
// 流程模板相关
const selectedFlowTemplate = ref<any>(null);
const standard = ref();
watch(() => props.taskInfo, (newVal) => {
if (newVal) {
localDetail.value = newVal;
nextTick(() => {
tableFormRef.value?.setFormDataFun({ ...localDetail.value, eMemberList: getMemberListIds(localDetail.value.eMemberList), pMemberList: getMemberListIds(localDetail.value.pMemberList) });
standard.value = localDetail.value.standard;
if (localDetail.value.flowTemplate) {
selectedFlowTemplate.value = localDetail.value.flowTemplate;
}
});
}
console.log('根据任务id获取任务详情数据' + taskFormData);
}, {
immediate: true,
deep: true,
});
const getFormData = async () => {
const valid = await tableFormRef.value?.validateFun();
if (valid) {
const formData = tableFormRef.value?.getFormDataFun();
formData.standard = standard.value;
if (selectedFlowTemplate.value) {
formData.flowTemplate = selectedFlowTemplate.value;
}
if (localDetail.value?.tagKeyList) {
const tagKeyList = disposeTagKey(formData, localDetail.value?.tagKeyList || [], getTagKeyMap());
console.log('tagKeyList', tagKeyList);
} else {
formData.tagKeyList = [];
}
// 处理时间范围
if (formData.planTime) {
formData.beginTime = formData.planTime[0];
formData.endTime = formData.planTime[1];
}
formData.pMemberIds = '';
if (formData.pMemberList?.length > 0) {
formData.pMemberIds = formData.pMemberList;
}
formData.eMemberIds = '';
if (formData.eMemberList?.length > 0) {
formData.eMemberIds = formData.eMemberList;
}
return formData;
} else {
return null;
}
};
defineExpose({
taskFormData,
getFormData,
});
onMounted(() => {
getTaskInfoFun();
});
</script>

View File

@@ -46,8 +46,8 @@ import UploadFile from '@/components/common/uploadFile/index.vue';
const props = defineProps({
taskId: {
type: Number,
default: 100,
type: String,
default: '',
},
showFilter: {
type: Boolean,

View File

@@ -50,8 +50,8 @@ import addTaskPerformance from './addTaskPerformance.vue';
const props = defineProps({
taskId: {
type: Number,
default: 100,
type: String,
default: '',
},
runInfo: {
type: Object,

View File

@@ -44,8 +44,8 @@ import UploadFile from '@/components/common/uploadFile/index.vue';
const props = defineProps({
taskId: {
type: Number,
default: 100,
type: String,
default: '',
},
showFilter: {
type: Boolean,

View File

@@ -5,7 +5,7 @@
diaTitle="上传交付物"
:width="'70%'"
:height="'70%'"
:zIndex="100"
:zIndex="101"
@close="handleCloseFun"
show-footer
>

View File

@@ -201,3 +201,14 @@ export const exportFile = (api: any, tableName: string, fileName: string, params
});
};
/**
* 根据文件id下载文件
* @param fileId
*/
export const downloadFileById = (fileId: number) => {
const link = document.createElement('a');
link.href = `${env.VITE_API_FILE_URL}/data/downloadFile?fileId=${fileId}`;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};

View File

@@ -18,6 +18,7 @@ const lang = {
'上一步': 'Previous',
'下一步': 'Next',
'查看': 'View',
'审批类型': 'Approval Type',
},
'菜单': {
'首页': 'Home',

View File

@@ -18,6 +18,7 @@ const lang = {
'上一步': '上一步',
'下一步': '下一步',
'查看': '查看',
'审批类型': '审批类型',
},
'菜单': {
'首页': '首页',

View File

@@ -146,9 +146,9 @@ import i18n from '@/utils/i18n';
import FilePreview from '@/components/common/filePreview/index.vue';
import emitter from '@/utils/eventBus';
import { TABLE_NAME } from '@/utils/enum/tableName';
import { downloadFileById } from '@/utils/file';
const { KNOWLEDGE_APPROVE_STATUS, KNOWLEDGE_APPROVE_TYPE } = useDict('KNOWLEDGE_APPROVE_STATUS', 'KNOWLEDGE_APPROVE_TYPE');
const env = import.meta.env;
type Data = RenderContentContext['data']
const fileTreeRef = ref<any>();
const baseTableRef = ref<any>();
@@ -253,7 +253,7 @@ const actionList = computed(() => {
title: i18n?.global?.t('通用.下载'),
type: 'primary',
click: (row: any) => {
downloadFileFun(row);
downloadFileById(row.id);
},
hide: (row: any) => {
return row.dataType !== 2;
@@ -398,10 +398,7 @@ const previewFileFun = (row: any) => {
currentRow.value = row;
previewVisible.value = true;
};
const downloadFileFun = (row: any) => {
const downloadUrl = `${env.VITE_API_FILE_URL}/data/downloadFile?fileId=${row.id}`;
window.open(downloadUrl, '_blank');
};
const editFileFun = (row: any) => {
currentRow.value = row;
visible.value = true;

View File

@@ -166,7 +166,8 @@
import { ref, onMounted } from 'vue';
import FileTree from '@/components/common/dataFileTree/index.vue';
import { getSimulationNodeTreeApi, getAllTemplateApi } from '@/api/data/dimensionTemplate';
import { addNodeForDataApi, addTaskForDataApi } from '@/api/project/node';
import { addNodeForDataApi, addTaskForDataApi, getNodeDetailForDataApi } from '@/api/project/node';
import { getTaskDetailApi } from '@/api/project/task';
import { dataOverViewListSimulationNodeFilesApi, dataOverViewDeleteSimulationNodeFilesApi, dataOverViewUploadSimulationNodeFilesApi } from '@/api/data/dataOverView';
import BaseTable from '@/components/common/table/baseTable.vue';
import Configuration from './components/configuration.vue';
@@ -246,6 +247,7 @@ const editFun = () => {
ElMessage.warning('请选择一个目录');
return;
}
nodeType.value = currentData.value.relatedResourceUuidOwnType;
if (currentData.value.relatedResourceUuidOwnType === NODE_TYPE.PROJECT) {
editId.value = currentData.value.relatedResourceUuid;
showProjectInfoDialog.value = true;
@@ -254,15 +256,29 @@ const editFun = () => {
editId.value = currentData.value.relatedParentUuid;
showNodeInfoDialog.value = true;
}
if (currentData.value.relatedResourceUuidOwnType === NODE_TYPE.WORKSPACE) {
if ([NODE_TYPE.WORKSPACE, NODE_TYPE.MACHINE].includes(currentData.value.relatedResourceUuidOwnType)) {
editId.value = currentData.value.relatedParentUuid;
editData.value = {
nodeName: currentData.value.originalName,
englishName: '',
nodeCode: '',
nodeType: currentData.value.relatedResourceUuidOwnType,
const params = {
relatedResourceUuid: currentData.value.relatedResourceUuid,
};
modalVisible.value = true;
getNodeDetailForDataApi(params).then((res: any) => {
if (res.code === 200) {
editData.value = res.data;
}
modalVisible.value = true;
});
}
if ([NODE_TYPE.TASK].includes(currentData.value.relatedResourceUuidOwnType)) {
editId.value = currentData.value.relatedParentUuid;
const params = {
relatedResourceUuid: currentData.value.relatedResourceUuid,
};
getTaskDetailApi(params).then((res: any) => {
if (res.code === 200) {
editData.value = res.data;
}
modalVisible.value = true;
});
}
};

View File

@@ -0,0 +1,50 @@
<template>
<div class="header">
<div class="label">{{ $t('通用.审批类型') }}</div>
<div class="content">
<el-tag :type="tagTypeMap[approveAction]" size="small">{{ contents }}</el-tag>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, watchEffect } from 'vue';
interface Props {
data: any;
}
const props = withDefaults(defineProps<Props>(), {
data: {},
});
const contents = ref<string>('');
const approveAction = ref<any>();
const tagTypeMap: any = {
1: 'success',
2: 'primary',
3: 'danger',
};
watchEffect(() => {
if (props.data) {
const approveContents = JSON.parse(props.data?.approveContents || '{}');
contents.value = approveContents.contents || '';
approveAction.value = props.data?.approveAction || '';
}
});
</script>
<style lang="scss" scoped>
.header {
margin-bottom: 24px;
display: flex;
}
.label {
font-weight: 600;
margin-right: 16px;
}
.content {
white-space: pre-wrap;
}
</style>

View File

@@ -1,10 +1,5 @@
<template>
<div class="header">
<div class="label">审批类型</div>
<div class="content">
<el-tag :type="tagTypeMap[approveAction]" size="small">{{ contents }}</el-tag>
</div>
</div>
<approvalTypeHeader :data="data" />
<BaseTable
ref="baseTableRef"
tableName="TASK_DELIVERABLE"
@@ -31,6 +26,7 @@
<script setup lang="ts">
import { computed, ref, watchEffect } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import approvalTypeHeader from './approvalTypeHeader.vue';
import i18n from '@/utils/i18n';
import { formatFileSize } from '@/utils/file';
import FilePreview from '@/components/common/filePreview/index.vue';
@@ -44,20 +40,11 @@ const props = withDefaults(defineProps<Props>(), {
});
const env = import.meta.env;
const knowledgeList = ref<any[]>([]);
const contents = ref<string>('');
const approveAction = ref<any>();
const tagTypeMap:any = {
1: 'success',
2: 'primary',
3: 'danger',
};
const baseTableRef = ref<any>(null);
watchEffect(() => {
if (props.data) {
const approveContents = JSON.parse(props.data?.approveContents || '{}');
knowledgeList.value = approveContents.afterData || approveContents.beforeData || null;
contents.value = approveContents.contents || '';
approveAction.value = props.data?.approveAction || '';
if (baseTableRef.value && knowledgeList.value) {
baseTableRef.value?.setDataFun(knowledgeList.value);
}
@@ -99,17 +86,3 @@ const actionList = computed(() => {
});
</script>
<style lang="scss" scoped>
.header {
margin-bottom: 24px;
display: flex;
}
.label {
font-weight: 600;
margin-right: 16px;
}
.content {
white-space: pre-wrap;
}
</style>

View File

@@ -1,10 +1,5 @@
<template>
<div class="header">
<div class="label">审批类型</div>
<div class="content">
<el-tag :type="tagTypeMap[approveAction]" size="small">{{ contents }}</el-tag>
</div>
</div>
<approvalTypeHeader :data="data" />
<BaseTable
ref="baseTableRef"
:tableName="TABLE_NAME.SIMULATION_KNOWLEDGE_APPROVE_PREVIEW"
@@ -31,10 +26,12 @@
<script setup lang="ts">
import { computed, ref, watchEffect } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import approvalTypeHeader from './approvalTypeHeader.vue';
import i18n from '@/utils/i18n';
import { formatFileSize } from '@/utils/file';
import FilePreview from '@/components/common/filePreview/index.vue';
import { TABLE_NAME } from '@/utils/enum/tableName';
import { downloadFileById } from '@/utils/file';
interface Props {
data: any;
@@ -43,22 +40,12 @@ interface Props {
const props = withDefaults(defineProps<Props>(), {
data: {},
});
const env = import.meta.env;
const knowledgeList = ref<any[]>([]);
const contents = ref<string>('');
const approveAction = ref<any>();
const tagTypeMap:any = {
1: 'success',
2: 'primary',
3: 'danger',
};
const baseTableRef = ref<any>(null);
watchEffect(() => {
if (props.data) {
const approveContents = JSON.parse(props.data?.approveContents || '{}');
knowledgeList.value = approveContents.afterData || approveContents.beforeData || null;
contents.value = approveContents.contents || '';
approveAction.value = props.data?.approveAction || '';
if (baseTableRef.value && knowledgeList.value) {
baseTableRef.value?.setDataFun(knowledgeList.value);
}
@@ -70,10 +57,7 @@ const previewFileFun = (row: any) => {
currentRow.value = row;
previewVisible.value = true;
};
const downloadFileFun = (row: any) => {
const downloadUrl = `${env.VITE_API_FILE_URL}/data/downloadFile?fileId=${row.id}`;
window.open(downloadUrl, '_blank');
};
const actionList = computed(() => {
return [
{
@@ -90,7 +74,7 @@ const actionList = computed(() => {
title: i18n?.global?.t('通用.下载'),
type: 'primary',
click: (row: any) => {
downloadFileFun(row);
downloadFileById(row.id);
},
hide: (row: any) => {
return row.dataType !== 2;
@@ -100,17 +84,3 @@ const actionList = computed(() => {
});
</script>
<style lang="scss" scoped>
.header {
margin-bottom: 24px;
display: flex;
}
.label {
font-weight: 600;
margin-right: 16px;
}
.content {
white-space: pre-wrap;
}
</style>

View File

@@ -59,7 +59,7 @@
</div>
<div class="run-flow-box">
<FlowView v-if="runInfo.flowTemplate" :show-config-page="false" :flow-uuid="runInfo.flowTemplate" @detail="getNodeTailFun"></FlowView>
</div>
<div class="run-info-box">
@@ -131,6 +131,7 @@ import taskPerformance from '@/components/taskDetail/taskPerformance.vue';
import runLogs from './runPagecomponent/runLogs.vue';
import ModelReview from './runPagecomponent/3DModelReview.vue';
import runVersionTree from './runPagecomponent/runVersionTree.vue';
import FlowView from '@/components/common/flow/flowView.vue';
const props = defineProps({
runInfo: {
@@ -154,6 +155,11 @@ const handleRightClickFun = () => {
};
const getNodeTailFun = (node:any) => {
console.log(node, 'node');
};
const currentRunNodeInfo = ref<any>({});
watch(() => props.runInfo, (newVal) => {
@@ -240,16 +246,17 @@ watch(() => props.runInfo, (newVal) => {
.run-flow-box {
width: 100%;
height: 30%;
height: 300px;
background-color: #fff;
margin-bottom: 10px;
border-radius: 2px;
overflow: hidden;
}
.run-info-box {
width: 100%;
height: calc(70% - 70px);
height: calc(100% - 370px);
display: flex;
align-items: center;
justify-content: space-between;

View File

@@ -100,6 +100,7 @@
:taskId="currentTaskInfo.id"
:current-task-info="currentTaskInfo"
@closeFn="showTaskDetailDialog = false"
@updateFn="updateTaskInfoFun"
>
</taskDetail>
</div>
@@ -108,9 +109,10 @@
import { onMounted, ref } from 'vue';
import { getTaskTreeFun } from './projectApi';
import { NODE_TYPE } from '@/utils/enum/node';
import { getChildrenNodeListApi } from '@/api/project/node';
import { getChildrenNodeListApi, modifyNodeTaskPerformanceApi } from '@/api/project/node';
import taskDetail from './taskDetail.vue';
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
import { getTagMapList } from '@/utils/task';
const props = defineProps<{
projectUuid: string;
@@ -186,6 +188,30 @@ const openTaskDetailDialogFun = (row?: any) => {
showTaskDetailDialog.value = true;
};
const updateTaskInfoFun = async (info:any) => {
const { flag, data }:any = info;
console.log(flag, 'flag');
console.log(data, 'data');
if (flag === 'info') {
const res:any = await modifyNodeTaskPerformanceApi({
addNodeList: [],
editNodeList: [data],
deleteNodeList: [],
ownRootNodeUuid: data.tag1,
tagMap: getTagMapList(),
});
if (res && res.code === 200) {
await getTaskTreeList();
}
}
showTaskDetailDialog.value = false;
};
const refreshPhaseList = () => {
getPhaseListApi();
};

View File

@@ -1,6 +1,6 @@
<template>
<div class="comp-content">
<Dialog v-model="dialogVisible" diaTitle="任务详情" :width="'70%'" :height="700" @close="closeFun" show-footer>
<Dialog v-model="dialogVisible" diaTitle="任务详情" :width="'70%'" :height="700" @close="closeFun" show-footer :zIndex="100">
<el-tabs v-model="activeTab">
<el-tab-pane label="任务详情" name="info">
<div class="task-tab-content">
@@ -8,9 +8,14 @@
</taskInfo>
</div>
</el-tab-pane>
<el-tab-pane label="计算模型" name="model">
<div class="task-tab-content">
<taskModel v-if="activeTab === 'model'" :task-id="taskId"></taskModel>
</div>
</el-tab-pane>
<el-tab-pane label="性能指标" name="performance">
<div class="task-tab-content">
<taskPerformance ref="taskPerformanceRef" v-if="activeTab === 'performance'" :task-id="taskId">
<taskPerformance ref="taskPerformanceRef" v-if="activeTab === 'performance'" :task-id="taskId" :param-type="'task'" :run-info="currentTaskInfo" :task-info="currentTaskInfo" :show-save-button="true">
</taskPerformance>
</div>
</el-tab-pane>
@@ -31,14 +36,10 @@
</el-tab-pane>
<el-tab-pane label="交付物" name="deliverables">
<div class="task-tab-content">
<taskDeliverable v-if="activeTab === 'deliverables'" :task-id="taskId"></taskDeliverable>
</div>
</el-tab-pane>
<el-tab-pane label="计算模型" name="model">
<div class="task-tab-content">
<taskModel v-if="activeTab === 'model'" :task-id="taskId"></taskModel>
<taskDeliverable v-if="activeTab === 'deliverables'" :task-id="currentTaskInfo?.id" :task-info="currentTaskInfo"></taskDeliverable>
</div>
</el-tab-pane>
</el-tabs>
<template #footer>
<div>
@@ -64,8 +65,8 @@ import taskCurve from '@/components/taskDetail/taskCurve.vue';
const emits = defineEmits(['closeFn', 'updateFn']);
defineProps({
taskId: {
type: Number,
default: 100,
type: String,
default: '',
},
currentTaskInfo: {
type: Object,
@@ -89,7 +90,7 @@ const updateFun = async () => {
}
if (activeTab.value === 'info') {
data = taskInfoRef.value.taskFormData();
data = await taskInfoRef.value.getFormData();
}
emits('updateFn', {
@@ -118,6 +119,7 @@ const updateFun = async () => {
.task-tab-content {
width: 100%;
height: 100%;
min-height: 500px;
}
}
</style>

View File

@@ -44,7 +44,7 @@
</div>
</template>
</BaseTable> -->
<taskDetail v-if="showTaskDetailDialog" :taskId="currentTaskInfo.id" @closeFn="showTaskDetailDialog = false">
<taskDetail v-if="showTaskDetailDialog" :taskId="currentTaskInfo.id" :currentTaskInfo="currentTaskInfo" @closeFn="showTaskDetailDialog = false" @updateFn="updateTaskInfoFun">
</taskDetail>
</div>
</template>
@@ -95,6 +95,15 @@ const showTaskDetailFun = (row:any) => {
currentTaskInfo.value = row;
};
const updateTaskInfoFun = async (info:any) => {
const { flag, data }:any = info;
console.log(flag, 'flag');
console.log(data, 'data');
showTaskDetailDialog.value = false;
};
const attentionTaskFun = async(row:any, isAttention:boolean) => {
const res:any = await attentionTaskApi(disposeAttentionParams(row.uuid, isAttention));
if (res.code === 200) {