wangxx недель назад: 4
Родитель
Сommit
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
          * 贡献分值(最终分值*权重/100)
104
          * 贡献分值(最终分值*权重/100)
105
          */
105
          */
106
         private BigDecimal contribution;
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
                     : baseScore;
117
                     : baseScore;
118
 
118
 
119
             // 6. 计算当前层级特有加减分
119
             // 6. 计算当前层级特有加减分
120
-            Map<String, BigDecimal> specialScores = calculateSpecialScores(dim.getId(), query.getDeptId(), 
120
+            Map<String, Object> specialScores = calculateSpecialScores(dim.getId(), query.getDeptId(), 
121
                     query.getStartDate(), query.getEndDate(),org);
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
             BigDecimal specialTotal = addScore.subtract(subtractScore);
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
             // 7. 最终分值 = 下级平均值(或基础分) + 特有合计
131
             // 7. 最终分值 = 下级平均值(或基础分) + 特有合计
127
             BigDecimal finalScore = averageScore.add(specialTotal);
132
             BigDecimal finalScore = averageScore.add(specialTotal);
@@ -142,6 +147,7 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
142
             item.setFinalScore(finalScore.setScale(2, RoundingMode.HALF_UP));
147
             item.setFinalScore(finalScore.setScale(2, RoundingMode.HALF_UP));
143
             item.setWeight(weight);
148
             item.setWeight(weight);
144
             item.setContribution(contribution);
149
             item.setContribution(contribution);
150
+            item.setSpecialDetails(specialDetails);
145
 
151
 
146
             result.add(item);
152
             result.add(item);
147
         }
153
         }
@@ -296,13 +302,14 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
296
     }
302
     }
297
 
303
 
298
     /**
304
     /**
299
-     * 计算小组特有加减分
305
+     * 计算小组特有加减分及明细
300
      * 注:小组特有事件通过org=1(部门级别)筛选
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
         result.put("add", BigDecimal.ZERO);
310
         result.put("add", BigDecimal.ZERO);
305
         result.put("subtract", BigDecimal.ZERO);
311
         result.put("subtract", BigDecimal.ZERO);
312
+        result.put("details", new ArrayList<GroupPortraitDTO.SpecialDetail>());
306
 
313
 
307
         // 查询该部门在该维度的特有事件(org=1表示部门级)
314
         // 查询该部门在该维度的特有事件(org=1表示部门级)
308
         ScoreEvent eventQuery = new ScoreEvent();
315
         ScoreEvent eventQuery = new ScoreEvent();
@@ -317,6 +324,8 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
317
         }
324
         }
318
         List<ScoreEvent> events = scoreEventMapper.selectList(eventQuery);
325
         List<ScoreEvent> events = scoreEventMapper.selectList(eventQuery);
319
 
326
 
327
+        List<GroupPortraitDTO.SpecialDetail> details = new ArrayList<>();
328
+        
320
         if (events == null || events.isEmpty()) {
329
         if (events == null || events.isEmpty()) {
321
             return result;
330
             return result;
322
         }
331
         }
@@ -324,23 +333,62 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
324
         // 分别累计加分和减分
333
         // 分别累计加分和减分
325
         BigDecimal addTotal = BigDecimal.ZERO;
334
         BigDecimal addTotal = BigDecimal.ZERO;
326
         BigDecimal subtractTotal = BigDecimal.ZERO;
335
         BigDecimal subtractTotal = BigDecimal.ZERO;
336
+        
337
+        // 使用Map按指标汇总:key为"二级_三级_四级",value为明细对象
338
+        Map<String, GroupPortraitDTO.SpecialDetail> summaryMap = new LinkedHashMap<>();
327
 
339
 
328
         for (ScoreEvent e : events) {
340
         for (ScoreEvent e : events) {
329
             BigDecimal score = e.getTotalScore() != null ? e.getTotalScore() : BigDecimal.ZERO;
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
             if (score.compareTo(BigDecimal.ZERO) > 0) {
365
             if (score.compareTo(BigDecimal.ZERO) > 0) {
331
                 addTotal = addTotal.add(score);
366
                 addTotal = addTotal.add(score);
332
             } else {
367
             } else {
333
                 subtractTotal = subtractTotal.add(score.abs());
368
                 subtractTotal = subtractTotal.add(score.abs());
334
             }
369
             }
335
         }
370
         }
371
+        
372
+        // 将汇总后的明细转换为List
373
+        details.addAll(summaryMap.values());
336
 
374
 
337
         result.put("add", addTotal);
375
         result.put("add", addTotal);
338
         result.put("subtract", subtractTotal);
376
         result.put("subtract", subtractTotal);
377
+        result.put("details", details);
339
 
378
 
340
         return result;
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
     private BigDecimal calculateTotalScore(List<GroupPortraitDTO.DimensionScore> dimensions) {
394
     private BigDecimal calculateTotalScore(List<GroupPortraitDTO.DimensionScore> dimensions) {