diff --git a/src/components/user/ContactModal.vue b/src/components/user/ContactModal.vue index fced95a..c10cc56 100644 --- a/src/components/user/ContactModal.vue +++ b/src/components/user/ContactModal.vue @@ -34,6 +34,7 @@ const forwardMode = defineProps(['forwardMode']) // 通讯录弹窗相关状态 const state = reactive({ + selectedGroupRowKeys: [], isShowAddressBookModal: false, customModalStyle: { width: '1288px', @@ -94,6 +95,9 @@ const state = reactive({ } ], groupChatListColumns: [ + { + type: 'selection' + }, { title: '群聊名称', field: 'groupName', @@ -127,7 +131,7 @@ const state = reactive({ addressBookData: [], company_name: '', groupChatListData: [], - addressBookTableHeight: 524, + addressBookTableHeight: 500, addressBookTableWidth: 800, addressBookPage: 1, addressBookPageSize: 10, @@ -189,16 +193,29 @@ const onMaskClick = () => { const selectType = ref(2) const onTriggerContact = (item) => { + const clicked = items.value.find((val) => val.id === item.id) + if (!clicked) return + if (selectType.value === 1) { + // 单选:清空后仅选中当前 items.value.forEach(contact => { contact.checked = false }) + clicked.checked = true + return } - - let data = items.value.find((val) => val.id === item.id) - if (data) { - data.checked = !data.checked + // 多选:限制同一类型选择 + if (!clicked.checked) { + const checked = items.value.filter(c => c.checked) + const currentType = checked.length ? checked[0].talk_type : null + if (currentType && currentType !== clicked.talk_type) { + // 切换类型时清空已选,保持单一类型 + items.value.forEach(c => { if (c.checked) c.checked = false }) + } + clicked.checked = true + } else { + clicked.checked = false } } @@ -353,6 +370,12 @@ const changeAddressBookSearch = (value) => { const handleAddressBookTabChange = (value) => { state.addressBookCurrentTab = value + // 切换时清空另一类选项 + if (value === 'employeeAddressBook') { + state.selectedGroupRowKeys = [] + } else if (value === 'groupChatList') { + state.selectedRowKeys = [] + } } const changeGroupChatListSearch = (value) => { @@ -379,29 +402,40 @@ const onAddressBookCancel = () => { } const onAddressBookSubmit = async () => { - if (!Array.isArray(state.selectedRowKeys) || state.selectedRowKeys.length === 0) { - processError('请选择联系人') - return - } - - try { - const results = await Promise.all( - state.selectedRowKeys.map((erpId) => getUserInfoByERPUserId({ erp_user_id: erpId })) - ) - - const data = results - .filter((res) => res && res.code === 200 && res.data && res.data.sys_id) - .map((res) => ({ receiver_id: res.data.sys_id, talk_type: 1 })) - - if (data.length === 0) { - processError('未获取到有效联系人') + if (state.addressBookCurrentTab === 'employeeAddressBook') { + if (!Array.isArray(state.selectedRowKeys) || state.selectedRowKeys.length === 0) { + processError('请选择联系人') return } + try { + const results = await Promise.all( + state.selectedRowKeys.map((erpId) => getUserInfoByERPUserId({ erp_user_id: erpId })) + ) + + const data = results + .filter((res) => res && res.code === 200 && res.data && res.data.sys_id) + .map((res) => ({ receiver_id: res.data.sys_id, talk_type: 1 })) + + if (data.length === 0) { + processError('未获取到有效联系人') + return + } + + emit('on-submit', data) + state.isShowAddressBookModal = false + } catch (e) { + processError('发送失败,请稍后重试') + } + } else if (state.addressBookCurrentTab === 'groupChatList') { + if (!Array.isArray(state.selectedGroupRowKeys) || state.selectedGroupRowKeys.length === 0) { + processError('请选择群聊') + return + } + + const data = state.selectedGroupRowKeys.map((gid) => ({ receiver_id: gid, talk_type: 2 })) emit('on-submit', data) state.isShowAddressBookModal = false - } catch (e) { - processError('发送失败,请稍后重试') } } @@ -540,7 +574,7 @@ watch(() => state.groupChatListSearchGroupName, (newValue, oldValue) => { 请选择联系人 -