package platform import ( "encoding/json" "lingniu/vehicle-data-platform/apps/api/internal/httpx" "net/http" ) // Mileage pickers expose only identifiers and export labels. Their service calls // retain the caller's existing VIN scope; statistics access grants no telemetry. type mileageVehicleOption struct { VIN string `json:"vin"` Plate string `json:"plate"` BrandName string `json:"brandName,omitempty"` ModelName string `json:"modelName,omitempty"` } func (h *Handler) handleMileageVehicleOptions(w http.ResponseWriter, r *http.Request) { data, err := h.service.VehicleCoverage(r.Context(), r.URL.Query()) result := Page[mileageVehicleOption]{Items: []mileageVehicleOption{}, Total: data.Total, Limit: data.Limit, Offset: data.Offset} for _, row := range data.Items { result.Items = append(result.Items, mileageVehicleOption{VIN: row.VIN, Plate: row.Plate, BrandName: row.BrandName, ModelName: row.ModelName}) } h.write(w, r, result, err) } func (h *Handler) handleMileageVehicles(w http.ResponseWriter, r *http.Request) { data, err := h.service.Vehicles(r.Context(), r.URL.Query()) result := Page[mileageVehicleOption]{Items: []mileageVehicleOption{}, Total: data.Total, Limit: data.Limit, Offset: data.Offset} for _, row := range data.Items { result.Items = append(result.Items, mileageVehicleOption{VIN: row.VIN, Plate: row.Plate}) } h.write(w, r, result, err) } func (h *Handler) handleMileageVehicleResolve(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() var query VehicleOverviewBatchQuery if err := json.NewDecoder(r.Body).Decode(&query); err != nil { httpx.WriteError(w, http.StatusBadRequest, "BAD_JSON", "请求 JSON 解析失败", err.Error(), traceID(r)) return } data, err := h.service.VehicleServiceOverviews(r.Context(), query) result := Page[mileageVehicleOption]{Items: []mileageVehicleOption{}, Total: data.Total, Limit: data.Limit, Offset: data.Offset} for _, row := range data.Items { result.Items = append(result.Items, mileageVehicleOption{VIN: row.VIN, Plate: row.Plate}) } h.write(w, r, result, err) }