进度填报提交逻辑优化

This commit is contained in:
Teo
2025-06-04 19:33:17 +08:00
parent 80c9d517ab
commit f128217846
3 changed files with 90 additions and 35 deletions

View File

@ -30,6 +30,7 @@ export interface ProgressCategoryVO {
children: ProgressCategoryVO[];
threeChildren: any[];
hasChildren:any;
detailChildren:any;
}
export interface ProgressCategoryForm extends BaseEntity {

View File

@ -61,8 +61,8 @@
<el-table-column label="完成数量" prop="finishedNumber" min-width="100px" />
<el-table-column label="延期量" min-width="100px">
<template #default="{ row: scopeRow }">
<el-tag :type="filterW(scopeRow) ? 'danger' : 'success'">
{{ filterW(scopeRow) }}
<el-tag :type="scopeRow.delayNumber.toString() ? 'success' : 'danger'">
{{ scopeRow.delayNumber || 0 }}
</el-tag>
</template>
</el-table-column>
@ -488,18 +488,18 @@ const handleRemove = (row?: any) => {
};
// 延期计算
const filterW = (row: any): number => {
const { finishedNumber, planNumber, endAt } = row;
if (!endAt) return 0;
// const filterW = (row: any): number => {
// const { finishedNumber, planNumber, endAt } = row;
// if (!endAt) return 0;
const endTime = new Date(endAt).getTime();
const now = new Date().getTime();
// const endTime = new Date(endAt).getTime();
// const now = new Date().getTime();
if (endTime <= now && planNumber > finishedNumber) {
return planNumber - finishedNumber;
}
return 0;
};
// if (endTime <= now && planNumber > finishedNumber) {
// return planNumber - finishedNumber;
// }
// return 0;
// };
// 暴露给模板的属性和方法
defineExpose({

View File

@ -24,10 +24,9 @@
:load="loadNode"
node-key="id"
lazy
@node-collapse="closeNode"
@node-expand="openNode"
:render-content="renderContent"
check-strictly
:expand-on-click-node="false"
/>
</div>
<div class="submit">
@ -82,7 +81,8 @@ const treeProps = {
children: 'children',
label: 'name',
isLeaf: 'leaf',
hasChildren: 'hasChildren' // 重要
hasChildren: 'hasChildren', // 重要
disabled: 'disabled'
};
//切换项目
@ -99,36 +99,76 @@ const handleSelect = (projectId: string) => {
/** 进度类别树选中事件 */
const handleCheckChange = (data: any, checked: boolean, indeterminate: boolean) => {
const node: Node | undefined = treeRef.value?.getNode(data.id);
if (node.level === 2) {
//二级节点 展开显示图层 收起删除
const children = node.childNodes.map((child) => child.data);
children.forEach((child) => {
child.disabled = !checked;
});
// 让 el-tree 刷新显示
treeRef.value.updateKeyChildren(data.id, children);
if (checked) {
addPointToMap(data.threeChildren); // 添加点到地图
clearLevel3Checked(node.level); // 清除三级节点的选中状态
treeRef.value.setChecked(data.id, true, false);
} else {
data.threeChildren.forEach((child: any) => {
const feature = featureMap[child.id];
if (feature && sharedSource.hasFeature(feature)) {
sharedSource.removeFeature(feature);
}
});
}
return;
}
if (!checked) return (submitForm.value.id = ''); // 只处理第三级节点的选中事件
const parent = node.parent;
if (!parent) return;
//消除所有节点的选中状态
treeRef.value.setCheckedKeys([], false);
clearLevel3Checked(node.level); // 清除三级节点的选中状态
// 设置当前点击项为选中
treeRef.value.setChecked(data.id, true, false);
submitForm.value.id = data.id; // 设置提交表单的id
};
/** 关闭节点事件 */
const closeNode = (node: any) => {
// 清除子节点
if (node.pid) {
node.threeChildren.forEach((child: any) => {
const feature = featureMap[child.id];
if (feature && sharedSource.hasFeature(feature)) {
sharedSource.removeFeature(feature);
//清除某一级节点所有选中状态
const clearLevel3Checked = (level) => {
const rootNodes = treeRef.value.store.root.childNodes;
const clearChecked = (nodes: any[]) => {
nodes.forEach((node) => {
if (node.level === level) {
treeRef.value.setChecked(node.key, false, false);
} else if (node.childNodes?.length) {
clearChecked(node.childNodes);
}
});
}
};
clearChecked(rootNodes);
};
/** 打开节点事件 */
const openNode = (node: any) => {
// 清除子节点
if (!node.pid) return;
addPointToMap(node.threeChildren); // 添加点到地图
};
/** 关闭节点事件 */
// const closeNode = (node: any) => {
// // 清除子节点
// if (node.pid) {
// // node.threeChildren.forEach((child: any) => {
// // const feature = featureMap[child.id];
// // if (feature && sharedSource.hasFeature(feature)) {
// // sharedSource.removeFeature(feature);
// // }
// // });
// }
// };
// /** 打开节点事件 */
// const openNode = (node: any) => {
// // 清除子节点
// if (!node.pid) return;
// // addPointToMap(node.threeChildren); // 添加点到地图
// };
//懒加载子节点
const loadNode = async (node: any, resolve: (data: any[]) => void) => {
@ -153,13 +193,15 @@ const loadNode = async (node: any, resolve: (data: any[]) => void) => {
return {
...detail,
name: detail.date, // 设置为叶子节点
leaf: true // 标记为叶子节点
leaf: true, // 标记为叶子节点
disabled: true
};
});
progressCategoryList.value.forEach((item, i) => {
let indexNum = item.children.findIndex((item) => item.id === secondLevelNodeId);
if (indexNum !== -1) {
item.children[indexNum].threeChildren = res.data.facilityList; // 将子节点添加到当前节点的threeChildren属性中
// item.children[indexNum].detailChildren = children; // 将子节点添加到当前节点的threeChildren属性中
}
});
@ -193,7 +235,7 @@ const submit = () => {
//重置树形结构选中以及图层高亮
const resetTreeAndMap = () => {
// 重置树形结构选中状态
treeRef.value?.setCheckedKeys([]);
clearLevel3Checked(3);
//取消加载状态
loading.value = false;
// 清除地图上的所有高亮
@ -216,13 +258,25 @@ const handleChange = (value: number) => {
};
//限定部分节点能选择
const renderContent = (context, { node }) => {
const renderContent = (context, { node, data }) => {
if (node.level === 3) {
return h('span', { class: 'custom-tree-node' }, [
h(ElCheckbox, {
modelValue: node.checked,
'onUpdate:modelValue': (val) => node.setChecked(val),
style: 'margin-right: 8px;margin-left: -20px;'
style: 'margin-right: 8px;',
disabled: data.disabled
}),
h('span', node.label)
]);
}
if (node.level === 2) {
return h('span', { class: 'custom-tree-node' }, [
h(ElCheckbox, {
modelValue: node.checked,
'onUpdate:modelValue': (val) => node.setChecked(val),
style: 'margin-right: 8px;',
disabled: !data.threeChildren || data.threeChildren.length == 0
}),
h('span', node.label)
]);