wangxx il y a 4 semaines
Parent
commit
1ac3dc9637

+ 48 - 0
airport-ledger/src/main/java/com/sundot/airport/ledger/dto/GroupPortraitDTO.java

@@ -104,5 +104,53 @@ public class GroupPortraitDTO implements Serializable {
104 104
          * 贡献分值(最终分值*权重/100)
105 105
          */
106 106
         private BigDecimal contribution;
107
+
108
+        /**
109
+         * 特有加减分明细列表
110
+         */
111
+        private List<SpecialDetail> specialDetails;
112
+    }
113
+
114
+    /**
115
+     * 特有加减分明细项
116
+     */
117
+    @Data
118
+    public static class SpecialDetail implements Serializable {
119
+        private static final long serialVersionUID = 1L;
120
+
121
+        /**
122
+         * 二级指标
123
+         */
124
+        private String level2Name;
125
+
126
+        /**
127
+         * 三级指标
128
+         */
129
+        private String level3Name;
130
+
131
+        /**
132
+         * 四级指标
133
+         */
134
+        private String level4Name;
135
+
136
+        /**
137
+         * 分值(正数为加分,负数为减分)
138
+         */
139
+        private BigDecimal score;
140
+
141
+        /**
142
+         * 事件描述
143
+         */
144
+        private String eventDesc;
145
+
146
+        /**
147
+         * 事件时间
148
+         */
149
+        private String eventTime;
150
+
151
+        /**
152
+         * 类型(加分/减分)
153
+         */
154
+        private String type;
107 155
     }
108 156
 }

+ 54 - 6
airport-ledger/src/main/java/com/sundot/airport/ledger/service/impl/GroupPortraitServiceImpl.java

@@ -117,11 +117,16 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
117 117
                     : baseScore;
118 118
 
119 119
             // 6. 计算当前层级特有加减分
120
-            Map<String, BigDecimal> specialScores = calculateSpecialScores(dim.getId(), query.getDeptId(), 
120
+            Map<String, Object> specialScores = calculateSpecialScores(dim.getId(), query.getDeptId(), 
121 121
                     query.getStartDate(), query.getEndDate(),org);
122
-            BigDecimal addScore = specialScores.getOrDefault("add", BigDecimal.ZERO);
123
-            BigDecimal subtractScore = specialScores.getOrDefault("subtract", BigDecimal.ZERO);
122
+            BigDecimal addScore = (BigDecimal) specialScores.getOrDefault("add", BigDecimal.ZERO);
123
+            BigDecimal subtractScore = (BigDecimal) specialScores.getOrDefault("subtract", BigDecimal.ZERO);
124 124
             BigDecimal specialTotal = addScore.subtract(subtractScore);
125
+            
126
+            // 获取特有条目明细
127
+            @SuppressWarnings("unchecked")
128
+            List<GroupPortraitDTO.SpecialDetail> specialDetails = 
129
+                    (List<GroupPortraitDTO.SpecialDetail>) specialScores.getOrDefault("details", new ArrayList<>());
125 130
 
126 131
             // 7. 最终分值 = 下级平均值(或基础分) + 特有合计
127 132
             BigDecimal finalScore = averageScore.add(specialTotal);
@@ -142,6 +147,7 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
142 147
             item.setFinalScore(finalScore.setScale(2, RoundingMode.HALF_UP));
143 148
             item.setWeight(weight);
144 149
             item.setContribution(contribution);
150
+            item.setSpecialDetails(specialDetails);
145 151
 
146 152
             result.add(item);
147 153
         }
@@ -296,13 +302,14 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
296 302
     }
297 303
 
298 304
     /**
299
-     * 计算小组特有加减分
305
+     * 计算小组特有加减分及明细
300 306
      * 注:小组特有事件通过org=1(部门级别)筛选
301 307
      */
