2026-07-06 11:46:58 +08:00

134 lines
3.3 KiB
Go

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
}