win 2a7b731484 feat(finance): implement Phase 1 core P&L service + wire into dashboard
- Add internal/service/finance/types.go: AssetType enum, param/result structs
- Add internal/service/finance/service.go: Service interface, read-only ctor
- Add internal/service/finance/query_user.go: QueryUserProfitLoss (4 fan-out scans)
- Add internal/service/finance/query_activity.go: QueryActivityProfitLoss (4 fan-out scans)
- Add internal/service/finance/service_test.go: 22 integration tests (all pass)
- Wire finance.Service into admin handler (admin.go)
- Replace dashboard_activity cost scan with finance.Service call (D-09: value_cents single source of truth)
- Revenue/gamepass/draw-count scans unchanged; response schema fully compatible

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-21 18:38:33 +08:00

74 lines
2.6 KiB
Go
Executable File

package admin
import (
"bindbox-game/internal/pkg/logger"
"bindbox-game/internal/repository/mysql"
"bindbox-game/internal/repository/mysql/dao"
activitysvc "bindbox-game/internal/service/activity"
adminsvc "bindbox-game/internal/service/admin"
bannersvc "bindbox-game/internal/service/banner"
channelsvc "bindbox-game/internal/service/channel"
douyinsvc "bindbox-game/internal/service/douyin"
financesvc "bindbox-game/internal/service/finance"
gamesvc "bindbox-game/internal/service/game"
livestreamsvc "bindbox-game/internal/service/livestream"
productsvc "bindbox-game/internal/service/product"
snapshotsvc "bindbox-game/internal/service/snapshot"
synthesissvc "bindbox-game/internal/service/synthesis"
syscfgsvc "bindbox-game/internal/service/sysconfig"
titlesvc "bindbox-game/internal/service/title"
usersvc "bindbox-game/internal/service/user"
"github.com/redis/go-redis/v9"
)
type handler struct {
logger logger.CustomLogger
writeDB *dao.Query
readDB *dao.Query
repo mysql.Repo
svc adminsvc.Service
activity activitysvc.Service
product productsvc.Service
userSvc usersvc.Service
banner bannersvc.Service
channel channelsvc.Service
title titlesvc.Service
syscfg syscfgsvc.Service
snapshotSvc snapshotsvc.Service
rollbackSvc snapshotsvc.RollbackService
douyinSvc douyinsvc.Service
livestream livestreamsvc.Service
synthesis synthesissvc.Service
financeSvc financesvc.Service // P&L service (read-only)
}
func New(logger logger.CustomLogger, db mysql.Repo, rdb *redis.Client) *handler {
userSvc := usersvc.New(logger, db)
snapshotSvc := snapshotsvc.NewService(db)
rollbackSvc := snapshotsvc.NewRollbackService(db, snapshotSvc)
syscfgSvc := syscfgsvc.New(logger, db)
ticketSvc := gamesvc.NewTicketService(logger, db) // 游戏资格服务
titleSvc := titlesvc.New(logger, db) // 称号服务
return &handler{
logger: logger,
writeDB: dao.Use(db.GetDbW()),
readDB: dao.Use(db.GetDbR()),
repo: db,
svc: adminsvc.New(logger, db),
activity: activitysvc.New(logger, db, userSvc, rdb),
product: productsvc.New(logger, db),
userSvc: userSvc,
banner: bannersvc.New(logger, db),
channel: channelsvc.New(logger, db),
title: titleSvc,
syscfg: syscfgSvc,
snapshotSvc: snapshotSvc,
rollbackSvc: rollbackSvc,
douyinSvc: douyinsvc.New(logger, db, syscfgSvc, ticketSvc, userSvc, titleSvc),
livestream: livestreamsvc.New(logger, db, ticketSvc),
synthesis: synthesissvc.New(db),
financeSvc: financesvc.New(logger, db),
}
}