add 添加消息发送
This commit is contained in:
parent
fecb3b7302
commit
f789ecf418
@ -11,6 +11,7 @@ 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.web.core.BaseController;
|
import org.dromara.common.web.core.BaseController;
|
||||||
import org.dromara.warm.flow.core.entity.HisTask;
|
import org.dromara.warm.flow.core.entity.HisTask;
|
||||||
|
import org.dromara.warm.flow.orm.entity.FlowHisTask;
|
||||||
import org.dromara.workflow.domain.bo.*;
|
import org.dromara.workflow.domain.bo.*;
|
||||||
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
|
import org.dromara.workflow.domain.vo.FlowHisTaskVo;
|
||||||
import org.dromara.workflow.domain.vo.FlowTaskVo;
|
import org.dromara.workflow.domain.vo.FlowTaskVo;
|
||||||
@ -182,7 +183,7 @@ public class FlwTaskController extends BaseController {
|
|||||||
* @param instanceId 实例id
|
* @param instanceId 实例id
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getBackTaskNode/{instanceId}")
|
@GetMapping("/getBackTaskNode/{instanceId}")
|
||||||
public R<List<HisTask>> getBackTaskNode(@PathVariable String instanceId) {
|
public R<List<FlowHisTask>> getBackTaskNode(@PathVariable String instanceId) {
|
||||||
return R.ok(flwTaskService.getBackTaskNode(instanceId));
|
return R.ok(flwTaskService.getBackTaskNode(instanceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,11 @@ public class BackProcessBo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通知
|
||||||
|
*/
|
||||||
|
private String notice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程变量
|
* 流程变量
|
||||||
*/
|
*/
|
||||||
|
@ -49,6 +49,11 @@ public class CompleteTaskBo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息通知
|
||||||
|
*/
|
||||||
|
private String notice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程变量
|
* 流程变量
|
||||||
*/
|
*/
|
||||||
|
@ -43,6 +43,7 @@ public class FlowProcessEventHandler {
|
|||||||
* @param businessKey 业务id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessKey) {
|
public void processTaskHandler(String flowCode, String nodeCode, Long taskId, String businessKey) {
|
||||||
|
log.info("发布流程任务事件, 流程编码: {}, 业务ID: {}", flowCode, businessKey);
|
||||||
ProcessTaskEvent processTaskEvent = new ProcessTaskEvent();
|
ProcessTaskEvent processTaskEvent = new ProcessTaskEvent();
|
||||||
processTaskEvent.setFlowCode(flowCode);
|
processTaskEvent.setFlowCode(flowCode);
|
||||||
processTaskEvent.setNodeCode(nodeCode);
|
processTaskEvent.setNodeCode(nodeCode);
|
||||||
|
@ -14,6 +14,7 @@ import org.dromara.warm.flow.orm.entity.FlowTask;
|
|||||||
import org.dromara.workflow.handler.FlowProcessEventHandler;
|
import org.dromara.workflow.handler.FlowProcessEventHandler;
|
||||||
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.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -105,7 +105,7 @@ public interface IFlwTaskService {
|
|||||||
* @param instanceId 实例id
|
* @param instanceId 实例id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
List<HisTask> getBackTaskNode(String instanceId);
|
List<FlowHisTask> getBackTaskNode(String instanceId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 终止任务
|
* 终止任务
|
||||||
|
@ -130,6 +130,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService {
|
|||||||
try {
|
try {
|
||||||
// 获取任务ID并查询对应的流程任务和实例信息
|
// 获取任务ID并查询对应的流程任务和实例信息
|
||||||
Long taskId = completeTaskBo.getTaskId();
|
Long taskId = completeTaskBo.getTaskId();
|
||||||
|
List<String> messageType = completeTaskBo.getMessageType();
|
||||||
|
String notice = completeTaskBo.getNotice();
|
||||||
// 获取抄送人
|
// 获取抄送人
|
||||||
List<WfCopy> wfCopyList = completeTaskBo.getWfCopyList();
|
List<WfCopy> wfCopyList = completeTaskBo.getWfCopyList();
|
||||||
FlowTask flowTask = flowTaskMapper.selectById(taskId);
|
FlowTask flowTask = flowTaskMapper.selectById(taskId);
|
||||||
@ -150,6 +152,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService {
|
|||||||
flowParams.hisTaskExt(completeTaskBo.getFileId());
|
flowParams.hisTaskExt(completeTaskBo.getFileId());
|
||||||
// 执行任务跳转,并根据返回的处理人设置下一步处理人
|
// 执行任务跳转,并根据返回的处理人设置下一步处理人
|
||||||
setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList);
|
setHandler(taskService.skip(taskId, flowParams), flowTask, wfCopyList);
|
||||||
|
//消息通知
|
||||||
|
WorkflowUtils.sendMessage(definition.getFlowName(), ins.getId(), messageType, notice);
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
@ -323,11 +327,14 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService {
|
|||||||
public boolean backProcess(BackProcessBo bo) {
|
public boolean backProcess(BackProcessBo bo) {
|
||||||
try {
|
try {
|
||||||
Long taskId = bo.getTaskId();
|
Long taskId = bo.getTaskId();
|
||||||
|
String notice = bo.getNotice();
|
||||||
|
List<String> messageType = bo.getMessageType();
|
||||||
List<FlowTask> flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId));
|
List<FlowTask> flowTasks = flowTaskMapper.selectList(new LambdaQueryWrapper<>(FlowTask.class).eq(FlowTask::getId, taskId));
|
||||||
if (CollUtil.isEmpty(flowTasks)) {
|
if (CollUtil.isEmpty(flowTasks)) {
|
||||||
throw new ServiceException("任务不存在!");
|
throw new ServiceException("任务不存在!");
|
||||||
}
|
}
|
||||||
Long definitionId = flowTasks.get(0).getDefinitionId();
|
Long definitionId = flowTasks.get(0).getDefinitionId();
|
||||||
|
Definition definition = defService.getById(definitionId);
|
||||||
List<FlowSkip> flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId));
|
List<FlowSkip> flowSkips = flowSkipMapper.selectList(new LambdaQueryWrapper<>(FlowSkip.class).eq(FlowSkip::getDefinitionId, definitionId));
|
||||||
FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType()));
|
FlowSkip flowSkip = StreamUtils.findFirst(flowSkips, e -> NodeType.START.getKey().equals(e.getNowNodeType()));
|
||||||
//开始节点的下一节点
|
//开始节点的下一节点
|
||||||
@ -347,6 +354,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService {
|
|||||||
flowParams.nodeCode(bo.getNodeCode());
|
flowParams.nodeCode(bo.getNodeCode());
|
||||||
Instance instance = taskService.skip(taskId, flowParams);
|
Instance instance = taskService.skip(taskId, flowParams);
|
||||||
setHandler(instance, flowTasks.get(0), null);
|
setHandler(instance, flowTasks.get(0), null);
|
||||||
|
//消息通知
|
||||||
|
WorkflowUtils.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);
|
||||||
@ -360,20 +369,24 @@ public class FlwTaskServiceImpl implements IFlwTaskService, AssigneeService {
|
|||||||
* @param instanceId 实例id
|
* @param instanceId 实例id
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<HisTask> getBackTaskNode(String instanceId) {
|
public List<FlowHisTask> getBackTaskNode(String instanceId) {
|
||||||
// 创建查询条件,查询历史任务记录
|
// 创建查询条件,查询历史任务记录
|
||||||
LambdaQueryWrapper<FlowHisTask> lw = new LambdaQueryWrapper<>(FlowHisTask.class)
|
LambdaQueryWrapper<FlowHisTask> lw = new LambdaQueryWrapper<>(FlowHisTask.class)
|
||||||
|
.select(FlowHisTask::getNodeCode, FlowHisTask::getNodeName)
|
||||||
.eq(FlowHisTask::getInstanceId, instanceId)
|
.eq(FlowHisTask::getInstanceId, instanceId)
|
||||||
.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey())
|
.eq(FlowHisTask::getNodeType, NodeType.BETWEEN.getKey())
|
||||||
.orderByDesc(FlowHisTask::getCreateTime);
|
.orderByDesc(FlowHisTask::getCreateTime);
|
||||||
|
|
||||||
List<FlowHisTask> flowHisTasks = flowHisTaskMapper.selectList(lw);
|
List<FlowHisTask> flowHisTasks = flowHisTaskMapper.selectList(lw);
|
||||||
if (CollUtil.isEmpty(flowHisTasks)) {
|
if (CollUtil.isEmpty(flowHisTasks)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
// 直接返回去重后的列表
|
return new ArrayList<>(flowHisTasks.stream()
|
||||||
return flowHisTasks.stream()
|
.collect(Collectors.toMap(
|
||||||
.distinct()
|
FlowHisTask::getNodeCode,
|
||||||
.collect(Collectors.toList());
|
task -> task,
|
||||||
|
(existing, replacement) -> existing
|
||||||
|
)).values());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,12 +1,22 @@
|
|||||||
package org.dromara.workflow.utils;
|
package org.dromara.workflow.utils;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
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.StringUtils;
|
||||||
|
import org.dromara.common.mail.utils.MailUtils;
|
||||||
|
import org.dromara.common.websocket.dto.WebSocketMessageDto;
|
||||||
|
import org.dromara.common.websocket.utils.WebSocketUtils;
|
||||||
|
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.orm.entity.FlowTask;
|
||||||
import org.dromara.warm.flow.orm.entity.FlowUser;
|
import org.dromara.warm.flow.orm.entity.FlowUser;
|
||||||
|
import org.dromara.workflow.common.enums.MessageTypeEnum;
|
||||||
|
import org.dromara.workflow.service.IFlwTaskService;
|
||||||
import org.dromara.workflow.service.IWfTaskAssigneeService;
|
import org.dromara.workflow.service.IWfTaskAssigneeService;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -20,6 +30,8 @@ import java.util.stream.Collectors;
|
|||||||
*/
|
*/
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
public class WorkflowUtils {
|
public class WorkflowUtils {
|
||||||
|
public static final IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class);
|
||||||
|
public static final IFlwTaskService iFlwTaskService = SpringUtils.getBean(IFlwTaskService.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取办理人
|
* 获取办理人
|
||||||
@ -31,7 +43,6 @@ public class WorkflowUtils {
|
|||||||
if (CollUtil.isEmpty(userList)) {
|
if (CollUtil.isEmpty(userList)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class);
|
|
||||||
// 获取所有用户的 UserDTO 列表
|
// 获取所有用户的 UserDTO 列表
|
||||||
return userList.stream()
|
return userList.stream()
|
||||||
.map(User::getProcessedBy)
|
.map(User::getProcessedBy)
|
||||||
@ -52,7 +63,6 @@ public class WorkflowUtils {
|
|||||||
return Set.of();
|
return Set.of();
|
||||||
}
|
}
|
||||||
Set<User> list = new HashSet<>();
|
Set<User> list = new HashSet<>();
|
||||||
IWfTaskAssigneeService taskAssigneeService = SpringUtils.getBean(IWfTaskAssigneeService.class);
|
|
||||||
for (User user : userList) {
|
for (User user : userList) {
|
||||||
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
|
// 根据 processedBy 前缀判断处理人类型,分别获取用户列表
|
||||||
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy());
|
List<UserDTO> users = taskAssigneeService.fetchUsersByStorageId(user.getProcessedBy());
|
||||||
@ -70,4 +80,48 @@ public class WorkflowUtils {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息
|
||||||
|
*
|
||||||
|
* @param flowName 流程定义名称
|
||||||
|
* @param messageType 消息类型
|
||||||
|
* @param message 消息内容,为空则发送默认配置的消息内容
|
||||||
|
*/
|
||||||
|
public static void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
|
||||||
|
List<UserDTO> userList = new ArrayList<>();
|
||||||
|
List<FlowTask> list = iFlwTaskService.selectByInstId(instId);
|
||||||
|
if (StringUtils.isBlank(message)) {
|
||||||
|
message = "有新的【" + flowName + "】单据已经提交至您的待办,请您及时处理。";
|
||||||
|
}
|
||||||
|
for (Task task : list) {
|
||||||
|
List<UserDTO> users = iFlwTaskService.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:
|
||||||
|
WebSocketMessageDto dto = new WebSocketMessageDto();
|
||||||
|
dto.setSessionKeys(new ArrayList<>(StreamUtils.toList(userList, UserDTO::getUserId)));
|
||||||
|
dto.setMessage(message);
|
||||||
|
WebSocketUtils.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