Commit 1606feb14d752412ee8f859e162f9f664d6f14f8
1 parent
fe91978f
feat(garden): 新增任务距离排序和智能排序功能
- 实现任务按距离排序和班组进度统计功能 - 添加任务智能排序(距离+个人效率加权)功能 - 新增GPS距离计算工具类和相关数据传输对象 - 添加出行速度配置和智能排序权重配置字典类型 - 实现用户任务效率预计算定时任务 - 优化API签名切面注解使用方式 - 添加微信公众号开放平台回调接口免登录配置
Showing
2 changed files
with
35 additions
and
1 deletions
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,6 +449,13 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 449 | 449 | ||
| 450 | // 4. 组装返回结果 | 450 | // 4. 组装返回结果 |
| 451 | TaskDistanceSortResultVO result = new TaskDistanceSortResultVO(); | 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 | result.setSortedTasks(sortedTasks); | 459 | result.setSortedTasks(sortedTasks); |
| 453 | result.setTeamProgress(teamProgress); | 460 | result.setTeamProgress(teamProgress); |
| 454 | result.setTotalPendingTasks(sortedTasks.size()); | 461 | result.setTotalPendingTasks(sortedTasks.size()); |
| @@ -585,6 +592,17 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -585,6 +592,17 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 585 | remaining.remove(nearestIndex); | 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 | // 无 GPS 任务追加到末尾 | 606 | // 无 GPS 任务追加到末尾 |
| 589 | if (CollectionUtils.isNotEmpty(tasksWithoutGps)) { | 607 | if (CollectionUtils.isNotEmpty(tasksWithoutGps)) { |
| 590 | for (TaskDistanceSortRespVO task : tasksWithoutGps) { | 608 | for (TaskDistanceSortRespVO task : tasksWithoutGps) { |
| @@ -649,7 +667,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -649,7 +667,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 649 | List<TaskDistanceSortRespVO> sortedTasks = queryCompletedTasksWithoutGps(userId); | 667 | List<TaskDistanceSortRespVO> sortedTasks = queryCompletedTasksWithoutGps(userId); |
| 650 | TeamProgressVO teamProgress = buildTeamProgress(userId, deptId); | 668 | TeamProgressVO teamProgress = buildTeamProgress(userId, deptId); |
| 651 | TaskDistanceSortResultVO result = new TaskDistanceSortResultVO(); | 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 | result.setTeamProgress(teamProgress); | 678 | result.setTeamProgress(teamProgress); |
| 654 | result.setTotalPendingTasks(sortedTasks.size()); | 679 | result.setTotalPendingTasks(sortedTasks.size()); |
| 655 | Log.info("返回App参数: " + JSON.toJSONString(result)); | 680 | Log.info("返回App参数: " + JSON.toJSONString(result)); |
| @@ -749,6 +774,13 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -749,6 +774,13 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 749 | 774 | ||
| 750 | // 7. 组装结果 | 775 | // 7. 组装结果 |
| 751 | TaskDistanceSortResultVO result = new TaskDistanceSortResultVO(); | 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 | result.setSortedTasks(sortedTasks); | 784 | result.setSortedTasks(sortedTasks); |
| 753 | result.setTeamProgress(teamProgress); | 785 | result.setTeamProgress(teamProgress); |
| 754 | result.setTotalPendingTasks(sortedTasks.size()); | 786 | result.setTotalPendingTasks(sortedTasks.size()); |
urbanops-module-garden/src/main/resources/mapper/homepage/HomepageSummaryMapper.xml
| @@ -647,6 +647,7 @@ | @@ -647,6 +647,7 @@ | ||
| 647 | <foreach collection='roleIds' item='roleId' open='(' close=')' separator=','> | 647 | <foreach collection='roleIds' item='roleId' open='(' close=')' separator=','> |
| 648 | #{roleId} | 648 | #{roleId} |
| 649 | </foreach> | 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 | AND r.starting_latitude IS NOT NULL AND r.starting_latitude != '' | 651 | AND r.starting_latitude IS NOT NULL AND r.starting_latitude != '' |
| 651 | 652 | ||
| 652 | UNION ALL | 653 | UNION ALL |
| @@ -676,6 +677,7 @@ | @@ -676,6 +677,7 @@ | ||
| 676 | <foreach collection='roleIds' item='roleId' open='(' close=')' separator=','> | 677 | <foreach collection='roleIds' item='roleId' open='(' close=')' separator=','> |
| 677 | #{roleId} | 678 | #{roleId} |
| 678 | </foreach> | 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 | AND r.starting_latitude IS NOT NULL AND r.starting_latitude != '' | 681 | AND r.starting_latitude IS NOT NULL AND r.starting_latitude != '' |
| 680 | ) t | 682 | ) t |
| 681 | </select> | 683 | </select> |