package databi import ( "strconv" "strings" "hyapp-admin-server/internal/modules/shared" "hyapp-admin-server/internal/repository" "hyapp-admin-server/internal/response" "github.com/gin-gonic/gin" ) type Handler struct { service *Service store *repository.Store audit shared.OperationLogger } func New(service *Service, store *repository.Store, audit shared.OperationLogger) *Handler { return &Handler{service: service, store: store, audit: audit} } func (h *Handler) Master(c *gin.Context) { access, ok := h.moneyAccess(c) if !ok { return } master, err := h.service.Master(c.Request.Context(), access, shared.ActorFromContext(c).UserID, access.All) if err != nil { response.ServerError(c, "获取 BI 主数据失败") return } response.OK(c, master) } func (h *Handler) Overview(c *gin.Context) { access, ok := h.moneyAccess(c) if !ok { return } result, err := h.service.Overview(c.Request.Context(), access, OverviewQuery{ StatTZ: c.Query("stat_tz"), StartMS: queryInt64(c, "start_ms"), EndMS: queryInt64(c, "end_ms"), AppCodes: splitCSV(c.Query("app_codes")), RegionID: queryInt64(c, "region_id"), }) if err != nil { response.ServerError(c, "获取 BI 统计数据失败") return } response.OK(c, result) } func (h *Handler) Funnel(c *gin.Context) { access, ok := h.moneyAccess(c) if !ok { return } result, err := h.service.Funnel(c.Request.Context(), access, FunnelQuery{ StatTZ: c.Query("stat_tz"), StartMS: queryInt64(c, "start_ms"), EndMS: queryInt64(c, "end_ms"), AppCodes: splitCSV(c.Query("app_codes")), RegionID: queryInt64(c, "region_id"), }) if err != nil { response.ServerError(c, "获取埋点漏斗数据失败") return } response.OK(c, result) } func (h *Handler) Kpi(c *gin.Context) { access, ok := h.moneyAccess(c) if !ok { return } result, err := h.service.Kpi(c.Request.Context(), access, KpiQuery{ StatTZ: c.Query("stat_tz"), StartMS: queryInt64(c, "start_ms"), EndMS: queryInt64(c, "end_ms"), PeriodMonth: c.Query("period_month"), AppCodes: splitCSV(c.Query("app_codes")), OperatorUserID: queryUint(c, "operator_user_id"), ActorUserID: shared.ActorFromContext(c).UserID, ViewAll: access.All, }) if err != nil { if strings.Contains(err.Error(), "period_month") { response.BadRequest(c, "运营充值月份格式不正确") return } response.ServerError(c, "获取运营充值数据失败") return } response.OK(c, result) } func (h *Handler) moneyAccess(c *gin.Context) (repository.MoneyAccess, bool) { if h.store == nil { return repository.MoneyAccess{All: true}, true } access, err := h.store.MoneyAccessForUser(shared.ActorFromContext(c).UserID) if err != nil { response.ServerError(c, "获取数据范围失败") return repository.MoneyAccess{}, false } return access, true } func queryInt64(c *gin.Context, key string) int64 { parsed, _ := strconv.ParseInt(strings.TrimSpace(c.Query(key)), 10, 64) return parsed } func queryUint(c *gin.Context, key string) uint { parsed, _ := strconv.ParseUint(strings.TrimSpace(c.Query(key)), 10, 64) return uint(parsed) } func splitCSV(value string) []string { parts := strings.Split(value, ",") out := make([]string, 0, len(parts)) for _, part := range parts { part = strings.TrimSpace(part) if part != "" { out = append(out, part) } } return out }