From 6b13839488edcd06046e26a41fe897358176689c Mon Sep 17 00:00:00 2001
From: 潘志宝 <979469083@qq.com>
Date: 星期五, 13 十二月 2024 17:56:41 +0800
Subject: [PATCH] 采集质量

---
 iailab-module-bpm/iailab-module-bpm-biz/src/main/java/com/iailab/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java |   94 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 94 insertions(+), 0 deletions(-)

diff --git a/iailab-module-bpm/iailab-module-bpm-biz/src/main/java/com/iailab/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java b/iailab-module-bpm/iailab-module-bpm-biz/src/main/java/com/iailab/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java
new file mode 100644
index 0000000..ce4a924
--- /dev/null
+++ b/iailab-module-bpm/iailab-module-bpm-biz/src/main/java/com/iailab/module/bpm/framework/flowable/core/candidate/strategy/dept/AbstractBpmTaskCandidateDeptLeaderStrategy.java
@@ -0,0 +1,94 @@
+package com.iailab.module.bpm.framework.flowable.core.candidate.strategy.dept;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import com.iailab.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy;
+import com.iailab.module.system.api.dept.DeptApi;
+import com.iailab.module.system.api.dept.dto.DeptRespDTO;
+import com.iailab.module.system.api.user.AdminUserApi;
+import com.iailab.module.system.api.user.dto.AdminUserRespDTO;
+
+import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 部门的负责人 {@link BpmTaskCandidateStrategy} 抽象类
+ *
+ * @author hou
+ */
+public abstract class AbstractBpmTaskCandidateDeptLeaderStrategy implements BpmTaskCandidateStrategy {
+
+    @Resource
+    protected DeptApi deptApi;
+    @Resource
+    protected AdminUserApi adminUserApi;
+
+    /**
+     * 获得指定层级的部门负责人,只有第 level 的负责人
+     *
+     * @param dept 指定部门
+     * @param level 第几级
+     * @return 部门负责人的编号
+     */
+    protected Long getAssignLevelDeptLeaderId(DeptRespDTO dept, Integer level) {
+        Assert.isTrue(level > 0, "level 必须大于 0");
+        if (dept == null) {
+            return null;
+        }
+        DeptRespDTO currentDept = dept;
+        for (int i = 1; i < level; i++) {
+            DeptRespDTO parentDept = deptApi.getDept(currentDept.getParentId()).getCheckedData();
+            if (parentDept == null) { // 找不到父级部门,到了最高级。返回最高级的部门负责人
+                break;
+            }
+            currentDept = parentDept;
+        }
+        return currentDept.getLeaderUserId();
+    }
+
+    /**
+     * 获得连续层级的部门负责人,包含 [1, level] 的负责人
+     *
+     * @param deptIds 指定部门编号数组
+     * @param level 最大层级
+     * @return 连续部门负责人 Id
+     */
+    protected Set<Long> getMultiLevelDeptLeaderIds(List<Long> deptIds, Integer level) {
+        Assert.isTrue(level > 0, "level 必须大于 0");
+        if (CollUtil.isEmpty(deptIds)) {
+            return new HashSet<>();
+        }
+        Set<Long> deptLeaderIds = new LinkedHashSet<>(); // 保证有序
+        for (Long deptId : deptIds) {
+            DeptRespDTO dept = deptApi.getDept(deptId).getCheckedData();
+            for (int i = 0; i < level; i++) {
+                if (dept.getLeaderUserId() != null) {
+                    deptLeaderIds.add(dept.getLeaderUserId());
+                }
+                DeptRespDTO parentDept = deptApi.getDept(dept.getParentId()).getCheckedData();
+                if (parentDept == null) { // 找不到父级部门. 已经到了最高层级了
+                    break;
+                }
+                dept = parentDept;
+            }
+        }
+        return deptLeaderIds;
+    }
+
+    /**
+     * 获取发起人的部门
+     *
+     * @param startUserId 发起人 Id
+     */
+    protected DeptRespDTO getStartUserDept(Long startUserId) {
+        AdminUserRespDTO startUser = adminUserApi.getUser(startUserId).getCheckedData();
+        if (startUser.getDeptId() == null) { // 找不到部门
+            return null;
+        }
+        return deptApi.getDept(startUser.getDeptId()).getCheckedData();
+    }
+
+}

--
Gitblit v1.9.3