diff --git a/controller/websocket_controller.go b/controller/websocket_controller.go index 7460d63..94a4820 100644 --- a/controller/websocket_controller.go +++ b/controller/websocket_controller.go @@ -686,6 +686,7 @@ func (c *WebSocketController) SendMessageHandler(ctx *gin.Context) { clientMsg := models.ClientReceivedMessage{ SenderID: "system", + RoomID: payload.RoomId, ReceiverID: payload.TargetClientID, SenderUserID: payload.SenderUserID, ReceiverUserID: payload.ReceiverUserID, @@ -784,25 +785,33 @@ func (c *WebSocketController) SendToUserHandler(ctx *gin.Context) { RoomId: payload.RoomId, SenderUserID: payload.SenderUserID, ReceiverUserID: payload.ReceiverUserID, + Duration: payload.Duration, MessageType: payload.MessageType, MessageContent: payload.MessageContent, CallID: payload.CallID, CallStatus: payload.CallStatus, } + var savedID = 0 + // 保存到数据库 if err := c.DB.Create(&chatMsg).Error; err != nil { log.Printf("❌ 保存消息到数据库失败: %v", err) } else { + // 获取消息id log.Printf("💾 消息保存到数据库成功: ID=%d", chatMsg.ID) + savedID = int(chatMsg.ID) } // 创建基础消息结构 clientMsg := models.ClientReceivedMessage{ SenderID: "system", ReceiverID: "", + ID: savedID, + RoomID: payload.RoomId, SenderUserID: payload.SenderUserID, ReceiverUserID: payload.ReceiverUserID, + Duration: payload.Duration, MessageType: payload.MessageType, Content: payload.MessageContent, SendTime: time.Now().Format(time.RFC3339), @@ -1026,29 +1035,29 @@ func (c *WebSocketController) sendMessageToUser(userID string, message models.Cl if len(clientIDs) == 0 { log.Printf("⚠️ 用户无在线客户端: UserID=%s", userID) - return fmt.Errorf("用户 %s 无在线客户端", userID) - } + //return fmt.Errorf("用户 %s 无在线客户端", userID) + } else { + log.Printf("📤📤📤📤📤📤📤📤 发送消息给用户: \n UserID=%s \n ClientCount=%d \n MsgType=%d", + userID, len(clientIDs), message.MessageType) - log.Printf("📤📤📤📤📤📤📤📤 发送消息给用户: \n UserID=%s \n ClientCount=%d \n MsgType=%d", - userID, len(clientIDs), message.MessageType) + var lastErr error + successCount := 0 - var lastErr error - successCount := 0 - - for _, clientID := range clientIDs { - if err := c.sendMessageToClient(clientID, message); err != nil { - log.Printf("⚠️ 发送到客户端失败: %v | ClientID=%s", err, clientID) - lastErr = err - } else { - successCount++ + for _, clientID := range clientIDs { + if err := c.sendMessageToClient(clientID, message); err != nil { + log.Printf("⚠️ 发送到客户端失败: %v | ClientID=%s", err, clientID) + lastErr = err + } else { + successCount++ + } } - } - if successCount == 0 { - return fmt.Errorf("所有客户端发送失败,最后错误: %v", lastErr) - } + if successCount == 0 { + return fmt.Errorf("所有客户端发送失败,最后错误: %v", lastErr) + } - log.Printf("✅ 用户消息发送完成: \n UserID=%s \n 成功=%d/%d", userID, successCount, len(clientIDs)) + log.Printf("✅ 用户消息发送完成: \n UserID=%s \n 成功=%d/%d", userID, successCount, len(clientIDs)) + } return nil } diff --git a/models/messages.go b/models/messages.go index 4cff003..196679d 100644 --- a/models/messages.go +++ b/models/messages.go @@ -8,8 +8,10 @@ type SendMessagePayload struct { TargetClientID string `json:"target_client_id"` // 目标客户端ID SenderUserID string `json:"sender_user_id"` // 发送者用户ID ReceiverUserID string `json:"receiver_user_id"` // 接收者用户ID - MessageType int `json:"message_type"` // 消息类型(0-8) + MessageType int `json:"message_type"` // 消息类型(0-9) MessageContent string `json:"message_content"` // 消息内容 + RoomId string `json:"room_id"` // 发送者用户ID + Duration int `json:"duration"` // 时长(音频、视频、音视频通话) // 通话专用字段 CallID string `json:"call_id,omitempty"` // 通话唯一ID CallStatus string `json:"call_status,omitempty"` // 通话状态:invite/accepted/rejected/ended/candidate @@ -18,9 +20,10 @@ type SendMessagePayload struct { // 通过用户ID发送消息的结构 type SendToUserPayload struct { RoomId string `json:"room_id"` // 发送者用户ID + Duration int `json:"duration"` // 时长(音频、视频、音视频通话) SenderUserID string `json:"sender_user_id"` // 发送者用户ID ReceiverUserID string `json:"receiver_user_id"` // 接收者用户ID - MessageType int `json:"message_type"` // 消息类型(0-8) + MessageType int `json:"message_type"` // 消息类型(0-9) MessageContent string `json:"message_content"` // 消息内容 // 通话专用字段 CallID string `json:"call_id,omitempty"` // 通话唯一ID @@ -33,8 +36,9 @@ type XkChatMessage struct { RoomId string `gorm:"type:varchar(100);index" json:"room_id"` // 房间ID SenderUserID string `gorm:"type:varchar(100);index" json:"sender_user_id"` // 发送者用户ID ReceiverUserID string `gorm:"type:varchar(100);index" json:"receiver_user_id"` // 接收者用户ID - MessageType int `gorm:"type:int" json:"message_type"` // 消息类型(0-8) + MessageType int `gorm:"type:int" json:"message_type"` // 消息类型(0-9) MessageContent string `gorm:"type:text" json:"message_content"` // 消息内容 + Duration int `json:"duration"` // 时长(音频、视频、音视频通话) CallID string `gorm:"type:varchar(100);index" json:"call_id"` // 通话唯一ID CallStatus string `gorm:"type:varchar(50)" json:"call_status"` // 通话状态 CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` // 创建时间 @@ -42,13 +46,16 @@ type XkChatMessage struct { // 客户端接收消息结构(最终格式) type ClientReceivedMessage struct { + ID int `json:"id"` // 房间号 + RoomID string `json:"room_id"` // 房间号 SenderID string `json:"sender_id"` // 发送者连接ID ReceiverID string `json:"receiver_id"` // 接收者连接ID SenderUserID string `json:"sender_user_id"` // 发送者用户ID ReceiverUserID string `json:"receiver_user_id"` // 接收者用户ID - MessageType int `json:"message_type"` // 消息类型(0-8) + MessageType int `json:"message_type"` // 消息类型(0-9) Content string `json:"content"` // 消息内容 SendTime string `json:"send_time"` // 发送时间 + Duration int `json:"duration"` // 时长(音频、视频、音视频通话) // 通话专用字段 CallID string `json:"call_id,omitempty"` // 通话唯一ID