树形多选
<script setup lang="ts"> import { useVModel } from '@vueuse/core'; const props = defineProps({ modelValue: { type: Object, default: () => { }, }, }); /* AI视觉应用 */ const emit = defineEmits(['update:modelValue']); const form = useVModel(props, 'modelValue', emit); const lastDataHandleai = ref(null); // 上次选择的dataHandle值 if (form.value) { form.value.aiApplyChecked = form.value.isAi === 1; if (form.value.dataSources) { form.value.dataSourcearr = [form.value.dataSources]; setLastDataHandle1('dataSourcearr'); } if (form.value.outType) { form.value.resultOut = [form.value.outType]; setLastDataHandle1('resultOut'); } _getAlgorithmSceneTree(); } const isOpen3 = ref<boolean>(true); const dataSourceList = ref([ { label: '照片', value: 1 }, { label: '视频', value: 2 }, ]); const resultOutList = ref([ { label: '同步', value: 1 }, { label: '异步', value: 2 }, ]); // 节点数列表 const checkContentList: any = ref([ ]); function openClose() { isOpen3.value = !isOpen3.value; } // 获取节点树 function _getAlgorithmSceneTree() { getAlgorithmSceneTree().then((res) => { if (res.success) { const d = res.data ? res.data : []; let d2 = []; if (d && d.length) { d2 = d.map((item) => { if (item.sceneList && item.sceneList.length) { item.sceneList.forEach((element) => { element.label = element.name; element.value = element.id; }); } return { checkedAll: false, // 全选 indeterminate: false, // 半勾选 checkedList: [], // 选中的 children: item.sceneList, ...item, }; }); checkContentList.value = d2; } } // 编辑回显检测内容 if (form.value.detection) { checkEdit(form.value.detection); } }); } function getisAi1(v: any) { form.value.isAi = v ? 1 : 0; // 没有勾选 检查内容都置空 if (!v) { form.value.dataSources = ''; form.value.outType = ''; form.value.detection = ''; } } // 编辑回显检测内容 function checkEdit(val: any) { const detectionarr = val.split(','); if (checkContentList.value && checkContentList.value.length) { checkContentList.value.forEach((item: any) => { if (item.children && item.children.length) { item.indeterminate = false; item.checkedAll = false; item.checkedList = []; item.children.forEach((itemchild: any) => { detectionarr.forEach((deteitem: any) => { if (+deteitem === itemchild.id) { item.checkedList.push(+deteitem); } }); }); } // 全选半选回显 if (item.checkedList.length) { item.indeterminate = true; item.checkedAll = false; if (item.children.length === item.checkedList.length) { item.checkedAll = true; item.indeterminate = false; } } }); } } // 监听变化 watch(() => form.value, (val) => { // console.log('1', val) if (val) { form.value.aiApplyChecked = val.isAi === 1; if (val.dataSources) { form.value.dataSourcearr = [val.dataSources]; setLastDataHandle1('dataSourcearr'); } if (val.outType) { form.value.resultOut = [val.outType]; setLastDataHandle1('resultOut'); } // 编辑回显检测内容 if (val.detection) { checkEdit(val.detection); } else { // 切换清空 checkContentList.value.forEach((item: any) => { if (item.children && item.children.length) { item.indeterminate = false; item.checkedAll = false; item.checkedList = []; } // 全选半选回显 if (item.checkedList.length) { item.indeterminate = true; item.checkedAll = false; if (item.children.length === item.checkedList.length) { item.checkedAll = true; item.indeterminate = false; } } }); } } }, { immediate: true, }); // 检测内容勾选所有 function checkedAll(e: any, index: any) { checkContentList.value[index].checkedList = e.target.checked ? checkContentList.value[index].children.map(v => v.value) : []; checkContentList.value[index].indeterminate = false; handleAiApply(); } // 检测内容勾选单个 function checkedOne(val: any, index: any) { const checkedCount = val.length; checkContentList.value[index].checkedAll = checkedCount === checkContentList.value[index].children.length; checkContentList.value[index].indeterminate = checkedCount > 0 && checkedCount < checkContentList.value[index].children.length; handleAiApply(); } function setLastDataHandle1(field: any) { lastDataHandleai.value = form.value[field].length > 0 ? form.value[field][0] : null; } // 处理AI应用 function handleAiApply() { form.value.detection = checkContentList.value.flatMap((o: any) => o.checkedList).join(','); } // 数据来源 function handleAiApply1(checkedValue: any) { form.value.dataSourcearr = checkedValue.filter((item: any) => lastDataHandleai.value !== item); setLastDataHandle1('dataSourcearr'); if (form.value.dataSourcearr && form.value.dataSourcearr.length) { form.value.dataSources = form.value.dataSourcearr[0]; } else { form.value.dataSources = ''; } } // 结果输出 function handleAiApply2(checkedValue: any) { form.value.resultOut = checkedValue.filter((item: any) => lastDataHandleai.value !== item); setLastDataHandle1('resultOut'); if (form.value.resultOut && form.value.resultOut.length) { form.value.outType = form.value.resultOut[0]; } else { form.value.outType = ''; } } </script> <template> <!-- AI视觉识别应用 全局和单点都需要 --> <!-- 全局 --> <div class="mt-3" :class="isOpen3 ? 'border_box_6' : 'border_box_6_title'" style="z-index: 1;"> <div class="h-12 px-4 flex items-center justify-between"> <div class="flex items-center"> <PubSvgIcon name="ai-icon" size="2.4rem" /> <span class="text-white text-lg font-medium ml-2">AI视觉识别应用信息</span> </div> <div class="flex items-center"> <a-switch v-model:checked="form.aiApplyChecked" @change="getisAi1" /> <PubSvgIcon class="toggle-icon cursor-pointer ml-2" :class="isOpen3 ? '' : 'close'" name="doubleleft" :size="16" @click="openClose()" /> </div> </div> <div v-show="isOpen3" class="p-4"> <a-form v-if="form.aiApplyChecked" :colon="false" label-align="left" :label-col="{ style: { width: '7rem' } }"> <a-form-item label="数据来源"> <a-checkbox-group v-model:value="form.dataSourcearr" :options="dataSourceList" @change="handleAiApply1" /> </a-form-item> <a-form-item> <template #label> <div class="flex items-center"> <span class="mr-1">结果输出</span> <PubSvgIcon name="notice-icon" size="1.2rem" /> </div> </template> <a-checkbox-group v-model:value="form.resultOut" :options="resultOutList" @change="handleAiApply2" /> </a-form-item> <a-form-item label="检测内容"> <div v-for="(item, index) in checkContentList" :key="index" class="w-full"> <div class="flex items-center" style="min-height: 32px;"> <!-- 父级 --> <a-checkbox v-model:checked="item.checkedAll" :indeterminate="item.indeterminate" @change="checkedAll($event, index)" > {{ item.name }} </a-checkbox> </div> <div class="pl-4 py-1 -ml-4 mb-3 bg-white/10 flex items-center" style="min-height: 32px;" v-if="item.children?.length"> <a-checkbox-group v-model:value="item.checkedList" :options="item.children" @change="checkedOne($event, index)" /> </div> </div> </a-form-item> </a-form> </div> </div> </template> <style lang="less" scoped> // 展开收起 :deep(.toggle-icon) { transition: all 0.3s ease; transform: rotate(90deg); &.close { transform: rotate(-90deg); } } </style>