98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
//go:build ignore
|
|
|
|
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"os"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
)
|
|
|
|
type metadataRecord struct {
|
|
VIN string `json:"vin"`
|
|
Plate string `json:"plate"`
|
|
Brand string `json:"brand"`
|
|
Model string `json:"model"`
|
|
VehicleModelID int64 `json:"vehicle_model_id"`
|
|
BatteryCapacityKWh float64 `json:"battery_capacity_kwh"`
|
|
TankCapacityL float64 `json:"tank_capacity_l"`
|
|
SourceUpdatedAt *time.Time `json:"source_updated_at,omitempty"`
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) != 2 {
|
|
panic("usage: query_metadata <output.json>")
|
|
}
|
|
dsn := strings.TrimSpace(os.Getenv("MYSQL_DSN"))
|
|
if dsn == "" {
|
|
panic("MYSQL_DSN is required")
|
|
}
|
|
db, err := sql.Open("mysql", dsn)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer db.Close()
|
|
rows, err := db.Query(`SELECT UPPER(TRIM(vi.vin)),COALESCE(vi.plate_number,''),
|
|
COALESCE(vm.brand,''),COALESCE(vm.model,''),vm.id,vm.battery_capacity,vm.tank_capacity,
|
|
CASE
|
|
WHEN vi.update_time IS NULL THEN vm.update_time
|
|
WHEN vm.update_time IS NULL THEN vi.update_time
|
|
ELSE GREATEST(vi.update_time,vm.update_time)
|
|
END
|
|
FROM ln_asset_management.vehicle_info vi
|
|
JOIN ln_asset_management.vehicle_model vm ON vm.id=vi.vehicle_model_id
|
|
WHERE COALESCE(vi.del_flag,'0')='0' AND COALESCE(vm.del_flag,'0')='0'
|
|
AND LOWER(TRIM(vm.brand))='hyundai'
|
|
AND LENGTH(TRIM(vi.vin))=17
|
|
AND vm.tank_capacity>0
|
|
AND vm.battery_capacity>0
|
|
ORDER BY vi.vin,vi.update_time DESC,vi.id DESC`)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer rows.Close()
|
|
byVIN := map[string]metadataRecord{}
|
|
for rows.Next() {
|
|
var row metadataRecord
|
|
var updated sql.NullTime
|
|
if err := rows.Scan(&row.VIN, &row.Plate, &row.Brand, &row.Model, &row.VehicleModelID, &row.BatteryCapacityKWh, &row.TankCapacityL, &updated); err != nil {
|
|
panic(err)
|
|
}
|
|
if _, exists := byVIN[row.VIN]; exists {
|
|
continue
|
|
}
|
|
if updated.Valid {
|
|
value := updated.Time
|
|
row.SourceUpdatedAt = &value
|
|
}
|
|
byVIN[row.VIN] = row
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
panic(err)
|
|
}
|
|
vins := make([]string, 0, len(byVIN))
|
|
for vin := range byVIN {
|
|
vins = append(vins, vin)
|
|
}
|
|
sort.Strings(vins)
|
|
out := make([]metadataRecord, 0, len(vins))
|
|
for _, vin := range vins {
|
|
out = append(out, byVIN[vin])
|
|
}
|
|
output, err := os.Create(os.Args[1])
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer output.Close()
|
|
encoder := json.NewEncoder(output)
|
|
encoder.SetIndent("", " ")
|
|
if err := encoder.Encode(out); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|