package main import ( "context" "database/sql" "errors" "flag" "fmt" "os" "time" "github.com/go-sql-driver/mysql" "lingniu/vehicle-data-platform/apps/api/internal/gzev" ) func main() { if err := run(); err != nil { fmt.Fprintln(os.Stderr, "gzev-daily-report:", err) os.Exit(1) } } func run() error { preview := flag.Bool("preview", false, "print summary without sending or recording delivery") flag.Parse() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) defer cancel() cfg, err := mysql.ParseDSN(os.Getenv("MYSQL_DSN")) if err != nil { return errors.New("invalid MYSQL_DSN") } cfg.ParseTime = true cfg.Loc = time.UTC cfg.Timeout = 10 * time.Second cfg.ReadTimeout = 30 * time.Second db, err := sql.Open("mysql", cfg.FormatDSN()) if err != nil { return errors.New("cannot initialize MySQL") } defer db.Close() account := env("GZEV_ACCOUNT", "guangdonglingniu") report, err := gzev.LoadDailyReport(ctx, db, account, env("GZEV_START_DATE", "2024-01-01"), time.Now()) if err != nil { return err } title, body := report.Message() if *preview { fmt.Println(title + "\n\n" + body) return nil } sender := gzev.ServerChanFromEnv() sent, err := gzev.DeliverDailyReport(env("GZEV_DAILY_REPORT_STATE", "/var/lib/lingniu-gzev/daily-report.json"), report.Date, func() error { return sender.SendMessage(ctx, title, body) }) if err != nil { return err } if sent { fmt.Printf("ServerChan accepted daily report: date=%s fetched_days=%d expected_days=%d missing_dates=%d\n", report.Date, report.Fetched, report.Expected, len(report.Missing)) } else { fmt.Printf("Daily report already accepted; skipped duplicate: date=%s\n", report.Date) } return nil } func env(k, fallback string) string { if v := os.Getenv(k); v != "" { return v } return fallback }