feat: 修改bug

This commit is contained in:
zerosaturation 2026-06-01 15:08:16 +08:00
parent 60db94e377
commit 44f368cda0

View File

@ -99,12 +99,13 @@ func (r *rankingRepository) getHotRankingByDimension(starID int64, dimension str
now := time.Now().UnixMilli() now := time.Now().UnixMilli()
startOfMonth := time.Date(time.Now().Year(), time.Now().Month(), 1, 0, 0, 0, 0, time.Local).UnixMilli() startOfMonth := time.Date(time.Now().Year(), time.Now().Month(), 1, 0, 0, 0, 0, time.Local).UnixMilli()
// 构建基础查询JOIN 用户表和粉丝档案表获取昵称和头像 // 构建基础查询
// 使用 GROUP BY 去重,并用聚合函数获取 owner 信息 // fan_profiles JOIN 条件按维度区分:
// is_original 是布尔值,需要转为 int 再取 MAX // - displaying/month: 使用 exhibitions.occupier_uid展位占用者必然是当前star的注册粉丝
// - total: 使用 assets.owner_uid无展览上下文时的全局拥有者
// 之所以不能统一用 assets.owner_uid是因为藏品拥有者不一定是当前star的粉丝。
db := r.db.Model(&models.Asset{}). db := r.db.Model(&models.Asset{}).
Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar"). Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = assets.owner_uid AND fp.star_id = ?", starID).
Where("assets.star_id = ? AND assets.is_active = ? AND assets.status = ?", starID, true, models.AssetStatusActive) Where("assets.star_id = ? AND assets.is_active = ? AND assets.status = ?", starID, true, models.AssetStatusActive)
if isOriginalOnly { if isOriginalOnly {
@ -116,8 +117,10 @@ func (r *rankingRepository) getHotRankingByDimension(starID int64, dimension str
case "displaying": case "displaying":
// 展示中:关联 Exhibition 表筛选未过期的、未删除的且是当前star的展品 // 展示中:关联 Exhibition 表筛选未过期的、未删除的且是当前star的展品
// occupier_star_id 表示展品所属的明星 // occupier_star_id 表示展品所属的明星
// 用展品的 occupier展位占用者去 JOIN fan_profiles而不是 assets.owner_uid
db = db.Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar, MAX(exhibitions.id) as exhibition_id"). db = db.Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar, MAX(exhibitions.id) as exhibition_id").
Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id AND exhibitions.deleted_at IS NULL"). Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id AND exhibitions.deleted_at IS NULL").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = exhibitions.occupier_uid AND fp.star_id = exhibitions.occupier_star_id").
Where("exhibitions.expire_at > ?", now). Where("exhibitions.expire_at > ?", now).
Where("exhibitions.occupier_star_id = ?", starID). Where("exhibitions.occupier_star_id = ?", starID).
Group("assets.id, exhibitions.id") Group("assets.id, exhibitions.id")
@ -125,19 +128,21 @@ func (r *rankingRepository) getHotRankingByDimension(starID int64, dimension str
// 本月:本月内展览过的藏品(包括已下架的,只要 expire_at 在本月内即可) // 本月:本月内展览过的藏品(包括已下架的,只要 expire_at 在本月内即可)
db = db.Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar, MAX(exhibitions.id) as exhibition_id"). db = db.Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar, MAX(exhibitions.id) as exhibition_id").
Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id"). Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = exhibitions.occupier_uid AND fp.star_id = exhibitions.occupier_star_id").
Where("exhibitions.expire_at >= ?", startOfMonth). Where("exhibitions.expire_at >= ?", startOfMonth).
Where("exhibitions.occupier_star_id = ?", starID). Where("exhibitions.occupier_star_id = ?", starID).
Group("assets.id, exhibitions.id") Group("assets.id, exhibitions.id")
case "total": case "total":
// 全部:直接使用 assets 表的 like_count无需额外条件 // 全部:直接使用 assets 表的 like_count无需额外条件
db = db.Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar, 0 as exhibition_id") // fan_profiles JOIN 使用藏品的拥有者(无展览上下文)
db = db.Select("assets.id as asset_id, assets.name as asset_name, assets.cover_url, assets.owner_uid, MAX(assets.like_count) as like_count, MAX(assets.is_original::int) as is_original, MAX(fp.nickname) as owner_nickname, MAX(fp.avatar_url) as owner_avatar, 0 as exhibition_id").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = assets.owner_uid AND fp.star_id = ?", starID)
} }
// 统计总数(先查询 ID 列表再 Count避免 DISTINCT 干扰) // 统计总数(先查询 ID 列表再 Count避免 DISTINCT 干扰)
var total int64 var total int64
countDB := r.db.Model(&models.Asset{}). countDB := r.db.Model(&models.Asset{}).
Select("assets.id"). Select("assets.id").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = assets.owner_uid AND fp.star_id = ?", starID).
Where("assets.star_id = ? AND assets.is_active = ? AND assets.status = ?", starID, true, models.AssetStatusActive) Where("assets.star_id = ? AND assets.is_active = ? AND assets.status = ?", starID, true, models.AssetStatusActive)
if isOriginalOnly { if isOriginalOnly {
countDB = countDB.Where("assets.is_original = ?", true) countDB = countDB.Where("assets.is_original = ?", true)
@ -145,13 +150,17 @@ func (r *rankingRepository) getHotRankingByDimension(starID int64, dimension str
switch dimension { switch dimension {
case "displaying": case "displaying":
countDB = countDB.Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id AND exhibitions.deleted_at IS NULL"). countDB = countDB.Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id AND exhibitions.deleted_at IS NULL").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = exhibitions.occupier_uid AND fp.star_id = exhibitions.occupier_star_id").
Where("exhibitions.expire_at > ?", now). Where("exhibitions.expire_at > ?", now).
Where("exhibitions.occupier_star_id = ?", starID) Where("exhibitions.occupier_star_id = ?", starID)
case "month": case "month":
// 本月:本月内展览过的藏品(包括已下架的) // 本月:本月内展览过的藏品(包括已下架的)
countDB = countDB.Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id"). countDB = countDB.Joins("INNER JOIN exhibitions ON exhibitions.asset_id = assets.id").
Joins("LEFT JOIN fan_profiles fp ON fp.user_id = exhibitions.occupier_uid AND fp.star_id = exhibitions.occupier_star_id").
Where("exhibitions.expire_at >= ?", startOfMonth). Where("exhibitions.expire_at >= ?", startOfMonth).
Where("exhibitions.occupier_star_id = ?", starID) Where("exhibitions.occupier_star_id = ?", starID)
case "total":
countDB = countDB.Joins("LEFT JOIN fan_profiles fp ON fp.user_id = assets.owner_uid AND fp.star_id = ?", starID)
} }
if err := countDB.Count(&total).Error; err != nil { if err := countDB.Count(&total).Error; err != nil {
return nil, 0, err return nil, 0, err