Bläddra i källkod

部门画像--能力画像优化

wangxx 3 veckor sedan
förälder
incheckning
1c8b148453

+ 3 - 3
airport-common/src/main/java/com/sundot/airport/common/enums/DeptTypeEnum.java

@@ -11,9 +11,9 @@ import lombok.Getter;
11 11
 public enum DeptTypeEnum {
12 12
 
13 13
     STATION("STATION", "机构站"),
14
-    BRIGADE("BRIGADE", "大队"),
15
-    MANAGER("MANAGER", "主管"),
16
-    TEAMS("TEAMS", "组");
14
+    BRIGADE("BRIGADE", "部门"),
15
+    MANAGER("MANAGER", "班组"),
16
+    TEAMS("TEAMS", "组");
17 17
 
18 18
     private final String code;
19 19
     private final String description;

+ 53 - 39
airport-ledger/src/main/java/com/sundot/airport/ledger/service/impl/GroupPortraitServiceImpl.java

@@ -2,6 +2,9 @@ package com.sundot.airport.ledger.service.impl;
2 2
 
3 3
 import com.sundot.airport.common.core.domain.entity.SysDept;
4 4
 import com.sundot.airport.common.core.domain.entity.SysUser;
5
+import com.sundot.airport.common.enums.DeptTypeEnum;
6
+import com.sundot.airport.common.enums.ScoreLevelEnum;
7
+import com.sundot.airport.common.utils.StringUtils;
5 8
 import com.sundot.airport.ledger.domain.ScoreDimension;
6 9
 import com.sundot.airport.ledger.domain.ScoreEvent;
7 10
 import com.sundot.airport.ledger.domain.vo.EmployeePortraitVO;
@@ -94,6 +97,9 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
94 97
     private List<GroupPortraitDTO.DimensionScore> calculateDimensions( SysDept dept, DeptPortraitQueryDTO query) {
95 98
         // 1. 根据部门类型确定org值
96 99
         String org = determineOrgByDeptType(dept.getDeptType());
100
+        if(StringUtils.isEmpty( org)){
101
+            return new ArrayList<>();
102
+        }
97 103
 
98 104
         // 2. 查询当前层级的所有维度定义
99 105
         ScoreDimension dq = new ScoreDimension();
@@ -157,42 +163,51 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
157 163
 
158 164
     /**
159 165
      * 根据部门类型确定org值
160
-     * TEAMS(班组) -> org='2' (小组维度)
161
-     * MANAGER(主管/队) -> org='1' (队维度)
162
-     * BRIGADE(大队/部门) -> org='1' (部门维度)
163
-     * STATION(站) -> org='1' (部门维度)
166
+     * 使用DeptTypeEnum和ScoreLevelEnum枚举
167
+     * 
168
+     * 部门类型 → 配分层级映射:
169
+     * - BRIGADE(部门) → DEPT(部门维度)
170
+     * - MANAGER(班组) → TEAM(队室维度)
171
+     * - TEAMS(小组) → GROUP(小组维度)
164 172
      */
165 173
     private String determineOrgByDeptType(String deptType) {
166
-        if (deptType == null) {
167
-            return "2"; // 默认小组维度
174
+        if (deptType == null || deptType.isEmpty()) {
175
+            return null;
176
+        }
177
+        
178
+        // TEAMS(小组) → GROUP(小组维度)
179
+        if (DeptTypeEnum.TEAMS.getCode().equals(deptType)) {
180
+            return ScoreLevelEnum.GROUP.getCode();
168 181
         }
169
-        switch (deptType) {
170
-            case "TEAMS":
171
-                return "2"; // 小组维度
172
-            case "MANAGER":
173
-            case "BRIGADE":
174
-            case "STATION":
175
-                return "1"; // 队/部门维度
176
-            default:
177
-                return "2";
182
+        
183
+        // MANAGER(班组) → TEAM(队室维度)
184
+        if (DeptTypeEnum.MANAGER.getCode().equals(deptType)) {
185
+            return ScoreLevelEnum.TEAM.getCode();
186
+        }
187
+        
188
+        // BRIGADE(部门)→ DEPT(部门维度)
189
+        if (DeptTypeEnum.BRIGADE.getCode().equals(deptType)) {
190
+            return ScoreLevelEnum.DEPT.getCode();
178 191
         }
192
+        
193
+        return null;
179 194
     }
180 195
 
181 196
     /**
182 197
      * 计算下级维度平均值(递归查找)
183
-     * 层级关系:部门(1) → 队/班组(2) → 小组(3) → 人员(4)
198
+     * 层级关系:部门(DEPT) → 队/班组(TEAM) → 小组(GROUP) → 人员(PERSON)
184 199
      * 递进逻辑:
185
-     * - org=1(部门) → 查询org=2(队)的维度 → 继续递归找org=3 → 继续递归找org=4
186
-     * - org=2(队) → 查询org=3(小组)的维度 → 继续递归找org=4
187
-     * - org=3(小组) → 查询org=4(人员)的维度 → 计算人员事件平均
188
-     * - org=4(人员) → 最底层,直接返回0
200
+     * - org=DEPT → 查询org=TEAM的维度 → 继续递归找org=GROUP → 继续递归找org=PERSON
201
+     * - org=TEAM → 查询org=GROUP的维度 → 继续递归找org=PERSON
202
+     * - org=GROUP → 查询org=PERSON的维度 → 计算人员事件平均
203
+     * - org=PERSON → 最底层,直接返回0
189 204
      */
190 205
     private BigDecimal calculateLowerLevelAverage(ScoreDimension currentDim, String beginTime, String endTime) {
191 206
         String dimRelationship = currentDim.getDimRelationship();
192 207
         String currentOrg = currentDim.getOrg();
193 208
         
194
-        // 1. 如果没有对照关系或已是最底层(org=4),返回0
195
-        if (dimRelationship == null || dimRelationship.isEmpty() || "4".equals(currentOrg)) {
209
+        // 1. 如果没有对照关系或已是最底层(org=PERSON),返回0
210
+        if (dimRelationship == null || dimRelationship.isEmpty() || ScoreLevelEnum.PERSON.getCode().equals(currentOrg)) {
196 211
             return BigDecimal.ZERO;
197 212
         }
198 213
         
@@ -219,12 +234,12 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
219 234
         ScoreDimension lowerDim = lowerDims.get(0);
220 235
 
221 236
         // 4. 根据下一级的org决定如何处理
222
-        if ("4".equals(lowerOrg)) {
237
+        if (ScoreLevelEnum.PERSON.getCode().equals(lowerOrg)) {
223 238
             // 下一级是人员维度,计算人员事件平均值
224 239
             return calculatePersonDimensionAverage(lowerDim, beginTime, endTime);
225 240
         } else {
226
-            // 下一级是组织维度(2或3),需要继续递归查找更下一级
227
-            // 例如:部门(1)找队(2),队(2)还要继续找小组(3)
241
+            // 下一级是组织维度(TEAM或GROUP),需要继续递归查找更下一级
242
+            // 例如:部门(DEPT)找队(TEAM),队(TEAM)还要继续找小组(GROUP)
228 243
             return calculateLowerLevelAverage(lowerDim, beginTime, endTime);
229 244
         }
230 245
     }
@@ -283,39 +298,38 @@ public class GroupPortraitServiceImpl implements IGroupPortraitService {
283 298
 
284 299
     /**
285 300
      * 获取下级层级的org值
286
-     * 层级关系:部门(1) -> 队(2) -> 小组(3) -> 员工(4)
301
+     * 使用ScoreLevelEnum枚举
302
+     * 层级关系:部门(DEPT) -> 队(TEAM) -> 小组(GROUP) -> 员工(PERSON)
287 303
      */
288 304
     private String getLowerLevelOrg(String currentOrg) {
289 305
         if (currentOrg == null) {
290 306
             return null;
291 307
         }
292
-        switch (currentOrg) {
293
-            case "1":
294
-                return "2";
295
-            case "2":
296
-                return "3";
297
-            case "3":
298
-                return "4";
299
-            default:
300
-                return null;
308
+        if (ScoreLevelEnum.DEPT.getCode().equals(currentOrg)) {
309
+            return ScoreLevelEnum.TEAM.getCode();
310
+        } else if (ScoreLevelEnum.TEAM.getCode().equals(currentOrg)) {
311
+            return ScoreLevelEnum.GROUP.getCode();
312
+        } else if (ScoreLevelEnum.GROUP.getCode().equals(currentOrg)) {
313
+            return ScoreLevelEnum.PERSON.getCode();
301 314
         }
315
+        return null;
302 316
     }
303 317
 
304 318
     /**
305 319
      * 计算小组特有加减分及明细
306
-     * 注:小组特有事件通过org=1(部门级别)筛选
320
+     * 注:特有事件通过当前org层级筛选
307 321
      */
308
-    private Map<String, Object> calculateSpecialScores(Long dimensionId, Long deptId, String beginTime, String endTime,String org) {
322
+    private Map<String, Object> calculateSpecialScores(Long dimensionId, Long deptId, String beginTime, String endTime, String org) {
309 323
         Map<String, Object> result = new HashMap<>();
310 324
         result.put("add", BigDecimal.ZERO);
311 325
         result.put("subtract", BigDecimal.ZERO);
312 326
         result.put("details", new ArrayList<GroupPortraitDTO.SpecialDetail>());
313 327
 
314
-        // 查询该部门在该维度的特有事件(org=1表示部门级
328
+        // 查询该部门在该维度的特有事件(根据org参数筛选
315 329
         ScoreEvent eventQuery = new ScoreEvent();
316 330
         eventQuery.setDimensionId(dimensionId);
317 331
         eventQuery.setDeptId(deptId);
318
-        eventQuery.setOrg("1"); // 部门级别事件
332
+        eventQuery.setOrg(org); // 使用传入的org参数
319 333
         if (beginTime != null && !beginTime.isEmpty()) {
320 334
             eventQuery.getParams().put("beginTime", beginTime);
321 335
         }