| | |
| | | # 车è¾GPSéç¨ç»è®¡åè½ä½¿ç¨è¯´æ |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | æ¬åè½å®ç°äºè½¦è¾GPSè¡é©¶éç¨çèªå¨ç»è®¡ï¼å
æ¬ï¼ |
| | | 1. **æ»éç¨ç»è®¡**ï¼åºäºGPSç¹è®¡ç®è½¦è¾æ¯æ¥æ»è¡é©¶éç¨ |
| | | 2. **任塿¶æ®µéç¨**ï¼è®¡ç®è½¦è¾å¨æ§è¡ä»»å¡æé´çè¡é©¶éç¨ |
| | | 3. **é任塿¶æ®µéç¨**ï¼è®¡ç®è½¦è¾éæ§è¡ä»»å¡æé´çè¡é©¶éç¨ |
| | | 4. **ä»»å¡éç¨å æ¯**ï¼è®¡ç®ä»»å¡éç¨å æ»éç¨çæ¯ä¾ |
| | | |
| | | ## æ ¸å¿ç®æ³ |
| | | |
| | | ### 1. è·ç¦»è®¡ç® |
| | | ä½¿ç¨ **Haversineå
¬å¼** 计ç®ç¸é»GPSç¹ä¹é´çå®é
è·ç¦»ï¼èèå°çæ²çï¼ |
| | | |
| | | ### 2. éç¨åæç®æ³ |
| | | æ ¹æ®GPSè®°å½çæ¶é´åºé´ä¸ä»»å¡æ¶é´åºé´ç**éå æ¯ä¾**ï¼å°æ¯æ®µè·ç¦»åæå°ä»»å¡éç¨åéä»»å¡éç¨ï¼ |
| | | |
| | | ``` |
| | | æ¶é´éå æ¯ä¾ = éå æ¶é¿ / æ»æ¶é¿ |
| | | ä»»å¡éç¨ = 段è·ç¦» à æ¶é´éå æ¯ä¾ |
| | | éä»»å¡éç¨ = 段è·ç¦» à (1 - æ¶é´éå æ¯ä¾) |
| | | ``` |
| | | |
| | | ## é¨ç½²æ¥éª¤ |
| | | |
| | | ### 1. æ§è¡æ°æ®åºèæ¬ |
| | | |
| | | æé¡ºåºæ§è¡ä»¥ä¸SQLæä»¶ï¼ |
| | | |
| | | ```bash |
| | | # 1. å建ç»è®¡è¡¨ |
| | | sql/vehicle_mileage_stats.sql |
| | | |
| | | # 2. æ·»å 宿¶ä»»å¡ |
| | | sql/vehicle_mileage_stats_job.sql |
| | | |
| | | # 3. æ·»å èåæé |
| | | sql/vehicle_mileage_stats_menu.sql |
| | | ``` |
| | | |
| | | ### 2. 代ç å·²èªå¨é¨ç½² |
| | | |
| | | 以ä¸ä»£ç æä»¶å·²åå»ºï¼ |
| | | |
| | | **å®ä½ç±»ï¼** |
| | | - `VehicleMileageStats.java` - éç¨ç»è®¡å®ä½ |
| | | - `TaskTimeInterval.java` - 任塿¶é´åºé´ |
| | | |
| | | **æ°æ®è®¿é®å±ï¼** |
| | | - `VehicleMileageStatsMapper.java` - éç¨ç»è®¡Mapperæ¥å£ |
| | | - `VehicleMileageStatsMapper.xml` - MyBatisæ å°æä»¶ |
| | | - `VehicleGpsMapper.java` - æ©å±GPSæ¥è¯¢æ¹æ³ |
| | | |
| | | **ä¸å¡å±ï¼** |
| | | - `IVehicleMileageStatsService.java` - Serviceæ¥å£ |
| | | - `VehicleMileageStatsServiceImpl.java` - Serviceå®ç°ï¼æ ¸å¿ç®æ³ï¼ |
| | | |
| | | **æ§å¶å±ï¼** |
| | | - `VehicleMileageStatsController.java` - REST APIæ¥å£ |
| | | |
| | | **宿¶ä»»å¡ï¼** |
| | | - `VehicleMileageStatsTask.java` - 宿¶ç»è®¡ä»»å¡ |
| | | |
| | | ### 3. å¯å¨å®æ¶ä»»å¡ |
| | | |
| | | ç³»ç»ä¼èªå¨æ·»å 宿¶ä»»å¡ï¼é»è®¤é
ç½®ï¼ |
| | | - **æ§è¡æ¶é´**ï¼æ¯å¤©åæ¨ 1:30 |
| | | - **ç»è®¡èå´**ï¼åä¸å¤©çææè½¦è¾GPSæ°æ® |
| | | - **Cron表达å¼**ï¼`0 30 1 * * ?` |
| | | |
| | | å¨ç³»ç»ç®¡ç -> 宿¶ä»»å¡ä¸å¯ä»¥æ¥çå管ç该任å¡ã |
| | | |
| | | ## ä½¿ç¨æ¹å¼ |
| | | |
| | | ### 1. èªå¨ç»è®¡ï¼æ¨èï¼ |
| | | |
| | | 宿¶ä»»å¡æ¯å¤©åæ¨èªå¨æ§è¡ï¼æ é人工干é¢ã |
| | | |
| | | ### 2. æå¨è§¦åç»è®¡ |
| | | |
| | | #### 2.1 å车è¾ç»è®¡ |
| | | |
| | | è°ç¨æ¥å£ï¼ |
| | | ``` |
| | | POST /system/mileageStats/calculate |
| | | åæ°ï¼ |
| | | - vehicleId: 车è¾ID |
| | | - statDate: ç»è®¡æ¥æï¼æ ¼å¼ï¼yyyy-MM-ddï¼ |
| | | ``` |
| | | |
| | | #### 2.2 æ¹éç»è®¡ |
| | | |
| | | è°ç¨æ¥å£ï¼ |
| | | ``` |
| | | POST /system/mileageStats/batchCalculate |
| | | åæ°ï¼ |
| | | - statDate: ç»è®¡æ¥æï¼æ ¼å¼ï¼yyyy-MM-ddï¼ |
| | | ``` |
| | | |
| | | #### 2.3 éè¿å®æ¶ä»»å¡è¡¥ç®å岿°æ® |
| | | |
| | | å¨å®æ¶ä»»å¡ç®¡çä¸ï¼æ§è¡ï¼ |
| | | ``` |
| | | vehicleMileageStatsTask.calculateMileageByDate('2025-11-09') |
| | | ``` |
| | | |
| | | ### 3. æ¥è¯¢ç»è®¡ç»æ |
| | | |
| | | ``` |
| | | GET /system/mileageStats/list |
| | | åæ°ï¼å¯éï¼ï¼ |
| | | - vehicleId: 车è¾ID |
| | | - vehicleNo: 车çå· |
| | | - statDate: ç»è®¡æ¥æ |
| | | - beginStatDate: å¼å§æ¥æ |
| | | - endStatDate: ç»ææ¥æ |
| | | ``` |
| | | |
| | | ### 4. 导åºç»è®¡æ°æ® |
| | | |
| | | ``` |
| | | POST /system/mileageStats/export |
| | | åæ°ï¼åæ¥è¯¢æ¥å£ |
| | | ``` |
| | | |
| | | ## æ°æ®è¡¨ç»æ |
| | | |
| | | ### tb_vehicle_mileage_statsï¼éç¨ç»è®¡è¡¨ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | stats_id | bigint | ç»è®¡IDï¼ä¸»é®ï¼ | |
| | | | vehicle_id | bigint | 车è¾ID | |
| | | | vehicle_no | varchar(20) | 车çå· | |
| | | | stat_date | date | ç»è®¡æ¥æ | |
| | | | total_mileage | decimal(10,2) | æ»éç¨ï¼å
¬éï¼ | |
| | | | task_mileage | decimal(10,2) | 任塿¶æ®µéç¨ï¼å
¬éï¼ | |
| | | | non_task_mileage | decimal(10,2) | é任塿¶æ®µéç¨ï¼å
¬éï¼ | |
| | | | task_ratio | decimal(5,4) | ä»»å¡éç¨å æ¯ï¼0-1ï¼ | |
| | | | gps_point_count | int | GPSç¹æ°é | |
| | | | task_count | int | 任塿°é | |
| | | |
| | | ### tb_vehicle_mileage_detailï¼éç¨æç»è¡¨ï¼ |
| | | |
| | | ç¨äºè°è¯å追溯ï¼è®°å½æ¯æ®µGPS轨迹çéç¨åææç»ã |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### 1. GPSæ°æ®è´¨é |
| | | |
| | | - GPSééé´éå»ºè®®å¨ 30-60ç§ |
| | | - è¿çï¼è®¡ç®éå¤§ï¼æ§è½å½±å |
| | | - è¿é¿ï¼éç¨ç²¾åº¦éä½ |
| | | |
| | | ### 2. 任塿¶é´å®ä¹ |
| | | |
| | | 任塿¶æ®µ = ä»ä»»å¡å建æ¶é´ï¼`create_time`ï¼å°ä»»å¡å®ææ¶é´ï¼`actual_end_time`ï¼ |
| | | |
| | | ç¡®ä¿ä»»å¡è¡¨ä¸è¿ä¸¤ä¸ªå段å确记å½ã |
| | | |
| | | ### 3. æ§è½ä¼å |
| | | |
| | | - ç»è®¡æ°æ®ææ¥ææ±æ»ï¼é¿å
宿¶è®¡ç® |
| | | - 建议ä¿ç3-6个æçç»è®¡æ°æ®ï¼å®æå½æ¡£å岿°æ® |
| | | - GPSåå§æ°æ®å»ºè®®ä¿ç7-30天ï¼ç±æ¸
ç任塿§å¶ï¼ |
| | | |
| | | ### 4. æ°æ®è¡¥ç® |
| | | |
| | | å¦éè¡¥ç®å岿°æ®ï¼å¯ä»¥éè¿å®æ¶ä»»å¡æAPIæ¥å£æ¹éæ§è¡ï¼ |
| | | |
| | | ```java |
| | | // è¡¥ç®æè¿7å¤©çæ°æ®ç¤ºä¾ |
| | | for (int i = 1; i <= 7; i++) { |
| | | String date = "2025-11-" + String.format("%02d", i); |
| | | vehicleMileageStatsTask.calculateMileageByDate(date); |
| | | } |
| | | ``` |
| | | |
| | | ## æ©å±è¯´æ |
| | | |
| | | ### 天å°å¾æ¥å£éæ |
| | | |
| | | è½ç¶æ ¸å¿ç®æ³ä½¿ç¨Haversineå
¬å¼è®¡ç®è·ç¦»ï¼ä½ç³»ç»å·²éæå¤©å°å¾æ¥å£ï¼å¯ç¨äºï¼ |
| | | |
| | | 1. **å°åè§£æ**ï¼å°GPSåæ è½¬æ¢ä¸ºå°åä¿¡æ¯ |
| | | 2. **è·¯å¾è§å**ï¼è®¡ç®å®é
éè·¯è·ç¦»ï¼æ¯ç´çº¿è·ç¦»æ´åç¡®ï¼ |
| | | 3. **POIæ¥è¯¢**ï¼æ¥è¯¢æ²¿éå
´è¶£ç¹ |
| | | |
| | | å¦é使ç¨å¤©å°å¾APIè¿è¡è·¯å¾è·ç¦»è®¡ç®ï¼å¯åè `VehicleGpsController` ä¸ç天å°å¾æ¥å£ã |
| | | |
| | | ## ææ¯æ¯æ |
| | | |
| | | 妿é®é¢ï¼è¯·æ£æ¥ï¼ |
| | | 1. æ°æ®åºè¡¨æ¯å¦æ£ç¡®å建 |
| | | 2. 宿¶ä»»å¡æ¯å¦æ£å¸¸å¯å¨ |
| | | 3. GPSæ°æ®æ¯å¦æ£å¸¸éé |
| | | 4. ä»»å¡è¡¨çæ¶é´å段æ¯å¦åç¡® |
| | | |
| | | æ¥å¿ä½ç½®ï¼ |
| | | - Service屿¥å¿ï¼æç´¢ `VehicleMileageStatsServiceImpl` |
| | | - 宿¶ä»»å¡æ¥å¿ï¼æç´¢ `VehicleMileageStatsTask` |