fix(go): store protocol parsed fields in realtime kv

This commit is contained in:
lingniu
2026-07-03 12:08:12 +08:00
parent 7bf78f91ba
commit 112b02e8c5
3 changed files with 83 additions and 94 deletions

View File

@@ -28,7 +28,7 @@ func realtimeKVFields(env envelope.FrameEnvelope, parsed map[string]any) []Realt
return nil
}
eventID := env.StableEventID()
add := func(rows []RealtimeKVField, domain string, fields map[string]any) []RealtimeKVField {
add := func(rows []RealtimeKVField, domain string, fields any) []RealtimeKVField {
flat := map[string]any{}
flattenKV("", fields, flat)
names := make([]string, 0, len(flat))
@@ -57,70 +57,35 @@ func realtimeKVFields(env envelope.FrameEnvelope, parsed map[string]any) []Realt
}
var rows []RealtimeKVField
switch env.Protocol {
case envelope.ProtocolGB32960:
units, ok := asAnySlice(parsed["data_units"])
if !ok {
return rows
keys := make([]string, 0, len(parsed))
for key := range parsed {
keys = append(keys, key)
}
sort.Strings(keys)
metadata := map[string]any{}
for _, key := range keys {
domain := strings.TrimSpace(key)
if domain == "" {
continue
}
for _, unit := range units {
unitMap, ok := unit.(map[string]any)
if !ok {
continue
}
domain := strings.TrimSpace(strconvAny(unitMap["name"]))
if domain == "" {
domain = strings.TrimSpace(strconvAny(unitMap["type"]))
}
if domain == "" {
continue
}
value, ok := unitMap["value"].(map[string]any)
if !ok {
continue
}
rows = add(rows, domain, domainKVFields(domain, value))
value := parsed[key]
switch typed := value.(type) {
case map[string]any:
rows = add(rows, domain, typed)
case []any:
rows = add(rows, domain, typed)
case []map[string]any:
rows = add(rows, domain, typed)
default:
metadata[domain] = value
}
case envelope.ProtocolJT808:
fields := cloneFields(env.Fields)
if location, ok := parsed["location"].(map[string]any); ok {
for key, value := range location {
fields[key] = value
}
}
rows = add(rows, "location", fields)
case envelope.ProtocolYutongMQTT:
fields := cloneFields(env.Fields)
if data, ok := parsed["data"].(map[string]any); ok {
for key, value := range data {
fields[key] = value
}
}
rows = add(rows, "vehicle", fields)
}
if len(metadata) > 0 {
rows = add(rows, "metadata", metadata)
}
return rows
}
func domainKVFields(domain string, value map[string]any) map[string]any {
out := cloneMap(value)
if domain != "gd_fc_stack" {
return out
}
summaries, ok := asAnySlice(out["summaries"])
if !ok || len(summaries) != 1 {
return out
}
summary, ok := summaries[0].(map[string]any)
if !ok {
return out
}
delete(out, "summaries")
for key, value := range summary {
out[key] = value
}
return out
}
func flattenKV(prefix string, value any, out map[string]any) {
switch typed := value.(type) {
case map[string]any: