fix(stats): map protocol mileage fields

This commit is contained in:
lingniu
2026-07-08 11:23:06 +08:00
parent 4e356876b1
commit fdcac05559
4 changed files with 94 additions and 30 deletions

View File

@@ -99,7 +99,7 @@ func SamplesFromEnvelope(env envelope.FrameEnvelope, loc *time.Location) ([]Metr
if vin == "" {
return nil, nil
}
totalMileage, ok := floatField(env, envelope.FieldTotalMileageKM)
totalMileage, ok := totalMileageKMFromEnvelope(env)
if !ok {
return nil, nil
}
@@ -125,6 +125,41 @@ func SamplesFromEnvelope(env envelope.FrameEnvelope, loc *time.Location) ([]Metr
}}, nil
}
type mileageFieldMapping struct {
key string
scale float64
}
func totalMileageKMFromEnvelope(env envelope.FrameEnvelope) (float64, bool) {
if value, ok := floatField(env, envelope.FieldTotalMileageKM); ok {
return value, true
}
for _, mapping := range mileageMappingsByProtocol(env.Protocol) {
value, ok := floatField(env, mapping.key)
if !ok {
continue
}
return value * mapping.scale, true
}
return 0, false
}
func mileageMappingsByProtocol(protocol envelope.Protocol) []mileageFieldMapping {
switch protocol {
case envelope.ProtocolGB32960:
return []mileageFieldMapping{{key: "gb32960.vehicle.total_mileage_km", scale: 1}}
case envelope.ProtocolJT808:
return []mileageFieldMapping{{key: "jt808.location.total_mileage_km", scale: 1}}
case envelope.ProtocolYutongMQTT:
return []mileageFieldMapping{
{key: "yutong_mqtt.data.total_mileage", scale: 0.001},
{key: "yutong_mqtt.root.data.total_mileage", scale: 0.001},
}
default:
return nil
}
}
const upsertDailyMileageSQL = `
INSERT INTO vehicle_daily_mileage
(vin, stat_date, protocol, daily_mileage_km,