Commit 5bbdadb9b7cec227a5cebef1b1ab5ab01520a9be
1 parent
285d3e4e
feat(garden): 添加个人历史完成率配置和个人任务效率统计功能
- 在DictTypeConstants中新增COMPLETION_RATE_CONFIG字典类型用于个人历史完成率配置 - 在TaskDistanceSortRespVO中添加historyCompletionRate字段用于存储个人历史完成率 - 在UserTaskEfficiencyDO中添加historyCompletionRate字段用于存储个人历史完成率 - 在HomepageSummaryServiceImpl的多个方法中加载效率数据并设置个人历史完成率 - 在TaskEfficiencyCalculateJob中实现个人历史完成率计算逻辑 - 在UserTaskEfficiencyMapper中添加statHistoryTotalCount查询方法 - 在MyBatis映射文件中添加统计用户6个月历史任务总量的SQL - 在RoadApiImpl中为getRoadInfoById方法禁用数据权限注解 - 将应用环境配置从dev切换到prod模式
Showing
9 changed files
with
94 additions
and
11 deletions
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/api/road/RoadApiImpl.java
| ... | ... | @@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil; |
| 5 | 5 | import com.alibaba.fastjson.JSON; |
| 6 | 6 | import com.zteits.urbanops.framework.common.util.http.HttpUtils; |
| 7 | 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 8 | +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; | |
| 8 | 9 | import com.zteits.urbanops.module.garden.controller.admin.road.vo.RoadRespVO; |
| 9 | 10 | import com.zteits.urbanops.module.garden.dto.road.RoadReqDTO; |
| 10 | 11 | import com.zteits.urbanops.module.garden.dto.road.RoadRespDTO; |
| ... | ... | @@ -69,6 +70,7 @@ public class RoadApiImpl implements RoadApi { |
| 69 | 70 | } |
| 70 | 71 | |
| 71 | 72 | @Override |
| 73 | + @DataPermission(enable = false) | |
| 72 | 74 | public RoadStreetRespDTO getRoadInfoById(String id) { |
| 73 | 75 | RoadRespVO roadRespVO = roadService.getUniqueRoad(Long.parseLong(id)); |
| 74 | 76 | if(null == roadRespVO){ | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/homepage/vo/TaskDistanceSortRespVO.java
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/UserTaskEfficiencyDO.java
| ... | ... | @@ -53,6 +53,9 @@ public class UserTaskEfficiencyDO extends BaseDO { |
| 53 | 53 | /** 效率比 = teamAvg / userAvg */ |
| 54 | 54 | private BigDecimal efficiencyRatio; |
| 55 | 55 | |
| 56 | + /** 个人历史完成率 = 6个月内已完成 / 6个月内总任务数 */ | |
| 57 | + private BigDecimal historyCompletionRate; | |
| 58 | + | |
| 56 | 59 | /** 统计周期 yyyy-MM */ |
| 57 | 60 | private String statPeriod; |
| 58 | 61 | } | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/mysql/UserTaskEfficiencyMapper.java
| ... | ... | @@ -40,4 +40,7 @@ public interface UserTaskEfficiencyMapper extends BaseMapperX<UserTaskEfficiency |
| 40 | 40 | |
| 41 | 41 | /** 工单效率统计 */ |
| 42 | 42 | List<Map<String, Object>> statWorkOrderEfficiency(@Param("beginTime") String beginTime); |
| 43 | + | |
| 44 | + /** 从 task_statistics 汇总用户 6 个月历史任务总量 */ | |
| 45 | + List<Map<String, Object>> statHistoryTotalCount(@Param("beginDate") String beginDate); | |
| 43 | 46 | } | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/job/TaskEfficiencyCalculateJob.java
| ... | ... | @@ -39,6 +39,7 @@ public class TaskEfficiencyCalculateJob implements JobHandler { |
| 39 | 39 | |
| 40 | 40 | // 2. 6个月窗口 |
| 41 | 41 | String beginTime = LocalDate.now().minusMonths(6).withDayOfMonth(1) + " 00:00:00"; |
| 42 | + String beginDate = LocalDate.now().minusMonths(6).withDayOfMonth(1).toString(); | |
| 42 | 43 | |
| 43 | 44 | // 3. 三类任务分别统计 |
| 44 | 45 | List<UserTaskEfficiencyDO> all = new ArrayList<>(); |
| ... | ... | @@ -59,6 +60,19 @@ public class TaskEfficiencyCalculateJob implements JobHandler { |
| 59 | 60 | e.setEfficiencyRatio(calcRatio(e.getAvgMinutes(), e.getTeamAvgMinutes())); |
| 60 | 61 | } |
| 61 | 62 | |
| 63 | + // 5.5 计算个人历史完成率 | |
| 64 | + Map<Long, Map<String, Object>> historyMap = loadHistoryTotalMap(beginDate); | |
| 65 | + for (UserTaskEfficiencyDO e : all) { | |
| 66 | + Map<String, Object> h = historyMap.get(e.getUserId()); | |
| 67 | + if (h != null) { | |
| 68 | + long total = toLong(h.get("history_total")); | |
| 69 | + long completed = toLong(h.get("history_completed")); | |
| 70 | + e.setHistoryCompletionRate(total > 0 | |
| 71 | + ? BigDecimal.valueOf(completed).divide(BigDecimal.valueOf(total), 4, RoundingMode.HALF_UP) | |
| 72 | + : BigDecimal.ZERO); | |
| 73 | + } | |
| 74 | + } | |
| 75 | + | |
| 62 | 76 | // 6. 生成大类汇总(ALL) |
| 63 | 77 | all.addAll(buildCategorySummary(all, statPeriod)); |
| 64 | 78 | |
| ... | ... | @@ -132,6 +146,17 @@ public class TaskEfficiencyCalculateJob implements JobHandler { |
| 132 | 146 | return ratio; |
| 133 | 147 | } |
| 134 | 148 | |
| 149 | + private Map<Long, Map<String, Object>> loadHistoryTotalMap(String beginDate) { | |
| 150 | + List<Map<String, Object>> rows = userTaskEfficiencyMapper.statHistoryTotalCount(beginDate); | |
| 151 | + Map<Long, Map<String, Object>> map = new LinkedHashMap<>(); | |
| 152 | + if (rows != null) { | |
| 153 | + for (Map<String, Object> row : rows) { | |
| 154 | + map.put(toLong(row.get("user_id")), row); | |
| 155 | + } | |
| 156 | + } | |
| 157 | + return map; | |
| 158 | + } | |
| 159 | + | |
| 135 | 160 | private List<UserTaskEfficiencyDO> buildCategorySummary(List<UserTaskEfficiencyDO> all, String statPeriod) { |
| 136 | 161 | Map<String, List<UserTaskEfficiencyDO>> catMap = new LinkedHashMap<>(); |
| 137 | 162 | for (UserTaskEfficiencyDO e : all) { |
| ... | ... | @@ -178,6 +203,19 @@ public class TaskEfficiencyCalculateJob implements JobHandler { |
| 178 | 203 | s.setEfficiencyRatio(ratioWeight > 0 |
| 179 | 204 | ? weightedRatio.divide(BigDecimal.valueOf(ratioWeight), 4, RoundingMode.HALF_UP) |
| 180 | 205 | : BigDecimal.ONE); |
| 206 | + // 加权计算 historyCompletionRate | |
| 207 | + BigDecimal weightedRate = BigDecimal.ZERO; | |
| 208 | + int rateWeightCnt = 0; | |
| 209 | + for (UserTaskEfficiencyDO e : group) { | |
| 210 | + if (e.getCompletedCount() > 0 && e.getHistoryCompletionRate() != null) { | |
| 211 | + weightedRate = weightedRate.add( | |
| 212 | + e.getHistoryCompletionRate().multiply(BigDecimal.valueOf(e.getCompletedCount()))); | |
| 213 | + rateWeightCnt += e.getCompletedCount(); | |
| 214 | + } | |
| 215 | + } | |
| 216 | + s.setHistoryCompletionRate(rateWeightCnt > 0 | |
| 217 | + ? weightedRate.divide(BigDecimal.valueOf(rateWeightCnt), 4, RoundingMode.HALF_UP) | |
| 218 | + : BigDecimal.ZERO); | |
| 181 | 219 | summaries.add(s); |
| 182 | 220 | } |
| 183 | 221 | return summaries; | ... | ... |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/homepage/HomepageSummaryServiceImpl.java
| ... | ... | @@ -458,9 +458,20 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ |
| 458 | 458 | if (db == null) return -1; |
| 459 | 459 | return da.compareTo(db); |
| 460 | 460 | }); |
| 461 | - result.setSortedTasks(sortedTasks); | |
| 462 | 461 | result.setTeamProgress(teamProgress); |
| 463 | 462 | result.setTotalPendingTasks(sortedTasks.size()); |
| 463 | + | |
| 464 | + // 4.5 加载效率数据,设置个人历史完成率 | |
| 465 | + Map<String, UserTaskEfficiencyDO> effMap = loadEfficiencyMap(userId); | |
| 466 | + for (TaskDistanceSortRespVO task : sortedTasks) { | |
| 467 | + UserTaskEfficiencyDO effDO = lookupEfficiency(effMap, task.getTaskType(), task.getTaskSubType()); | |
| 468 | + if (effDO != null && effDO.getHistoryCompletionRate() != null) { | |
| 469 | + task.setHistoryCompletionRate(effDO.getHistoryCompletionRate()); | |
| 470 | + } | |
| 471 | + } | |
| 472 | + | |
| 473 | + result.setSortedTasks(sortedTasks); | |
| 474 | + | |
| 464 | 475 | int totalDist = 0; |
| 465 | 476 | int totalWalkMin = 0; |
| 466 | 477 | int totalTriMin = 0; |
| ... | ... | @@ -508,6 +519,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ |
| 508 | 519 | result.add(sortVo); |
| 509 | 520 | } |
| 510 | 521 | } |
| 522 | + // 加载效率数据,设置个人历史完成率 | |
| 523 | + Map<String, UserTaskEfficiencyDO> effMap = loadEfficiencyMap(userId); | |
| 524 | + for (TaskDistanceSortRespVO task : result) { | |
| 525 | + UserTaskEfficiencyDO effDO = lookupEfficiency(effMap, task.getTaskType(), task.getTaskSubType()); | |
| 526 | + if (effDO != null && effDO.getHistoryCompletionRate() != null) { | |
| 527 | + task.setHistoryCompletionRate(effDO.getHistoryCompletionRate()); | |
| 528 | + } | |
| 529 | + } | |
| 511 | 530 | logTaskList("已办SQL原始记录", result); |
| 512 | 531 | Log.info("返回App参数: " + JSON.toJSONString(result)); |
| 513 | 532 | return result; |
| ... | ... | @@ -674,17 +693,17 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ |
| 674 | 693 | TeamProgressVO teamProgress = buildTeamProgress(userId, deptId); |
| 675 | 694 | TaskDistanceSortResultVO result = new TaskDistanceSortResultVO(); |
| 676 | 695 | sortedTasks.sort((a, b) -> { |
| 677 | - Integer da = a.getDistance(), db = b.getDistance(); | |
| 678 | - if (da == null && db == null) return 0; | |
| 679 | - if (da == null) return 1; | |
| 680 | - if (db == null) return -1; | |
| 681 | - return da.compareTo(db); | |
| 682 | - }); | |
| 683 | - result.setSortedTasks(sortedTasks); | |
| 696 | + Integer da = a.getDistance(), db = b.getDistance(); | |
| 697 | + if (da == null && db == null) return 0; | |
| 698 | + if (da == null) return 1; | |
| 699 | + if (db == null) return -1; | |
| 700 | + return da.compareTo(db); | |
| 701 | + }); | |
| 684 | 702 | result.setTeamProgress(teamProgress); |
| 685 | 703 | result.setTotalPendingTasks(sortedTasks.size()); |
| 704 | + result.setSortedTasks(sortedTasks); | |
| 686 | 705 | Log.info("返回App参数: " + JSON.toJSONString(result)); |
| 687 | - return result; | |
| 706 | + return result; | |
| 688 | 707 | } |
| 689 | 708 | |
| 690 | 709 | List<Long> roleIds = roleApi.getRoleIdsByUserId(userId); |
| ... | ... | @@ -743,6 +762,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ |
| 743 | 762 | if (effDO != null) { |
| 744 | 763 | task.setUserAvgMinutes(effDO.getAvgMinutes()); |
| 745 | 764 | task.setTeamAvgMinutes(effDO.getTeamAvgMinutes()); |
| 765 | + task.setHistoryCompletionRate(effDO.getHistoryCompletionRate()); | |
| 746 | 766 | } |
| 747 | 767 | |
| 748 | 768 | if (task.getTaskLat() != null && task.getTaskLon() != null) { |
| ... | ... | @@ -807,9 +827,10 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ |
| 807 | 827 | if (db == null) return -1; |
| 808 | 828 | return da.compareTo(db); |
| 809 | 829 | }); |
| 810 | - result.setSortedTasks(sortedTasks); | |
| 811 | 830 | result.setTeamProgress(teamProgress); |
| 812 | 831 | result.setTotalPendingTasks(sortedTasks.size()); |
| 832 | + result.setSortedTasks(sortedTasks); | |
| 833 | + | |
| 813 | 834 | int totalDist = 0; |
| 814 | 835 | for (TaskDistanceSortRespVO t : sortedTasks) { |
| 815 | 836 | if (t.getDistance() != null) totalDist += t.getDistance(); | ... | ... |
urbanops-module-garden/src/main/resources/mapper/UserTaskEfficiencyMapper.xml
| ... | ... | @@ -71,4 +71,15 @@ |
| 71 | 71 | GROUP BY t.ASSIGNEE_, u.dept_id, m.order_type |
| 72 | 72 | </select> |
| 73 | 73 | |
| 74 | + <!-- 汇总用户 6 个月历史任务总量 --> | |
| 75 | + <select id="statHistoryTotalCount" resultType="java.util.Map"> | |
| 76 | + SELECT user_id, | |
| 77 | + SUM(insp_total + mt_total + wo_total) AS history_total, | |
| 78 | + SUM(insp_completed + mt_completed + wo_completed) AS history_completed | |
| 79 | + FROM garden_task_statistics | |
| 80 | + WHERE busi_date >= #{beginDate} | |
| 81 | + AND deleted = 0 | |
| 82 | + GROUP BY user_id | |
| 83 | + </select> | |
| 84 | + | |
| 74 | 85 | </mapper> | ... | ... |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java