潘志宝
4 天以前 b8a0affd03b5fa9fa33cd6f870e90394c2df86c7
提交 | 用户 | 时间
bb2880 1 package com.iailab.module.bpm.framework.flowable.core.candidate.strategy.dept;
H 2
3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert;
5 import com.iailab.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
6 import com.iailab.module.system.api.dept.DeptApi;
7 import com.iailab.module.system.api.dept.dto.DeptRespDTO;
8 import com.iailab.module.system.api.user.AdminUserApi;
9 import com.iailab.module.system.api.user.dto.AdminUserRespDTO;
10
11 import javax.annotation.Resource;
12 import java.util.HashSet;
13 import java.util.LinkedHashSet;
14 import java.util.List;
15 import java.util.Set;
16
17 /**
18  * 部门的负责人 {@link BpmTaskCandidateStrategy} 抽象类
19  *
20  * @author hou
21  */
22 public abstract class AbstractBpmTaskCandidateDeptLeaderStrategy implements BpmTaskCandidateStrategy {
23
24     @Resource
25     protected DeptApi deptApi;
26     @Resource
27     protected AdminUserApi adminUserApi;
28
29     /**
30      * 获得指定层级的部门负责人,只有第 level 的负责人
31      *
32      * @param dept 指定部门
33      * @param level 第几级
34      * @return 部门负责人的编号
35      */
36     protected Long getAssignLevelDeptLeaderId(DeptRespDTO dept, Integer level) {
37         Assert.isTrue(level > 0, "level 必须大于 0");
38         if (dept == null) {
39             return null;
40         }
41         DeptRespDTO currentDept = dept;
42         for (int i = 1; i < level; i++) {
43             DeptRespDTO parentDept = deptApi.getDept(currentDept.getParentId()).getCheckedData();
44             if (parentDept == null) { // 找不到父级部门,到了最高级。返回最高级的部门负责人
45                 break;
46             }
47             currentDept = parentDept;
48         }
49         return currentDept.getLeaderUserId();
50     }
51
52     /**
53      * 获得连续层级的部门负责人,包含 [1, level] 的负责人
54      *
55      * @param deptIds 指定部门编号数组
56      * @param level 最大层级
57      * @return 连续部门负责人 Id
58      */
59     protected Set<Long> getMultiLevelDeptLeaderIds(List<Long> deptIds, Integer level) {
60         Assert.isTrue(level > 0, "level 必须大于 0");
61         if (CollUtil.isEmpty(deptIds)) {
62             return new HashSet<>();
63         }
64         Set<Long> deptLeaderIds = new LinkedHashSet<>(); // 保证有序
65         for (Long deptId : deptIds) {
66             DeptRespDTO dept = deptApi.getDept(deptId).getCheckedData();
67             for (int i = 0; i < level; i++) {
68                 if (dept.getLeaderUserId() != null) {
69                     deptLeaderIds.add(dept.getLeaderUserId());
70                 }
71                 DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()).getCheckedData();
72                 if (parentDept == null) { // 找不到父级部门. 已经到了最高层级了
73                     break;
74                 }
75                 dept = parentDept;
76             }
77         }
78         return deptLeaderIds;
79     }
80
81     /**
82      * 获取发起人的部门
83      *
84      * @param startUserId 发起人 Id
85      */
86     protected DeptRespDTO getStartUserDept(Long startUserId) {
87         AdminUserRespDTO startUser = adminUserApi.getUser(startUserId).getCheckedData();
88         if (startUser.getDeptId() == null) { // 找不到部门
89             return null;
90         }
91         return deptApi.getDept(startUser.getDeptId()).getCheckedData();
92     }
93
94 }