302
-    private Map<String, BigDecimal> calculateSpecialScores(Long dimensionId, Long deptId, String beginTime, String endTime,String org) {
303
-        Map<String, BigDecimal> result = new HashMap<>();
308
+    private Map<String, Object> calculateSpecialScores(Long dimensionId, Long deptId, String beginTime, String endTime,String org) {
309
+        Map<String, Object> result = new HashMap<>();
304 310
         result.put("add", BigDecimal.ZERO);
305 311
         result.put("subtract", BigDecimal.ZERO);
312
+        result.put("details", new ArrayList<GroupPortraitDTO.SpecialDetail>());
306 313
 
307 314
         // 查询该部门在该维度的特有事件(org=1表示部门级)
308 315
         ScoreEvent eventQuery = new ScoreEvent();
@@ -317,6 +324,8 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
317 324
         }
318 325
         List<ScoreEvent> events = scoreEventMapper.selectList(eventQuery);
319 326
 
327
+        List<GroupPortraitDTO.SpecialDetail> details = new ArrayList<>();
328
+        
320 329
         if (events == null || events.isEmpty()) {
321 330
             return result;
322 331
         }
@@ -324,23 +333,62 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
324 333
         // 分别累计加分和减分
325 334
         BigDecimal addTotal = BigDecimal.ZERO;
326 335
         BigDecimal subtractTotal = BigDecimal.ZERO;
336
+        
337
+        // 使用Map按指标汇总:key为"二级_三级_四级",value为明细对象
338
+        Map<String, GroupPortraitDTO.SpecialDetail> summaryMap = new LinkedHashMap<>();
327 339
 
328 340
         for (ScoreEvent e : events) {
329 341
             BigDecimal score = e.getTotalScore() != null ? e.getTotalScore() : BigDecimal.ZERO;
342
+            
343
+            // 构建汇总key:二级+三级+四级指标名称
344
+            String summaryKey = buildSummaryKey(e.getLevel2Name(), e.getLevel3Name(), e.getLevel4Name());
345
+            
346
+            // 如果该指标已存在,则累加分值
347
+            if (summaryMap.containsKey(summaryKey)) {
348
+                GroupPortraitDTO.SpecialDetail existingDetail = summaryMap.get(summaryKey);
349
+                BigDecimal newScore = existingDetail.getScore().add(score);
350
+                existingDetail.setScore(newScore);
351
+                // 更新类型(如果分值变号)
352
+                existingDetail.setType(newScore.compareTo(BigDecimal.ZERO) >= 0 ? "加分" : "减分");
353
+            } else {
354
+                // 组装明细项
355
+                GroupPortraitDTO.SpecialDetail detail = new GroupPortraitDTO.SpecialDetail();
356
+                detail.setLevel2Name(e.getLevel2Name());
357
+                detail.setLevel3Name(e.getLevel3Name());
358
+                detail.setLevel4Name(e.getLevel4Name());
359
+                detail.setScore(score);
360
+                detail.setEventDesc(e.getEventDesc());
361
+                detail.setType(score.compareTo(BigDecimal.ZERO) >= 0 ? "加分" : "减分");
362
+                summaryMap.put(summaryKey, detail);
363
+            }
364
+            
330 365
             if (score.compareTo(BigDecimal.ZERO) > 0) {
331 366
                 addTotal = addTotal.add(score);
332 367
             } else {
333 368
                 subtractTotal = subtractTotal.add(score.abs());
334 369
             }
335 370
         }
371
+        
372
+        // 将汇总后的明细转换为List
373
+        details.addAll(summaryMap.values());
336 374
 
337 375
         result.put("add", addTotal);
338 376
         result.put("subtract", subtractTotal);
377
+        result.put("details", details);
339 378
 
340 379
         return result;
341 380
     }
342 381
 
343 382
     /**
383
+     * 构建汇总key:二级+三级+四级指标名称
384
+     */
385
+    private String buildSummaryKey(String level2Name, String level3Name, String level4Name) {
386
+        return (level2Name != null ? level2Name : "") + "_" +
387
+               (level3Name != null ? level3Name : "") + "_" +
388
+               (level4Name != null ? level4Name : "");
389
+    }
390
+
391
+    /**
344 392
      * 计算综合评分(各维度贡献分值之和)
345 393
      */
346 394
     private BigDecimal calculateTotalScore(List<GroupPortraitDTO.DimensionScore> dimensions) {