From fe33646ee6e2d1e57f2b51812e94983a0e9efb04 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 14 十二月 2025 16:51:28 +0800
Subject: [PATCH] feat: 修复统计

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.java |   56 ++++++++-----
 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java                                  |   12 +++
 ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml                                   |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java                             |    4 
 ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml                       |    6 -
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java      |   83 +++++++++++++-------
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java                          |   10 +-
 ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xml                  |    6 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java      |    2 
 ruoyi-admin/src/main/resources/application.yml                                                    |    2 
 sql/qy_wechat_config.sql                                                                          |    2 
 11 files changed, 116 insertions(+), 72 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java
index 789d0cd..37dd210 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java
@@ -114,7 +114,7 @@
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             sdf.setLenient(false); // 涓ユ牸瑙f瀽鏃ユ湡
             Date date = sdf.parse(statDate.trim());
-            
+            logger.info("---> 鎵嬪姩璁$畻杞﹁締閲岀▼姹囨��,杞﹁締ID: {}, 鏃ユ湡: {}", vehicleId, date);
             VehicleMileageStats stats = vehicleMileageStatsService.calculateAndSaveMileageStats(vehicleId, date);
             // 淇String鍒癉ate杞崲闂锛屾坊鍔犳洿濂界殑閿欒澶勭悊
             if (stats != null) {
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 105bc73..4219d2c 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -58,7 +58,7 @@
     basename: i18n/messages
   profiles:
     # 鐜 dev|test|prod
-    active: dev
+    active: prod
   # 鏂囦欢涓婁紶
   servlet:
     multipart:
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
index 434d1e1..0f573b0 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
@@ -110,6 +110,18 @@
     }
 
     /**
+     * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈�
+     * @param date
+     * @param format
+     * @return
+     */
+    public static final String formatDate(Date date, String format){
+        return new SimpleDateFormat(format).format(date);
+    }
+    public static  final  String formatDate(Date date){
+        return new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).format(date);
+    }
+    /**
      * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈� 鏍煎紡
      */
     public static Date parseDate(Object str)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
index c918380..f900677 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
@@ -138,6 +138,6 @@
      * @return
      */
     public List<SysTask> selectTaskByVehicleIdAndDate(@Param("vehicleId") Long vehicleId,
-                                                      @Param("startTime") Date startTime,
-                                                      @Param("endTime") Date endTime);
+                                                      @Param("startTime") String startTime,
+                                                      @Param("endTime") String endTime);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java
index da0f917..d8afe11 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleGpsMapper.java
@@ -60,8 +60,8 @@
      * @return GPS鍧愭爣鍒楄〃
      */
     public List<VehicleGps> selectGpsDataByTimeRange(@Param("vehicleId") Long vehicleId,
-                                                       @Param("startTime") Date startTime,
-                                                       @Param("endTime") Date endTime);
+                                                       @Param("startTime") String startTime,
+                                                       @Param("endTime") String endTime);
 
     /**
      * 鏌ヨ娲昏穬杞﹁締ID鍒楄〃
@@ -69,7 +69,7 @@
      * @param startTime 璧峰鏃堕棿
      * @return 杞﹁締ID鍒楄〃
      */
-    public List<Long> selectActiveVehicleIds(@Param("startTime") Date startTime);
+    public List<Long> selectActiveVehicleIds(@Param("startTime") String startTime);
     
     /**
      * 鏌ヨ鏈璁$畻鐨凣PS鍧愭爣锛堜笉鍦╰b_vehicle_gps_calculated琛ㄤ腑鐨勮褰曪級
@@ -80,6 +80,6 @@
      * @return 鏈璁$畻鐨凣PS鍧愭爣鍒楄〃
      */
     public List<VehicleGps> selectUncalculatedGps(@Param("vehicleId") Long vehicleId,
-                                                    @Param("startTime") Date startTime,
-                                                    @Param("endTime") Date endTime);
+                                                    @Param("startTime") String startTime,
+                                                    @Param("endTime") String endTime);
 } 
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.java
index 3738cfb..9936086 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.java
@@ -3,6 +3,8 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
+
+import com.ruoyi.common.utils.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -97,10 +99,11 @@
     public int batchCalculateSegmentMileage(Date startTime, Date endTime) {
         try {
 //            logger.info("寮�濮嬫壒閲忚绠桮PS鍒嗘閲岀▼ - 鏃堕棿鑼冨洿: {} 鍒� {}", startTime, endTime);
-            
+            String startTimeStr = DateUtils.formatDate(startTime,DateUtils.YYYY_MM_DD_HH_MM_SS);
+            String endTimeStr = DateUtils.formatDate(endTime,DateUtils.YYYY_MM_DD_HH_MM_SS);
             // 鏌ヨ鍦ㄦ寚瀹氭椂闂磋寖鍥村唴鏈塆PS鏁版嵁鐨勬墍鏈夎溅杈嗭紙娣诲姞鎱QL鐩戞帶锛�
             long startQueryTime = System.currentTimeMillis();
-            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTime);
+            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTimeStr);
             long queryTime = System.currentTimeMillis() - startQueryTime;
             
             // 鎱㈡煡璇㈣鍛婏紙瓒呰繃1绉掞級
