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/VehicleMileageStatsServiceImpl.java | 83 ++++++++++++++++++++++++++---------------
1 files changed, 53 insertions(+), 30 deletions(-)
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("娌℃湁鎵惧埌娲昏穬杞﹁締");
--
Gitblit v1.9.1