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 | 315 +++++++++++++++++++++++++++-------------------------
1 files changed, 165 insertions(+), 150 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 f795378..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,11 +4,15 @@
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;
import java.util.List;
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;
@@ -112,21 +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());
// 3. 鏌ヨ杞﹁締鍦ㄨ鏃ユ湡鐨勪换鍔℃椂闂村尯闂�
List<TaskTimeInterval> taskIntervals = vehicleMileageStatsMapper.selectTaskTimeIntervals(vehicleId, dayStart, dayEnd);
-
- // 4. 璁$畻閲岀▼
- MileageCalculation calculation = calculateMileage(gpsList, taskIntervals);
-
+// 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());
+
+ 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);
// 5. 鏌ヨ鎴栧垱寤虹粺璁¤褰�
VehicleMileageStats stats = vehicleMileageStatsMapper.selectByVehicleIdAndDate(vehicleId, statDate);
boolean isNew = (stats == null);
@@ -155,8 +172,11 @@
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, 鍗犳瘮: {}",
+// vehicleId, statDate, calculation.totalMileage, taskDistance, calculation.nonTaskMileage, calculation.taskRatio);
// 7. 淇濆瓨鍒版暟鎹簱
if (isNew) {
@@ -164,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());
}
}
@@ -188,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("娌℃湁鎵惧埌娲昏穬杞﹁締");
@@ -207,7 +229,7 @@
}
}
- logger.info("鎵归噺閲岀▼缁熻瀹屾垚 - 鏃ユ湡: {}, 鎬昏溅杈嗘暟: {}, 鎴愬姛: {}", statDate, vehicleIds.size(), successCount);
+// logger.info("鎵归噺閲岀▼缁熻瀹屾垚 - 鏃ユ湡: {}, 鎬昏溅杈嗘暟: {}, 鎴愬姛: {}", statDate, vehicleIds.size(), successCount);
return successCount;
} catch (Exception e) {
@@ -216,10 +238,23 @@
}
}
+
+
+ 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);
+
+ }
/**
* 璁$畻閲岀▼鐨勫唴閮ㄦ柟娉�
*/
- private MileageCalculation calculateMileage(List<VehicleGps> gpsList, List<TaskTimeInterval> taskIntervals) {
+ private MileageCalculation calculateMileage(List<VehicleGps> gpsList, BigDecimal taskDistance) {
MileageCalculation result = new MileageCalculation();
// 閬嶅巻GPS鐐癸紝璁$畻鐩搁偦鐐逛箣闂寸殑璺濈
@@ -234,23 +269,12 @@
p2.getLatitude().doubleValue(),
p2.getLongitude().doubleValue()
);
-
- // 鑾峰彇杩欐璺濈鐨勬椂闂村尯闂�
- Date segmentStart = parseDateTime(p1.getCollectTime());
- Date segmentEnd = parseDateTime(p2.getCollectTime());
-
- // 璁$畻杩欐璺濈鍦ㄤ换鍔℃椂娈电殑鍗犳瘮
- double taskRatio = calculateTaskOverlapRatio(segmentStart, segmentEnd, taskIntervals);
-
- // 鍒嗘憡閲岀▼
- double taskDistance = distance * taskRatio;
- double nonTaskDistance = distance * (1 - taskRatio);
-
+
result.totalMileage = result.totalMileage.add(BigDecimal.valueOf(distance));
- result.taskMileage = result.taskMileage.add(BigDecimal.valueOf(taskDistance));
- result.nonTaskMileage = result.nonTaskMileage.add(BigDecimal.valueOf(nonTaskDistance));
}
-
+
+ result.taskMileage=taskDistance;
+ result.nonTaskMileage=result.totalMileage.subtract(result.taskMileage);
// 璁$畻浠诲姟閲岀▼鍗犳瘮
if (result.totalMileage.compareTo(BigDecimal.ZERO) > 0) {
result.taskRatio = result.taskMileage.divide(result.totalMileage, 4, RoundingMode.HALF_UP);
@@ -299,32 +323,95 @@
return EARTH_RADIUS_KM * c;
}
+ //璁$畻浠诲姟鏃堕棿娈靛唴鐨勯噷绋嬶紝搴旇鎷垮埌璇ヤ换鍔″湪宸ヤ綔鏃堕棿娈甸噷鐨勫垎娈佃窛绂荤劧鍚庣浉鍔�
+ private List<VehicleGpsSegmentMileage> getTaskDistanceMileage(Long vehicleId, Date segmentStart, Date segmentEnd) {
+ List<VehicleGpsSegmentMileage> mileages = segmentMileageMapper.selectSegmentsByDateRange(vehicleId, segmentStart, segmentEnd);
+ return mileages != null ? mileages : new ArrayList<>();
+ }
+
/**
- * 璁$畻鏃堕棿娈典笌浠诲姟鏃舵鐨勯噸鍙犳瘮渚�
+ * 璁$畻鍦ㄤ换鍔℃椂闂存鍐呯殑瀹為檯浠诲姟閲岀▼
+ * 閫氳繃妫�鏌ュ垎娈甸噷绋嬫暟鎹槸鍚︿笌浠诲姟鏃堕棿娈甸噸鍙狅紝绱姞杩欎簺閲嶅彔鍒嗘鐨勫疄闄呴噷绋�
+ *
+ * @param taskTimeIntervals 浠诲姟鏃堕棿娈靛垪琛�
+ * @param segmentMileages 鍒嗘閲岀▼鏁版嵁鍒楄〃
+ * @return 鍦ㄤ换鍔℃椂闂存鍐呯殑鎬婚噷绋�
*/
- private double calculateTaskOverlapRatio(Date segmentStart, Date segmentEnd, List<TaskTimeInterval> taskIntervals) {
- if (taskIntervals == null || taskIntervals.isEmpty()) {
- return 0.0;
+ private BigDecimal getTaskDistance(List<TaskTimeInterval> taskTimeIntervals, List<VehicleGpsSegmentMileage> segmentMileages) {
+ if (taskTimeIntervals == null || taskTimeIntervals.isEmpty() ||
+ segmentMileages == null || segmentMileages.isEmpty()) {
+ return BigDecimal.ZERO;
}
- long segmentDuration = segmentEnd.getTime() - segmentStart.getTime();
- if (segmentDuration <= 0) {
- return 0.0;
- }
+ BigDecimal totalTaskDistance = BigDecimal.ZERO;
- long totalOverlap = 0;
-
- for (TaskTimeInterval task : taskIntervals) {
- // 璁$畻閲嶅彔鏃堕棿
- long overlapStart = Math.max(segmentStart.getTime(), task.getStartTime().getTime());
- long overlapEnd = Math.min(segmentEnd.getTime(), task.getEndTime().getTime());
+ // 閬嶅巻鎵�鏈夊垎娈甸噷绋嬫暟鎹�
+ for (VehicleGpsSegmentMileage segment : segmentMileages) {
+ // 鍙鐞嗘湁鍏宠仈浠诲姟ID涓旀湁璺濈鏁版嵁鐨勫垎娈�
+// if (segment.getTaskId() == null || segment.getSegmentDistance() == null) {
+// continue;
+// }
+
+ // 妫�鏌ヨ鍒嗘鏄惁涓庝换浣曚换鍔℃椂闂存閲嶅彔
+ Date segmentStart = segment.getSegmentStartTime();
+ Date segmentEnd = segment.getSegmentEndTime();
- if (overlapEnd > overlapStart) {
- totalOverlap += (overlapEnd - overlapStart);
+ boolean isInTaskPeriod = false;
+ for (TaskTimeInterval taskInterval : taskTimeIntervals) {
+ // 璁$畻鏃堕棿閲嶅彔 --浠诲姟鏃堕棿娈�
+ long overlapStart = Math.max(segmentStart.getTime(), taskInterval.getStartTime().getTime());
+ long overlapEnd = Math.min(segmentEnd.getTime(), taskInterval.getEndTime().getTime());
+
+ // 濡傛灉鏈夋椂闂撮噸鍙狅紝鍒欒鍒嗘灞炰簬浠诲姟閲岀▼
+ if (overlapEnd > overlapStart) {
+ isInTaskPeriod = true;
+ break;
+ }
+ }
+
+ // 濡傛灉鍒嗘鍦ㄤ换鍔℃椂闂存鍐咃紝鍒欑疮鍔犲叾閲岀▼
+ if (isInTaskPeriod) {
+ totalTaskDistance = totalTaskDistance.add(segment.getSegmentDistance());
}
}
- return (double) totalOverlap / segmentDuration;
+ return totalTaskDistance;
+ }
+ /**
+ * 璁$畻鎸囧畾鏃堕棿娈靛唴鐨勫疄闄呬换鍔¢噷绋�
+ * 閫氳繃鏌ユ壘涓庤鏃堕棿娈甸噸鍙犵殑浠诲姟锛屽苟绱姞杩欎簺浠诲姟鍦ㄨ鏃堕棿娈靛唴鐨勫疄闄呴噷绋�
+ */
+ private double calculateActualTaskMileage(Date segmentStart, Date segmentEnd, List<VehicleGpsSegmentMileage> segmentMileages) {
+ if (segmentMileages == null || segmentMileages.isEmpty()) {
+ return 0.0;
+ }
+
+ double totalTaskMileage = 0.0;
+
+ // 閬嶅巻鎵�鏈夊垎娈甸噷绋嬫暟鎹紝鎵惧嚭涓庢寚瀹氭椂闂存閲嶅彔涓旀湁鍏宠仈浠诲姟鐨勫垎娈�
+ for (VehicleGpsSegmentMileage segment : segmentMileages) {
+ // 鍙鐞嗘湁鍏宠仈浠诲姟鐨勫垎娈�
+ if (segment.getTaskId() == null) {
+ continue;
+ }
+
+ // 妫�鏌ュ垎娈垫椂闂翠笌鎸囧畾鏃堕棿娈垫槸鍚︽湁閲嶅彔
+ Date segStart = segment.getSegmentStartTime();
+ Date segEnd = segment.getSegmentEndTime();
+
+ // 璁$畻閲嶅彔鏃堕棿
+ long overlapStart = Math.max(segmentStart.getTime(), segStart.getTime());
+ long overlapEnd = Math.min(segmentEnd.getTime(), segEnd.getTime());
+
+ // 濡傛灉鏈夋椂闂撮噸鍙狅紝鍒欏皢璇ュ垎娈电殑璺濈鍔犲叆浠诲姟閲岀▼
+ if (overlapEnd > overlapStart) {
+ if (segment.getSegmentDistance() != null) {
+ totalTaskMileage += segment.getSegmentDistance().doubleValue();
+ }
+ }
+ }
+
+ return totalTaskMileage;
}
/**
@@ -383,102 +470,28 @@
logger.info("杞﹁締ID: {} 鍦ㄦ棩鏈�: {} 鏃犲垎娈甸噷绋嬫暟鎹�", vehicleId, statDate);
return null;
}
+
+ List<TaskTimeInterval> taskIntervals = vehicleMileageStatsMapper.selectTaskTimeIntervals(vehicleId, dayStart, dayEnd);
+ 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() : 0;
+ BigDecimal taskDistance = getTaskDistance(taskIntervals, mileages);
+ BigDecimal totalDistance = calculateTotalMileage(segments);
+ BigDecimal nonTaskDistance = totalDistance.subtract(taskDistance);
- // 3. 姹囨�婚噷绋嬫暟鎹�
- BigDecimal totalMileage = BigDecimal.ZERO;
- int totalGpsPoints = 0;
-
- for (VehicleGpsSegmentMileage segment : segments) {
- if (segment.getSegmentDistance() != null) {
- totalMileage = totalMileage.add(segment.getSegmentDistance());
- }
- if (segment.getGpsPointCount() != null) {
- totalGpsPoints += segment.getGpsPointCount();
- }
- }
-
- // 4. 璁$畻浠诲姟閲岀▼鍜岄潪浠诲姟閲岀▼锛堜紭鍖栵細浼樺厛浣跨敤task_id鐩存帴鑱氬悎锛�
- BigDecimal taskMileage = BigDecimal.ZERO;
- BigDecimal nonTaskMileage = BigDecimal.ZERO;
- int taskCount = 0; // 浠诲姟鏁伴噺
-
- // 4.1 缁熻鏈塼ask_id鐨勫垎娈垫暟閲�
- int segmentsWithTask = 0;
- for (VehicleGpsSegmentMileage segment : segments) {
- if (segment.getTaskId() != null) {
- segmentsWithTask++;
- }
- }
-
- // 4.2 濡傛灉澶ч儴鍒嗗垎娈甸兘鏈塼ask_id锛屼娇鐢ㄤ紭鍖栨柟妗堬紙鐩存帴鎸塼ask_id鑱氬悎锛�
- if (segmentsWithTask > segments.size() * 0.8) {
- logger.debug("杞﹁締ID: {} 鏃ユ湡: {} 浣跨敤浼樺寲鏂规锛氱洿鎺ユ寜task_id鑱氬悎锛坽}涓垎娈垫湁task_id锛屽崰姣攞}%锛�",
- vehicleId, statDate, segmentsWithTask, (segmentsWithTask * 100.0 / segments.size()));
-
- // 浣跨敤Set缁熻鍘婚噸鐨勪换鍔D鏁伴噺
- Set<Long> uniqueTaskIds = new HashSet<>();
-
- // 鐩存帴鎸塼ask_id鍒嗙粍鑱氬悎
- for (VehicleGpsSegmentMileage segment : segments) {
- BigDecimal segDistance = segment.getSegmentDistance() != null ? segment.getSegmentDistance() : BigDecimal.ZERO;
-
- if (segment.getTaskId() != null) {
- // 鏈変换鍔D锛岃鍏ヤ换鍔¢噷绋�
- taskMileage = taskMileage.add(segDistance);
- uniqueTaskIds.add(segment.getTaskId());
- } else {
- // 娌℃湁浠诲姟ID锛岃鍏ラ潪浠诲姟閲岀▼
- nonTaskMileage = nonTaskMileage.add(segDistance);
- }
- }
-
- // 璁剧疆鍘婚噸鍚庣殑浠诲姟鏁伴噺
- taskCount = uniqueTaskIds.size();
-
- } else {
- // 4.3 闄嶇骇鏂规锛氫娇鐢ㄥ師鏈夌殑鏃堕棿閲嶅彔璁$畻鏂瑰紡
- logger.debug("杞﹁締ID: {} 鏃ユ湡: {} 浣跨敤闄嶇骇鏂规锛氭椂闂撮噸鍙犺绠楋紙鍙湁{}涓垎娈垫湁task_id锛屽崰姣攞}%锛�",
- vehicleId, statDate, segmentsWithTask, (segmentsWithTask * 100.0 / segments.size()));
-
- List<TaskTimeInterval> taskIntervals = vehicleMileageStatsMapper.selectTaskTimeIntervals(vehicleId, dayStart, dayEnd);
-
- for (VehicleGpsSegmentMileage segment : segments) {
- Date segStart = segment.getSegmentStartTime();
- Date segEnd = segment.getSegmentEndTime();
- BigDecimal segDistance = segment.getSegmentDistance() != null ? segment.getSegmentDistance() : BigDecimal.ZERO;
-
- // 璁$畻璇ュ垎娈典笌浠诲姟鏃舵鐨勯噸鍙犳瘮渚�
- double taskRatio = calculateTaskOverlapRatio(segStart, segEnd, taskIntervals);
-
- // 鍒嗘憡閲岀▼
- BigDecimal taskDist = segDistance.multiply(BigDecimal.valueOf(taskRatio));
- BigDecimal nonTaskDist = segDistance.multiply(BigDecimal.valueOf(1 - taskRatio));
-
- taskMileage = taskMileage.add(taskDist);
- nonTaskMileage = nonTaskMileage.add(nonTaskDist);
- }
-
- // 璁剧疆浠诲姟鏁伴噺
- taskCount = taskIntervals == null ? 0 : taskIntervals.size();
- }
-
- // 璁$畻浠诲姟閲岀▼鍗犳瘮
+ // 闃叉闄ら浂閿欒
BigDecimal taskRatio = BigDecimal.ZERO;
- if (totalMileage.compareTo(BigDecimal.ZERO) > 0) {
- taskRatio = taskMileage.divide(totalMileage, 4, RoundingMode.HALF_UP);
-
- // 鏁版嵁鏍¢獙:鍗犳瘮搴斿湪0-1涔嬮棿,濡傛灉瓒呭嚭璇存槑鏁版嵁寮傚父
- if (taskRatio.compareTo(BigDecimal.ONE) > 0) {
- logger.warn("杞﹁締ID: {} 鏃ユ湡: {} 浠诲姟閲岀▼鍗犳瘮寮傚父: {} (浠诲姟閲岀▼:{}, 鎬婚噷绋�:{}), 寮哄埗璁句负1.0",
- vehicleId, statDate, taskRatio, taskMileage, totalMileage);
- taskRatio = BigDecimal.ONE;
- } else if (taskRatio.compareTo(BigDecimal.ZERO) < 0) {
- logger.warn("杞﹁締ID: {} 鏃ユ湡: {} 浠诲姟閲岀▼鍗犳瘮涓鸿礋: {}, 寮哄埗璁句负0",
- vehicleId, statDate, taskRatio);
- taskRatio = BigDecimal.ZERO;
- }
+ if (totalDistance != null && totalDistance.compareTo(BigDecimal.ZERO) > 0) {
+ taskRatio = taskDistance.divide(totalDistance, 4, RoundingMode.HALF_UP);
}
-
+ // 3. 姹囨�婚噷绋嬫暟鎹�
+
+
// 5. 鏌ヨ鎴栧垱寤虹粺璁¤褰�
VehicleMileageStats stats = vehicleMileageStatsMapper.selectByVehicleIdAndDate(vehicleId, statDate);
boolean isNew = (stats == null);
@@ -503,9 +516,9 @@
}
// 6. 璁剧疆缁熻鏁版嵁
- stats.setTotalMileage(totalMileage.setScale(2, RoundingMode.HALF_UP));
- stats.setTaskMileage(taskMileage.setScale(2, RoundingMode.HALF_UP));
- stats.setNonTaskMileage(nonTaskMileage.setScale(2, RoundingMode.HALF_UP));
+ stats.setTotalMileage(totalDistance.setScale(2, RoundingMode.HALF_UP));
+ stats.setTaskMileage(taskDistance.setScale(2, RoundingMode.HALF_UP));
+ stats.setNonTaskMileage(nonTaskDistance.setScale(2, RoundingMode.HALF_UP));
stats.setTaskRatio(taskRatio);
stats.setGpsPointCount(totalGpsPoints);
stats.setTaskCount(taskCount);
@@ -519,8 +532,8 @@
vehicleMileageStatsMapper.updateVehicleMileageStats(stats);
}
- logger.info("杞﹁締ID: {} 鏃ユ湡: {} 浠庡垎娈垫眹鎬诲畬鎴� - 鎬婚噷绋�: {}km, 浠诲姟閲岀▼: {}km, 闈炰换鍔¢噷绋�: {}km, 鍒嗘鏁�: {}",
- vehicleId, statDate, totalMileage, taskMileage, nonTaskMileage, segments.size());
+// logger.info("杞﹁締ID: {} 鏃ユ湡: {} 浠庡垎娈垫眹鎬诲畬鎴� - 鎬婚噷绋�: {}km, 浠诲姟閲岀▼: {}km, 闈炰换鍔¢噷绋�: {}km, 鍒嗘鏁�: {}",
+// vehicleId, statDate, totalMileage, taskMileage, nonTaskMileage, segments.size());
return stats;
@@ -541,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