fix: 完成商务迁移复核与接口优化并清理历史资料

This commit is contained in:
Yvan
2026-11-04 14:45:02 +08:00
parent 5a96be6a79
commit 297e80827d
176 changed files with 6803 additions and 6002 deletions
+52 -25
View File
@@ -4,6 +4,7 @@ import (
"context"
"sort"
"golang.org/x/sync/errgroup"
"gorm.io/gorm"
"kra/internal/biz/business"
)
@@ -80,6 +81,9 @@ func analyticsRoot(db *gorm.DB, kind business.AnalyticsKind, scope business.Anal
if kind == business.ChannelAnalytics {
id = "r.promote_id"
if scope.IncludeSub {
if pay {
q = analyticsPayLeaves(db, q)
}
q = q.Joins("LEFT JOIN tab_promote root_p ON root_p.source_db=r.source_db AND root_p.id=r.promote_id")
id = "COALESCE(NULLIF(root_p.top_promote_id,0),r.promote_id)"
if pay {
@@ -89,6 +93,12 @@ func analyticsRoot(db *gorm.DB, kind business.AnalyticsKind, scope business.Anal
}
return q, id
}
func analyticsPayLeaves(db, q *gorm.DB) *gorm.DB {
// 金额可先按原渠道加总再归并树,减少按每天/游戏重复关联渠道资料。
leaves := q.Select("r.source_db,r.promote_id,COALESCE(SUM(r.total_pay),0) AS total_pay").Group("r.source_db,r.promote_id")
return db.Table("(?) r", leaves)
}
func putAnalyticsCount(counts *business.PortraitCounts, metric int, count int64) {
switch metric {
case 1:
@@ -134,44 +144,61 @@ func (r *analyticsRepo) Aggregate(ctx context.Context, kind business.AnalyticsKi
}
return rowMap[key]
}
var pays []analyticsAggPO
q, id := analyticsRoot(db, kind, scope, f, "tab_sw_report_day", 0, true)
if err := q.Select("r.source_db," + id + " AS entity_id,COALESCE(SUM(r.total_pay),0) AS amount").Group("r.source_db," + id).Scan(&pays).Error; err != nil {
return nil, business.ErrStorage
var pays, counts []analyticsAggPO
var global []portraitCountPO
globalPay := "0"
withGlobal := kind == business.ChannelAnalytics && scope.Viewer.All
group, queryContext := errgroup.WithContext(ctx)
// 每个请求最多两个并行查询,复用同一存储客户端;结果读取完后再组装 DO。
group.SetLimit(2)
queryDB := db.WithContext(queryContext)
group.Go(func() error {
q, id := analyticsRoot(queryDB, kind, scope, f, "tab_sw_report_day", 0, true)
if err := q.Select("r.source_db," + id + " AS entity_id,COALESCE(SUM(r.total_pay),0) AS amount").Group("r.source_db," + id).Scan(&pays).Error; err != nil {
return business.ErrStorage
}
return nil
})
group.Go(func() error {
q, id := analyticsRoot(queryDB, kind, scope, f, "tab_sw_report_day_key", mode, false)
if err := q.Select("r.source_db," + id + " AS entity_id,r.metric,COUNT(DISTINCT r.identity_key) AS count").Group("r.source_db," + id + ",r.metric").Scan(&counts).Error; err != nil {
return business.ErrStorage
}
return nil
})
if withGlobal {
group.Go(func() error {
q := analyticsQuery(queryDB, scope, f, "tab_sw_report_day_key", mode)
if err := q.Select("r.metric,COUNT(DISTINCT " + portraitIdentity(queryDB, scope.IDCardDedup) + ") AS count").Group("r.metric").Scan(&global).Error; err != nil {
return business.ErrStorage
}
if err := analyticsQuery(queryDB, scope, f, "tab_sw_report_day", 0).Select("COALESCE(SUM(r.total_pay),0)").Scan(&globalPay).Error; err != nil {
return business.ErrStorage
}
return nil
})
}
if err := group.Wait(); err != nil {
return nil, err
}
for _, po := range pays {
if po.ID == nil {
continue
if po.ID != nil {
rowFor(po).Pay = po.Amount
}
rowFor(po).Pay = po.Amount
}
var counts []analyticsAggPO
q, id = analyticsRoot(db, kind, scope, f, "tab_sw_report_day_key", mode, false)
if err := q.Select("r.source_db," + id + " AS entity_id,r.metric,COUNT(DISTINCT r.identity_key) AS count").Group("r.source_db," + id + ",r.metric").Scan(&counts).Error; err != nil {
return nil, business.ErrStorage
}
for _, po := range counts {
if po.ID == nil {
continue
if po.ID != nil {
putAnalyticsCount(&rowFor(po).Counts, po.Metric, po.Count)
}
putAnalyticsCount(&rowFor(po).Counts, po.Metric, po.Count)
}
if kind == business.ChannelAnalytics && !scope.Viewer.All {
if err := filterAnalyticsRows(db, scope, f, rowMap); err != nil {
return nil, err
}
}
if kind == business.ChannelAnalytics && scope.Viewer.All {
var global []portraitCountPO
q := analyticsQuery(db, scope, f, "tab_sw_report_day_key", mode)
if err := q.Select("r.metric,COUNT(DISTINCT " + portraitIdentity(db, scope.IDCardDedup) + ") AS count").Group("r.metric").Scan(&global).Error; err != nil {
return nil, business.ErrStorage
}
if withGlobal {
totals := toPortraitCounts(global)
result.GlobalCounts = &totals
if err := analyticsQuery(db, scope, f, "tab_sw_report_day", 0).Select("COALESCE(SUM(r.total_pay),0)").Scan(&result.GlobalPay).Error; err != nil {
return nil, business.ErrStorage
}
result.GlobalCounts, result.GlobalPay = &totals, globalPay
}
if len(rowMap) == 0 {
return result, nil