visitor_service.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package service
  2. import (
  3. _ "github.com/2930134478/AI-CS/backend/models" // 用于访问 models.User 类型(通过 repository 返回)
  4. "github.com/2930134478/AI-CS/backend/repository"
  5. )
  6. // OnlineAgentHub 描述获取在线客服ID列表的能力。
  7. type OnlineAgentHub interface {
  8. GetOnlineAgentIDs() map[uint]bool
  9. }
  10. // VisitorService 负责访客相关的业务逻辑。
  11. type VisitorService struct {
  12. userRepo *repository.UserRepository
  13. hub OnlineAgentHub
  14. }
  15. // NewVisitorService 创建 VisitorService 实例。
  16. func NewVisitorService(userRepo *repository.UserRepository, hub OnlineAgentHub) *VisitorService {
  17. return &VisitorService{
  18. userRepo: userRepo,
  19. hub: hub,
  20. }
  21. }
  22. // GetOnlineAgents 获取所有在线客服列表。
  23. // 返回在线客服的基本信息(ID、昵称、头像)。
  24. func (s *VisitorService) GetOnlineAgents() ([]OnlineAgent, error) {
  25. // 从 WebSocket Hub 获取在线客服ID列表
  26. onlineAgentIDs := s.hub.GetOnlineAgentIDs()
  27. if len(onlineAgentIDs) == 0 {
  28. return []OnlineAgent{}, nil
  29. }
  30. // 将 map 转换为 ID 列表
  31. ids := make([]uint, 0, len(onlineAgentIDs))
  32. for id := range onlineAgentIDs {
  33. ids = append(ids, id)
  34. }
  35. // 从数据库查询这些客服的详细信息(包含 admin 和 agent 角色)
  36. users, err := s.userRepo.FindByIDsAndRoles(ids, []string{"admin", "agent"})
  37. if err != nil {
  38. return nil, err
  39. }
  40. // 转换为 OnlineAgent 列表
  41. agents := make([]OnlineAgent, 0, len(users))
  42. for _, user := range users {
  43. agents = append(agents, OnlineAgent{
  44. ID: user.ID,
  45. Nickname: user.Nickname,
  46. AvatarURL: user.AvatarURL,
  47. })
  48. }
  49. return agents, nil
  50. }