diff --git a/src/pages/chooseByDeps/index.vue b/src/pages/chooseByDeps/index.vue index 42851c4..209076a 100644 --- a/src/pages/chooseByDeps/index.vue +++ b/src/pages/chooseByDeps/index.vue @@ -571,43 +571,53 @@ const buildDepsMap = (departments) => { } const allCheckStatus = computed(() => { - if (currentCrumbs?.value?.sons?.length === 0) { + if ( + currentCrumbs?.value?.sons?.length === 0 && + currentMembers.value.length === 0 + ) { return 'noChecked' } if (state.chooseMode === 2) { // 检查部门选择状态 - const allDepsChecked = currentCrumbs?.value?.sons?.every( - (son) => son.checkStatus === 'checked', - ) - const someDepsChecked = currentCrumbs?.value?.sons?.some( - (son) => - son.checkStatus === 'checked' || son.checkStatus === 'halfChecked', - ) + const allDepsChecked = + currentCrumbs?.value?.sons?.length > 0 + ? currentCrumbs?.value?.sons?.every( + (son) => son.checkStatus === 'checked', + ) + : true // 如果没有子部门,则视为部门全选 // 检查人员选择状态 - const currentMemberIds = new Set( - currentMembers.value.map((member) => member.ID), - ) const allMembersChecked = currentMembers.value.length > 0 && currentMembers.value.every((member) => membersCheckedKeys.value.some((checked) => checked.ID === member.ID), ) - const someMembersChecked = currentMembers.value.some((member) => - membersCheckedKeys.value.some((checked) => checked.ID === member.ID), - ) // 综合判断全选状态 - if (allDepsChecked && allMembersChecked) { + // 1. 如果有子部门和成员,则需要都选中才是全选 + // 2. 如果只有成员没有子部门,则只需要成员全选即可 + // 3. 如果只有子部门没有成员,则只需要子部门全选即可 + if ( + (currentCrumbs?.value?.sons?.length > 0 && allDepsChecked) || + (currentMembers.value.length > 0 && allMembersChecked) + ) { return 'checked' - } else if (someDepsChecked || someMembersChecked) { + } else if ( + currentCrumbs?.value?.sons?.some( + (son) => + son.checkStatus === 'checked' || son.checkStatus === 'halfChecked', + ) || + currentMembers.value.some((member) => + membersCheckedKeys.value.some((checked) => checked.ID === member.ID), + ) + ) { return 'halfChecked' } return 'noChecked' } - // 部门选择模式的原有逻辑 + // 部门选择模式的原有逻辑保持不变 const allChecked = currentCrumbs?.value?.sons?.every( (son) => son.checkStatus === 'checked', ) @@ -700,6 +710,10 @@ const updateNodeStatus = (node) => { // 更新当前节点及其所有子节点的状态 const updateCheckStatus = (node, status, doShow) => { node.checkStatus = status + // 当状态为 noChecked 时,同时取消当前按钮的选中状态 + if (status === 'noChecked') { + node.currentChecked = false + } if (state.chooseMode === 2 && doShow) { node.showInPopup = true @@ -910,15 +924,30 @@ const checkCurrentItem = (item) => { const treeNode = findNodeById(depTreeMyList.value[0], item.ID) if (!treeNode) return + // 检查子节点状态 + const allSonsChecked = + treeNode.sons && + Array.isArray(treeNode.sons) && + treeNode.sons.every((son) => son.checkStatus === 'checked') + // 切换当前节点的单独选中状态 treeNode.currentChecked = !treeNode.currentChecked // 更新节点状态 if (treeNode.currentChecked) { - treeNode.checkStatus = 'halfChecked' + // 如果子节点全部选中,则当前节点也应该完全选中 + if (allSonsChecked) { + treeNode.checkStatus = 'checked' + } else { + treeNode.checkStatus = 'halfChecked' + } } else { - // 如果取消单独选中,则恢复未选中状态 - treeNode.checkStatus = 'noChecked' + // 如果取消单独选中,但子节点全选,保持半选状态 + if (allSonsChecked) { + treeNode.checkStatus = 'halfChecked' + } else { + treeNode.checkStatus = 'noChecked' + } } // 更新父节点状态 @@ -945,20 +974,25 @@ const calculateTotalStaffNum = (node) => { } const getCurrentMembers = async (depItem) => { - if (state.chooseMode === 1) { + if (state.chooseMode === 1 || !depItem?.ID) { currentMembers.value = [] return } - let params = { - departmentId: depItem.ID, - status: 'notactive', - } + // 使用更明确的参数结构 + let params = { status: 'notactive' } if (searchVal.value) { - delete params.departmentId - params = Object.assign({}, params, { + params = { fatherDepartmentId: depItem.ID, - nickName: searchVal.value, - }) + nickName: searchVal.value.trim(), + } + } else { + params.departmentId = depItem.ID + } + + // 添加请求拦截 + if (!params.departmentId && !params.fatherDepartmentId) { + console.error('无效的部门ID参数') + return } const res = await getDepMembers(params) if (res.status === 0) { @@ -988,8 +1022,11 @@ const checkMember = (item, val) => { watch( () => currentCrumbs.value, (newValue, oldValue) => { - getCurrentMembers(newValue) + if (newValue?.ID && (state.chooseMode === 2 || state.chooseMode === 3)) { + getCurrentMembers(newValue) + } }, + { immediate: true }, ) const deleteMember = (item) => { diff --git a/src/store/auth/index.js b/src/store/auth/index.js index 494cce0..370131d 100644 --- a/src/store/auth/index.js +++ b/src/store/auth/index.js @@ -5,7 +5,7 @@ import { userInfoApi } from "@/api/user"; import {ref} from 'vue' export const useAuth = createGlobalState(() => { // const token = useStorage('token', '', uniStorage) - const token = ref('79b5c732d96d2b27a48a99dfd4a5566c43aaa5796242e854ebe3ffc198d6876b9628e7b764d9af65ab5dbb2d517ced88170491b74b048c0ba827c0d3741462cb89dc59ed46653a449af837a8262941caaef1334d640773710f8cd96473bacfb190cba595a5d6a9c87d70f0999a3ebb41147213b31b4bdccffca66a56acf3baab5af0154f0dce360079f37709f78e13711036899344bddb0fb4cf0f2890287cb62c3fcbe33368caa5e213624577be8b8420ab75b1f50775ee16142a4321c5d56995f37354a66a969da98d95ba6e65d142ed097e04b411c1ebad2f62866d0ec7e1838420530a9941dbbcd00490199f8b892d39c9c0de979228015326a8fde48c55b8d48be643cb00da04330faa68977c689c6d523213435a2d92e3fab2976a1f5a6d4bfcb6c7aba3b4924873003b6492a2d0b81da4722162c68aeeec942eb2a85d') + const token = ref('79b5c732d96d2b27a48a99dfd4a5566c43aaa5796242e854ebe3ffc198d6876b9628e7b764d9af65ab5dbb2d517ced88170491b74b048c0ba827c0d3741462cb89dc59ed46653a449af837a8262941caaef1334d640773710f8cd96473bacfb190cba595a5d6a9c87d70f0999a3ebb41147213b31b4bdccffca66a56acf3baab5af0154f0dce360079f37709f78e13711036899344bddb0fb4cf0f2890287cb62c3fcbe33368caa5e213624577be8b8420ab75b1f50775ee16142a4321c5d56995f37354a66a969da98d95ba6e65d142ed097e04b411c1ebad2f62866d0ec7e1838420530a9941dbbcd00490199f8b8989ec7fe774a82b3f1c4a71a1a6338dec73760f6e72184147caceb1e8a1884e7251c809c440eb394f5df08a384a639a4710527561343785f238745ba9057ec3d4d5fdf5130d4666761c69db08d31abb01') const refreshToken = useStorage('refreshToken', '', uniStorage) const userInfo = useStorage('userInfo', {}, uniStorage) const leaderList = useStorage('leaderList', [], uniStorage)