# JT808 Daily Mileage Streaming ## Scope The analytics app can calculate daily mileage from JT808 telemetry only. It consumes `vehicle.event.jt808.v1`, keeps the rolling per-vehicle daily state in Redis, and saves the current daily result into the common `vehicle-stat` metric repository. ## Storage There is no separate JT808 daily-mileage table. Runtime state is stored under the configured JT808 state store so the stream can continue after restart. The derived metric is written through `VehicleStatRepository.saveDailyStat(...)` into the common JDBC/MySQL metric table `vehicle_stat_metric`. The JT808 daily-mileage value is calculated from the GPS total mileage reported in location additional information: ```text daily_mileage_km = last_total_mileage_km - first_total_mileage_km calculation_method = JT808_TOTAL_MILEAGE_DIFF ``` The metric is saved only after at least two ordered JT808 location points with valid `total_mileage_km` have been received for the same vehicle and local day. If the difference is negative, no metric row is saved for that state update. ## Runtime Settings Set these in Portainer or Nacos, without committing secrets: ```text KAFKA_TOPIC_JT808_EVENT=vehicle.event.jt808.v1 VEHICLE_STAT_JT808_MILEAGE_ENABLED=true MYSQL_JDBC_URL= MYSQL_USERNAME= MYSQL_PASSWORD= REDIS_HOST= REDIS_PORT=6379 REDIS_DATABASE=50 REDIS_PASSWORD= ``` Algorithm defaults use the Asia/Shanghai daily boundary. The rolling state stores only the fields needed by the GPS total-mileage difference calculation.