|
|
@@ -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) {
|