|
|
@@ -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
|
}
|