2026-01-28 13:38:05 +08:00
|
|
|
|
import { ref, computed } from 'vue'
|
|
|
|
|
|
import { onShow, onUnload } from '@dcloudio/uni-app'
|
2026-02-05 11:26:53 +08:00
|
|
|
|
import { storeToRefs } from 'pinia'
|
2026-02-03 11:20:32 +08:00
|
|
|
|
import api from '@/utils/api.js'
|
|
|
|
|
|
import useTeamStore from '@/store/team.js'
|
2026-02-05 11:26:53 +08:00
|
|
|
|
import useAccountStore from '@/store/account.js'
|
2026-01-28 13:38:05 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
2026-02-03 11:20:32 +08:00
|
|
|
|
* 群聊hook - 管理群聊成员和头像
|
2026-01-28 13:38:05 +08:00
|
|
|
|
* @param {string} groupID 群组ID
|
|
|
|
|
|
*/
|
|
|
|
|
|
export default function useGroupChat(groupID) {
|
|
|
|
|
|
const groupInfo = ref({})
|
|
|
|
|
|
const members = ref([])
|
2026-02-03 11:20:32 +08:00
|
|
|
|
const teamMemberIds = ref([]) // 存储团队成员的userId列表
|
|
|
|
|
|
const patientId = ref('') // 存储患者ID
|
|
|
|
|
|
const teamStore = useTeamStore()
|
2026-02-05 11:26:53 +08:00
|
|
|
|
const { openid } = storeToRefs(useAccountStore())
|
2026-01-28 13:38:05 +08:00
|
|
|
|
|
|
|
|
|
|
// 群聊成员映射
|
|
|
|
|
|
const chatMember = computed(() => {
|
|
|
|
|
|
const res = {}
|
|
|
|
|
|
members.value.forEach(member => {
|
|
|
|
|
|
res[member.id] = {
|
|
|
|
|
|
name: member.name,
|
2026-02-03 11:20:32 +08:00
|
|
|
|
avatar: member.avatar,
|
|
|
|
|
|
isTeamMember: member.isTeamMember // 标记是否为团队成员
|
2026-01-28 13:38:05 +08:00
|
|
|
|
}
|
2026-02-03 16:01:31 +08:00
|
|
|
|
// 如果成员有 miniAppId(患者的聊天 userID),也添加一个映射(用于消息的 from 字段)
|
|
|
|
|
|
if (member.miniAppId) {
|
|
|
|
|
|
res[member.miniAppId] = {
|
|
|
|
|
|
name: member.name,
|
|
|
|
|
|
avatar: member.avatar,
|
|
|
|
|
|
isTeamMember: member.isTeamMember
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-28 13:38:05 +08:00
|
|
|
|
})
|
|
|
|
|
|
return res
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-02-03 11:20:32 +08:00
|
|
|
|
// 判断某个userId是否为团队成员
|
|
|
|
|
|
const isTeamMember = (userId) => {
|
|
|
|
|
|
return teamMemberIds.value.includes(userId)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取用户头像(根据是否为团队成员返回不同的默认头像)
|
|
|
|
|
|
const getUserAvatar = (userId) => {
|
|
|
|
|
|
const member = chatMember.value[userId]
|
|
|
|
|
|
if (!member) {
|
|
|
|
|
|
// 如果找不到成员信息,根据是否为团队成员返回默认头像
|
2026-02-05 11:26:53 +08:00
|
|
|
|
// 患者(userId为当前账户openid)使用 default-patient-avatar.png
|
|
|
|
|
|
// 其他情况使用 default-avatar.svg
|
|
|
|
|
|
return userId === openid.value ? '/static/default-patient-avatar.png' : '/static/default-avatar.svg'
|
2026-02-03 11:20:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果有头像且不为空字符串,返回头像
|
|
|
|
|
|
if (member.avatar && member.avatar.trim() !== '') {
|
|
|
|
|
|
return member.avatar
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-05 11:26:53 +08:00
|
|
|
|
// 否则根据是否为团队成员返回默认头像
|
|
|
|
|
|
// 患者使用 default-patient-avatar.png,团队成员使用 default-avatar.svg
|
|
|
|
|
|
return member.isTeamMember ? '/static/default-avatar.svg' : '/static/default-patient-avatar.png'
|
2026-02-03 11:20:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取群聊信息和成员头像
|
2026-01-28 13:38:05 +08:00
|
|
|
|
async function getGroupInfo() {
|
|
|
|
|
|
const gid = typeof groupID === 'string' ? groupID : groupID.value
|
|
|
|
|
|
if (!gid) return
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
2026-02-03 11:20:32 +08:00
|
|
|
|
// 1. 获取群聊基本信息
|
|
|
|
|
|
const groupResult = await api('getGroupListByGroupId', { groupId: gid })
|
2026-01-28 13:38:05 +08:00
|
|
|
|
|
2026-02-03 11:20:32 +08:00
|
|
|
|
if (groupResult && groupResult.success && groupResult.data) {
|
|
|
|
|
|
groupInfo.value = {
|
|
|
|
|
|
groupID: gid,
|
|
|
|
|
|
name: groupResult.data.team?.name || '群聊',
|
|
|
|
|
|
status: groupResult.data.orderStatus || 'active',
|
|
|
|
|
|
teamId: groupResult.data.teamId
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 16:01:31 +08:00
|
|
|
|
// 2. 如果有teamId,获取团队成员头像和名称
|
2026-02-03 11:20:32 +08:00
|
|
|
|
if (groupResult.data.teamId) {
|
2026-02-03 16:01:31 +08:00
|
|
|
|
const memberMap = await teamStore.getTeamMemberAvatarsAndName(groupResult.data.teamId)
|
2026-02-03 11:20:32 +08:00
|
|
|
|
|
|
|
|
|
|
// 3. 存储团队成员ID列表
|
2026-02-03 16:01:31 +08:00
|
|
|
|
teamMemberIds.value = Object.keys(memberMap)
|
2026-02-03 11:20:32 +08:00
|
|
|
|
|
2026-02-03 16:01:31 +08:00
|
|
|
|
// 4. 构建团队成员列表(从返回的 { userId: { avatar, name } } 中提取)
|
|
|
|
|
|
members.value = teamMemberIds.value.map(userId => {
|
|
|
|
|
|
const memberInfo = memberMap[userId] || {}
|
|
|
|
|
|
return {
|
|
|
|
|
|
id: userId,
|
|
|
|
|
|
name: memberInfo.name || userId, // 使用返回的 name,如果没有则用 userId
|
|
|
|
|
|
avatar: memberInfo.avatar || '', // 使用返回的 avatar
|
|
|
|
|
|
isTeamMember: true
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2026-02-03 11:20:32 +08:00
|
|
|
|
|
|
|
|
|
|
// 5. 添加患者信息(使用默认患者头像)
|
|
|
|
|
|
if (groupResult.data.patient) {
|
|
|
|
|
|
const pid = groupResult.data.patientId?.toString() || ''
|
|
|
|
|
|
patientId.value = pid
|
|
|
|
|
|
members.value.push({
|
|
|
|
|
|
id: pid,
|
|
|
|
|
|
name: groupResult.data.patient.name || '患者',
|
|
|
|
|
|
avatar: '', // 患者不设置头像,使用默认
|
2026-02-03 16:01:31 +08:00
|
|
|
|
isTeamMember: false,
|
|
|
|
|
|
miniAppId: groupResult.data.patient.miniAppId || '' // 患者的聊天 userID
|
2026-02-03 11:20:32 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-28 13:38:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('获取群聊信息失败:', error)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
onShow(() => {
|
|
|
|
|
|
getGroupInfo()
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
onUnload(() => {
|
|
|
|
|
|
// 清理资源
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
groupInfo,
|
|
|
|
|
|
members,
|
|
|
|
|
|
chatMember,
|
2026-02-03 11:20:32 +08:00
|
|
|
|
getGroupInfo,
|
|
|
|
|
|
isTeamMember,
|
|
|
|
|
|
getUserAvatar
|
2026-01-28 13:38:05 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|