58 lines
2.0 KiB
Go
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
|
|
}
|