Commit 1606feb14d752412ee8f859e162f9f664d6f14f8

Authored by 王彪总
1 parent fe91978f

feat(garden): 新增任务距离排序和智能排序功能

- 实现任务按距离排序和班组进度统计功能
- 添加任务智能排序(距离+个人效率加权)功能
- 新增GPS距离计算工具类和相关数据传输对象
- 添加出行速度配置和智能排序权重配置字典类型
- 实现用户任务效率预计算定时任务
- 优化API签名切面注解使用方式
- 添加微信公众号开放平台回调接口免登录配置
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java
... ... @@ -449,6 +449,13 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{
449 449  
450 450 // 4. 组装返回结果
451 451 TaskDistanceSortResultVO result = new TaskDistanceSortResultVO();
  452 + sortedTasks.sort((a, b) -> {
  453 + Integer da = a.getDistance(), db = b.getDistance();
  454 + if (da == null && db == null) return 0;
  455 + if (da == null) return 1;
  456 + if (db == null) return -1;
  457 + return da.compareTo(db);
  458 + });
452 459 result.setSortedTasks(sortedTasks);
453 460 result.setTeamProgress(teamProgress);
454 461 result.setTotalPendingTasks(sortedTasks.size());
... ... @@ -585,6 +592,17 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{
585 592 remaining.remove(nearestIndex);
586 593 }
587 594  
  595 + // 重算 distance 为到用户当前位置的直线距离(非 NN 路径距离)
  596 + double userLat = req.getCurrentLat().doubleValue();
  597 + double userLon = req.getCurrentLon().doubleValue();
  598 + for (TaskDistanceSortRespVO t : sortedTasks) {
  599 + int d = (int) Math.round(GpsDistanceUtil.haversineDistance(userLat, userLon,
  600 + t.getTaskLat().doubleValue(), t.getTaskLon().doubleValue()));
  601 + t.setDistance(d);
  602 + t.setEstimatedWalkingMinutes((int) Math.ceil(d / walkingSpeedMperMin));
  603 + t.setEstimatedTricycleMinutes((int) Math.ceil(d / tricycleSpeedMperMin));
  604 + }
  605 +
588 606 // 无 GPS 任务追加到末尾
589 607 if (CollectionUtils.isNotEmpty(tasksWithoutGps)) {
590 608 for (TaskDistanceSortRespVO task : tasksWithoutGps) {
... ... @@ -649,7 +667,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{
649 667 List<TaskDistanceSortRespVO> sortedTasks = queryCompletedTasksWithoutGps(userId);
650 668 TeamProgressVO teamProgress = buildTeamProgress(userId, deptId);
651 669 TaskDistanceSortResultVO result = new TaskDistanceSortResultVO();
652   - result.setSortedTasks(sortedTasks);
  670 + sortedTasks.sort((a, b) -> {
  671 + Integer da = a.getDistance(), db = b.getDistance();
  672 + if (da == null && db == null) return 0;
  673 + if (da == null) return 1;
  674 + if (db == null) return -1;
  675 + return da.compareTo(db);
  676 + });
  677 + result.setSortedTasks(sortedTasks);
653 678 result.setTeamProgress(teamProgress);
654 679 result.setTotalPendingTasks(sortedTasks.size());
655 680 Log.info("返回App参数: " + JSON.toJSONString(result));
... ... @@ -749,6 +774,13 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{
749 774  
750 775 // 7. 组装结果
751 776 TaskDistanceSortResultVO result = new TaskDistanceSortResultVO();
  777 + sortedTasks.sort((a, b) -> {
  778 + Integer da = a.getDistance(), db = b.getDistance();
  779 + if (da == null && db == null) return 0;
  780 + if (da == null) return 1;
  781 + if (db == null) return -1;
  782 + return da.compareTo(db);
  783 + });
752 784 result.setSortedTasks(sortedTasks);
753 785 result.setTeamProgress(teamProgress);
754 786 result.setTotalPendingTasks(sortedTasks.size());
... ...
urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml
... ... @@ -647,6 +647,7 @@
647 647 <foreach collection='roleIds' item='roleId' open='(' close=')' separator=','>
648 648 #{roleId}
649 649 </foreach>
  650 + AND NOT EXISTS (SELECT 1 FROM garden_inspection_plan_commit ic WHERE ic.batch_no = a.batch_no AND ic.user_id = #{userId})
650 651 AND r.starting_latitude IS NOT NULL AND r.starting_latitude != ''
651 652  
652 653 UNION ALL
... ... @@ -676,6 +677,7 @@
676 677 <foreach collection='roleIds' item='roleId' open='(' close=')' separator=','>
677 678 #{roleId}
678 679 </foreach>
  680 + AND NOT EXISTS (SELECT 1 FROM garden_maintain_plan_commit mc WHERE mc.batch_no = a.batch_no AND mc.user_id = #{userId})
679 681 AND r.starting_latitude IS NOT NULL AND r.starting_latitude != ''
680 682 ) t
681 683 </select>
... ...