// Read-only production verification of the same repository used by HTTP APIs. package main import ( "context" "database/sql" "encoding/json" "flag" "fmt" _ "github.com/go-sql-driver/mysql" "lingniu/vehicle-data-platform/apps/api/internal/openplatform" "math" "os" "reflect" "strings" "time" ) func main() { start := flag.String("start", "2026-09-11", "first date") end := flag.String("end", "2026-09-15", "last date") vin := flag.String("vins", "", "VINs, empty = all current vehicles") flag.Parse() db, err := sql.Open("mysql", os.Getenv("MYSQL_DSN")) must(err) defer db.Close() ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() vins := strings.Split(*vin, ",") if *vin == "" { vins = nil rows, e := db.QueryContext(ctx, "SELECT DISTINCT vin FROM vehicle_identity_binding WHERE vin<>''") must(e) for rows.Next() { var v string must(rows.Scan(&v)) vins = append(vins, v) } must(rows.Err()) rows.Close() } r := openplatform.NewMySQLRepository(db) began := time.Now() priorities := []string{"GB32960", "YUTONG_MQTT"} all, err := r.ReconciledMileageRange(ctx, vins, *start, *end, priorities) must(err) first, e := time.Parse("2006-01-02", *start) must(e) last, e := time.Parse("2006-01-02", *end) must(e) mismatches := 0 differences := 0 normal := 0 qualities := map[string]int{} samples := map[string]openplatform.DailyMileage{} for date := first; !date.After(last); date = date.AddDate(0, 0, 1) { d := date.Format("2006-01-02") single, e := r.ReconciledMileageRange(ctx, vins, d, d, priorities) must(e) for _, v := range vins { key := v + "\x00" + d value, ok := all[key] one, exists := single[key] if ok != exists || !reflect.DeepEqual(value, one) { differences++ } if !ok { continue } qualities[value.DataQuality]++ prev, hasPrev := all[v+"\x00"+date.AddDate(0, 0, -1).Format("2006-01-02")] if value.DataQuality == "" || value.DataQuality == "CARRIED_FORWARD" { normal++ if hasPrev && math.Abs(value.TotalMileageKm-prev.TotalMileageKm-value.MileageKm) > 0.001 { mismatches++ } } if len(vins) < 10 { samples[key] = value } } } must(json.NewEncoder(os.Stdout).Encode(map[string]any{"vehicles": len(vins), "rows": len(all), "normal": normal, "qualities": qualities, "reconciliationMismatches": mismatches, "singleRangeDifferences": differences, "samples": samples, "elapsed": time.Since(began).String()})) if mismatches > 0 || differences > 0 { os.Exit(2) } } func must(e error) { if e != nil { fmt.Fprintln(os.Stderr, e) os.Exit(1) } }