refactor: 工况库、指标库替换组件

This commit is contained in:
JiangSheng
2025-11-05 10:35:39 +08:00
parent 793a66c272
commit a1ab0ef938
7 changed files with 452 additions and 130 deletions

View File

@@ -37,6 +37,7 @@
:data="formatData"
height="100%"
v-bind="$attrs"
keepSource
:seq-config="{startIndex: (current - 1) * size}"
:column-config="{
drag: true,
@@ -111,6 +112,7 @@ import TableSearch from './tableSearch.vue';
import TableFormDia from './tableFormDia.vue';
import { getFormConfigureApi } from '@/api/system/systemData';
import { formOptionsFormat } from './lib';
import { uniqBy } from 'lodash-es';
const emit = defineEmits(['searchChange', 'load']);
@@ -332,6 +334,21 @@ const removeFun = (data: any) => {
return vxeTableRef.value.remove(data);
}
};
const editRecords = ref<any>({
insertRecords: [],
removeRecords: [],
updateRecords: [],
});
// 获取表格增删改的行
const getRecordSetFun = () => {
const { insertRecords, removeRecords, updateRecords } = vxeTableRef.value?.getRecordset();
return {
insertRecords: uniqBy([...insertRecords, ...editRecords.value.insertRecords], 'fakeId'),
removeRecords: uniqBy([...removeRecords, ...editRecords.value.removeRecords], 'fakeId'),
updateRecords: uniqBy([...updateRecords, ...editRecords.value.updateRecords], 'fakeId'),
};
};
watch(() => props.tableName, () => {
initFun();
@@ -349,6 +366,7 @@ defineExpose({
setOptionsFun,
getCheckboxRecordsFun,
removeFun,
getRecordSetFun,
});
</script>

View File

@@ -9,14 +9,14 @@
:actionsWidth="95"
@checkbox-change="checkboxChangeFun"
>
<template #leftOptions>
<template #leftOptions v-if="!readonly">
<div>
<el-button :icon="Plus" @click="addRowFun(NODE_TYPE.CATEGORY)" :disabled="addNodeDisabled[NODE_TYPE.CATEGORY]">{{ $t('工况库.分类') }}</el-button>
<el-button :icon="Plus" @click="addRowFun(NODE_TYPE.TASK)" :disabled="addNodeDisabled[NODE_TYPE.TASK]">{{ $t('工况库.工况') }}</el-button>
<el-button :icon="Plus" @click="addRowFun(NODE_TYPE.PERFORMANCE)" :disabled="addNodeDisabled[NODE_TYPE.PERFORMANCE]">{{ $t('工况库.指标') }}</el-button>
</div>
</template>
<template #tableActions="{ row }">
<template #tableActions="{ row }" v-if="!readonly">
<div class="gl-table-actions">
<el-link type="primary" @click="editTableRowFun(row)">编辑</el-link>
<el-popconfirm
@@ -32,7 +32,7 @@
</div>
</template>
</TreeCaseTable>
<Dialog v-model="modalVisible" destroy-on-close :diaTitle="modalTitle" show-footer :height=" formData.nodeType===NODE_TYPE.TASK? 700 : 'auto'">
<!-- <Dialog v-model="modalVisible" destroy-on-close :diaTitle="modalTitle" show-footer :height=" formData.nodeType===NODE_TYPE.TASK? 700 : 'auto'">
<template #default>
<el-form ref="modalFormRef" :model="formData" label-width="auto">
<template v-for="item in formItemList" :key="item.field">
@@ -145,19 +145,25 @@
<el-button @click="cancelForm">取消</el-button>
<el-button type="primary" @click="confirmForm">确定</el-button>
</template>
</Dialog>
</Dialog> -->
<nodeDetailDialog v-model="modalVisible" :tableName="currentModalTableName" :diaTitle="modalTitle" @ok="onNodeDetailOkFun" :detail="formData"/>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { ref, onMounted, nextTick } from 'vue';
import { Plus } from '@element-plus/icons-vue';
import TreeCaseTable from '@/components/common/treeCaseTable/treeTable.vue';
import Dialog from '@/components/common/dialog/index.vue';
import UploadImg from '@/components/common/uploadImg/index.vue';
import { NODE_TYPE } from '@/utils/enum/node';
import { isCategoryType, canAddChild } from '@/utils/node';
import { isFunction } from 'lodash-es';
import nodeDetailDialog from './nodeDetailDialog.vue';
import { random, cloneDeep, omit, minBy, uniqBy, findLastIndex, isFunction } from 'lodash-es';
import { TASK_CALCULATE_STATUS, TASK_PROCESS_STATUS } from '@/utils/enum/task';
import { disposeTagKey } from '@/views/task/projectDetail/components/project';
import { ElMessage } from 'element-plus';
import { isCategoryNodeType } from '@/utils/node';
const loadcaseTableRef = ref();
const modalTitle = ref<string>('');
@@ -170,22 +176,48 @@ const addNodeDisabled = ref<any>({});
interface Props {
data: any;
tableName: string;
modalTableNameList?: string[];
leftVisible?: boolean;
leftButtonVisible?: boolean;
readonly?: boolean;
rememberProjectPhaseId?: string;
projectInfo?: any;
excludeOperation?: any;
needPermission?: boolean; // 需要判断权限
projectManagerIds?: any; // 项目管理员
creatorId?: any; // 项目创建人
projectUuid?: string; // 项目uuid
phaseUuid?: string; // 阶段uuid
exportBtnVisible?: boolean; // 阶段uuid
}
withDefaults(defineProps<Props>(), {
const props = withDefaults(defineProps<Props>(), {
data: [],
tableName: '',
modalTableNameList: () => (['TASK_POOL_CATEGORY', 'TASK_POOL_TASK', 'TASK_POOL_PERFORMANCE']),
leftVisible: true,
leftButtonVisible: true,
readonly: false,
rememberProjectPhaseId: '',
projectInfo: null,
excludeOperation: [],
needPermission: false,
projectManagerIds: [],
creatorId: '',
projectUuid: '',
phaseUuid: '',
exportBtnVisible: false,
});
onMounted(() => {
checkboxChangeFun();
});
const addRowFun = (nodeType?: any) => {
setModalTitle('add', nodeType);
displayModalFun(nodeType, 'add');
};
const currentModalTableName = ref('');
const setModalTitle = (type: string, filterColumnType: string) => {
let text = type === 'add' ? '新增' : '编辑';
switch (filterColumnType) {
@@ -194,14 +226,21 @@ const setModalTitle = (type: string, filterColumnType: string) => {
break;
case NODE_TYPE.CATEGORY:
text += '分类';
currentModalTableName.value = props.modalTableNameList[0];
break;
case NODE_TYPE.TASK:
text += '工况';
currentModalTableName.value = props.modalTableNameList[1];
break;
case NODE_TYPE.PERFORMANCE:
text += '指标';
currentModalTableName.value = props.modalTableNameList[2];
break;
}
if (isCategoryNodeType(filterColumnType)) {
text += '分类';
currentModalTableName.value = props.modalTableNameList[0];
}
modalTitle.value = text;
operationType.value = type;
};
@@ -246,12 +285,110 @@ const cancelForm = () => {
formData.value = {};
modalVisible.value = false;
};
// 保存form
const isSameNameLevel = (row: any, visibleData: any) => {
console.log('visibleData', visibleData);
const sameLevelList = visibleData.filter((item: any) => {
return item.parentId === row.parentId && item.fakeId !== row.fakeId;
});
const isExistSameName = sameLevelList.some((item: any) => {
return item.nodeName === row.nodeName;
});
return isExistSameName;
};
const getVxeRef = () => {
return loadcaseTableRef.value?.TreeTableRef?.treeTableRef;
};
const onNodeDetailOkFun = (formData: any) => {
const { visibleData } = getVxeRef()?.getTableData();
const checkRowData = getVxeRef()?.getCheckboxRecords(true);
if (operationType.value === 'add') {
const addRow = {
parentId: checkRowData[0]?.fakeId,
fakeId: random(0, 1, true) * random(0, 1, true) + '',
discipline: checkRowData[0]?.discipline,
...formData,
depth: checkRowData[0]?.depth + 1,
};
if (addRow.nodeType === NODE_TYPE.TASK) {
addRow.exeStatus = TASK_PROCESS_STATUS.NO_STARTED;
addRow.achieveStatus = TASK_CALCULATE_STATUS.NO_CALCULATE;
}
// 给新增节点赋值tagKeyMapList
// const tagKeyList = disposeTagKey(addRow, checkRowData[0]?.tagKeyList || [], tagKeyMapList.value);
// if (addRow?.nodeType === NodeTaskType.ROUNDS || addRow.type === TaskType.PERFORMANCE) {
// addRow.parentBeginTime = null;
// addRow.parentEndTime = null;
// }
// if (addRow.type === TaskType.PERFORMANCE) {
// addRow.beginTime = null;
// addRow.endTime = null;
// }
if (isSameNameLevel(addRow, visibleData)) {
return ElMessage.warning('当前层级已有同名,请修改名称');
}
const insertPosition: any = -1;
if (checkRowData[0]?.children?.length > 0) {
// const lastBranchIndex = findLastIndex(checkRowData[0].children, (item: any) => {
// return item.type === addRow.type;
// });
// if (lastBranchIndex === -1 && addRow.type === TaskType.NODE) {
// insertPosition = null;
// } else if (lastBranchIndex !== -1) {
// const insertPositionRow = checkRowData[0]?.children[lastBranchIndex];
// insertPosition = findNextRow(insertPositionRow, false) || -1;
// }
}
// 新增顶层节点时要赋值顶层uuid
if (checkRowData.length === 0) {
// 有阶段就取阶段的uuid
addRow.pid = props.phaseUuid || props.projectUuid;
} else {
addRow.pid = checkRowData[0].uuid;
}
nextTick(async () => {
await getVxeRef()?.insertAt(addRow, insertPosition);
await getVxeRef()?.setTreeExpand(checkRowData[0], true);
// emits('updateCallback', 'add');
});
} else {
if (isSameNameLevel(formData, visibleData)) {
return ElMessage.warning('当前层级已有同名,请修改名称');
}
visibleData.forEach((item: any) => {
if (item.fakeId === formData.fakeId) {
// for (const key in formData) {
// item[key] = formData[key];
// }
getVxeRef().setRow(item, formData).then(res => {
console.log('res', res);
});
}
});
nextTick(() => {
// TODO 测试代码 后期删除
const { visibleData, fullData } = getVxeRef()?.getTableData();
console.log('fullData', fullData);
console.log('visibleData', visibleData);
const { insertRecords, removeRecords, updateRecords } = getVxeRef()?.getRecordset();
console.log({ insertRecords, removeRecords, updateRecords });
const res = getVxeRef().getUpdateRecords();
console.log('res', res);
});
// emits('updateCallback', 'update');
}
getVxeRef()?.clearCheckboxRow();
cancelForm();
};// 保存form
const confirmForm = () => {
// modalFormRef.value?.validate(async (valid: boolean) => {
// if (valid) {
// const { visibleData } = loadcaseTableRef.value?.proTreeRef?.getTableData();
// const checkRowData = loadcaseTableRef.value?.proTreeRef?.vxeGridRef.getCheckboxRecords(true);
// const checkRowData = getVxeRef()?.getCheckboxRecords(true);
// if (operationType.value === 'add') {
// const addRow = {
// parentId: checkRowData[0]?.fakeId,
@@ -297,8 +434,8 @@ const confirmForm = () => {
// addRow.pid = checkRowData[0].uuid;
// }
// nextTick(async () => {
// await loadcaseTableRef.value?.proTreeRef?.vxeGridRef.insertAt(addRow, insertPosition);
// await loadcaseTableRef.value?.proTreeRef?.vxeGridRef?.setTreeExpand(checkRowData[0], true);
// await getVxeRef()?.insertAt(addRow, insertPosition);
// await getVxeRef()??.setTreeExpand(checkRowData[0], true);
// emits('updateCallback', 'add');
// });
// } else {
@@ -382,6 +519,10 @@ const canAddChildFun = (checkRowData: any, nodeType: string) => {
}
addNodeDisabled.value[nodeType] = !canAdd;
};
defineExpose({
loadcaseTableRef,
});
</script>
<style lang="scss" scoped>

View File

@@ -0,0 +1,80 @@
<template>
<Dialog
v-model="visible"
show-footer
show-cancel-button
show-confirm-button
:diaTitle="diaTitle"
@show="onShowFun"
:confirm-closable="false"
width="500"
>
<template #default>
<TableForm ref="tableFormRef" :tableName="tableName" @change="onFormChangeFun">
</TableForm>
</template>
<template #footer>
<div>
<el-button @click="onConfirmCancel">取消</el-button>
<el-button type="primary" @click="onConfirmFun">确定</el-button>
</div>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref, computed, nextTick } from 'vue';
import Dialog from '@/components/common/dialog/index.vue';
import TableForm from '@/components/common/table/tableForm.vue';
interface Props {
modelValue: boolean;
tableName: string;
diaTitle: string;
detail?: any;
}
const props = withDefaults(defineProps<Props>(), {
modelValue: false,
tableName: '',
diaTitle: '',
});
const emits = defineEmits(['update:modelValue', 'ok']);
const visible = computed({
get: () => props.modelValue,
set: (val) => emits('update:modelValue', val),
});
const tableFormRef = ref<any>();
const onShowFun = () => {
resetFun();
nextTick(() => {
if (props.detail) {
tableFormRef.value?.setFormDataFun({ ...props.detail });
}
});
};
const resetFun = () => {
tableFormRef.value?.resetFun();
};
const onFormChangeFun = () => {
};
const onConfirmCancel = () => {
visible.value = false;
};
const onConfirmFun = async () => {
const valid = await tableFormRef.value?.validateFun();
if (valid) {
const formData = tableFormRef.value?.getFormDataFun();
emits('ok', formData);
}
};
</script>
<style lang="scss" scoped>
.upload {
width: 100%;
}
</style>

View File

@@ -146,6 +146,7 @@ const removeFun = (data: any) => {
defineExpose({
getCheckboxRecordsFun,
removeFun,
TreeTableRef,
});
</script>

View File

@@ -31,9 +31,9 @@ export const canAddChild = (parent: TreeNode, childType: string): boolean => {
if (!parent || !parent.nodeType) {
return false;
}
if (parent.nodeType === NODE_TYPE.ROOT) {
return getAllowedChildrenTypes(parent.nodeType).includes(childType);
}
// if (parent.nodeType === NODE_TYPE.ROOT) {
// return getAllowedChildrenTypes(parent.nodeType).includes(childType);
// }
const parentNodeType = isCategoryNodeType(parent.nodeType) ? NODE_TYPE.CATEGORY : parent.nodeType;
const childNodeType = isCategoryNodeType(childType) ? NODE_TYPE.CATEGORY : childType;
return getAllowedChildrenTypes(parentNodeType).includes(childNodeType);

View File

@@ -3,10 +3,12 @@
height: 100%;
position: relative;
}
:deep(.button-container) {
display: flex;
align-items: center;
}
:deep(.el-upload-list) {
display: none;
}
@@ -44,6 +46,7 @@
align-items: center;
font-size: 14px;
font-weight: 400;
:deep(.el-input__inner) {
overflow: hidden;
text-overflow: ellipsis;
@@ -82,17 +85,23 @@
}
.pool-select {
float: right;
height: 60px;
.el-select {
width: 180px;
}
}
.select-form {
.el-form-item {
.el-form-item {
margin-bottom: 0px;
}
.el-form-item:nth-child(2) {
margin-right: 0px;
}
}
.flex-end {
margin-bottom: var(--margin-small);
}

View File

@@ -14,66 +14,78 @@
<el-icon class="mr5">
<Plus />
</el-icon>
{{ $t('工况库.创建清单库') }}
{{ $t("工况库.创建清单库") }}
</el-button>
<el-button @click="openImportPoolFun">
<el-icon class="mr5">
<Upload />
</el-icon>
{{ $t('工况库.导入Excel') }}
{{ $t("工况库.导入Excel") }}
</el-button>
<el-button @click="onExportPoolFun" :loading="exportLoading">
<el-icon class="mr5">
<Download />
</el-icon>
{{ $t('工况库.导出Excel') }}
{{ $t("工况库.导出Excel") }}
</el-button>
</template>
<el-button type="primary" @click="openAddApproveUserFun">
<el-icon class="mr5">
<Finished />
</el-icon>
{{ $t('工况库.提交评审') }}
{{ $t("工况库.提交评审") }}
</el-button>
<el-button type="danger" @click="openDelPoolFun">
<el-icon class="mr5">
<Finished />
</el-icon>
{{ $t('工况库.删除库') }}
{{ $t("工况库.删除库") }}
</el-button>
<div class="select-form">
<div class="pool-select select-form">
<el-form :inline="true">
<el-form-item :label="$t('工况库.工况清单库')" :label-width="100">
<el-select
:teleported="false"
v-model='currentPoolBrief'
:props="{label:'poolName', value:'value'}"
v-model="currentPoolBrief"
:props="{ label: 'poolName', value: 'value' }"
value-key="poolName"
:fit-input-width="true"
@change="onPoolChangeFun"
>
<el-option v-for="item in poolList" :key="item.value" :label="item.poolName" :value="item" />
<el-option
v-for="item in poolList"
:key="item.value"
:label="item.poolName"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('工况库.版本')" :label-width="40">
<el-select
:teleported="false"
v-model='currentPoolBriefVersion'
:props="{label:'poolVersion', value:'value'}"
v-model="currentPoolBriefVersion"
:props="{ label: 'poolVersion', value: 'value' }"
value-key="poolVersion"
:fit-input-width="true"
@change="onVersionChangeFun"
>
<el-option v-for="item in versionList" :key="item.value" :label="item.poolVersion" :value="item" />
<el-option
v-for="item in versionList"
:key="item.value"
:label="item.poolVersion"
:value="item"
/>
</el-select>
</el-form-item>
</el-form>
</div>
</el-space>
</div>
<loadCaseTable ref="treeTableRef" tableName="TASK_POOL" :modalTableNameList="['TASK_POOL_CATEGORY','TASK_POOL_TASK','TASK_POOL_PERFORMANCE']" :data="tableData" > </loadCaseTable>
<loadcase-pro-table
v-if="false"
ref="treeTableRef"
:columns="tableColumns"
:data-source="tableData"
@@ -90,9 +102,12 @@
@refresh="refreshData"
>
<template #toolbar_tools_extra>
<span v-if="pageType === 'performance'" >
<span v-if="pageType === 'performance'">
显示配置
<el-radio-group v-model="loadcaseOrPerformanceSwitch" @change="changeLoadcaseOrPerformanceType">
<el-radio-group
v-model="loadcaseOrPerformanceSwitch"
@change="changeLoadcaseOrPerformanceType"
>
<el-radio :value="true" size="large">树结构</el-radio>
<el-radio :value="false" size="large">表结构</el-radio>
</el-radio-group>
@@ -102,34 +117,46 @@
</div>
<div class="contain" v-if="!loadcaseOrPerformanceSwitch && pageType !== 'loadcase'">
<div class="pool-select">
<el-form :inline="true" >
<el-form :inline="true">
<el-form-item :label="$t('工况库.工况清单库')" :label-width="100">
<el-select
:teleported="false"
v-model='currentPoolBrief'
:props="{label:'poolName', value:'value'}"
v-model="currentPoolBrief"
:props="{ label: 'poolName', value: 'value' }"
value-key="poolName"
:fit-input-width="true"
@change="onPoolChangeFun"
>
<el-option v-for="item in poolList" :key="item.value" :label="item.poolName" :value="item" />
<el-option
v-for="item in poolList"
:key="item.value"
:label="item.poolName"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('工况库.版本')" :label-width="40">
<el-select
:teleported="false"
v-model='currentPoolBriefVersion'
:props="{label:'poolVersion', value:'value'}"
v-model="currentPoolBriefVersion"
:props="{ label: 'poolVersion', value: 'value' }"
value-key="poolVersion"
:fit-input-width="true"
@change="onVersionChangeFun"
>
<el-option v-for="item in versionList" :key="item.value" :label="item.poolVersion" :value="item" />
<el-option
v-for="item in versionList"
:key="item.value"
:label="item.poolVersion"
:value="item"
/>
</el-select>
</el-form-item>
</el-form>
</div>
<loadCaseTable ref="treeTableRef" :loading="performanceLoading" readonly tableName="PERFORMANCE_POOL" :data="performanceData" > </loadCaseTable>
<loadcase-pro-table
v-if="false"
ref="treeTableRef"
:toolbarConfig="{
enabled: false,
@@ -147,7 +174,7 @@
readonly
>
<template #toolbar_tools_extra>
<span v-if="pageType === 'performance'" >
<span v-if="pageType === 'performance'">
显示配置
<el-radio-group v-model="loadcaseOrPerformanceSwitch">
<el-radio :value="true" size="large">树结构</el-radio>
@@ -169,29 +196,57 @@
</div>
</div>
<addApproveUser v-model="dialogApproveUserVisible" :isInitial="isEmptyPool" @ok="onConfirmFun"></addApproveUser>
<add-pool-modal v-model="addPoolModalVisible" mode="add" :poolList="poolList" detail="{}" @ok="onAddPoolOkFun"/>
<del-pool-modal v-model="delPoolModalVisible" @ok="onDelPoolOkFun"/>
<import-pool-modal v-model="importPoolModalVisible" :poolList="poolList" @ok="onImportPoolOkFun"/>
<addApproveUser
v-model="dialogApproveUserVisible"
:isInitial="isEmptyPool"
@ok="onConfirmFun"
></addApproveUser>
<add-pool-modal
v-model="addPoolModalVisible"
mode="add"
:poolList="poolList"
detail="{}"
@ok="onAddPoolOkFun"
/>
<del-pool-modal v-model="delPoolModalVisible" @ok="onDelPoolOkFun" />
<import-pool-modal
v-model="importPoolModalVisible"
:poolList="poolList"
@ok="onImportPoolOkFun"
/>
</template>
<script lang="ts" setup>
import {
computed,
nextTick,
onMounted,
ref,
type Ref,
} from 'vue';
import { computed, nextTick, onMounted, ref, type Ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus';
import { cloneDeep, groupBy } from 'lodash-es';
import { onBeforeRouteLeave, useRouter } from 'vue-router';
import loadcaseProTable from '@/components/loadCaseTable/commonTable/loadcaseProTable.vue';
import { getLoadcaseLibColumn, getPerformanceLibColumn, taskPoolDictOptions } from '@/components/loadCaseTable/utils/project.ts';
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
import {
getLoadcaseLibColumn,
getPerformanceLibColumn,
taskPoolDictOptions,
} from '@/components/loadCaseTable/utils/project.ts';
import addApproveUser from './addApproveUsers.vue';
import { transformPoolNodesToTree, transformTreeToPoolNodes, getNodeExtras, canAddChild } from '@/utils/node';
import {
transformPoolNodesToTree,
transformTreeToPoolNodes,
getNodeExtras,
canAddChild,
extractLeafNodesWithParentTypes,
} from '@/utils/node';
import { poolNodeExtraPropPickMap } from '@/utils/enum/node';
import { createTaskPoolApi, updateTaskPoolApi, getTaskPoolApi, getTaskPoolPerformanceApi, getTaskPoolVersionsApi, getAllTaskPoolApi, importTaskPoolApi, exportTaskPoolApi } from '@/api/task/taskpool';
import {
createTaskPoolApi,
updateTaskPoolApi,
getTaskPoolApi,
getTaskPoolPerformanceApi,
getTaskPoolVersionsApi,
getAllTaskPoolApi,
importTaskPoolApi,
exportTaskPoolApi,
} from '@/api/task/taskpool';
import { NODE_TYPE } from '@/utils/enum/node';
import addPoolModal from './addPoolModal.vue';
import delPoolModal from './delPoolModal.vue';
@@ -214,7 +269,16 @@ const tableColumns = computed(() => {
let data: any = cloneDeep(loadcaseLibColumn.value);
if (props.pageType === 'performance' && !loadcaseOrPerformanceSwitch.value) {
data = data.filter((item: any) => {
return !['operation', 'nodeType', 'days', 'flowTemplateName', 'analysisSoftware', 'confidence', 'difficult', 'analyseTarget'].includes(item.field);
return ![
'operation',
'nodeType',
'days',
'flowTemplateName',
'analysisSoftware',
'confidence',
'difficult',
'analyseTarget',
].includes(item.field);
});
data.forEach((item: any) => {
if (item.field === 'nodeName') {
@@ -241,14 +305,16 @@ const tableColumns = computed(() => {
const tableData = ref<any>([]);
const isHaveNotSave = () => {
const { insertRecords, removeRecords, updateRecords } =
treeTableRef.value?.loadcaseTableRef?.proTreeRef?.getRecordset();
return (
// !store.loadcaseIsSave ||
insertRecords.length > 0 ||
removeRecords.length > 0 ||
updateRecords.length > 0
);
try {
const { insertRecords, removeRecords, updateRecords } = getRecordSetFun();
return (
insertRecords.length > 0 || removeRecords.length > 0 || updateRecords.length > 0
);
} catch (e) {
console.error('e', e);
return false;
}
};
const saveType = ref<string>('');
@@ -264,7 +330,12 @@ const refreshData = async (callback?: any) => {
};
const treeTableRef = ref();
const getVxeRef = () => {
return treeTableRef?.value?.loadcaseTableRef?.TreeTableRef?.treeTableRef;
};
const getRecordSetFun = () => {
return treeTableRef?.value?.loadcaseTableRef?.TreeTableRef?.getRecordSetFun();
};
// 任务模板库、仿真指标库切换
const loadcaseOrPerformanceSwitch = ref<boolean>(false); // 指标数据
@@ -275,7 +346,7 @@ const performanceData = ref<any>([]);
const dialogApproveUserVisible = ref(false);
// 打开选中评审人弹窗
const openAddApproveUserFun = () => {
const { visibleData } = treeTableRef.value?.loadcaseTableRef?.proTreeRef.getTableData();
const { visibleData } = getVxeRef()?.getTableData();
if (!visibleData.length) {
ElMessage.warning('不能提交空数据');
return;
@@ -310,8 +381,8 @@ const onConfirmFun = async (formData: any) => {
}
};
const createTaskPoolFun = async (formData:any) => {
const { fullData, visibleData } = treeTableRef.value?.loadcaseTableRef?.getTableData();
const createTaskPoolFun = async (formData: any) => {
const { fullData, visibleData } = getVxeRef()?.getTableData();
console.log(' fullData, visibleData', fullData, visibleData);
const nodes = cloneDeep(fullData);
const pickedNodes = transformTreeToPoolNodes(nodes);
@@ -323,14 +394,14 @@ const createTaskPoolFun = async (formData:any) => {
nodes: pickedNodes,
users: formData.selectUser,
};
const res:any = await createTaskPoolApi(req);
const res: any = await createTaskPoolApi(req);
if (res.code === 200) {
refreshPoolFun();
}
};
const updateTaskPoolFun = async (formData:any) => {
const updateTaskPoolFun = async (formData: any) => {
const { insertRecords, removeRecords, updateRecords } =
treeTableRef.value?.loadcaseTableRef?.proTreeRef?.getRecordset();
getRecordSetFun();
const req = {
users: formData.selectUser,
bNewVersion: formData.bNewVersion,
@@ -371,24 +442,23 @@ const updateTaskPoolFun = async (formData:any) => {
const delObj = formatDelFun(cloneDeep(removeRecords));
Object.assign(req, delObj);
}
const res:any = await updateTaskPoolApi(req);
const res: any = await updateTaskPoolApi(req);
if (res.code === 200) {
ElMessage.success(res.message);
refreshVersionFun();
}
};
const formatAddFun = (insertRecords:TreeNode[], updateRecords:TreeNode[]) => {
const { visibleData } = treeTableRef.value?.loadcaseTableRef?.getTableData();
let nodes:any[] = [];
const nodeExtras:any[] = [];
let tasks:any[] = [];
const taskExtras:any[] = [];
let performances:any[] = [];
const performanceExtras:any[] = [];
const formatAdd = (arr:any ) => {
arr.forEach((item:any) => {
const parentRow = visibleData.find((row:any) => {
const formatAddFun = (insertRecords: TreeNode[], updateRecords: TreeNode[]) => {
const { visibleData } = getVxeRef()?.getTableData();
let nodes: any[] = [];
const nodeExtras: any[] = [];
let tasks: any[] = [];
const taskExtras: any[] = [];
let performances: any[] = [];
const performanceExtras: any[] = [];
const formatAdd = (arr: any) => {
arr.forEach((item: any) => {
const parentRow = visibleData.find((row: any) => {
return row.fakeId === item.parentId;
});
if (item.nodeType === NODE_TYPE.TASK) {
@@ -399,14 +469,14 @@ const formatAddFun = (insertRecords:TreeNode[], updateRecords:TreeNode[]) => {
item.isTemp = true;
}
} else if (item.nodeType === NODE_TYPE.PERFORMANCE) {
if (parentRow && parentRow.uuid ) {
if (parentRow && parentRow.uuid) {
item.parentId = parentRow.uuid;
performances.push(item);
} else {
item.isTemp = true;
}
} else {
if (parentRow && parentRow.uuid ) {
if (parentRow && parentRow.uuid) {
item.parentId = parentRow.uuid;
} else {
if (canAddChild({ nodeType: NODE_TYPE.ROOT }, item.nodeType)) {
@@ -421,25 +491,25 @@ const formatAddFun = (insertRecords:TreeNode[], updateRecords:TreeNode[]) => {
};
formatAdd(insertRecords);
nodes = nodes.filter(item => !item.isTemp);
tasks = tasks.filter(item => !item.isTemp);
performances = performances.filter(item => !item.isTemp);
nodes = nodes.filter((item) => !item.isTemp);
tasks = tasks.filter((item) => !item.isTemp);
performances = performances.filter((item) => !item.isTemp);
const nodesGroup = groupBy(nodes, 'parentId');
const addNodes = Object.keys(nodesGroup).map(key => {
const addNodes = Object.keys(nodesGroup).map((key) => {
return {
parentId: key === 'undefined' ? '' : key,
nodes: transformTreeToPoolNodes(nodesGroup[key]),
};
});
const tasksGroup = groupBy(tasks, 'parentId');
const addTasks = Object.keys(tasksGroup).map(key => {
const addTasks = Object.keys(tasksGroup).map((key) => {
return {
nodeId: key === 'undefined' ? '' : key,
tasks: transformTreeToPoolNodes(tasksGroup[key]),
};
});
const performancesGroup = groupBy(performances, 'parentId');
const addPerformances = Object.keys(performancesGroup).map(key => {
const addPerformances = Object.keys(performancesGroup).map((key) => {
return {
nodeId: key === 'undefined' ? '' : key,
taskId: key === 'undefined' ? '' : key,
@@ -447,11 +517,11 @@ const formatAddFun = (insertRecords:TreeNode[], updateRecords:TreeNode[]) => {
};
});
const formatUpdate = (arr:any) => {
arr.forEach((item:any) => {
const formatUpdate = (arr: any) => {
arr.forEach((item: any) => {
item.extras = getNodeExtras(item, poolNodeExtraPropPickMap);
if (Array.isArray(item.extras) && item.extras.length > 0) {
item.extras.forEach((extra:any) => {
item.extras.forEach((extra: any) => {
if (!extra.uuid) {
if (item.nodeType === NODE_TYPE.TASK) {
taskExtras.push(extra);
@@ -464,7 +534,6 @@ const formatAddFun = (insertRecords:TreeNode[], updateRecords:TreeNode[]) => {
});
}
});
};
formatUpdate(updateRecords);
return {
@@ -475,17 +544,16 @@ const formatAddFun = (insertRecords:TreeNode[], updateRecords:TreeNode[]) => {
addPerformances,
addPerformanceExtras: performanceExtras,
};
};
const formatUpdateFun = (updateRecords:TreeNode[]) => {
const updateNodes:any[] = [];
const updateNodeExtras:any[] = [];
const updateTasks:any[] = [];
const updateTaskExtras:any[] = [];
const updatePerformances:any[] = [];
const updatePerformanceExtras:any[] = [];
const formatUpdate = (arr:TreeNode[]) => {
arr.forEach(item => {
const formatUpdateFun = (updateRecords: TreeNode[]) => {
const updateNodes: any[] = [];
const updateNodeExtras: any[] = [];
const updateTasks: any[] = [];
const updateTaskExtras: any[] = [];
const updatePerformances: any[] = [];
const updatePerformanceExtras: any[] = [];
const formatUpdate = (arr: TreeNode[]) => {
arr.forEach((item) => {
if (item.nodeType === NODE_TYPE.TASK) {
updateTasks.push(item);
} else if (item.nodeType === NODE_TYPE.PERFORMANCE) {
@@ -495,7 +563,7 @@ const formatUpdateFun = (updateRecords:TreeNode[]) => {
}
item.extras = getNodeExtras(item, poolNodeExtraPropPickMap);
if (Array.isArray(item.extras) && item.extras.length > 0) {
item.extras.forEach(extra => {
item.extras.forEach((extra) => {
if (extra.uuid) {
if (item.nodeType === NODE_TYPE.TASK) {
updateTaskExtras.push(extra);
@@ -519,32 +587,32 @@ const formatUpdateFun = (updateRecords:TreeNode[]) => {
updatePerformanceExtras,
};
};
const formatDelFun = (removeRecords:TreeNode[]) => {
const deleteNodes:any[] = [];
const deleteNodeExtras:any[] = [];
const deleteTasks:any[] = [];
const deleteTaskExtras:any[] = [];
const deletePerformances:any[] = [];
const formatDelFun = (removeRecords: TreeNode[]) => {
const deleteNodes: any[] = [];
const deleteNodeExtras: any[] = [];
const deleteTasks: any[] = [];
const deleteTaskExtras: any[] = [];
const deletePerformances: any[] = [];
const deletePerformanceExtras: any[] = [];
removeRecords.forEach((item:TreeNode) => {
removeRecords.forEach((item: TreeNode) => {
if (item.nodeType === NODE_TYPE.TASK) {
deleteTasks.push(item.uuid);
if (Array.isArray(item.extras) && item.extras.length > 0) {
item.extras.forEach((extra:Extra) => {
item.extras.forEach((extra: Extra) => {
deleteTaskExtras.push(extra.uuid);
});
}
} else if (item.nodeType === NODE_TYPE.PERFORMANCE) {
deletePerformances.push(item.uuid);
if (Array.isArray(item.extras) && item.extras.length > 0) {
item.extras.forEach((extra:Extra) => {
item.extras.forEach((extra: Extra) => {
deletePerformanceExtras.push(extra.uuid);
});
}
} else {
deleteNodes.push(item.uuid);
if (Array.isArray(item.extras) && item.extras.length > 0) {
item.extras.forEach((extra:Extra) => {
item.extras.forEach((extra: Extra) => {
deleteNodeExtras.push(extra.uuid);
});
}
@@ -581,13 +649,15 @@ onBeforeRouteLeave((to, from, next) => {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning',
}).then(() => {
pendingRoute.value = to;
dialogApproveUserVisible.value = true;
next(false);
}).catch(() => {
next();
});
})
.then(() => {
pendingRoute.value = to;
dialogApproveUserVisible.value = true;
next(false);
})
.catch(() => {
next();
});
});
const poolList: Ref<Pool[]> = ref([]);
const queryPoolListFun = async () => {
@@ -609,9 +679,10 @@ const onPoolChangeFun = (pool: any) => {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning',
}).then(() => {
dialogApproveUserVisible.value = true;
})
.then(() => {
dialogApproveUserVisible.value = true;
})
.catch(() => {
currentPoolBrief.value = pool;
queryVersionsFun();
@@ -632,13 +703,15 @@ const onVersionChangeFun = () => {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning',
}).then(() => {
dialogApproveUserVisible.value = true;
})
.then(() => {
dialogApproveUserVisible.value = true;
})
.catch(() => {
refreshTreeFun();
});
};
const extractTableData:any = ref([]);
const queryTaskPoolFun = async () => {
if (!currentPoolBriefVersion.value) {
return;
@@ -655,6 +728,7 @@ const queryTaskPoolFun = async () => {
tree = transformPoolNodesToTree(res.data.nodes);
tableData.value = tree;
isEmptyPool.value = false;
extractTableData.value = extractLeafNodesWithParentTypes(res.data.nodes);
nextTick(() => {
treeTableRef.value?.changeLevel('全部展开');
});
@@ -675,7 +749,7 @@ const queryTaskPoolPerformanceFun = async () => {
performanceData.value = transformPoolNodesToTree(res.data);
}
};
const refreshTreeFun = async() => {
const refreshTreeFun = async () => {
if (props.pageType === 'loadcase') {
await queryTaskPoolFun();
}
@@ -683,7 +757,7 @@ const refreshTreeFun = async() => {
await queryTaskPoolPerformanceFun();
}
};
const refreshPoolFun = async() => {
const refreshPoolFun = async () => {
await queryPoolListFun();
};
const refreshVersionFun = async () => {
@@ -693,7 +767,7 @@ const queryVersionsFun = async () => {
const req = {
poolName: currentPoolBrief.value.poolName,
};
const res:any = await getTaskPoolVersionsApi(req);
const res: any = await getTaskPoolVersionsApi(req);
if (res.code === 200 && res.data && Array.isArray(res.data) && res.data.length > 0) {
versionList.value = res.data;
if (versionList.value.length > 0) {
@@ -843,4 +917,3 @@ onMounted(async () => {
</script>
<style src="./taskPool.scss" lang="scss" scoped />