package main import ( "encoding/json" "fmt" "net/http" "time" ) // Симулирует агрегацию данных за день (в реальности — запрос к БД) type DailyStat struct { Date string `json:"date"` Orders int `json:"orders"` Revenue float64 `json:"revenue"` AvgOrder float64 `json:"avg_order_value"` NewUsers int `json:"new_users"` TopCategory string `json:"top_category"` } func generateDailyStats(days int) []DailyStat { stats := make([]DailyStat, days) base := time.Now().UTC() revenues := []float64{4821.50, 3920.00, 6100.75, 5200.10, 7330.40, 4100.00, 8950.30} orders := []int{38, 31, 49, 42, 58, 33, 72} categories := []string{"electronics", "furniture", "electronics", "stationery", "electronics", "furniture", "electronics"} for i := 0; i < days; i++ { day := base.AddDate(0, 0, -(days - 1 - i)) rev := revenues[i%len(revenues)] ord := orders[i%len(orders)] stats[i] = DailyStat{ Date: day.Format("2006-01-02"), Orders: ord, Revenue: rev, AvgOrder: float64(int(rev/float64(ord)*100)) / 100, NewUsers: 5 + i*2, TopCategory: categories[i%len(categories)], } } return stats } func Handler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") days := 7 stats := generateDailyStats(days) totalRevenue := 0.0 totalOrders := 0 for _, s := range stats { totalRevenue += s.Revenue totalOrders += s.Orders } report := map[string]interface{}{ "status": "ok", "generated_at": time.Now().UTC().Format(time.RFC3339), "period_days": days, "total_revenue": fmt.Sprintf("%.2f", totalRevenue), "total_orders": totalOrders, "avg_daily_rev": fmt.Sprintf("%.2f", totalRevenue/float64(days)), "daily_breakdown": stats, } json.NewEncoder(w).Encode(report) }