|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
|
import {nextTick, ref} from "vue";
|
|
|
|
|
|
import type {TreeNode} from "@/api/types/monitor/Tree";
|
|
|
|
|
|
import {ElMessage, type TreeData, type TreeKey} from "element-plus";
|
|
|
|
|
|
import {useCameraBindStore} from "@/stores/modules/cameraBind";
|
|
|
|
|
|
const cameraBindStore=useCameraBindStore();
|
|
|
|
|
|
const filteredTreeData = ref<TreeNode[]>([]);
|
|
|
|
|
|
// 用于记录当前选中的节点 ID
|
|
|
|
|
|
const currentCheckedId=ref<number>();
|
|
|
|
|
|
interface Params {
|
|
|
|
|
|
title: string;
|
|
|
|
|
|
rows: any;
|
|
|
|
|
|
getTreeData?: (() => Promise<any>) | undefined;
|
|
|
|
|
|
}
|
|
|
|
|
|
const visible = ref(false);
|
|
|
|
|
|
const treeRef=ref<any>(null);
|
|
|
|
|
|
const paramsProps=ref<Params>({
|
|
|
|
|
|
rows: null,
|
|
|
|
|
|
title:'',
|
|
|
|
|
|
getTreeData: undefined
|
|
|
|
|
|
})
|
|
|
|
|
|
const emit=defineEmits(['bindingCamera']);
|
|
|
|
|
|
// 接收父组件传递过来的参数
|
|
|
|
|
|
const acceptParams=async (params:Params)=> {
|
|
|
|
|
|
paramsProps.value = params;
|
|
|
|
|
|
const res = await paramsProps.value.getTreeData!();
|
|
|
|
|
|
if (res.code == '0000') {
|
|
|
|
|
|
filteredTreeData.value = res.data;
|
|
|
|
|
|
}
|
|
|
|
|
|
currentCheckedId.value=paramsProps.value.rows.val;
|
|
|
|
|
|
console.log('当前被选中的节点的ID为:',currentCheckedId.value);
|
|
|
|
|
|
visible.value = true;
|
|
|
|
|
|
await nextTick();
|
|
|
|
|
|
if(currentCheckedId.value)
|
|
|
|
|
|
{
|
|
|
|
|
|
treeRef.value.setCheckedKeys([currentCheckedId.value]);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
treeRef.value.setCheckedKeys([]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 提交数据
|
|
|
|
|
|
const handleSubmit = async () => {
|
|
|
|
|
|
const checkedNodes = treeRef.value.getCheckedNodes();
|
|
|
|
|
|
// 顺手帮你加个保护机制,避免触发你上一个问题里提到的 undefined 报错
|
|
|
|
|
|
if (!checkedNodes || checkedNodes.length === 0) {
|
|
|
|
|
|
ElMessage.warning('请先选择一个设备');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
|
|
|
// 移除pinia中原先绑定的摄像头
|
|
|
|
|
|
if(currentCheckedId.value!=checkedNodes[0])
|
|
|
|
|
|
{
|
|
|
|
|
|
cameraBindStore.unbindCamera(currentCheckedId.value);
|
|
|
|
|
|
}
|
|
|
|
|
|
emit('bindingCamera', checkedNodes[0]);
|
|
|
|
|
|
treeRef.value.setCheckedKeys([]);
|
|
|
|
|
|
currentCheckedId.value = null; // 提交后清空选中状态
|
|
|
|
|
|
visible.value = false;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.log(error);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
const handleCheck=(data: TreeNode, info: { checkedKeys: TreeKey[],checkedNodes: TreeData, halfCheckedKeys: TreeKey[], halfCheckedNodes: TreeData})=>{
|
|
|
|
|
|
// 判断当前操作是勾选还是取消勾选
|
|
|
|
|
|
const isChecked = info.checkedKeys.includes(data.id);
|
|
|
|
|
|
if(isChecked)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 如果被勾选
|
|
|
|
|
|
// 判断是否为叶子节点
|
|
|
|
|
|
const isLeaf=!data.children || data.children.length === 0;
|
|
|
|
|
|
if(!isLeaf)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 如果不是叶子节点,强制从已选列表中移除当前节点
|
|
|
|
|
|
const newKeys=info.checkedKeys.filter(key => key !== data.id);
|
|
|
|
|
|
treeRef.value.setCheckedKeys(newKeys);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}else {
|
|
|
|
|
|
treeRef.value.setCheckedKeys([data.id]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 暴露给父组件
|
|
|
|
|
|
defineExpose({
|
|
|
|
|
|
acceptParams
|
|
|
|
|
|
})
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<template>
|
|
|
|
|
|
<el-dialog
|
|
|
|
|
|
v-model="visible"
|
|
|
|
|
|
class="tree-wrapper"
|
|
|
|
|
|
:title="paramsProps.title"
|
|
|
|
|
|
width="500px"
|
|
|
|
|
|
draggable >
|
|
|
|
|
|
<el-scrollbar height="400px">
|
|
|
|
|
|
<el-empty v-if="filteredTreeData.length === 0" description="暂无设备数据" :image-size="60" />
|
|
|
|
|
|
<el-tree-v2
|
|
|
|
|
|
v-else
|
|
|
|
|
|
ref="treeRef"
|
|
|
|
|
|
:height="400"
|
|
|
|
|
|
:data="filteredTreeData"
|
|
|
|
|
|
show-checkbox
|
|
|
|
|
|
check-strictly
|
|
|
|
|
|
@check="handleCheck"
|
|
|
|
|
|
node-key="id"
|
|
|
|
|
|
default-expand-all
|
|
|
|
|
|
:props="{
|
|
|
|
|
|
label: 'name',
|
|
|
|
|
|
children: 'children',
|
|
|
|
|
|
}"
|
|
|
|
|
|
class="transfer-tree"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-scrollbar>
|
|
|
|
|
|
|
|
|
|
|
|
<template #footer>
|
|
|
|
|
|
<el-button @click="visible = false"> 取消</el-button>
|
|
|
|
|
|
<el-button type="primary" @click="handleSubmit"> 确定</el-button>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
</el-dialog>
|
|
|
|
|
|
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</style>
|