update 优化 重构将 WorkflowUtils 工具类改为 FlwCommonService 更通用的业务处理
This commit is contained in:
parent
45eac02f4f
commit
b7517cbbd4
@ -0,0 +1,73 @@
|
|||||||
|
package org.dromara.workflow.service;
|
||||||
|
|
||||||
|
import org.dromara.warm.flow.core.entity.User;
|
||||||
|
import org.dromara.warm.flow.core.service.UserService;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用 工作流服务
|
||||||
|
*
|
||||||
|
* @author LionLi
|
||||||
|
*/
|
||||||
|
public interface IFlwCommonService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取工作流用户service
|
||||||
|
*/
|
||||||
|
UserService getFlowUserService();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建工作流用户
|
||||||
|
*
|
||||||
|
* @param userList 办理用户
|
||||||
|
* @param taskId 任务ID
|
||||||
|
* @return 用户
|
||||||
|
*/
|
||||||
|
Set<User> buildUser(List<User> userList, Long taskId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建工作流用户
|
||||||
|
*
|
||||||
|
* @param userIdList 办理用户
|
||||||
|
* @param taskId 任务ID
|
||||||
|
* @return 用户
|
||||||
|
*/
|
||||||
|
Set<User> buildFlowUser(List<String> userIdList, Long taskId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息
|
||||||
|
*
|
||||||
|
* @param flowName 流程定义名称
|
||||||
|
* @param messageType 消息类型
|
||||||
|
* @param message 消息内容,为空则发送默认配置的消息内容
|
||||||
|
*/
|
||||||
|
void sendMessage(String flowName, Long instId, List<String> messageType, String message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 驳回
|
||||||
|
*
|
||||||
|
* @param message 审批意见
|
||||||
|
* @param instanceId 流程实例id
|
||||||
|
* @param targetNodeCode 目标节点
|
||||||
|
* @param flowStatus 流程状态
|
||||||
|
* @param flowHisStatus 节点操作状态
|
||||||
|
*/
|
||||||
|
void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 申请人节点编码
|
||||||
|
*
|
||||||
|
* @param definitionId 流程定义id
|
||||||
|
* @return 申请人节点编码
|
||||||
|
*/
|
||||||
|
String applyNodeCode(Long definitionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除运行中的任务
|
||||||
|
*
|
||||||
|
* @param taskIds 任务id
|
||||||
|
*/
|
||||||
|
void deleteRunTask(List<Long> taskIds);
|
||||||
|
}
|
@ -1,15 +1,21 @@
|
|||||||
package org.dromara.workflow.utils;
|
package org.dromara.workflow.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import lombok.AccessLevel;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.domain.dto.UserDTO;
|
import org.dromara.common.core.domain.dto.UserDTO;
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
import org.dromara.common.mail.utils.MailUtils;
|
||||||
|
import org.dromara.common.sse.dto.SseMessageDto;
|
||||||
|
import org.dromara.common.sse.utils.SseMessageUtils;
|
||||||
import org.dromara.warm.flow.core.constant.ExceptionCons;
|
import org.dromara.warm.flow.core.constant.ExceptionCons;
|
||||||
import org.dromara.warm.flow.core.dto.FlowParams;
|
import org.dromara.warm.flow.core.dto.FlowParams;
|
||||||
import org.dromara.warm.flow.core.entity.Node;
|
import org.dromara.warm.flow.core.entity.Node;
|
||||||
|
import org.dromara.warm.flow.core.entity.Task;
|
||||||
import org.dromara.warm.flow.core.entity.User;
|
import org.dromara.warm.flow.core.entity.User;
|
||||||
import org.dromara.warm.flow.core.enums.NodeType;
|
import org.dromara.warm.flow.core.enums.NodeType;
|
||||||
import org.dromara.warm.flow.core.enums.SkipType;
|
import org.dromara.warm.flow.core.enums.SkipType;
|
||||||
@ -22,36 +28,44 @@ import org.dromara.warm.flow.orm.entity.FlowTask;
|
|||||||
import org.dromara.warm.flow.orm.entity.FlowUser;
|
import org.dromara.warm.flow.orm.entity.FlowUser;
|
||||||
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
|
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
|
||||||
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
||||||
|
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||||
|
import org.dromara.workflow.common.enums.MessageTypeEnum;
|
||||||
import org.dromara.workflow.common.enums.TaskAssigneeType;
|
import org.dromara.workflow.common.enums.TaskAssigneeType;
|
||||||
|
import org.dromara.workflow.service.IFlwCommonService;
|
||||||
import org.dromara.workflow.service.IFlwTaskAssigneeService;
|
import org.dromara.workflow.service.IFlwTaskAssigneeService;
|
||||||
import org.dromara.workflow.service.IFlwTaskService;
|
import org.dromara.workflow.service.IFlwTaskService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 工作流工具
|
* 工作流工具
|
||||||
*
|
*
|
||||||
* @author may
|
* @author LionLi
|
||||||
*/
|
*/
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
@ConditionalOnEnable
|
||||||
public class WorkflowUtils {
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class FlwCommonServiceImpl implements IFlwCommonService {
|
||||||
|
|
||||||
private static final IFlwTaskAssigneeService TASK_ASSIGNEE_SERVICE = SpringUtils.getBean(IFlwTaskAssigneeService.class);
|
private final FlowNodeMapper flowNodeMapper;
|
||||||
private static final IFlwTaskService FLW_TASK_SERVICE = SpringUtils.getBean(IFlwTaskService.class);
|
private final FlowTaskMapper flowTaskMapper;
|
||||||
private static final FlowNodeMapper FLOW_NODE_MAPPER = SpringUtils.getBean(FlowNodeMapper.class);
|
private final UserService userService;
|
||||||
private static final FlowTaskMapper FLOW_TASK_MAPPER = SpringUtils.getBean(FlowTaskMapper.class);
|
private final TaskService taskService;
|
||||||
private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class);
|
private final NodeService nodeService;
|
||||||
private static final TaskService TASK_SERVICE = SpringUtils.getBean(TaskService.class);
|
|
||||||
private static final NodeService NODE_SERVICE = SpringUtils.getBean(NodeService.class);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取工作流用户service
|
* 获取工作流用户service
|
||||||
*/
|
*/
|
||||||
public static UserService getFlowUserService() {
|
@Override
|
||||||
return USER_SERVICE;
|
public UserService getFlowUserService() {
|
||||||
|
return userService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -61,15 +75,17 @@ public class WorkflowUtils {
|
|||||||
* @param taskId 任务ID
|
* @param taskId 任务ID
|
||||||
* @return 用户
|
* @return 用户
|
||||||
*/
|
*/
|
||||||
public static Set<User> buildUser(List<User> userList, Long taskId) {
|
@Override
|
||||||
|
public Set<User> buildUser(List<User> userList, Long taskId) {
|
||||||
if (CollUtil.isEmpty(userList)) {
|
if (CollUtil.isEmpty(userList)) {
|
||||||
return Set.of();
|
return Set.of();
|
||||||
}
|
}
|
||||||
Set<User> list = new HashSet<>();
|
Set<User> list = new HashSet<>();
|
||||||
Set<String> processedBySet = new HashSet<>();
|
Set<String> processedBySet = new HashSet<>();
|
||||||
|
IFlwTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IFlwTaskAssigneeService.class);
|
||||||
for (User user : userList) {
|
for (User user : userList) {
|
||||||
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
|
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
|
||||||
List<UserDTO> users = TASK_ASSIGNEE_SERVICE.fetchUsersByStorageId(user.getProcessedBy());
|
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy());
|
||||||
// 转换为 FlowUser 并添加到结果集合
|
// 转换为 FlowUser 并添加到结果集合
|
||||||
if (CollUtil.isNotEmpty(users)) {
|
if (CollUtil.isNotEmpty(users)) {
|
||||||
users.forEach(dto -> {
|
users.forEach(dto -> {
|
||||||
@ -95,7 +111,8 @@ public class WorkflowUtils {
|
|||||||
* @param taskId 任务ID
|
* @param taskId 任务ID
|
||||||
* @return 用户
|
* @return 用户
|
||||||
*/
|
*/
|
||||||
public static Set<User> buildFlowUser(List<String> userIdList, Long taskId) {
|
@Override
|
||||||
|
public Set<User> buildFlowUser(List<String> userIdList, Long taskId) {
|
||||||
if (CollUtil.isEmpty(userIdList)) {
|
if (CollUtil.isEmpty(userIdList)) {
|
||||||
return Set.of();
|
return Set.of();
|
||||||
}
|
}
|
||||||
@ -114,6 +131,52 @@ public class WorkflowUtils {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息
|
||||||
|
*
|
||||||
|
* @param flowName 流程定义名称
|
||||||
|
* @param messageType 消息类型
|
||||||
|
* @param message 消息内容,为空则发送默认配置的消息内容
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
|
||||||
|
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
|
||||||
|
List<UserDTO> userList = new ArrayList<>();
|
||||||
|
List<FlowTask> list = flwTaskService.selectByInstId(instId);
|
||||||
|
if (StringUtils.isBlank(message)) {
|
||||||
|
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
|
||||||
|
}
|
||||||
|
for (Task task : list) {
|
||||||
|
List<UserDTO> users = flwTaskService.currentTaskAllUser(task.getId());
|
||||||
|
if (CollUtil.isNotEmpty(users)) {
|
||||||
|
userList.addAll(users);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(userList)) {
|
||||||
|
for (String code : messageType) {
|
||||||
|
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
|
||||||
|
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
|
||||||
|
switch (messageTypeEnum) {
|
||||||
|
case SYSTEM_MESSAGE:
|
||||||
|
SseMessageDto dto = new SseMessageDto();
|
||||||
|
dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList()));
|
||||||
|
dto.setMessage(message);
|
||||||
|
SseMessageUtils.publishMessage(dto);
|
||||||
|
break;
|
||||||
|
case EMAIL_MESSAGE:
|
||||||
|
MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message);
|
||||||
|
break;
|
||||||
|
case SMS_MESSAGE:
|
||||||
|
//todo 短信发送
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 驳回
|
* 驳回
|
||||||
*
|
*
|
||||||
@ -123,8 +186,10 @@ public class WorkflowUtils {
|
|||||||
* @param flowStatus 流程状态
|
* @param flowStatus 流程状态
|
||||||
* @param flowHisStatus 节点操作状态
|
* @param flowHisStatus 节点操作状态
|
||||||
*/
|
*/
|
||||||
public static void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
|
@Override
|
||||||
List<FlowTask> list = FLW_TASK_SERVICE.selectByInstId(instanceId);
|
public void backTask(String message, Long instanceId, String targetNodeCode, String flowStatus, String flowHisStatus) {
|
||||||
|
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
|
||||||
|
List<FlowTask> list = flwTaskService.selectByInstId(instanceId);
|
||||||
if (CollUtil.isNotEmpty(list)) {
|
if (CollUtil.isNotEmpty(list)) {
|
||||||
List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
|
List<FlowTask> tasks = StreamUtils.filter(list, e -> e.getNodeCode().equals(targetNodeCode));
|
||||||
if (list.size() == tasks.size()) {
|
if (list.size() == tasks.size()) {
|
||||||
@ -132,7 +197,7 @@ public class WorkflowUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (FlowTask task : list) {
|
for (FlowTask task : list) {
|
||||||
List<UserDTO> userList = FLW_TASK_SERVICE.currentTaskAllUser(task.getId());
|
List<UserDTO> userList = flwTaskService.currentTaskAllUser(task.getId());
|
||||||
FlowParams flowParams = FlowParams.build();
|
FlowParams flowParams = FlowParams.build();
|
||||||
flowParams.nodeCode(targetNodeCode);
|
flowParams.nodeCode(targetNodeCode);
|
||||||
flowParams.message(message);
|
flowParams.message(message);
|
||||||
@ -143,7 +208,7 @@ public class WorkflowUtils {
|
|||||||
if (CollUtil.isNotEmpty(userList)) {
|
if (CollUtil.isNotEmpty(userList)) {
|
||||||
flowParams.handler(userList.get(0).getUserId().toString());
|
flowParams.handler(userList.get(0).getUserId().toString());
|
||||||
}
|
}
|
||||||
TASK_SERVICE.skip(task.getId(), flowParams);
|
taskService.skip(task.getId(), flowParams);
|
||||||
}
|
}
|
||||||
//解决会签多人审批问题
|
//解决会签多人审批问题
|
||||||
backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
|
backTask(message, instanceId, targetNodeCode, flowStatus, flowHisStatus);
|
||||||
@ -155,13 +220,14 @@ public class WorkflowUtils {
|
|||||||
* @param definitionId 流程定义id
|
* @param definitionId 流程定义id
|
||||||
* @return 申请人节点编码
|
* @return 申请人节点编码
|
||||||
*/
|
*/
|
||||||
public static String applyNodeCode(Long definitionId) {
|
@Override
|
||||||
|
public String applyNodeCode(Long definitionId) {
|
||||||
//获取已发布的流程节点
|
//获取已发布的流程节点
|
||||||
List<FlowNode> flowNodes = FLOW_NODE_MAPPER.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
|
List<FlowNode> flowNodes = flowNodeMapper.selectList(new LambdaQueryWrapper<FlowNode>().eq(FlowNode::getDefinitionId, definitionId));
|
||||||
AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
|
AssertUtil.isTrue(CollUtil.isEmpty(flowNodes), ExceptionCons.NOT_PUBLISH_NODE);
|
||||||
Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
|
Node startNode = flowNodes.stream().filter(t -> NodeType.isStart(t.getNodeType())).findFirst().orElse(null);
|
||||||
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
|
AssertUtil.isNull(startNode, ExceptionCons.LOST_START_NODE);
|
||||||
Node nextNode = NODE_SERVICE.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
|
Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey());
|
||||||
return nextNode.getNodeCode();
|
return nextNode.getNodeCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,11 +236,12 @@ public class WorkflowUtils {
|
|||||||
*
|
*
|
||||||
* @param taskIds 任务id
|
* @param taskIds 任务id
|
||||||
*/
|
*/
|
||||||
public static void deleteRunTask(List<Long> taskIds) {
|
@Override
|
||||||
|
public void deleteRunTask(List<Long> taskIds) {
|
||||||
if (CollUtil.isEmpty(taskIds)) {
|
if (CollUtil.isEmpty(taskIds)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
USER_SERVICE.deleteByTaskIds(taskIds);
|
userService.deleteByTaskIds(taskIds);
|
||||||
FLOW_TASK_MAPPER.deleteByIds(taskIds);
|
flowTaskMapper.deleteByIds(taskIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -33,8 +33,8 @@ import org.dromara.workflow.common.constant.FlowConstant;
|
|||||||
import org.dromara.workflow.domain.FlowCategory;
|
import org.dromara.workflow.domain.FlowCategory;
|
||||||
import org.dromara.workflow.domain.vo.FlowDefinitionVo;
|
import org.dromara.workflow.domain.vo.FlowDefinitionVo;
|
||||||
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
||||||
|
import org.dromara.workflow.service.IFlwCommonService;
|
||||||
import org.dromara.workflow.service.IFlwDefinitionService;
|
import org.dromara.workflow.service.IFlwDefinitionService;
|
||||||
import org.dromara.workflow.utils.WorkflowUtils;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
@ -64,6 +64,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
|
|||||||
private final FlowNodeMapper flowNodeMapper;
|
private final FlowNodeMapper flowNodeMapper;
|
||||||
private final FlowSkipMapper flowSkipMapper;
|
private final FlowSkipMapper flowSkipMapper;
|
||||||
private final FlwCategoryMapper flwCategoryMapper;
|
private final FlwCategoryMapper flwCategoryMapper;
|
||||||
|
private final IFlwCommonService flwCommonService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询流程定义列表
|
* 查询流程定义列表
|
||||||
@ -125,7 +126,7 @@ public class FlwDefinitionServiceImpl implements IFlwDefinitionService {
|
|||||||
List<String> errorMsg = new ArrayList<>();
|
List<String> errorMsg = new ArrayList<>();
|
||||||
if (CollUtil.isNotEmpty(flowNodes)) {
|
if (CollUtil.isNotEmpty(flowNodes)) {
|
||||||
for (FlowNode flowNode : flowNodes) {
|
for (FlowNode flowNode : flowNodes) {
|
||||||
String applyNodeCode = WorkflowUtils.applyNodeCode(id);
|
String applyNodeCode = flwCommonService.applyNodeCode(id);
|
||||||
if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) {
|
if (StringUtils.isBlank(flowNode.getPermissionFlag()) && !applyNodeCode.equals(flowNode.getNodeCode()) && NodeType.BETWEEN.getKey().equals(flowNode.getNodeType())) {
|
||||||
errorMsg.add(flowNode.getNodeName());
|
errorMsg.add(flowNode.getNodeName());
|
||||||
}
|
}
|
||||||
|
@ -46,9 +46,9 @@ import org.dromara.workflow.domain.vo.FlowVariableVo;
|
|||||||
import org.dromara.workflow.handler.FlowProcessEventHandler;
|
import org.dromara.workflow.handler.FlowProcessEventHandler;
|
||||||
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
||||||
import org.dromara.workflow.mapper.FlwInstanceMapper;
|
import org.dromara.workflow.mapper.FlwInstanceMapper;
|
||||||
|
import org.dromara.workflow.service.IFlwCommonService;
|
||||||
import org.dromara.workflow.service.IFlwInstanceService;
|
import org.dromara.workflow.service.IFlwInstanceService;
|
||||||
import org.dromara.workflow.service.IFlwTaskService;
|
import org.dromara.workflow.service.IFlwTaskService;
|
||||||
import org.dromara.workflow.utils.WorkflowUtils;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@ -76,6 +76,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
|||||||
private final IFlwTaskService flwTaskService;
|
private final IFlwTaskService flwTaskService;
|
||||||
private final FlwInstanceMapper flwInstanceMapper;
|
private final FlwInstanceMapper flwInstanceMapper;
|
||||||
private final FlwCategoryMapper flwCategoryMapper;
|
private final FlwCategoryMapper flwCategoryMapper;
|
||||||
|
private final IFlwCommonService flwCommonService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询正在运行的流程实例
|
* 分页查询正在运行的流程实例
|
||||||
@ -245,15 +246,15 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
|
|||||||
}
|
}
|
||||||
String message = bo.getMessage();
|
String message = bo.getMessage();
|
||||||
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
|
BusinessStatusEnum.checkCancelStatus(instance.getFlowStatus());
|
||||||
String applyNodeCode = WorkflowUtils.applyNodeCode(definition.getId());
|
String applyNodeCode = flwCommonService.applyNodeCode(definition.getId());
|
||||||
//撤销
|
//撤销
|
||||||
WorkflowUtils.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
|
flwCommonService.backTask(message, instance.getId(), applyNodeCode, BusinessStatusEnum.CANCEL.getStatus(), BusinessStatusEnum.CANCEL.getStatus());
|
||||||
//判断或签节点是否有多个,只保留一个
|
//判断或签节点是否有多个,只保留一个
|
||||||
List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
|
List<Task> currentTaskList = taskService.list(FlowEngine.newTask().setInstanceId(instance.getId()));
|
||||||
if (CollUtil.isNotEmpty(currentTaskList)) {
|
if (CollUtil.isNotEmpty(currentTaskList)) {
|
||||||
if (currentTaskList.size() > 1) {
|
if (currentTaskList.size() > 1) {
|
||||||
currentTaskList.remove(0);
|
currentTaskList.remove(0);
|
||||||
WorkflowUtils.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
|
flwCommonService.deleteRunTask(StreamUtils.toList(currentTaskList, Task::getId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,12 +22,9 @@ import org.dromara.common.core.utils.StringUtils;
|
|||||||
import org.dromara.common.core.utils.ValidatorUtils;
|
import org.dromara.common.core.utils.ValidatorUtils;
|
||||||
import org.dromara.common.core.validate.AddGroup;
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
import org.dromara.common.core.validate.EditGroup;
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
import org.dromara.common.mail.utils.MailUtils;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.sse.dto.SseMessageDto;
|
|
||||||
import org.dromara.common.sse.utils.SseMessageUtils;
|
|
||||||
import org.dromara.warm.flow.core.dto.FlowParams;
|
import org.dromara.warm.flow.core.dto.FlowParams;
|
||||||
import org.dromara.warm.flow.core.entity.*;
|
import org.dromara.warm.flow.core.entity.*;
|
||||||
import org.dromara.warm.flow.core.enums.NodeType;
|
import org.dromara.warm.flow.core.enums.NodeType;
|
||||||
@ -41,7 +38,6 @@ import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
|
|||||||
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
|
import org.dromara.warm.flow.orm.mapper.FlowNodeMapper;
|
||||||
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
import org.dromara.warm.flow.orm.mapper.FlowTaskMapper;
|
||||||
import org.dromara.workflow.common.ConditionalOnEnable;
|
import org.dromara.workflow.common.ConditionalOnEnable;
|
||||||
import org.dromara.workflow.common.enums.MessageTypeEnum;
|
|
||||||
import org.dromara.workflow.common.enums.TaskAssigneeType;
|
import org.dromara.workflow.common.enums.TaskAssigneeType;
|
||||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.bo.*;
|
import org.dromara.workflow.domain.bo.*;
|
||||||
@ -51,9 +47,9 @@ import org.dromara.workflow.handler.FlowProcessEventHandler;
|
|||||||
import org.dromara.workflow.handler.WorkflowPermissionHandler;
|
import org.dromara.workflow.handler.WorkflowPermissionHandler;
|
||||||
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
import org.dromara.workflow.mapper.FlwCategoryMapper;
|
||||||
import org.dromara.workflow.mapper.FlwTaskMapper;
|
import org.dromara.workflow.mapper.FlwTaskMapper;
|
||||||
|
import org.dromara.workflow.service.IFlwCommonService;
|
||||||
import org.dromara.workflow.service.IFlwTaskAssigneeService;
|
import org.dromara.workflow.service.IFlwTaskAssigneeService;
|
||||||
import org.dromara.workflow.service.IFlwTaskService;
|
import org.dromara.workflow.service.IFlwTaskService;
|
||||||
import org.dromara.workflow.utils.WorkflowUtils;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@ -89,6 +85,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
private final FlwCategoryMapper flwCategoryMapper;
|
private final FlwCategoryMapper flwCategoryMapper;
|
||||||
private final FlowNodeMapper flowNodeMapper;
|
private final FlowNodeMapper flowNodeMapper;
|
||||||
private final IFlwTaskAssigneeService flwTaskAssigneeService;
|
private final IFlwTaskAssigneeService flwTaskAssigneeService;
|
||||||
|
private final IFlwCommonService flwCommonService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动任务
|
* 启动任务
|
||||||
@ -182,7 +179,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
Instance instance = taskService.skip(taskId, flowParams);
|
Instance instance = taskService.skip(taskId, flowParams);
|
||||||
this.setHandler(instance, flowTask, flowCopyList);
|
this.setHandler(instance, flowTask, flowCopyList);
|
||||||
// 消息通知
|
// 消息通知
|
||||||
this.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
|
flwCommonService.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
|
||||||
//设置下一环节处理人
|
//设置下一环节处理人
|
||||||
setNextHandler(ins.getId());
|
setNextHandler(ins.getId());
|
||||||
return true;
|
return true;
|
||||||
@ -205,10 +202,10 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
if (variableMap != null && variableMap.containsKey(task.getNodeCode())) {
|
if (variableMap != null && variableMap.containsKey(task.getNodeCode())) {
|
||||||
String userIds = variableMap.get(task.getNodeCode()).toString();
|
String userIds = variableMap.get(task.getNodeCode()).toString();
|
||||||
// 批量删除现有任务的办理人记录
|
// 批量删除现有任务的办理人记录
|
||||||
WorkflowUtils.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
|
flwCommonService.getFlowUserService().deleteByTaskIds(List.of(task.getId()));
|
||||||
// 批量新增任务办理人记录
|
// 批量新增任务办理人记录
|
||||||
Set<User> users = WorkflowUtils.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
|
Set<User> users = flwCommonService.buildFlowUser(List.of(userIds.split(StringUtils.SEPARATOR)), task.getId());
|
||||||
WorkflowUtils.getFlowUserService().saveBatch(new ArrayList<>(users));
|
flwCommonService.getFlowUserService().saveBatch(new ArrayList<>(users));
|
||||||
variableMap.remove(task.getNodeCode());
|
variableMap.remove(task.getNodeCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,7 +263,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
}
|
}
|
||||||
List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId);
|
List<Long> taskIdList = StreamUtils.toList(flowTasks, FlowTask::getId);
|
||||||
// 获取与当前任务关联的用户列表
|
// 获取与当前任务关联的用户列表
|
||||||
List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
|
List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
|
||||||
if (CollUtil.isEmpty(associatedUsers)) {
|
if (CollUtil.isEmpty(associatedUsers)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -275,16 +272,16 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
for (FlowTask flowTask : flowTasks) {
|
for (FlowTask flowTask : flowTasks) {
|
||||||
List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId()));
|
List<User> users = StreamUtils.filter(associatedUsers, user -> Objects.equals(user.getAssociated(), flowTask.getId()));
|
||||||
if (CollUtil.isNotEmpty(users)) {
|
if (CollUtil.isNotEmpty(users)) {
|
||||||
userList.addAll(WorkflowUtils.buildUser(users, flowTask.getId()));
|
userList.addAll(flwCommonService.buildUser(users, flowTask.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 批量删除现有任务的办理人记录
|
// 批量删除现有任务的办理人记录
|
||||||
WorkflowUtils.getFlowUserService().deleteByTaskIds(taskIdList);
|
flwCommonService.getFlowUserService().deleteByTaskIds(taskIdList);
|
||||||
// 确保要保存的 userList 不为空
|
// 确保要保存的 userList 不为空
|
||||||
if (CollUtil.isEmpty(userList)) {
|
if (CollUtil.isEmpty(userList)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
WorkflowUtils.getFlowUserService().saveBatch(userList);
|
flwCommonService.getFlowUserService().saveBatch(userList);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -324,7 +321,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
return flowUser;
|
return flowUser;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
// 批量保存抄送人员
|
// 批量保存抄送人员
|
||||||
WorkflowUtils.getFlowUserService().saveBatch(userList);
|
flwCommonService.getFlowUserService().saveBatch(userList);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -452,7 +449,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
|
BusinessStatusEnum.checkBackStatus(inst.getFlowStatus());
|
||||||
Long definitionId = task.getDefinitionId();
|
Long definitionId = task.getDefinitionId();
|
||||||
Definition definition = defService.getById(definitionId);
|
Definition definition = defService.getById(definitionId);
|
||||||
String applyNodeCode = WorkflowUtils.applyNodeCode(definitionId);
|
String applyNodeCode = flwCommonService.applyNodeCode(definitionId);
|
||||||
FlowParams flowParams = FlowParams.build();
|
FlowParams flowParams = FlowParams.build();
|
||||||
flowParams.nodeCode(bo.getNodeCode());
|
flowParams.nodeCode(bo.getNodeCode());
|
||||||
flowParams.message(message);
|
flowParams.message(message);
|
||||||
@ -465,7 +462,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
Instance instance = insService.getById(inst.getId());
|
Instance instance = insService.getById(inst.getId());
|
||||||
this.setHandler(instance, task, null);
|
this.setHandler(instance, task, null);
|
||||||
// 消息通知
|
// 消息通知
|
||||||
this.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
|
flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
@ -565,7 +562,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
}
|
}
|
||||||
flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
|
flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
|
||||||
flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
|
flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
|
||||||
flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(WorkflowUtils.applyNodeCode(task.getDefinitionId())));
|
flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(flwCommonService.applyNodeCode(task.getDefinitionId())));
|
||||||
return flowTaskVo;
|
return flowTaskVo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -737,7 +734,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
|
List<FlowTask> flowTasks = this.selectByIdList(taskIdList);
|
||||||
// 批量删除现有任务的办理人记录
|
// 批量删除现有任务的办理人记录
|
||||||
if (CollUtil.isNotEmpty(flowTasks)) {
|
if (CollUtil.isNotEmpty(flowTasks)) {
|
||||||
WorkflowUtils.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
|
flwCommonService.getFlowUserService().deleteByTaskIds(StreamUtils.toList(flowTasks, FlowTask::getId));
|
||||||
List<User> userList = flowTasks.stream()
|
List<User> userList = flowTasks.stream()
|
||||||
.map(flowTask -> {
|
.map(flowTask -> {
|
||||||
FlowUser flowUser = new FlowUser();
|
FlowUser flowUser = new FlowUser();
|
||||||
@ -748,7 +745,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
})
|
})
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
if (CollUtil.isNotEmpty(userList)) {
|
if (CollUtil.isNotEmpty(userList)) {
|
||||||
WorkflowUtils.getFlowUserService().saveBatch(userList);
|
flwCommonService.getFlowUserService().saveBatch(userList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -767,7 +764,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
|
public Map<Long, List<UserDTO>> currentTaskAllUser(List<Long> taskIdList) {
|
||||||
Map<Long, List<UserDTO>> map = new HashMap<>();
|
Map<Long, List<UserDTO>> map = new HashMap<>();
|
||||||
// 获取与当前任务关联的用户列表
|
// 获取与当前任务关联的用户列表
|
||||||
List<User> associatedUsers = WorkflowUtils.getFlowUserService().getByAssociateds(taskIdList);
|
List<User> associatedUsers = flwCommonService.getFlowUserService().getByAssociateds(taskIdList);
|
||||||
Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
|
Map<Long, List<User>> listMap = StreamUtils.groupByKey(associatedUsers, User::getAssociated);
|
||||||
for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
|
for (Map.Entry<Long, List<User>> entry : listMap.entrySet()) {
|
||||||
List<User> value = entry.getValue();
|
List<User> value = entry.getValue();
|
||||||
@ -787,7 +784,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
@Override
|
@Override
|
||||||
public List<UserDTO> currentTaskAllUser(Long taskId) {
|
public List<UserDTO> currentTaskAllUser(Long taskId) {
|
||||||
// 获取与当前任务关联的用户列表
|
// 获取与当前任务关联的用户列表
|
||||||
List<User> userList = WorkflowUtils.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
|
List<User> userList = flwCommonService.getFlowUserService().getByAssociateds(Collections.singletonList(taskId));
|
||||||
if (CollUtil.isEmpty(userList)) {
|
if (CollUtil.isEmpty(userList)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
@ -807,48 +804,4 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
|
|||||||
.eq(FlowNode::getDefinitionId, definitionId));
|
.eq(FlowNode::getDefinitionId, definitionId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 发送消息
|
|
||||||
*
|
|
||||||
* @param flowName 流程定义名称
|
|
||||||
* @param messageType 消息类型
|
|
||||||
* @param message 消息内容,为空则发送默认配置的消息内容
|
|
||||||
*/
|
|
||||||
public void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
|
|
||||||
List<UserDTO> userList = new ArrayList<>();
|
|
||||||
List<FlowTask> list = this.selectByInstId(instId);
|
|
||||||
if (StringUtils.isBlank(message)) {
|
|
||||||
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
|
|
||||||
}
|
|
||||||
for (Task task : list) {
|
|
||||||
List<UserDTO> users = this.currentTaskAllUser(task.getId());
|
|
||||||
if (CollUtil.isNotEmpty(users)) {
|
|
||||||
userList.addAll(users);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (CollUtil.isNotEmpty(userList)) {
|
|
||||||
for (String code : messageType) {
|
|
||||||
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
|
|
||||||
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
|
|
||||||
switch (messageTypeEnum) {
|
|
||||||
case SYSTEM_MESSAGE:
|
|
||||||
SseMessageDto dto = new SseMessageDto();
|
|
||||||
dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList()));
|
|
||||||
dto.setMessage(message);
|
|
||||||
SseMessageUtils.publishMessage(dto);
|
|
||||||
break;
|
|
||||||
case EMAIL_MESSAGE:
|
|
||||||
MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), "单据审批提醒", message);
|
|
||||||
break;
|
|
||||||
case SMS_MESSAGE:
|
|
||||||
//todo 短信发送
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new IllegalStateException("Unexpected value: " + messageTypeEnum);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user