From 18ebd6c84f714f57342d8061fd7e4870f70a056e Mon Sep 17 00:00:00 2001 From: lingniu Date: Wed, 1 Jul 2026 02:10:04 +0800 Subject: [PATCH] refactor: simplify jt808 mileage state --- .../ingest/vehiclestat/jt808/Jt808DailyMileageState.java | 9 --------- .../vehiclestat/jt808/RedisJt808MileageStateStore.java | 3 --- .../vehiclestat/jt808/Jt808DailyMileageStateTest.java | 8 ++------ .../jt808/RedisJt808MileageStateStoreTest.java | 8 ++++++-- 4 files changed, 8 insertions(+), 20 deletions(-) diff --git a/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageState.java b/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageState.java index ddcab4d2..93f2fc84 100644 --- a/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageState.java +++ b/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageState.java @@ -18,7 +18,6 @@ public final class Jt808DailyMileageState { private Instant lastEventTime; private double firstTotalMileageKm = Double.NaN; private double lastTotalMileageKm = Double.NaN; - private double odometerMileageKm; private int acceptedPoints; private int totalMileageSamples; private int outOfOrderPoints; @@ -50,7 +49,6 @@ public final class Jt808DailyMileageState { Instant lastEventTime, double firstTotalMileageKm, double lastTotalMileageKm, - double odometerMileageKm, int acceptedPoints, int totalMileageSamples, int outOfOrderPoints, @@ -60,7 +58,6 @@ public final class Jt808DailyMileageState { state.lastEventTime = lastEventTime; state.firstTotalMileageKm = firstTotalMileageKm; state.lastTotalMileageKm = lastTotalMileageKm; - state.odometerMileageKm = odometerMileageKm; state.acceptedPoints = acceptedPoints; state.totalMileageSamples = totalMileageSamples; state.outOfOrderPoints = outOfOrderPoints; @@ -112,11 +109,9 @@ public final class Jt808DailyMileageState { if (current < lastTotalMileageKm) { odometerAnomalies++; lastTotalMileageKm = current; - odometerMileageKm = 0.0; return; } lastTotalMileageKm = current; - odometerMileageKm = current - firstTotalMileageKm; } private OptionalDouble totalMileageDifference() { @@ -160,10 +155,6 @@ public final class Jt808DailyMileageState { return lastEventTime; } - public double odometerMileageKm() { - return odometerMileageKm; - } - public double lastTotalMileageKm() { return lastTotalMileageKm; } diff --git a/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStore.java b/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStore.java index dba6d843..6ef1e34c 100644 --- a/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStore.java +++ b/modules/services/vehicle-stat-service/src/main/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStore.java @@ -66,7 +66,6 @@ public final class RedisJt808MileageStateStore implements Jt808MileageStateStore PointSnapshot lastPoint, Double firstTotalMileageKm, Double lastTotalMileageKm, - double odometerMileageKm, int acceptedPoints, Integer totalMileageSamples, int outOfOrderPoints, @@ -83,7 +82,6 @@ public final class RedisJt808MileageStateStore implements Jt808MileageStateStore null, finiteOrNull(state.firstTotalMileageKm()), finiteOrNull(state.lastTotalMileageKm()), - state.odometerMileageKm(), state.acceptedPoints(), state.totalMileageSamples(), state.outOfOrderPoints(), @@ -100,7 +98,6 @@ public final class RedisJt808MileageStateStore implements Jt808MileageStateStore restoredLastEventTime(), nanIfNull(firstTotalMileageKm), nanIfNull(lastTotalMileageKm), - odometerMileageKm, acceptedPoints, restoredTotalMileageSamples(), outOfOrderPoints, diff --git a/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageStateTest.java b/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageStateTest.java index 9846f353..ebc43ee2 100644 --- a/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageStateTest.java +++ b/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/Jt808DailyMileageStateTest.java @@ -19,7 +19,6 @@ class Jt808DailyMileageStateTest { assertThat(state.acceptedPoints()).isEqualTo(1); assertThat(state.totalMileageSamples()).isEqualTo(1); - assertThat(state.odometerMileageKm()).isZero(); assertThat(state.firstTotalMileageKm()).isEqualTo(100.0); assertThat(state.lastTotalMileageKm()).isEqualTo(100.0); assertThat(state.toVehicleDailyStatResult()).isEmpty(); @@ -28,7 +27,7 @@ class Jt808DailyMileageStateTest { } @Test - void orderedPointUpdatesGpsSpeedAndOdometerMileage() { + void orderedPointsCalculateDailyMileageFromTotalMileageDifference() { Jt808DailyMileageState state = Jt808DailyMileageState.empty("VIN001", "VIN001", "13900000001", LocalDate.of(2026, 6, 30)); state.apply(point("2026-06-30T00:00:00Z", 120.000000, 30.000000, 36.0, 100.0)); @@ -37,7 +36,6 @@ class Jt808DailyMileageStateTest { assertThat(state.acceptedPoints()).isEqualTo(2); assertThat(state.totalMileageSamples()).isEqualTo(2); - assertThat(state.odometerMileageKm()).isCloseTo(1.2, offset(0.000001)); assertThat(state.firstTotalMileageKm()).isEqualTo(100.0); assertThat(state.lastTotalMileageKm()).isEqualTo(101.2); assertThat(state.toVehicleDailyStatResult()).isPresent(); @@ -66,7 +64,6 @@ class Jt808DailyMileageStateTest { state.apply(point("2026-06-30T00:01:40Z", 120.010370, 30.000000, 36.0, 99.5)); - assertThat(state.odometerMileageKm()).isZero(); assertThat(state.odometerAnomalies()).isEqualTo(1); assertThat(state.toVehicleDailyStatResult()).isEmpty(); } @@ -79,13 +76,12 @@ class Jt808DailyMileageStateTest { state.apply(point("2026-06-30T00:01:00Z", 120.000100, 30.000000, 36.0, 200.0)); - assertThat(state.odometerMileageKm()).isEqualTo(100.0); assertThat(state.odometerAnomalies()).isZero(); assertThat(state.toVehicleDailyStatResult().orElseThrow().dailyMileageKm()).hasValue(100.0); } @Test - void gpsDistanceIsFallbackWhenTotalMileageIsMissing() { + void totalMileageIsRequiredForDailyMileageMetric() { Jt808DailyMileageState state = Jt808DailyMileageState.empty("VIN001", "VIN001", "13900000001", LocalDate.of(2026, 6, 30)); state.apply(point("2026-06-30T00:00:00Z", 120.000000, 30.000000, 36.0, null)); diff --git a/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStoreTest.java b/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStoreTest.java index 75832069..06b0aecf 100644 --- a/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStoreTest.java +++ b/modules/services/vehicle-stat-service/src/test/java/com/lingniu/ingest/vehiclestat/jt808/RedisJt808MileageStateStoreTest.java @@ -2,6 +2,7 @@ package com.lingniu.ingest.vehiclestat.jt808; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; @@ -31,14 +32,17 @@ class RedisJt808MileageStateStoreTest { store.save(state); + ArgumentCaptor json = ArgumentCaptor.forClass(String.class); verify(values).set( org.mockito.ArgumentMatchers.eq("vehicle:mileage:jt808:daily:2026-06-30:VIN001"), - org.mockito.ArgumentMatchers.contains("\"vehicleKey\":\"VIN001\""), + json.capture(), org.mockito.ArgumentMatchers.eq(Duration.ofDays(3))); + assertThat(json.getValue()).contains("\"vehicleKey\":\"VIN001\""); + assertThat(json.getValue()).doesNotContain("odometerMileageKm"); } @Test - void loadsStateFromJson() { + void loadsStateFromLegacyJson() { StringRedisTemplate redis = mock(StringRedisTemplate.class); @SuppressWarnings("unchecked") ValueOperations values = mock(ValueOperations.class);