From f7fcb204d96745b842137441373d15cabeafc87a Mon Sep 17 00:00:00 2001 From: 王彪总 Date: Fri, 10 Jul 2026 17:13:32 +0800 Subject: [PATCH] feat(garden): 新增任务距离排序和智能排序功能 --- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/TaskEfficiencyCalculateJob.java | 27 ++++++++++++++++++++++++--- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java | 1 + urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/GpsDistanceUtil.java | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/TaskEfficiencyCalculateJob.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/TaskEfficiencyCalculateJob.java index df6d5dc..c106657 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/TaskEfficiencyCalculateJob.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/TaskEfficiencyCalculateJob.java @@ -6,6 +6,7 @@ import com.zteits.urbanops.module.garden.dal.mysql.UserTaskEfficiencyMapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; @@ -28,6 +29,7 @@ public class TaskEfficiencyCalculateJob implements JobHandler { private UserTaskEfficiencyMapper userTaskEfficiencyMapper; @Override + @Transactional(rollbackFor = Exception.class) public String execute(String param) { String statPeriod = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM")); log.info("TaskEfficiencyCalculateJob start, statPeriod={}", statPeriod); @@ -67,8 +69,8 @@ public class TaskEfficiencyCalculateJob implements JobHandler { e.setUpdater("job"); e.setCreateTime(now); e.setUpdateTime(now); - userTaskEfficiencyMapper.insert(e); } + userTaskEfficiencyMapper.insertBatch(all); log.info("TaskEfficiencyCalculateJob done, total={}", all.size()); return "success, total=" + all.size(); @@ -155,8 +157,27 @@ public class TaskEfficiencyCalculateJob implements JobHandler { s.setAvgMinutes(totalCnt > 0 ? BigDecimal.valueOf(totalMin).divide(BigDecimal.valueOf(totalCnt), 2, RoundingMode.HALF_UP) : BigDecimal.ZERO); - s.setTeamAvgMinutes(group.get(0).getTeamAvgMinutes()); - s.setEfficiencyRatio(calcRatio(s.getAvgMinutes(), s.getTeamAvgMinutes())); + // 大类汇总:按 completed_count 加权计算 teamAvg 和 efficiencyRatio + long teamTotalMin = 0; + int teamTotalCnt = 0; + BigDecimal weightedRatio = BigDecimal.ZERO; + int ratioWeight = 0; + for (UserTaskEfficiencyDO e : group) { + if (e.getCompletedCount() > 0 && e.getEfficiencyRatio() != null) { + weightedRatio = weightedRatio.add( + e.getEfficiencyRatio().multiply(BigDecimal.valueOf(e.getCompletedCount()))); + ratioWeight += e.getCompletedCount(); + } + teamTotalMin += e.getTeamAvgMinutes() != null + ? e.getTeamAvgMinutes().multiply(BigDecimal.valueOf(e.getCompletedCount())).longValue() : 0; + teamTotalCnt += e.getCompletedCount() != null ? e.getCompletedCount() : 0; + } + s.setTeamAvgMinutes(teamTotalCnt > 0 + ? BigDecimal.valueOf(teamTotalMin).divide(BigDecimal.valueOf(teamTotalCnt), 2, RoundingMode.HALF_UP) + : BigDecimal.ZERO); + s.setEfficiencyRatio(ratioWeight > 0 + ? weightedRatio.divide(BigDecimal.valueOf(ratioWeight), 4, RoundingMode.HALF_UP) + : BigDecimal.ONE); summaries.add(s); } return summaries; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java index 75a239b..74af2b4 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java @@ -599,6 +599,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ int d = (int) Math.round(GpsDistanceUtil.haversineDistance(userLat, userLon, t.getTaskLat().doubleValue(), t.getTaskLon().doubleValue())); t.setDistance(d); + t.setCumulativeDistance(null); t.setEstimatedWalkingMinutes((int) Math.ceil(d / walkingSpeedMperMin)); t.setEstimatedTricycleMinutes((int) Math.ceil(d / tricycleSpeedMperMin)); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/GpsDistanceUtil.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/GpsDistanceUtil.java index 2dde886..710b44a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/GpsDistanceUtil.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/GpsDistanceUtil.java @@ -26,6 +26,7 @@ public class GpsDistanceUtil { double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); + a = Math.min(1.0, a); // 防止浮点精度导致 a > 1 产生 NaN double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return EARTH_RADIUS_M * c; } -- libgit2 0.21.4