¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | |
| | | /** |
| | | * è·ååç人æé设置å表tabsé¡µç¾ |
| | | * |
| | | * @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 å
å«åé
ç±»ååIDçå符串ï¼ä¾å¦ "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 ä»»å¡åé
ç±»åï¼è¡¨ç¤ºç¨æ·ãè§è²ãé¨é¨æå
¶ä»ï¼TaskAssigneeEnum æä¸¾å¼ï¼ |
| | | * @param ids 䏿å®åé
ç±»åå
³èç ID å表ï¼ä¾å¦ç¨æ·IDãè§è²IDãé¨é¨IDçï¼ |
| | | * @return è¿åå
å«ç¨æ·ä¿¡æ¯çå表ãå¦æç±»åä¸ºç¨æ·ï¼USERï¼ï¼åéè¿ç¨æ·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); |
| | | }; |
| | | } |
| | | |
| | | } |