Files
kra-new/internal/data/analytics/dashboard.go
T

67 lines
2.8 KiB
Go

package analytics
import (
"context"
"gorm.io/gorm"
biz "kra/internal/biz/analytics"
"kra/internal/data/ledger"
"strconv"
"time"
)
type Provider interface{ DB() *gorm.DB }
type repo struct{ data Provider }
func NewRepo(data Provider) biz.Repo { return &repo{data: data} }
func (r *repo) Dashboard(ctx context.Context, from, to time.Time) (*biz.Dashboard, error) {
db := r.data.DB().WithContext(ctx)
out := &biz.Dashboard{DiamondRateCents: 10}
if err := db.Table("live_rooms").Where("deleted_at IS NULL").Count(&out.RoomTotal).Error; err != nil {
return nil, err
}
var set ledger.SettingPO
if err := db.Where(&ledger.SettingPO{Key: "diamond_rate_cents"}).First(&set).Error; err == nil {
if v, e := strconv.ParseInt(set.Value, 10, 64); e == nil {
out.DiamondRateCents = v
}
}
var f struct{ RechargeCents, PaidOrderCount int64 }
if err := db.Model(&ledger.RechargeOrderPO{}).Select("COALESCE(SUM(amount_cents),0) AS recharge_cents,COUNT(*) AS paid_order_count").Where("credited_at IS NOT NULL AND credited_at BETWEEN ? AND ?", from, to).Scan(&f).Error; err != nil {
return nil, err
}
out.RechargeCents, out.PaidOrderCount = f.RechargeCents, f.PaidOrderCount
var g struct{ Diamonds, Count int64 }
if err := db.Model(&ledger.GiftSendPO{}).Select("COALESCE(SUM(diamond_total),0) AS diamonds,COUNT(*) AS count").Where("created_at BETWEEN ? AND ?", from, to).Scan(&g).Error; err != nil {
return nil, err
}
out.GiftDiamonds, out.GiftSendCount = g.Diamonds, g.Count
start := time.Date(to.Year(), to.Month(), to.Day(), 0, 0, 0, 0, to.Location()).AddDate(0, 0, -6)
var points []struct {
Date string
AmountCents int64
}
if err := db.Model(&ledger.RechargeOrderPO{}).Select("DATE(credited_at) AS date,COALESCE(SUM(amount_cents),0) AS amount_cents").Where("credited_at IS NOT NULL AND credited_at >= ?", start).Group("DATE(credited_at)").Order("DATE(credited_at)").Scan(&points).Error; err != nil {
return nil, err
}
m := map[string]int64{}
for _, p := range points {
m[p.Date] = p.AmountCents
}
for i := 0; i < 7; i++ {
d := start.AddDate(0, 0, i).Format("2006-01-02")
out.RechargeTrend = append(out.RechargeTrend, &biz.TrendPoint{Date: d, AmountCents: m[d]})
}
var ranks []struct {
RoomID uint
RoomName, AnchorName string
Diamonds int64
}
if err := db.Model(&ledger.GiftSendPO{}).Select("COALESCE(room_id,0) AS room_id,room_name,anchor_name,SUM(diamond_total) AS diamonds").Where("created_at BETWEEN ? AND ?", from, to).Group("room_id,room_name,anchor_name").Order("diamonds DESC").Limit(5).Scan(&ranks).Error; err != nil {
return nil, err
}
for _, x := range ranks {
out.GiftRanking = append(out.GiftRanking, &biz.GiftRank{RoomID: x.RoomID, RoomName: x.RoomName, AnchorName: x.AnchorName, Diamonds: x.Diamonds})
}
return out, nil
}