@@ -167,9 +170,10 @@
             Date startTime = cal.getTime();
             
             logger.info("寮�濮嬭ˉ鍋胯绠� - 鍥炴函澶╂暟: {}, 鏃堕棿鑼冨洿: {} 鍒� {}", lookbackDays, startTime, endTime);
-            
+
+            String startTimeStr=DateUtils.formatDate(startTime, DateUtils.YYYY_MM_DD_HH_MM_SS);
             // 鏌ヨ鎵�鏈夋椿璺冭溅杈�
-            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTime);
+            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTimeStr);
             
             if (vehicleIds == null || vehicleIds.isEmpty()) {
                 logger.info("娌℃湁鎵惧埌娲昏穬杞﹁締");
@@ -178,11 +182,13 @@
             
             int successCount = 0;
             int totalUncalculated = 0;
-            
+
+
+            String endTimeStr=DateUtils.formatDate(endTime, DateUtils.YYYY_MM_DD_HH_MM_SS);
             for (Long vehicleId : vehicleIds) {
                 try {
                     // 鏌ヨ璇ヨ溅杈嗘湭琚绠楃殑GPS鏁版嵁
-                    List<VehicleGps> uncalculatedGps = vehicleGpsMapper.selectUncalculatedGps(vehicleId, startTime, endTime);
+                    List<VehicleGps> uncalculatedGps = vehicleGpsMapper.selectUncalculatedGps(vehicleId, startTimeStr, endTimeStr);
                     
                     if (uncalculatedGps == null || uncalculatedGps.isEmpty()) {
                         logger.debug("杞﹁締 {} 娌℃湁鏈绠楃殑GPS鏁版嵁", vehicleId);
@@ -241,14 +247,16 @@
     public int calculateVehicleSegmentMileage(Long vehicleId, Date startTime, Date endTime) {
         try {
             // 鏌ヨ杞﹁締鍦ㄦ椂闂磋寖鍥村唴鐨凣PS鏁版嵁
-            List<VehicleGps> gpsList = vehicleGpsMapper.selectGpsDataByTimeRange(vehicleId, startTime, endTime);
+            String startTimeStr=DateUtils.formatDate(startTime, DateUtils.YYYY_MM_DD_HH_MM_SS);
+            String endTimeStr=DateUtils.formatDate(endTime, DateUtils.YYYY_MM_DD_HH_MM_SS);
+            List<VehicleGps> gpsList = vehicleGpsMapper.selectGpsDataByTimeRange(vehicleId, startTimeStr, endTimeStr);
             
             if (gpsList == null || gpsList.isEmpty()) {
                 logger.debug("杞﹁締ID: {} 鍦ㄦ椂闂磋寖鍥� {} 鍒� {} 鍐呮棤GPS鏁版嵁", vehicleId, startTime, endTime);
                 return 0;
             }
             
-            logger.info("杞﹁締ID: {} 鏌ヨ鍒� {} 鏉PS鏁版嵁 startTime:{},endTime:{}", vehicleId, gpsList.size(),startTime,endTime);
+//            logger.info("杞﹁締ID: {} 鏌ヨ鍒� {} 鏉PS鏁版嵁 startTime:{},endTime:{}", vehicleId, gpsList.size(),startTime,endTime);
             
             return calculateVehicleSegmentMileageWithGpsList(vehicleId, gpsList, startTime, endTime);
             
@@ -284,7 +292,7 @@
             // 澶勭悊姣忎釜鏃堕棿娈靛苟璁$畻閲岀▼
             int savedCount = processSegmentedGpsData(vehicleId, segmentedData, config);
             
-            logger.info("杞﹁締 {} 璁$畻瀹屾垚锛屼繚瀛樹簡 {} 涓椂闂存鐨勯噷绋嬫暟鎹�", vehicleId, savedCount);
+//            logger.info("杞﹁締 {} 璁$畻瀹屾垚锛屼繚瀛樹簡 {} 涓椂闂存鐨勯噷绋嬫暟鎹�", vehicleId, savedCount);
             
             // 鑷姩瑙﹀彂姣忔棩缁熻姹囨��
             if (savedCount > 0) {
@@ -319,7 +327,7 @@
         // 鑾峰彇鏄惁璺宠繃宸茶绠桮PS鐐圭殑閰嶇疆
         String skipCalculatedConfig = configService.selectConfigByKey("gps.mileage.skip.calculated");
         config.skipCalculated = skipCalculatedConfig == null || "true".equalsIgnoreCase(skipCalculatedConfig);
-        logger.info("鎺у埗璺宠繃閲嶅璁$畻鏍囪瘑: {}", config.skipCalculated);
+//        logger.info("鎺у埗璺宠繃閲嶅璁$畻鏍囪瘑: {}", config.skipCalculated);
         
         return config;
     }
@@ -383,7 +391,7 @@
         
         // 濡傛灉鏈鍙湁1涓偣锛屼笖娌℃湁涓婁竴娈电殑鏈�鍚庝竴涓偣锛屾棤娉曡绠楄窛绂�
         if (segmentGpsList.size() == 1 && previousSegmentLastPoint == null) {
-            logger.debug("杞﹁締 {} 鏃堕棿娈� {} 鍙湁1涓狦PS鐐逛笖鏃犲墠缃偣锛屾殏瀛樺緟涓嬩竴娈佃绠�", vehicleId, segmentStartTime);
+//            logger.debug("杞﹁締 {} 鏃堕棿娈� {} 鍙湁1涓狦PS鐐逛笖鏃犲墠缃偣锛屾殏瀛樺緟涓嬩竴娈佃绠�", vehicleId, segmentStartTime);
             return false;
         }
         
@@ -421,14 +429,14 @@
             String gpsIds = gpsIdList.stream()
                 .map(String::valueOf)
                 .collect(java.util.stream.Collectors.joining(","));
-            
+
             // 鍒涘缓鍒嗘閲岀▼璁板綍
             VehicleGpsSegmentMileage segment = buildSegmentMileageRecord(
                 vehicleId, segmentStartTime, segmentEndTime, segmentGpsList, 
                 distance, gpsIdList, gpsIds, config.calculateMethod);
             
             // 淇濆瓨鍒版暟鎹簱
-            logger.info("淇濆瓨杞﹁締鍒嗘椂娈甸噷绋嬪埌鏁版嵁搴撲腑,杞﹁締ID: {}, 鏃堕棿娈�: {} 鍒� {}", vehicleId, segmentStartTime, segmentEndTime);
+//            logger.info("淇濆瓨杞﹁締鍒嗘椂娈甸噷绋嬪埌鏁版嵁搴撲腑,杞﹁締ID: {}, 鏃堕棿娈�: {} 鍒� {}", vehicleId, segmentStartTime, segmentEndTime);
             segmentMileageMapper.insertVehicleGpsSegmentMileage(segment);
             
             // 璁板綍宸茶绠楃殑GPS鐐癸紙濡傛灉寮�鍚簡閲嶅璁$畻鎺у埗锛�
@@ -436,9 +444,9 @@
                 recordCalculatedGpsPoints(gpsIdList, segment.getSegmentId(), vehicleId);
             }
             
-            logger.debug("杞﹁締 {} 鏃堕棿娈� {} 鍒� {} 閲岀▼: {}km, GPS鐐规暟: {}, GPS IDs: {}", 
-                       vehicleId, segmentStartTime, segmentEndTime, distance, segmentGpsList.size(), 
-                       gpsIds.length() > 50 ? gpsIds.substring(0, 50) + "..." : gpsIds);
+//            logger.debug("杞﹁締 {} 鏃堕棿娈� {} 鍒� {} 閲岀▼: {}km, GPS鐐规暟: {}, GPS IDs: {}",
+//                       vehicleId, segmentStartTime, segmentEndTime, distance, segmentGpsList.size(),
+//                       gpsIds.length() > 50 ? gpsIds.substring(0, 50) + "..." : gpsIds);
             
             return true;
             
@@ -560,7 +568,7 @@
             for (Date statDate : affectedDates) {
                 try {
                     mileageStatsService.aggregateFromSegmentMileage(vehicleId, statDate);
-                    logger.info("杞﹁締 {} 鏃ユ湡 {} 鐨勭粺璁℃暟鎹凡鑷姩姹囨�荤敓鎴�", vehicleId, statDate);
+//                    logger.info("杞﹁締 {} 鏃ユ湡 {} 鐨勭粺璁℃暟鎹凡鑷姩姹囨�荤敓鎴�", vehicleId, statDate);
                 } catch (Exception e) {
                     logger.error("杞﹁締 {} 鏃ユ湡 {} 鑷姩姹囨�荤粺璁″け璐�", vehicleId, statDate, e);
                 }
@@ -662,8 +670,8 @@
             );
             totalDistance = totalDistance.add(BigDecimal.valueOf(gapDistance));
             
-            logger.debug("璺ㄦ闂撮殭璺濈: {}km (涓婁竴娈垫湯鐐� -> 褰撳墠娈甸鐐�)", 
-                String.format("%.3f", gapDistance));
+//            logger.debug("璺ㄦ闂撮殭璺濈: {}km (涓婁竴娈垫湯鐐� -> 褰撳墠娈甸鐐�)",
+//                String.format("%.3f", gapDistance));
         }
         
         // 2. 鍐嶈绠楀綋鍓嶆鍐呴儴鐨勮窛绂伙紙濡傛灉鏈�2涓垨浠ヤ笂GPS鐐癸級
@@ -840,10 +848,12 @@
                                       Date segmentStartTime, Date segmentEndTime) {
         try {
             // 鏌ヨ璇ヨ溅杈嗘鍦ㄦ墽琛岀殑浠诲姟鍒楄〃
-            List<SysTask> activeTasks = sysTaskMapper.selectTaskByVehicleIdAndDate(vehicleId,segmentStartTime,segmentEndTime);
+          String segmentStartTimeStr =  DateUtils.formatDate(segmentStartTime, "yyyy-MM-dd HH:mm:ss");
+          String segmentEndTimeStr =  DateUtils.formatDate(segmentEndTime, "yyyy-MM-dd HH:mm:ss");
+            List<SysTask> activeTasks = sysTaskMapper.selectTaskByVehicleIdAndDate(vehicleId,segmentStartTimeStr,segmentEndTimeStr);
             
             if (activeTasks == null || activeTasks.isEmpty()) {
-                logger.debug("杞﹁締 {} 鍦ㄦ椂闂存 {} - {} 娌℃湁姝e湪鎵ц鐨勪换鍔�", vehicleId, segmentStartTime, segmentEndTime);
+                logger.info("杞﹁締 {} 鍦ㄦ椂闂存 {} - {} 娌℃湁姝e湪鎵ц鐨勪换鍔�", vehicleId, segmentStartTime, segmentEndTime);
                 return;
             }
             
@@ -859,8 +869,8 @@
                     segment.setTaskId(task.getTaskId());
                     segment.setTaskCode(task.getTaskCode());
                     
-                    logger.debug("杞﹁締 {} 鏃堕棿娈� {} - {} 鍏宠仈浠诲姟: taskId={}, taskCode={}", 
-                               vehicleId, segmentStartTime, segmentEndTime, task.getTaskId(), task.getTaskCode());
+//                    logger.debug("杞﹁締 {} 鏃堕棿娈� {} - {} 鍏宠仈浠诲姟: taskId={}, taskCode={}",
+//                               vehicleId, segmentStartTime, segmentEndTime, task.getTaskId(), task.getTaskCode());
                     break; // 鎵惧埌涓�涓尮閰嶇殑浠诲姟鍗冲彲
                 }
             }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java
index 2f59384..2d1eeaf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java
@@ -4,6 +4,7 @@
 import java.math.RoundingMode;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashSet;
@@ -11,6 +12,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ruoyi.common.utils.DateUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -114,28 +116,34 @@
             
             calendar.add(Calendar.DAY_OF_MONTH, 1);
             Date dayEnd = calendar.getTime();
-            
+
+            String dayStartStr=DateUtils.formatDate(dayStart, DateUtils.YYYY_MM_DD_HH_MM_SS);
+            String dayEndStr=DateUtils.formatDate(dayEnd, DateUtils.YYYY_MM_DD_HH_MM_SS);
             // 2. 鏌ヨ杞﹁締鍦ㄨ鏃ユ湡鐨凣PS鏁版嵁锛堟寜鏃堕棿鎺掑簭锛�
-            List<VehicleGps> gpsList = vehicleGpsMapper.selectGpsDataByTimeRange(vehicleId, dayStart, dayEnd);
+            List<VehicleGps> gpsList = vehicleGpsMapper.selectGpsDataByTimeRange(vehicleId, dayStartStr, dayEndStr);
             
             if (gpsList == null || gpsList.isEmpty()) {
-//                logger.info("杞﹁締ID: {} 鍦ㄦ棩鏈�: {} 鏃燝PS鏁版嵁", vehicleId, statDate);
+                logger.info("---> 杞﹁締ID:{} 鍦ㄦ棩鏈�:{} 鏃燝PS鏁版嵁", vehicleId, statDate);
                 return null;
             }
-//            logger.info("杞﹁締ID:{} GPS鏁版嵁鏉℃暟:{}", vehicleId, gpsList.size());
+//            logger.info("---> 杞﹁締ID:{} GPS鏁版嵁鏉℃暟:{}", vehicleId, gpsList.size());
             // 3. 鏌ヨ杞﹁締鍦ㄨ鏃ユ湡鐨勪换鍔℃椂闂村尯闂�
             List<TaskTimeInterval> taskIntervals = vehicleMileageStatsMapper.selectTaskTimeIntervals(vehicleId, dayStart, dayEnd);
+//            logger.info("---> 杞﹁締ID:{} 浠诲姟鏃堕棿鍖洪棿鏁�:{}", vehicleId, taskIntervals.size());
 
+           List<VehicleGpsSegmentMileage> mileages = this.getTaskDistanceMileage(vehicleId, dayStart, dayEnd).stream().filter(e -> e.getSegmentDistance() != null && e.getSegmentDistance().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
 
-           List<VehicleGpsSegmentMileage> mileages = this.getTaskDistanceMileage(vehicleId, dayStart, dayEnd);
            int totalGpsPoints = mileages.stream()
                 .filter(segment -> segment.getGpsPointCount() != null)
                 .mapToInt(VehicleGpsSegmentMileage::getGpsPointCount)
                 .sum();
+//           logger.info("---> 杞﹁締ID:{} 浠诲姟鏃堕棿:{} 閲岀▼鏃堕棿:{}", vehicleId,
+//                   taskIntervals.stream().map(e->"寮�濮嬫椂闂�:"+DateUtils.formatDate(e.getStartTime())+",缁撴潫鏃堕棿:"+DateUtils.formatDate(e.getEndTime())).collect(Collectors.joining()),
+//                   mileages.stream().map(e->"寮�濮嬫椂闂�:"+DateUtils.formatDate(e.getSegmentStartTime())+",缁撴潫鏃堕棿:"+DateUtils.formatDate(e.getSegmentEndTime())).collect(Collectors.joining()));
             BigDecimal taskDistance = getTaskDistance(taskIntervals,mileages);
-
+//            logger.info("---> 杞﹁締ID:{} 浠诲姟鎬婚噷绋�:{}", vehicleId, taskDistance);
             MileageCalculation calculation = calculateMileage(gpsList, taskDistance);
-//            logger.info("璁$畻鍑鸿溅杈嗗綋澶╂�婚噷绋嬶紝杞﹁締ID:{},鎬婚噷绋嬶細{},浠诲姟閲岀▼:{}",vehicleId,calculation.totalMileage,calculation.taskMileage);
+//            logger.info("---> 璁$畻鍑鸿溅杈嗗綋澶╂�婚噷绋嬶紝杞﹁締ID:{},鎬婚噷绋嬶細{},浠诲姟閲岀▼:{}",vehicleId,calculation.totalMileage,calculation.taskMileage);
             // 5. 鏌ヨ鎴栧垱寤虹粺璁¤褰�
             VehicleMileageStats stats = vehicleMileageStatsMapper.selectByVehicleIdAndDate(vehicleId, statDate);
             boolean isNew = (stats == null);
@@ -164,7 +172,7 @@
             stats.setTaskMileage(calculation.taskMileage);
             stats.setNonTaskMileage(calculation.nonTaskMileage);
             stats.setTaskRatio(calculation.taskRatio);
-            stats.setGpsPointCount(gpsList.size());
+            stats.setGpsPointCount(totalGpsPoints);
             stats.setTaskCount(taskIntervals == null ? 0 : taskIntervals.size());
 
 //            logger.info("杞﹁締ID: {} 鏃ユ湡: {} 閲岀▼缁熻瀹屾垚 - 鎬婚噷绋�: {}km, 浠诲姟閲岀▼: {}km, 闈炰换鍔¢噷绋�: {}km, 鍗犳瘮: {}",
@@ -176,15 +184,17 @@
             } else {
                 vehicleMileageStatsMapper.updateVehicleMileageStats(stats);
             }
-            
-            logger.info("杞﹁締ID: {} 鏃ユ湡: {} 閲岀▼缁熻瀹屾垚 - 鎬婚噷绋�: {}km, 浠诲姟閲岀▼: {}km, 闈炰换鍔¢噷绋�: {}km, 鍗犳瘮: {}", 
-                       vehicleId, statDate, calculation.totalMileage, calculation.taskMileage, 
-                       calculation.nonTaskMileage, calculation.taskRatio);
-            
+
+//            if (taskIntervals != null) {
+//                logger.info("---> 鍚屾閲岀▼瀹屾垚,杞﹁締ID: {} 鏃ユ湡: {} 閲岀▼缁熻瀹屾垚 - 鎬婚噷绋�: {}km,浠诲姟鏁伴噺锛歿} 浠诲姟閲岀▼: {}km, 闈炰换鍔¢噷绋�: {}km, 鍗犳瘮: {}",
+//                           vehicleId, statDate, calculation.totalMileage,taskIntervals.size(), calculation.taskMileage,
+//                           calculation.nonTaskMileage, calculation.taskRatio);
+//            }
+
             return stats;
             
         } catch (Exception e) {
-            logger.error("璁$畻杞﹁締閲岀▼缁熻澶辫触 - 杞﹁締ID: {}, 鏃ユ湡: {}", vehicleId, statDate, e);
+            logger.error("---> 璁$畻杞﹁締閲岀▼缁熻澶辫触 - 杞﹁締ID: {}, 鏃ユ湡: {}", vehicleId, statDate, e);
             throw new RuntimeException("璁$畻閲岀▼缁熻澶辫触: " + e.getMessage());
         }
     }
@@ -200,9 +210,9 @@
             calendar.setTime(statDate);
             calendar.add(Calendar.DAY_OF_MONTH, -7);
             Date startTime = calendar.getTime();
-            
+            String startTimeStr = DateUtils.formatDate(startTime,DateUtils.YYYY_MM_DD_HH_MM_SS);
             // 鏌ヨ鎵�鏈夋椿璺冭溅杈�
-            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTime);
+            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTimeStr);
             
             if (vehicleIds == null || vehicleIds.isEmpty()) {
                 logger.info("娌℃湁鎵惧埌娲昏穬杞﹁締");
@@ -219,7 +229,7 @@
                 }
             }
             
