From 4cf06bb1d18c07883073fdbb5d45d3c88e849def Mon Sep 17 00:00:00 2001 From: xuchao <1151716571@qq.com> Date: Sat, 10 Jan 2026 20:35:34 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packageB/priority/helpFilter.vue | 159 ++++++++++++++++++------------- 1 file changed, 94 insertions(+), 65 deletions(-) diff --git a/packageB/priority/helpFilter.vue b/packageB/priority/helpFilter.vue index 1e49d0a..654f8d0 100644 --- a/packageB/priority/helpFilter.vue +++ b/packageB/priority/helpFilter.vue @@ -40,15 +40,8 @@ 所属区域: - + @@ -209,7 +202,6 @@ const getBackgroundStyle = (imageName) => ({ const trainVideoImgUrl=config.trainVideoImgUrl const picker = ref(null) -const isRegionsLoading = ref(true); // 所属区域选项(可根据实际替换为动态数据) const regions = ref([]) @@ -243,21 +235,10 @@ onLoad(() => { $api.myRequest("/system/user/login/user/info", {}, "GET", 9100, { Authorization: `Bearer ${uni.getStorageSync("fourLevelLinkage-token")}` }).then(async (resData) => { - try { - // 一次性递归加载完整树状结构 - regions.value = await loadLevelData(resData.sysUser.dept.deptId); - isRegionsLoading.value = false; - } catch (error) { - isRegionsLoading.value = false; - uni.showToast({ title: '网络波动,所属区域数据加载失败', icon: 'none' }); - } - - Promise.all([ - getDictionary(), - getDataList('refresh') - ]).catch(error => { - console.log('其他数据加载失败:', error); - }); + + await loadLevelData(resData.sysUser.dept.deptId); + getDictionary() + getDataList('refresh'); }); }else{ navTo('/packageB/login2'); @@ -283,48 +264,96 @@ function getTaskTypeLabelByValue(value) { const item = taskTypeOptions.value.find(item => item.value === String(value)) return item ? item.text : '暂无帮扶类型' } -function getRequestHeader() { - return { - 'Authorization': uni.getStorageSync('fourLevelLinkage-token'), - 'Content-Type': "application/x-www-form-urlencoded" - }; + // 加载某一级的数据(parentId 为空表示根) +async function loadLevelData(parentId,node) { + let header = { + 'Authorization': uni.getStorageSync('fourLevelLinkage-token'), + 'Content-Type': "application/x-www-form-urlencoded" + }; + let params = { parentId }; + + try { + const resData = await $api.myRequest('/dispatch/dept/list', params, 'get', 9100, header); + if(resData.data.length==0){ + picker.value.hide() + return + } + const formatted = (resData.data || []).map(item => ({ + text: item.deptName, + value: item.tags, + deptId: item.deptId, + children: [] + })); + if(node){ + injectChildren(parentId, formatted); + }else{ + regions.value=formatted + } + } catch (error) { + console.error("加载部门数据失败:", error); + uni.showToast({ title: '加载失败', icon: 'none' }); + } } +// 将子级数据注入到对应的父节点 +function injectChildren(parentValue, childrenData) { + const findAndInject = (nodes) => { + for (let node of nodes) { + if (node.deptId === parentValue) { + // 如果 children 已存在且非空,避免重复加载 + if (!node.children || node.children.length === 0) { + node.children = childrenData; + } + return true; + } + if (node.children && node.children.length > 0) { + if (findAndInject(node.children)) return true; + } + } + return false; + } -async function loadLevelData(parentId) { - let header = getRequestHeader(); - let params = { parentId }; - - try { - const resData = await $api.myRequest('/dispatch/dept/list', params, 'get', 9100, header); - const data = resData.data || []; - - const formatted = await Promise.all(data.map(async (item) => { - try { - // 递归加载子节点 - const children = await loadLevelData(item.deptId); - return { - text: item.deptName, - value: item.tags, - deptId: item.deptId, - children: children - }; - } catch (error) { - console.log(`加载部门${item.deptName}的子节点失败:`, error); - // 单个节点加载失败不影响其他节点,返回该节点的基本信息 - return { - text: item.deptName, - value: item.tags, - deptId: item.deptId, - children: [] - }; - } - })); - - return formatted; - } catch (error) { - console.log(`加载父节点${parentId}的数据失败:`, error); - return []; - } + findAndInject(regions.value); + // 强制更新 +} +// 当用户选择时触发(注意:change 在每级选择后都会触发) +function onchange(e) { + const selectedValues = e.detail.value; + // formData.deptId=selectedValues.map(item => item.value).join(','); + if (selectedValues.length === 0) return; + // 获取最后一级选中的 value + const lastSelectedValue = selectedValues[selectedValues.length - 1]; + // 查找该节点是否有 children,如果没有则尝试加载 + const node = findNodeByValue(regions.value, lastSelectedValue); + if (node && (!node.children || node.children.length === 0)) { + // 检查接口是否还有下一级(可通过接口返回判断,或先尝试加载) + // 这里我们直接尝试加载下一级 + loadLevelData(node.deptId , node); + picker.value.show() + } +} +// 工具函数:根据 value 查找节点 +function findNodeByValue(nodes, value) { + for (let node of nodes) { + if (node.value === value.value) { + return node; + } + if (node.children && node.children.length > 0) { + const found = findNodeByValue(node.children, value); + if (found) return found; + } + } + return null; +} +function getDeptOptions(){ + let header={ + 'Authorization':uni.getStorageSync('fourLevelLinkage-token'), + 'Content-Type': "application/x-www-form-urlencoded" + } + let params={ + parentId:'' + } + $api.myRequest('/dispatch/dept/list', params,'get',9100,header).then((resData) => { + }); } function getDataList(type = 'add') { let maxPage=Math.ceil(totalNum.value/pageSize.value)