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,6 +5,7 @@ import cn.hutool.json.JSONUtil; | ||
| 5 | import com.alibaba.fastjson.JSON; | 5 | import com.alibaba.fastjson.JSON; |
| 6 | import com.zteits.urbanops.framework.common.util.http.HttpUtils; | 6 | import com.zteits.urbanops.framework.common.util.http.HttpUtils; |
| 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; | 7 | import com.zteits.urbanops.framework.common.util.object.BeanUtils; |
| 8 | +import com.zteits.urbanops.framework.datapermission.core.annotation.DataPermission; | ||
| 8 | import com.zteits.urbanops.module.garden.controller.admin.road.vo.RoadRespVO; | 9 | import com.zteits.urbanops.module.garden.controller.admin.road.vo.RoadRespVO; |
| 9 | import com.zteits.urbanops.module.garden.dto.road.RoadReqDTO; | 10 | import com.zteits.urbanops.module.garden.dto.road.RoadReqDTO; |
| 10 | import com.zteits.urbanops.module.garden.dto.road.RoadRespDTO; | 11 | import com.zteits.urbanops.module.garden.dto.road.RoadRespDTO; |
| @@ -69,6 +70,7 @@ public class RoadApiImpl implements RoadApi { | @@ -69,6 +70,7 @@ public class RoadApiImpl implements RoadApi { | ||
| 69 | } | 70 | } |
| 70 | 71 | ||
| 71 | @Override | 72 | @Override |
| 73 | + @DataPermission(enable = false) | ||
| 72 | public RoadStreetRespDTO getRoadInfoById(String id) { | 74 | public RoadStreetRespDTO getRoadInfoById(String id) { |
| 73 | RoadRespVO roadRespVO = roadService.getUniqueRoad(Long.parseLong(id)); | 75 | RoadRespVO roadRespVO = roadService.getUniqueRoad(Long.parseLong(id)); |
| 74 | if(null == roadRespVO){ | 76 | if(null == roadRespVO){ |
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/app/homepage/vo/TaskDistanceSortRespVO.java
| @@ -55,4 +55,7 @@ public class TaskDistanceSortRespVO extends TaskDetailsRspVo { | @@ -55,4 +55,7 @@ public class TaskDistanceSortRespVO extends TaskDetailsRspVo { | ||
| 55 | 55 | ||
| 56 | /** 班组平均完成时长(分钟) */ | 56 | /** 班组平均完成时长(分钟) */ |
| 57 | private BigDecimal teamAvgMinutes; | 57 | private BigDecimal teamAvgMinutes; |
| 58 | + | ||
| 59 | + /** 个人历史完成率 = 6个月内已完成 / 6个月内总任务数 */ | ||
| 60 | + private BigDecimal historyCompletionRate; | ||
| 58 | } | 61 | } |
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,6 +53,9 @@ public class UserTaskEfficiencyDO extends BaseDO { | ||
| 53 | /** 效率比 = teamAvg / userAvg */ | 53 | /** 效率比 = teamAvg / userAvg */ |
| 54 | private BigDecimal efficiencyRatio; | 54 | private BigDecimal efficiencyRatio; |
| 55 | 55 | ||
| 56 | + /** 个人历史完成率 = 6个月内已完成 / 6个月内总任务数 */ | ||
| 57 | + private BigDecimal historyCompletionRate; | ||
| 58 | + | ||
| 56 | /** 统计周期 yyyy-MM */ | 59 | /** 统计周期 yyyy-MM */ |
| 57 | private String statPeriod; | 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,4 +40,7 @@ public interface UserTaskEfficiencyMapper extends BaseMapperX<UserTaskEfficiency | ||
| 40 | 40 | ||
| 41 | /** 工单效率统计 */ | 41 | /** 工单效率统计 */ |
| 42 | List<Map<String, Object>> statWorkOrderEfficiency(@Param("beginTime") String beginTime); | 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,6 +39,7 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | ||
| 39 | 39 | ||
| 40 | // 2. 6个月窗口 | 40 | // 2. 6个月窗口 |
| 41 | String beginTime = LocalDate.now().minusMonths(6).withDayOfMonth(1) + " 00:00:00"; | 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 | // 3. 三类任务分别统计 | 44 | // 3. 三类任务分别统计 |
| 44 | List<UserTaskEfficiencyDO> all = new ArrayList<>(); | 45 | List<UserTaskEfficiencyDO> all = new ArrayList<>(); |
| @@ -59,6 +60,19 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | @@ -59,6 +60,19 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | ||
| 59 | e.setEfficiencyRatio(calcRatio(e.getAvgMinutes(), e.getTeamAvgMinutes())); | 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 | // 6. 生成大类汇总(ALL) | 76 | // 6. 生成大类汇总(ALL) |
| 63 | all.addAll(buildCategorySummary(all, statPeriod)); | 77 | all.addAll(buildCategorySummary(all, statPeriod)); |
| 64 | 78 | ||
| @@ -132,6 +146,17 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | @@ -132,6 +146,17 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | ||
| 132 | return ratio; | 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 | private List<UserTaskEfficiencyDO> buildCategorySummary(List<UserTaskEfficiencyDO> all, String statPeriod) { | 160 | private List<UserTaskEfficiencyDO> buildCategorySummary(List<UserTaskEfficiencyDO> all, String statPeriod) { |
| 136 | Map<String, List<UserTaskEfficiencyDO>> catMap = new LinkedHashMap<>(); | 161 | Map<String, List<UserTaskEfficiencyDO>> catMap = new LinkedHashMap<>(); |
| 137 | for (UserTaskEfficiencyDO e : all) { | 162 | for (UserTaskEfficiencyDO e : all) { |
| @@ -178,6 +203,19 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | @@ -178,6 +203,19 @@ public class TaskEfficiencyCalculateJob implements JobHandler { | ||
| 178 | s.setEfficiencyRatio(ratioWeight > 0 | 203 | s.setEfficiencyRatio(ratioWeight > 0 |
| 179 | ? weightedRatio.divide(BigDecimal.valueOf(ratioWeight), 4, RoundingMode.HALF_UP) | 204 | ? weightedRatio.divide(BigDecimal.valueOf(ratioWeight), 4, RoundingMode.HALF_UP) |
| 180 | : BigDecimal.ONE); | 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 | summaries.add(s); | 219 | summaries.add(s); |
| 182 | } | 220 | } |
| 183 | return summaries; | 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,9 +458,20 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 458 | if (db == null) return -1; | 458 | if (db == null) return -1; |
| 459 | return da.compareTo(db); | 459 | return da.compareTo(db); |
| 460 | }); | 460 | }); |
| 461 | - result.setSortedTasks(sortedTasks); | ||
| 462 | result.setTeamProgress(teamProgress); | 461 | result.setTeamProgress(teamProgress); |
| 463 | result.setTotalPendingTasks(sortedTasks.size()); | 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 | int totalDist = 0; | 475 | int totalDist = 0; |
| 465 | int totalWalkMin = 0; | 476 | int totalWalkMin = 0; |
| 466 | int totalTriMin = 0; | 477 | int totalTriMin = 0; |
| @@ -508,6 +519,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -508,6 +519,14 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 508 | result.add(sortVo); | 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 | logTaskList("已办SQL原始记录", result); | 530 | logTaskList("已办SQL原始记录", result); |
| 512 | Log.info("返回App参数: " + JSON.toJSONString(result)); | 531 | Log.info("返回App参数: " + JSON.toJSONString(result)); |
| 513 | return result; | 532 | return result; |
| @@ -674,17 +693,17 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -674,17 +693,17 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 674 | TeamProgressVO teamProgress = buildTeamProgress(userId, deptId); | 693 | TeamProgressVO teamProgress = buildTeamProgress(userId, deptId); |
| 675 | TaskDistanceSortResultVO result = new TaskDistanceSortResultVO(); | 694 | TaskDistanceSortResultVO result = new TaskDistanceSortResultVO(); |
| 676 | sortedTasks.sort((a, b) -> { | 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 | result.setTeamProgress(teamProgress); | 702 | result.setTeamProgress(teamProgress); |
| 685 | result.setTotalPendingTasks(sortedTasks.size()); | 703 | result.setTotalPendingTasks(sortedTasks.size()); |
| 704 | + result.setSortedTasks(sortedTasks); | ||
| 686 | Log.info("返回App参数: " + JSON.toJSONString(result)); | 705 | Log.info("返回App参数: " + JSON.toJSONString(result)); |
| 687 | - return result; | 706 | + return result; |
| 688 | } | 707 | } |
| 689 | 708 | ||
| 690 | List<Long> roleIds = roleApi.getRoleIdsByUserId(userId); | 709 | List<Long> roleIds = roleApi.getRoleIdsByUserId(userId); |
| @@ -743,6 +762,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -743,6 +762,7 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 743 | if (effDO != null) { | 762 | if (effDO != null) { |
| 744 | task.setUserAvgMinutes(effDO.getAvgMinutes()); | 763 | task.setUserAvgMinutes(effDO.getAvgMinutes()); |
| 745 | task.setTeamAvgMinutes(effDO.getTeamAvgMinutes()); | 764 | task.setTeamAvgMinutes(effDO.getTeamAvgMinutes()); |
| 765 | + task.setHistoryCompletionRate(effDO.getHistoryCompletionRate()); | ||
| 746 | } | 766 | } |
| 747 | 767 | ||
| 748 | if (task.getTaskLat() != null && task.getTaskLon() != null) { | 768 | if (task.getTaskLat() != null && task.getTaskLon() != null) { |
| @@ -807,9 +827,10 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | @@ -807,9 +827,10 @@ public class HomepageSummaryServiceImpl implements HomepageSummaryService{ | ||
| 807 | if (db == null) return -1; | 827 | if (db == null) return -1; |
| 808 | return da.compareTo(db); | 828 | return da.compareTo(db); |
| 809 | }); | 829 | }); |
| 810 | - result.setSortedTasks(sortedTasks); | ||
| 811 | result.setTeamProgress(teamProgress); | 830 | result.setTeamProgress(teamProgress); |
| 812 | result.setTotalPendingTasks(sortedTasks.size()); | 831 | result.setTotalPendingTasks(sortedTasks.size()); |
| 832 | + result.setSortedTasks(sortedTasks); | ||
| 833 | + | ||
| 813 | int totalDist = 0; | 834 | int totalDist = 0; |
| 814 | for (TaskDistanceSortRespVO t : sortedTasks) { | 835 | for (TaskDistanceSortRespVO t : sortedTasks) { |
| 815 | if (t.getDistance() != null) totalDist += t.getDistance(); | 836 | if (t.getDistance() != null) totalDist += t.getDistance(); |
urbanops-module-garden/src/main/resources/mapper/UserTaskEfficiencyMapper.xml
| @@ -71,4 +71,15 @@ | @@ -71,4 +71,15 @@ | ||
| 71 | GROUP BY t.ASSIGNEE_, u.dept_id, m.order_type | 71 | GROUP BY t.ASSIGNEE_, u.dept_id, m.order_type |
| 72 | </select> | 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 | </mapper> | 85 | </mapper> |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/enums/DictTypeConstants.java
| @@ -36,4 +36,6 @@ public interface DictTypeConstants { | @@ -36,4 +36,6 @@ public interface DictTypeConstants { | ||
| 36 | 36 | ||
| 37 | String TASK_SORT_WEIGHT_CONFIG = "task_sort_weight_config"; // 智能排序权重配置 | 37 | String TASK_SORT_WEIGHT_CONFIG = "task_sort_weight_config"; // 智能排序权重配置 |
| 38 | 38 | ||
| 39 | + String COMPLETION_RATE_CONFIG = "completion_rate_config"; // 个人历史完成率配置 | ||
| 40 | + | ||
| 39 | } | 41 | } |