From f1208474f771a1c233d7425c8ed13fbaa0d521ac Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期三, 12 三月 2025 09:35:13 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/5.X' into 5.X

---
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java
new file mode 100644
index 0000000..5877bb5
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java
@@ -0,0 +1,165 @@
+package org.dromara.workflow.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.dto.DeptDTO;
+import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
+import org.dromara.common.core.domain.dto.UserDTO;
+import org.dromara.common.core.domain.model.TaskAssigneeBody;
+import org.dromara.common.core.enums.FormatsType;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.service.DeptService;
+import org.dromara.common.core.service.TaskAssigneeService;
+import org.dromara.common.core.service.UserService;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.warm.flow.ui.dto.HandlerFunDto;
+import org.dromara.warm.flow.ui.dto.HandlerQuery;
+import org.dromara.warm.flow.ui.dto.TreeFunDto;
+import org.dromara.warm.flow.ui.service.HandlerSelectService;
+import org.dromara.warm.flow.ui.vo.HandlerSelectVo;
+import org.dromara.workflow.common.ConditionalOnEnable;
+import org.dromara.workflow.common.enums.TaskAssigneeEnum;
+import org.dromara.workflow.service.IFlwTaskAssigneeService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 娴佺▼璁捐鍣�-鑾峰彇鍔炵悊浜烘潈闄愯缃垪琛�
+ *
+ * @author AprilWind
+ */
+@ConditionalOnEnable
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, HandlerSelectService {
+
+    private static final String DEFAULT_GROUP_NAME = "榛樿鍒嗙粍";
+    private final TaskAssigneeService taskAssigneeService;
+    private final UserService userService;
+    private final DeptService deptService;
+
+    /**
+     * 鑾峰彇鍔炵悊浜烘潈闄愯缃垪琛╰abs椤电
+     *
+     * @return tabs椤电
+     */
+    @Override
+    public List<String> getHandlerType() {
+        return TaskAssigneeEnum.getAssigneeTypeList();
+    }
+
+    /**
+     * 鑾峰彇鍔炵悊鍒楄〃, 鍚屾椂鏋勫缓宸︿晶閮ㄩ棬鏍戠姸缁撴瀯
+     *
+     * @param query 鏌ヨ鏉′欢
+     * @return HandlerSelectVo
+     */
+    @Override
+    public HandlerSelectVo getHandlerSelect(HandlerQuery query) {
+        // 鑾峰彇浠诲姟鍔炵悊绫诲瀷
+        TaskAssigneeEnum type = TaskAssigneeEnum.fromDesc(query.getHandlerType());
+        // 杞崲鏌ヨ鏉′欢涓� TaskAssigneeBody
+        TaskAssigneeBody taskQuery = BeanUtil.toBean(query, TaskAssigneeBody.class);
+
+        // 缁熶竴鏌ヨ骞舵瀯寤轰笟鍔℃暟鎹�
+        TaskAssigneeDTO dto = fetchTaskAssigneeData(type, taskQuery);
+        List<DeptDTO> depts = fetchDeptData(type);
+
+        return getHandlerSelectVo(buildHandlerData(dto, type), buildDeptTree(depts));
+    }
+
+    /**
+     * 鏍规嵁浠诲姟鍔炵悊绫诲瀷鏌ヨ瀵瑰簲鐨勬暟鎹�
+     */
+    private TaskAssigneeDTO fetchTaskAssigneeData(TaskAssigneeEnum type, TaskAssigneeBody taskQuery) {
+        return switch (type) {
+            case USER -> taskAssigneeService.selectUsersByTaskAssigneeList(taskQuery);
+            case ROLE -> taskAssigneeService.selectRolesByTaskAssigneeList(taskQuery);
+            case DEPT -> taskAssigneeService.selectDeptsByTaskAssigneeList(taskQuery);
+            case POST -> taskAssigneeService.selectPostsByTaskAssigneeList(taskQuery);
+            default -> throw new ServiceException("Unsupported handler type");
+        };
+    }
+
+    /**
+     * 鏍规嵁浠诲姟鍔炵悊绫诲瀷鑾峰彇閮ㄩ棬鏁版嵁
+     */
+    private List<DeptDTO> fetchDeptData(TaskAssigneeEnum type) {
+        if (type == TaskAssigneeEnum.USER || type == TaskAssigneeEnum.DEPT || type == TaskAssigneeEnum.POST) {
+            return deptService.selectDeptsByList();
+        }
+        return new ArrayList<>();
+    }
+
+    /**
+     * 鏋勫缓閮ㄩ棬鏍戠姸缁撴瀯
+     */
+    private TreeFunDto<DeptDTO> buildDeptTree(List<DeptDTO> depts) {
+        return new TreeFunDto<>(depts)
+            .setId(dept -> String.valueOf(dept.getDeptId()))
+            .setName(DeptDTO::getDeptName)
+            .setParentId(dept -> String.valueOf(dept.getParentId()));
+    }
+
+    /**
+     * 鏋勫缓浠诲姟鍔炵悊浜烘暟鎹�
+     */
+    private HandlerFunDto<TaskAssigneeDTO.TaskHandler> buildHandlerData(TaskAssigneeDTO dto, TaskAssigneeEnum type) {
+        return new HandlerFunDto<>(dto.getList(), dto.getTotal())
+            .setStorageId(assignee -> type.getCode() + assignee.getStorageId())
+            .setHandlerCode(assignee -> StringUtils.blankToDefault(assignee.getHandlerCode(), "鏃�"))
+            .setHandlerName(assignee -> StringUtils.blankToDefault(assignee.getHandlerName(), "鏃�"))
+            .setGroupName(assignee -> StringUtils.defaultIfBlank(
+                Optional.ofNullable(assignee.getGroupName())
+                    .map(deptService::selectDeptNameByIds)
+                    .orElse(DEFAULT_GROUP_NAME), DEFAULT_GROUP_NAME))
+            .setCreateTime(assignee -> DateUtils.parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, assignee.getCreateTime()));
+    }
+
+    /**
+     * 鏍规嵁瀛樺偍鏍囪瘑绗︼紙storageId锛夎В鏋愬垎閰嶇被鍨嬪拰ID锛屽苟鑾峰彇瀵瑰簲鐨勭敤鎴峰垪琛�
+     *
+     * @param storageId 鍖呭惈鍒嗛厤绫诲瀷鍜孖D鐨勫瓧绗︿覆锛堜緥濡� "user:123" 鎴� "role:456"锛�
+     * @return 涓庡垎閰嶇被鍨嬪拰ID鍖归厤鐨勭敤鎴峰垪琛紝濡傛灉鏍煎紡鏃犳晥鍒欒繑鍥炵┖鍒楄〃
+     */
+    @Override
+    public List<UserDTO> fetchUsersByStorageId(String storageId) {
+        List<UserDTO> list = new ArrayList<>();
+        for (String str : storageId.split(StrUtil.COMMA)) {
+            String[] parts = str.split(StrUtil.COLON, 2);
+            if (parts.length < 2) {
+                list.addAll(getUsersByType(TaskAssigneeEnum.USER, List.of(Long.valueOf(parts[0]))));
+            } else {
+                list.addAll(getUsersByType(TaskAssigneeEnum.fromCode(parts[0] + StrUtil.COLON), List.of(Long.valueOf(parts[1]))));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鐨勪换鍔″垎閰嶇被鍨嬶紙TaskAssigneeEnum锛夊拰 ID 鍒楄〃锛岃幏鍙栧搴旂殑鐢ㄦ埛淇℃伅鍒楄〃
+     *
+     * @param type 浠诲姟鍒嗛厤绫诲瀷锛岃〃绀虹敤鎴枫�佽鑹层�侀儴闂ㄦ垨鍏朵粬锛圱askAssigneeEnum 鏋氫妇鍊硷級
+     * @param ids  涓庢寚瀹氬垎閰嶇被鍨嬪叧鑱旂殑 ID 鍒楄〃锛堜緥濡傜敤鎴稩D銆佽鑹睮D銆侀儴闂↖D绛夛級
+     * @return 杩斿洖鍖呭惈鐢ㄦ埛淇℃伅鐨勫垪琛ㄣ�傚鏋滅被鍨嬩负鐢ㄦ埛锛圲SER锛夛紝鍒欓�氳繃鐢ㄦ埛ID鍒楄〃鏌ヨ锛�
+     * 濡傛灉绫诲瀷涓鸿鑹诧紙ROLE锛夛紝鍒欓�氳繃瑙掕壊ID鍒楄〃鏌ヨ锛�
+     * 濡傛灉绫诲瀷涓洪儴闂紙DEPT锛夛紝鍒欓�氳繃閮ㄩ棬ID鍒楄〃鏌ヨ锛�
+     * 濡傛灉绫诲瀷涓哄矖浣嶏紙POST锛夋垨鏃犳硶璇嗗埆鐨勭被鍨嬶紝鍒欒繑鍥炵┖鍒楄〃
+     */
+    private List<UserDTO> getUsersByType(TaskAssigneeEnum type, List<Long> ids) {
+        return switch (type) {
+            case USER -> userService.selectListByIds(ids);
+            case ROLE -> userService.selectUsersByRoleIds(ids);
+            case DEPT -> userService.selectUsersByDeptIds(ids);
+            case POST -> userService.selectUsersByPostIds(ids);
+        };
+    }
+
+}

--
Gitblit v1.9.3