diff --git a/modules/core/vehicle-identity/pom.xml b/modules/core/vehicle-identity/pom.xml
index 723d1a35..00cdf569 100644
--- a/modules/core/vehicle-identity/pom.xml
+++ b/modules/core/vehicle-identity/pom.xml
@@ -48,5 +48,10 @@
spring-boot-test
test
+
+ com.h2database
+ h2
+ test
+
diff --git a/modules/core/vehicle-identity/src/test/java/com/lingniu/ingest/identity/MySqlVehicleIdentityServiceJdbcTest.java b/modules/core/vehicle-identity/src/test/java/com/lingniu/ingest/identity/MySqlVehicleIdentityServiceJdbcTest.java
new file mode 100644
index 00000000..04d2f4b9
--- /dev/null
+++ b/modules/core/vehicle-identity/src/test/java/com/lingniu/ingest/identity/MySqlVehicleIdentityServiceJdbcTest.java
@@ -0,0 +1,73 @@
+package com.lingniu.ingest.identity;
+
+import com.lingniu.ingest.api.ProtocolId;
+import org.h2.jdbcx.JdbcDataSource;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.UUID;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class MySqlVehicleIdentityServiceJdbcTest {
+
+ @Test
+ void registrationVinWriteBackIsQueryableThroughRealJdbc() throws Exception {
+ JdbcDataSource dataSource = new JdbcDataSource();
+ dataSource.setURL("jdbc:h2:mem:" + UUID.randomUUID()
+ + ";MODE=MySQL;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1");
+
+ try (MySqlVehicleIdentityService service =
+ new MySqlVehicleIdentityService(dataSource, "vehicle_identity_binding")) {
+ service.register(new VehicleRegistrationBinding(
+ ProtocolId.JT808,
+ "unknown",
+ "13079961001",
+ "dev61001",
+ "粤B61001",
+ 44,
+ 4401,
+ "maker-a",
+ "type-a",
+ 1));
+
+ try (Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ ResultSet registered = statement.executeQuery("""
+ SELECT vin, device_id, plate, province, city, maker, device_type, plate_color
+ FROM vehicle_identity_binding_registration
+ WHERE protocol = 'JT808' AND phone = '13079961001'
+ """);
+ assertThat(registered.next()).isTrue();
+ assertThat(registered.getString("vin")).isEqualTo("unknown");
+ assertThat(registered.getString("device_id")).isEqualTo("DEV61001");
+ assertThat(registered.getString("plate")).isEqualTo("粤B61001");
+ assertThat(registered.getInt("province")).isEqualTo(44);
+ assertThat(registered.getInt("city")).isEqualTo(4401);
+ assertThat(registered.getString("maker")).isEqualTo("MAKER-A");
+ assertThat(registered.getString("device_type")).isEqualTo("TYPE-A");
+ assertThat(registered.getInt("plate_color")).isEqualTo(1);
+
+ statement.executeUpdate("""
+ UPDATE vehicle_identity_binding_registration
+ SET vin = 'LNVIN00000061001'
+ WHERE protocol = 'JT808' AND phone = '13079961001'
+ """);
+ }
+
+ service.refresh();
+
+ assertThat(service.resolve(new VehicleIdentityLookup(
+ ProtocolId.JT808, "", "13079961001", "", "")).vin())
+ .isEqualTo("LNVIN00000061001");
+ assertThat(service.resolve(new VehicleIdentityLookup(
+ ProtocolId.JT808, "", "", "dev61001", "")).vin())
+ .isEqualTo("LNVIN00000061001");
+ assertThat(service.resolve(new VehicleIdentityLookup(
+ ProtocolId.JT808, "", "", "", "粤B61001")).vin())
+ .isEqualTo("LNVIN00000061001");
+ }
+ }
+}
diff --git a/modules/services/event-history-service/src/main/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryController.java b/modules/services/event-history-service/src/main/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryController.java
index bcb23cbd..4e6c1304 100644
--- a/modules/services/event-history-service/src/main/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryController.java
+++ b/modules/services/event-history-service/src/main/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryController.java
@@ -22,6 +22,7 @@ import java.io.IOException;
import java.time.Instant;
import java.util.List;
import java.util.Locale;
+import java.util.Map;
@RestController
@ConditionalOnProperty(prefix = "lingniu.ingest.event-history", name = "enabled", havingValue = "true")
@@ -30,6 +31,15 @@ import java.util.Locale;
@Tag(name = "telemetry-field-history-controller", description = "遥测字段历史分页查询接口。")
public final class TelemetryFieldHistoryController {
+ private static final Map JT808_FIELD_ALIASES = Map.of(
+ "location.longitude", "longitude",
+ "location.latitude", "latitude",
+ "location.altitude_m", "altitude_m",
+ "location.speed_kmh", "speed_kmh",
+ "location.direction_deg", "direction_deg",
+ "location.alarm_flag", "location_alarm_flag",
+ "location.status_flag", "location_status_raw");
+
private final TdengineHistoryReader reader;
public TelemetryFieldHistoryController(TdengineHistoryReader reader) {
@@ -67,7 +77,9 @@ public final class TelemetryFieldHistoryController {
@Parameter(description = "上一页返回的 nextCursor.id。", example = "event-xxx#0")
@RequestParam(required = false) String cursorId) throws IOException {
String normalizedProtocol = require(protocol, "protocol is required for telemetry field query").toUpperCase(Locale.ROOT);
- String normalizedFieldKey = require(fieldKey, "fieldKey is required for telemetry field query");
+ String normalizedFieldKey = normalizeFieldKey(
+ normalizedProtocol,
+ require(fieldKey, "fieldKey is required for telemetry field query"));
QueryTimeRange range = QueryTimeRange.parse(dateFrom, dateTo);
TdenginePage page = reader.queryTelemetryFields(new TdengineTelemetryFieldQuery(
normalizedProtocol,
@@ -81,6 +93,13 @@ public final class TelemetryFieldHistoryController {
return TelemetryFieldPageResponse.from(page);
}
+ private static String normalizeFieldKey(String protocol, String fieldKey) {
+ if (!"JT808".equals(protocol)) {
+ return fieldKey;
+ }
+ return JT808_FIELD_ALIASES.getOrDefault(fieldKey, fieldKey);
+ }
+
private static String resolveVehicleKey(String protocol, String vehicleKey, String vin, String phone) {
String explicitVehicleKey = trimToNull(vehicleKey);
if (explicitVehicleKey != null) {
diff --git a/modules/services/event-history-service/src/test/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryControllerTest.java b/modules/services/event-history-service/src/test/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryControllerTest.java
index c820a2c5..24213e2e 100644
--- a/modules/services/event-history-service/src/test/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryControllerTest.java
+++ b/modules/services/event-history-service/src/test/java/com/lingniu/ingest/eventhistory/TelemetryFieldHistoryControllerTest.java
@@ -78,6 +78,7 @@ class TelemetryFieldHistoryControllerTest {
null);
assertThat(reader.query.vehicleKey()).isEqualTo("jt808:g7gps");
+ assertThat(reader.query.fieldKey()).isEqualTo("speed_kmh");
}
@Test