Zuncle 3db52af4b6 feat(activity): 重构福利活动并支持统一奖池
对齐福利活动新库表结构,支持商品、道具卡和优惠券统一建奖、开奖与中奖记录。
同时新增福利活动测试命令行工具,便于模拟消费、参与活动并验证完整开奖链路。
2026-04-29 17:21:11 +08:00

58 lines
2.0 KiB
Go

package welfare_activity
import (
"context"
"time"
)
func (s *service) ListWinners(ctx context.Context, activityID int64, page int, pageSize int) (*WinnerListResponse, error) {
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 20
}
if pageSize > 100 {
pageSize = 100
}
db := s.repo.GetDbR().WithContext(ctx).Table("welfare_activity_winners w").Where("w.activity_id = ?", activityID)
var total int64
if err := db.Count(&total).Error; err != nil {
return nil, err
}
var list []WinnerItem
err := s.repo.GetDbR().WithContext(ctx).Table("welfare_activity_winners w").
Select("w.id, w.user_id, COALESCE(u.nickname, '') AS nickname, COALESCE(u.avatar, '') AS avatar, w.prize_id, w.reward_type, w.reward_ref_id, w.prize_name_snapshot AS prize_name, w.prize_image_snapshot AS prize_image, w.prize_value_snapshot_cents AS price_cents, w.cost_cents, w.grant_record_type, w.grant_record_id, w.created_at").
Joins("LEFT JOIN users u ON u.id = w.user_id").
Where("w.activity_id = ?", activityID).
Order("w.id DESC").
Offset((page - 1) * pageSize).
Limit(pageSize).
Scan(&list).Error
return &WinnerListResponse{Page: page, PageSize: pageSize, Total: total, List: list}, err
}
func (s *service) GetCost(ctx context.Context, activityID int64) (*CostSummary, error) {
var out CostSummary
err := s.repo.GetDbR().WithContext(ctx).Table("welfare_activity_winners").
Select("COALESCE(SUM(cost_cents), 0) AS cost_cents, COUNT(*) AS count").
Where("activity_id = ?", activityID).
Scan(&out).Error
return &out, err
}
func (s *service) GetCostSummary(ctx context.Context, startTime *time.Time, endTime *time.Time) (*CostSummary, error) {
q := s.repo.GetDbR().WithContext(ctx).Table("welfare_activity_winners").Select("COALESCE(SUM(cost_cents), 0) AS cost_cents, COUNT(*) AS count")
if startTime != nil {
q = q.Where("created_at >= ?", *startTime)
}
if endTime != nil {
q = q.Where("created_at < ?", *endTime)
}
var out CostSummary
if err := q.Scan(&out).Error; err != nil {
return nil, err
}
return &out, nil
}