package radio import ( "sundynix-go/global" common "sundynix-go/model/commom/request" "sundynix-go/model/radio/response" "sundynix-go/model/system" ) type UserService struct{} // GetRadioUserList 获取电台用户列表(带订阅/收听统计) func (s *UserService) GetRadioUserList(info common.PageInfo, isVip int, keyword string) ([]response.RadioUserItem, int64, error) { var total int64 var users []system.User db := global.DB.Model(&system.User{}) // 关键字搜索 if keyword != "" { db = db.Where("nick_name LIKE ? OR phone LIKE ? OR account LIKE ?", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%") } // VIP 筛选: 1=VIP, 2=非VIP, 0或其他=全部 if isVip == 1 { db = db.Where("is_vip = 1") } else if isVip == 2 { db = db.Where("is_vip = 0") } // 统计总数 if err := db.Count(&total).Error; err != nil { return nil, 0, err } // 分页查询用户列表 if err := db.Preload("Avatar"). Scopes(info.Paginate()). Order("created_at DESC"). Find(&users).Error; err != nil { return nil, 0, err } // 批量获取用户ID userIds := make([]string, len(users)) for i, u := range users { userIds[i] = u.Id } if len(userIds) == 0 { return []response.RadioUserItem{}, total, nil } // 批量查询订阅数 type UserCount struct { UserId string Count int64 } var subCounts []UserCount global.DB.Table("sundynix_radio_subscription"). Select("user_id, COUNT(*) as count"). Where("user_id IN ? AND status = 1 AND deleted_at IS NULL", userIds). Group("user_id"). Scan(&subCounts) subMap := make(map[string]int64) for _, sc := range subCounts { subMap[sc.UserId] = sc.Count } // 批量查询收听次数 var listenCounts []UserCount global.DB.Table("sundynix_radio_listen_log"). Select("user_id, COUNT(*) as count"). Where("user_id IN ? AND deleted_at IS NULL", userIds). Group("user_id"). Scan(&listenCounts) listenMap := make(map[string]int64) for _, lc := range listenCounts { listenMap[lc.UserId] = lc.Count } // 批量查询收藏数 var favCounts []UserCount global.DB.Table("sundynix_radio_favorite"). Select("user_id, COUNT(*) as count"). Where("user_id IN ? AND deleted_at IS NULL", userIds). Group("user_id"). Scan(&favCounts) favMap := make(map[string]int64) for _, fc := range favCounts { favMap[fc.UserId] = fc.Count } // 批量查询订单总额(分) type UserAmount struct { UserId string TotalAmount int64 OrderCount int64 } var orderStats []UserAmount global.DB.Table("sundynix_order"). Select("user_id, SUM(amount) as total_amount, COUNT(*) as order_count"). Where("user_id IN ? AND status = 1 AND deleted_at IS NULL", userIds). Group("user_id"). Scan(&orderStats) amountMap := make(map[string]int64) orderCountMap := make(map[string]int64) for _, os := range orderStats { amountMap[os.UserId] = os.TotalAmount orderCountMap[os.UserId] = os.OrderCount } // 组装结果 result := make([]response.RadioUserItem, len(users)) for i, u := range users { avatarUrl := "" if u.Avatar != nil { avatarUrl = u.Avatar.Url } result[i] = response.RadioUserItem{ Id: u.Id, Name: u.Name, NickName: u.NickName, Account: u.Account, Phone: u.Phone, AvatarUrl: avatarUrl, Gender: u.Gender, IsVip: u.IsVip, VipExpireAt: u.VipExpireAt, LastLoginAt: u.LastLoginAt, LastLoginIp: u.LastLoginIp, CreatedAt: u.CreatedAt, SubscribeCount: subMap[u.Id], ListenCount: listenMap[u.Id], FavoriteCount: favMap[u.Id], TotalSpent: amountMap[u.Id], OrderCount: orderCountMap[u.Id], } } return result, total, nil }