-            logger.info("鎵归噺閲岀▼缁熻瀹屾垚 - 鏃ユ湡: {}, 鎬昏溅杈嗘暟: {}, 鎴愬姛: {}", statDate, vehicleIds.size(), successCount);
+//            logger.info("鎵归噺閲岀▼缁熻瀹屾垚 - 鏃ユ湡: {}, 鎬昏溅杈嗘暟: {}, 鎴愬姛: {}", statDate, vehicleIds.size(), successCount);
             return successCount;
             
         } catch (Exception e) {
@@ -231,7 +241,12 @@
 
 
     private BigDecimal calculateTotalMileage(List<VehicleGpsSegmentMileage> mileages) {
+        if (mileages == null || mileages.isEmpty()) {
+            return BigDecimal.ZERO;
+        }
+        
         return mileages.stream()
+            .filter(mileage -> mileage.getSegmentDistance() != null) // 杩囨护鎺夎窛绂讳负null鐨勫垎娈�
             .map(mileage -> mileage.getSegmentDistance())
             .reduce(BigDecimal.ZERO, BigDecimal::add);
 
@@ -310,7 +325,8 @@
 
     //璁$畻浠诲姟鏃堕棿娈靛唴鐨勯噷绋嬶紝搴旇鎷垮埌璇ヤ换鍔″湪宸ヤ綔鏃堕棿娈甸噷鐨勫垎娈佃窛绂荤劧鍚庣浉鍔�
     private List<VehicleGpsSegmentMileage> getTaskDistanceMileage(Long vehicleId, Date segmentStart, Date segmentEnd) {
-        return segmentMileageMapper.selectSegmentsByDateRange(vehicleId, segmentStart, segmentEnd);
+        List<VehicleGpsSegmentMileage> mileages = segmentMileageMapper.selectSegmentsByDateRange(vehicleId, segmentStart, segmentEnd);
+        return mileages != null ? mileages : new ArrayList<>();
     }
 
     /**
@@ -332,7 +348,9 @@
         // 閬嶅巻鎵�鏈夊垎娈甸噷绋嬫暟鎹�
         for (VehicleGpsSegmentMileage segment : segmentMileages) {
             // 鍙鐞嗘湁鍏宠仈浠诲姟ID涓旀湁璺濈鏁版嵁鐨勫垎娈�
-
+//            if (segment.getTaskId() == null || segment.getSegmentDistance() == null) {
+//                continue;
+//            }
 
             // 妫�鏌ヨ鍒嗘鏄惁涓庝换浣曚换鍔℃椂闂存閲嶅彔
             Date segmentStart = segment.getSegmentStartTime();
@@ -433,8 +451,6 @@
     @Override
     public VehicleMileageStats aggregateFromSegmentMileage(Long vehicleId, Date statDate) {
         try {
-            calculateAndSaveMileageStats(vehicleId, statDate);
-            //TODO
             // 1. 鑾峰彇缁熻鏃ユ湡鐨勫紑濮嬪拰缁撴潫鏃堕棿
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(statDate);
@@ -456,18 +472,23 @@
             }
 
             List<TaskTimeInterval> taskIntervals = vehicleMileageStatsMapper.selectTaskTimeIntervals(vehicleId, dayStart, dayEnd);
-            Integer taskCount = taskIntervals.size();
-
-
-            List<VehicleGpsSegmentMileage> mileages = this.getTaskDistanceMileage(vehicleId, dayStart, dayEnd);
-            Integer totalGpsPoints = mileages.stream()
+            Integer taskCount = taskIntervals != null ? taskIntervals.size() : 0;
+            logger.info("杞﹁締ID: {} 鍦ㄦ棩鏈�: {} 鏈� {} 涓换鍔�", vehicleId, statDate, taskCount);
+            List<VehicleGpsSegmentMileage> mileages = this.getTaskDistanceMileage(vehicleId, dayStart, dayEnd).stream().filter(e -> e.getSegmentDistance() != null && e.getSegmentDistance().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList());
+            logger.info("杞﹁締ID: {} 鍦ㄦ棩鏈�: {} 鏈� {} 涓垎娈甸噷绋嬫暟鎹�", vehicleId, statDate, mileages.size());
+            Integer totalGpsPoints = mileages != null ? mileages.stream()
                 .filter(segment -> segment.getGpsPointCount() != null)
                 .mapToInt(VehicleGpsSegmentMileage::getGpsPointCount)
-                .sum();
-            BigDecimal taskDistance = getTaskDistance(taskIntervals,mileages);
+                .sum() : 0;
+            BigDecimal taskDistance = getTaskDistance(taskIntervals, mileages);
             BigDecimal totalDistance = calculateTotalMileage(segments);
             BigDecimal nonTaskDistance = totalDistance.subtract(taskDistance);
-            BigDecimal taskRatio = taskDistance.divide(totalDistance, 4, RoundingMode.HALF_UP);
+            
+            // 闃叉闄ら浂閿欒
+            BigDecimal taskRatio = BigDecimal.ZERO;
+            if (totalDistance != null && totalDistance.compareTo(BigDecimal.ZERO) > 0) {
+                taskRatio = taskDistance.divide(totalDistance, 4, RoundingMode.HALF_UP);
+            }
             // 3. 姹囨�婚噷绋嬫暟鎹�
 
 
@@ -533,9 +554,11 @@
             calendar.setTime(statDate);
             calendar.add(Calendar.DAY_OF_MONTH, -7);
             Date startTime = calendar.getTime();
+
+            String startTimeStr = DateUtils.formatDate(startTime, DateUtils.YYYY_MM_DD_HH_MM_SS);
             
             // 鏌ヨ鎵�鏈夋椿璺冭溅杈�
-            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTime);
+            List<Long> vehicleIds = vehicleGpsMapper.selectActiveVehicleIds(startTimeStr);
             
             if (vehicleIds == null || vehicleIds.isEmpty()) {
                 logger.info("娌℃湁鎵惧埌娲昏穬杞﹁締");
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
index 1b5cfbb..18aa0a0 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
@@ -188,14 +188,13 @@
 
     <select id="selectTaskByVehicleIdAndDate" resultMap="SysTaskResult">
         select tv.task_id, t.actual_start_time,
-        IFNULL(t.actual_end_time, NOW()) as t.actual_end_time
+        IFNULL(t.actual_end_time, NOW()) as actual_end_time
         from sys_task_vehicle tv
         inner join sys_task t on tv.task_id = t.task_id
         where tv.vehicle_id = #{vehicleId}
         and t.del_flag = '0'
         and (
-        (t.actual_end_time is not null and t.actual_start_time > #{startTime} and t.actual_end_time &lt; #{endTime} )
-        or (t.actual_end_time is null and t.actual_start_time > ${endTime} )
+        (t.actual_start_time &lt;= #{endTime} and (t.actual_end_time is null or t.actual_end_time &gt;= #{startTime}))
         )
         order by t.actual_start_time
     </select>
diff --git a/ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xml b/ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xml
index 53443f9..aa125c1 100644
--- a/ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xml
@@ -64,8 +64,10 @@
     <select id="selectSegmentsByDateRange" resultMap="VehicleGpsSegmentMileageResult">
         <include refid="selectVehicleGpsSegmentMileageVo"/>
         WHERE vehicle_id = #{vehicleId}
-          AND segment_start_time &gt;= #{startDate}
-          AND segment_end_time &lt;= #{endDate}
+          AND segment_start_time &lt;= #{endDate}
+          AND segment_end_time &gt;= #{startDate}
+          AND segment_start_time IS NOT NULL
+          AND segment_end_time IS NOT NULL
         ORDER BY segment_start_time
     </select>
     
diff --git a/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml b/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml
index 47abb4d..1a2218f 100644
--- a/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml
@@ -94,10 +94,8 @@
         inner join sys_task t on tv.task_id = t.task_id
         where tv.vehicle_id = #{vehicleId}
           and t.del_flag = '0'
-          and (
-                (t.actual_end_time is not null and t.actual_start_time &gt; #{startTime} and t.actual_end_time &lt; #{endTime})
-                or (t.actual_end_time is null and t.actual_start_time &gt; #{startTime})
-        )
+          and (t.actual_start_time &lt;= #{endTime} and (t.actual_end_time is null or t.actual_end_time &gt;= #{startTime}))
+
         order by t.actual_start_time
     </select>
         
diff --git a/sql/qy_wechat_config.sql b/sql/qy_wechat_config.sql
index 03bbb5b..e532117 100644
--- a/sql/qy_wechat_config.sql
+++ b/sql/qy_wechat_config.sql
@@ -14,6 +14,6 @@
 ('浼佷笟寰俊鏈嶅姟鍚敤鐘舵��', 'qy_wechat.enable', 'false', 'Y', 'admin', SYSDATE(), '', NULL, '浼佷笟寰俊鏈嶅姟鏄惁鍚敤锛宼rue-鍚敤锛宖alse-绂佺敤'),
 ('浼佷笟寰俊CorpID', 'qy_wechat.corp_id', 'wx248505bfbab6d0c1', 'N', 'admin', SYSDATE(), '', NULL, '浼佷笟寰俊浼佷笟ID'),
 ('浼佷笟寰俊CorpSecret', 'qy_wechat.corp_secret', '2MCilqWYC0FWjOQ894sbb-s7Lb5sVH4HHuJgOsd9l1k', 'N', 'admin', SYSDATE(), '', NULL, '浼佷笟寰俊搴旂敤瀵嗛挜'),
-('浼佷笟寰俊AgentId', 'qy_wechat.agent_id', '1000002', 'N', 'admin', SYSDATE(), '', NULL, '浼佷笟寰俊搴旂敤AgentId');
+('浼佷笟寰俊AgentId', 'qy_wechat.agent_id', '21', 'N', 'admin', SYSDATE(), '', NULL, '浼佷笟寰俊搴旂敤AgentId');
 
 COMMIT;
\ No newline at end of file

--
Gitblit v1.9.1