进度填报提交逻辑优化
This commit is contained in:
@ -30,6 +30,7 @@ export interface ProgressCategoryVO {
|
|||||||
children: ProgressCategoryVO[];
|
children: ProgressCategoryVO[];
|
||||||
threeChildren: any[];
|
threeChildren: any[];
|
||||||
hasChildren:any;
|
hasChildren:any;
|
||||||
|
detailChildren:any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ProgressCategoryForm extends BaseEntity {
|
export interface ProgressCategoryForm extends BaseEntity {
|
||||||
|
@ -61,8 +61,8 @@
|
|||||||
<el-table-column label="完成数量" prop="finishedNumber" min-width="100px" />
|
<el-table-column label="完成数量" prop="finishedNumber" min-width="100px" />
|
||||||
<el-table-column label="延期量" min-width="100px">
|
<el-table-column label="延期量" min-width="100px">
|
||||||
<template #default="{ row: scopeRow }">
|
<template #default="{ row: scopeRow }">
|
||||||
<el-tag :type="filterW(scopeRow) ? 'danger' : 'success'">
|
<el-tag :type="scopeRow.delayNumber.toString() ? 'success' : 'danger'">
|
||||||
{{ filterW(scopeRow) }}
|
{{ scopeRow.delayNumber || 0 }}
|
||||||
</el-tag>
|
</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -488,18 +488,18 @@ const handleRemove = (row?: any) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 延期计算
|
// 延期计算
|
||||||
const filterW = (row: any): number => {
|
// const filterW = (row: any): number => {
|
||||||
const { finishedNumber, planNumber, endAt } = row;
|
// const { finishedNumber, planNumber, endAt } = row;
|
||||||
if (!endAt) return 0;
|
// if (!endAt) return 0;
|
||||||
|
|
||||||
const endTime = new Date(endAt).getTime();
|
// const endTime = new Date(endAt).getTime();
|
||||||
const now = new Date().getTime();
|
// const now = new Date().getTime();
|
||||||
|
|
||||||
if (endTime <= now && planNumber > finishedNumber) {
|
// if (endTime <= now && planNumber > finishedNumber) {
|
||||||
return planNumber - finishedNumber;
|
// return planNumber - finishedNumber;
|
||||||
}
|
// }
|
||||||
return 0;
|
// return 0;
|
||||||
};
|
// };
|
||||||
|
|
||||||
// 暴露给模板的属性和方法
|
// 暴露给模板的属性和方法
|
||||||
defineExpose({
|
defineExpose({
|
||||||
|
@ -24,10 +24,9 @@
|
|||||||
:load="loadNode"
|
:load="loadNode"
|
||||||
node-key="id"
|
node-key="id"
|
||||||
lazy
|
lazy
|
||||||
@node-collapse="closeNode"
|
|
||||||
@node-expand="openNode"
|
|
||||||
:render-content="renderContent"
|
:render-content="renderContent"
|
||||||
check-strictly
|
check-strictly
|
||||||
|
:expand-on-click-node="false"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div class="submit">
|
<div class="submit">
|
||||||
@ -82,7 +81,8 @@ const treeProps = {
|
|||||||
children: 'children',
|
children: 'children',
|
||||||
label: 'name',
|
label: 'name',
|
||||||
isLeaf: 'leaf',
|
isLeaf: 'leaf',
|
||||||
hasChildren: 'hasChildren' // 重要
|
hasChildren: 'hasChildren', // 重要
|
||||||
|
disabled: 'disabled'
|
||||||
};
|
};
|
||||||
|
|
||||||
//切换项目
|
//切换项目
|
||||||
@ -99,37 +99,77 @@ const handleSelect = (projectId: string) => {
|
|||||||
/** 进度类别树选中事件 */
|
/** 进度类别树选中事件 */
|
||||||
const handleCheckChange = (data: any, checked: boolean, indeterminate: boolean) => {
|
const handleCheckChange = (data: any, checked: boolean, indeterminate: boolean) => {
|
||||||
const node: Node | undefined = treeRef.value?.getNode(data.id);
|
const node: Node | undefined = treeRef.value?.getNode(data.id);
|
||||||
if (!checked) return (submitForm.value.id = ''); // 只处理第三级节点的选中事件
|
|
||||||
|
|
||||||
const parent = node.parent;
|
if (node.level === 2) {
|
||||||
if (!parent) return;
|
//二级节点 展开显示图层 收起删除
|
||||||
//消除所有节点的选中状态
|
const children = node.childNodes.map((child) => child.data);
|
||||||
treeRef.value.setCheckedKeys([], false);
|
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);
|
treeRef.value.setChecked(data.id, true, false);
|
||||||
submitForm.value.id = data.id; // 设置提交表单的id
|
} else {
|
||||||
};
|
data.threeChildren.forEach((child: any) => {
|
||||||
|
|
||||||
/** 关闭节点事件 */
|
|
||||||
const closeNode = (node: any) => {
|
|
||||||
// 清除子节点
|
|
||||||
if (node.pid) {
|
|
||||||
node.threeChildren.forEach((child: any) => {
|
|
||||||
const feature = featureMap[child.id];
|
const feature = featureMap[child.id];
|
||||||
if (feature && sharedSource.hasFeature(feature)) {
|
if (feature && sharedSource.hasFeature(feature)) {
|
||||||
sharedSource.removeFeature(feature);
|
sharedSource.removeFeature(feature);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!checked) return (submitForm.value.id = ''); // 只处理第三级节点的选中事件
|
||||||
|
|
||||||
|
const parent = node.parent;
|
||||||
|
if (!parent) return;
|
||||||
|
//消除所有节点的选中状态
|
||||||
|
clearLevel3Checked(node.level); // 清除三级节点的选中状态
|
||||||
|
// 设置当前点击项为选中
|
||||||
|
treeRef.value.setChecked(data.id, true, false);
|
||||||
|
submitForm.value.id = data.id; // 设置提交表单的id
|
||||||
};
|
};
|
||||||
|
|
||||||
/** 打开节点事件 */
|
//清除某一级节点所有选中状态
|
||||||
const openNode = (node: any) => {
|
const clearLevel3Checked = (level) => {
|
||||||
// 清除子节点
|
const rootNodes = treeRef.value.store.root.childNodes;
|
||||||
if (!node.pid) return;
|
|
||||||
addPointToMap(node.threeChildren); // 添加点到地图
|
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 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) => {
|
const loadNode = async (node: any, resolve: (data: any[]) => void) => {
|
||||||
if (node.level !== 2) {
|
if (node.level !== 2) {
|
||||||
@ -153,13 +193,15 @@ const loadNode = async (node: any, resolve: (data: any[]) => void) => {
|
|||||||
return {
|
return {
|
||||||
...detail,
|
...detail,
|
||||||
name: detail.date, // 设置为叶子节点
|
name: detail.date, // 设置为叶子节点
|
||||||
leaf: true // 标记为叶子节点
|
leaf: true, // 标记为叶子节点
|
||||||
|
disabled: true
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
progressCategoryList.value.forEach((item, i) => {
|
progressCategoryList.value.forEach((item, i) => {
|
||||||
let indexNum = item.children.findIndex((item) => item.id === secondLevelNodeId);
|
let indexNum = item.children.findIndex((item) => item.id === secondLevelNodeId);
|
||||||
if (indexNum !== -1) {
|
if (indexNum !== -1) {
|
||||||
item.children[indexNum].threeChildren = res.data.facilityList; // 将子节点添加到当前节点的threeChildren属性中
|
item.children[indexNum].threeChildren = res.data.facilityList; // 将子节点添加到当前节点的threeChildren属性中
|
||||||
|
// item.children[indexNum].detailChildren = children; // 将子节点添加到当前节点的threeChildren属性中
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -193,7 +235,7 @@ const submit = () => {
|
|||||||
//重置树形结构选中以及图层高亮
|
//重置树形结构选中以及图层高亮
|
||||||
const resetTreeAndMap = () => {
|
const resetTreeAndMap = () => {
|
||||||
// 重置树形结构选中状态
|
// 重置树形结构选中状态
|
||||||
treeRef.value?.setCheckedKeys([]);
|
clearLevel3Checked(3);
|
||||||
//取消加载状态
|
//取消加载状态
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
// 清除地图上的所有高亮
|
// 清除地图上的所有高亮
|
||||||
@ -216,13 +258,25 @@ const handleChange = (value: number) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//限定部分节点能选择
|
//限定部分节点能选择
|
||||||
const renderContent = (context, { node }) => {
|
const renderContent = (context, { node, data }) => {
|
||||||
if (node.level === 3) {
|
if (node.level === 3) {
|
||||||
return h('span', { class: 'custom-tree-node' }, [
|
return h('span', { class: 'custom-tree-node' }, [
|
||||||
h(ElCheckbox, {
|
h(ElCheckbox, {
|
||||||
modelValue: node.checked,
|
modelValue: node.checked,
|
||||||
'onUpdate:modelValue': (val) => node.setChecked(val),
|
'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)
|
h('span', node.label)
|
||||||
]);
|
]);
|
||||||
|
Reference in New Issue
Block a user