fix:bug清单内容修复

This commit is contained in:
2025-11-28 11:25:35 +08:00
parent d6d93d7aac
commit d33050f1f9
12 changed files with 187 additions and 171 deletions

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

@@ -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) {