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 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
... ... @@ -55,4 +55,7 @@ public class TaskDistanceSortRespVO extends TaskDetailsRspVo {
55 55  
56 56 /** 班组平均完成时长(分钟) */
57 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 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
... ... @@ -36,4 +36,6 @@ public interface DictTypeConstants {
36 36  
37 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 3 name: urbanops-server
4 4  
5 5 profiles:
6   - active: dev
  6 + active: prod
7 7  
8 8  
9 9 main:
... ...