From 3dfc468f50f6802e9b4027a858d95485b71c2401 Mon Sep 17 00:00:00 2001 From: liqi Date: Fri, 5 Dec 2025 15:48:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BE=A4=E8=81=8A=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/api/room_handler.go | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/internal/api/room_handler.go b/internal/api/room_handler.go index ffcd6ed..52ceafe 100644 --- a/internal/api/room_handler.go +++ b/internal/api/room_handler.go @@ -9,6 +9,7 @@ import ( "fmt" "log" "strconv" + "strings" "xk-websocket-v2/internal/model" "xk-websocket-v2/internal/service" "xk-websocket-v2/internal/utils" @@ -351,6 +352,110 @@ func AddGroupMembersHandler(c *gin.Context) { return } + // 发送群通知和系统消息 + if service.ChatSvc != nil && service.UserSvc != nil { + // 获取操作者信息 + operator, opErr := service.UserSvc.GetUserByID(userID.(string)) + if opErr == nil { + // 获取被邀请成员信息 + invitedNames := make([]string, 0) + for _, memberID := range req.MemberIDs { + member, memErr := service.UserSvc.GetUserByID(memberID) + if memErr == nil { + invitedNames = append(invitedNames, member.Name) + } + } + + if len(invitedNames) > 0 { + // 获取群成员列表(包括新加入的成员) + memberIDs, mErr := service.RoomSvc.GetRoomMembers(roomID) + if mErr == nil { + // 构建群通知消息内容 + var notifContent string + if len(invitedNames) == 1 { + notifContent = fmt.Sprintf("%s 邀请了 %s 加入群聊", operator.Name, invitedNames[0]) + } else { + notifContent = fmt.Sprintf("%s 邀请了 %s 加入群聊", operator.Name, strings.Join(invitedNames, "、")) + } + + notifExtra := map[string]interface{}{ + "type": "member_invite", + "room_id": roomID, + "operator": userID.(string), + "operator_name": operator.Name, + "targets": req.MemberIDs, + "target_names": invitedNames, + } + notifExtraJSON, _ := json.Marshal(notifExtra) + + // 为所有成员发送群通知(包括新加入的成员) + for _, uid := range memberIDs { + // 群通知消息 + notifMsg := model.ChatMessage{ + RoomID: roomID, + SenderUserID: userID.(string), + ReceiverUserID: roomID, + MessageType: model.MessageTypeGroupNotif, + Content: notifContent, + Extra: string(notifExtraJSON), + } + + if err := service.ChatSvc.DB.Create(¬ifMsg).Error; err == nil { + // 更新会话 + if service.ConversationSvc != nil { + _ = service.ConversationSvc.UpsertConversationOnMessage(uid, roomID, roomID, notifMsg, false) + } + + // 推送消息 + pushMsg := model.WsPayload{ + RequestType: "receive_message", + Data: notifMsg, + } + msgBytes, _ := json.Marshal(pushMsg) + service.ChatSvc.DispatchMessage(uid, msgBytes) + } + } + + // 为新加入的成员发送系统消息 + for _, memberID := range req.MemberIDs { + systemContent := fmt.Sprintf("你被 %s 邀请加入群聊", operator.Name) + systemExtra := map[string]interface{}{ + "type": "member_invited", + "room_id": roomID, + "operator": userID.(string), + "operator_name": operator.Name, + } + systemExtraJSON, _ := json.Marshal(systemExtra) + + systemMsg := model.ChatMessage{ + RoomID: roomID, + SenderUserID: userID.(string), + ReceiverUserID: roomID, + MessageType: model.MessageTypeSystem, + Content: systemContent, + Extra: string(systemExtraJSON), + } + + if err := service.ChatSvc.DB.Create(&systemMsg).Error; err == nil { + // 更新会话 + if service.ConversationSvc != nil { + _ = service.ConversationSvc.UpsertConversationOnMessage(memberID, roomID, roomID, systemMsg, false) + } + + // 推送消息 + pushMsg := model.WsPayload{ + RequestType: "receive_message", + Data: systemMsg, + } + msgBytes, _ := json.Marshal(pushMsg) + service.ChatSvc.DispatchMessage(memberID, msgBytes) + } + } + } + } + } + } + utils.Success(c, "添加成员成功") }