Commit 5bbdadb9b7cec227a5cebef1b1ab5ab01520a9be

Authored by 王彪总
1 parent 285d3e4e

feat(garden): 添加个人历史完成率配置和个人任务效率统计功能

- 在DictTypeConstants中新增COMPLETION_RATE_CONFIG字典类型用于个人历史完成率配置
- 在TaskDistanceSortRespVO中添加historyCompletionRate字段用于存储个人历史完成率
- 在UserTaskEfficiencyDO中添加historyCompletionRate字段用于存储个人历史完成率
- 在HomepageSummaryServiceImpl的多个方法中加载效率数据并设置个人历史完成率
- 在TaskEfficiencyCalculateJob中实现个人历史完成率计算逻辑
- 在UserTaskEfficiencyMapper中添加statHistoryTotalCount查询方法
- 在MyBatis映射文件中添加统计用户6个月历史任务总量的SQL
- 在RoadApiImpl中为getRoadInfoById方法禁用数据权限注解
- 将应用环境配置从dev切换到prod模式
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 }
urbanops-server/src/main/resources/application.yaml
@@ -3,7 +3,7 @@ spring: @@ -3,7 +3,7 @@ spring:
3 name: urbanops-server 3 name: urbanops-server
4 4
5 profiles: 5 profiles:
6 - active: dev 6 + active: prod
7 7
8 8
9 main: 9 main: