Compare commits

...

4 Commits

Author SHA1 Message Date
疯狂的狮子Li
6bc28e41de update 优化 工作流代码 2025-08-29 10:06:22 +08:00
疯狂的狮子Li
a4fb3fadaf update 优化 将返回值从bo改为vo 2025-08-29 09:52:21 +08:00
疯狂的狮子Li
cfa67fcd8c
Revert "update 添加 FlowCopyVo 类,优化抄送对象处理逻辑"
This reverts commit e5e8d305d2.
2025-08-29 01:35:27 +00:00
AprilWind
e5e8d305d2 update 添加 FlowCopyVo 类,优化抄送对象处理逻辑 2025-08-29 09:29:12 +08:00
5 changed files with 75 additions and 37 deletions

View File

@ -0,0 +1,36 @@
package org.dromara.workflow.domain.vo;
import lombok.Data;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import java.io.Serial;
import java.io.Serializable;
/**
* 抄送对象
*
* @author AprilWind
*/
@Data
public class FlowCopyVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户id
*/
private Long userId;
/**
* 用户名称
*/
@Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "userId")
private String userName;
public FlowCopyVo(Long userId) {
this.userId = userId;
}
}

View File

@ -5,7 +5,6 @@ import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant; import org.dromara.common.translation.constant.TransConstant;
import org.dromara.warm.flow.core.entity.User; import org.dromara.warm.flow.core.entity.User;
import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.bo.FlowCopyBo;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -192,7 +191,7 @@ public class FlowTaskVo implements Serializable {
* <p> * <p>
* 根据扩展属性中 CopySettingEnum 类型的数据生成存储需要抄送的对象 ID * 根据扩展属性中 CopySettingEnum 类型的数据生成存储需要抄送的对象 ID
*/ */
private List<FlowCopyBo> copyList; private List<FlowCopyVo> copyList;
/** /**
* 自定义参数 Map * 自定义参数 Map

View File

@ -11,13 +11,13 @@ import org.dromara.common.core.enums.BusinessStatusEnum;
import org.dromara.common.core.service.UserService; import org.dromara.common.core.service.UserService;
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.core.utils.StringUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.dto.FlowParams; import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.entity.Definition; import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.entity.Instance; import org.dromara.warm.flow.core.entity.Instance;
import org.dromara.warm.flow.core.entity.Task; import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.core.listener.GlobalListener; import org.dromara.warm.flow.core.listener.GlobalListener;
import org.dromara.warm.flow.core.listener.ListenerVariable; import org.dromara.warm.flow.core.listener.ListenerVariable;
import org.dromara.warm.flow.core.service.InsService;
import org.dromara.workflow.common.ConditionalOnEnable; import org.dromara.workflow.common.ConditionalOnEnable;
import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.common.enums.TaskStatusEnum; import org.dromara.workflow.common.enums.TaskStatusEnum;
@ -47,12 +47,11 @@ import java.util.Set;
public class WorkflowGlobalListener implements GlobalListener { public class WorkflowGlobalListener implements GlobalListener {
private final IFlwTaskService flwTaskService; private final IFlwTaskService flwTaskService;
private final IFlwInstanceService instanceService; private final IFlwInstanceService flwInstanceService;
private final FlowProcessEventHandler flowProcessEventHandler; private final FlowProcessEventHandler flowProcessEventHandler;
private final IFlwCommonService flwCommonService; private final IFlwCommonService flwCommonService;
private final IFlwNodeExtService nodeExtService; private final IFlwNodeExtService nodeExtService;
private final UserService userService; private final UserService userService;
private final InsService insService;
/** /**
* 创建监听器任务创建时执行 * 创建监听器任务创建时执行
@ -159,7 +158,7 @@ public class WorkflowGlobalListener implements GlobalListener {
flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, BusinessStatusEnum.BACK.getStatus(), params, false); flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, BusinessStatusEnum.BACK.getStatus(), params, false);
// 修改流程实例状态 // 修改流程实例状态
instance.setFlowStatus(BusinessStatusEnum.BACK.getStatus()); instance.setFlowStatus(BusinessStatusEnum.BACK.getStatus());
insService.updateById(instance); FlowEngine.insService().updateById(instance);
} }
} }
} }
@ -188,12 +187,9 @@ public class WorkflowGlobalListener implements GlobalListener {
if (variable.containsKey(FlowConstant.MESSAGE_TYPE)) { if (variable.containsKey(FlowConstant.MESSAGE_TYPE)) {
List<String> messageType = MapUtil.get(variable, FlowConstant.MESSAGE_TYPE, new TypeReference<>() {}); List<String> messageType = MapUtil.get(variable, FlowConstant.MESSAGE_TYPE, new TypeReference<>() {});
String notice = MapUtil.getStr(variable, FlowConstant.MESSAGE_NOTICE); String notice = MapUtil.getStr(variable, FlowConstant.MESSAGE_NOTICE);
// 消息通知 flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
if (CollUtil.isNotEmpty(messageType)) {
flwCommonService.sendMessage(definition.getFlowName(), instance.getId(), messageType, notice);
}
} }
insService.removeVariables(instance.getId(), FlowEngine.insService().removeVariables(instance.getId(),
FlowConstant.FLOW_COPY_LIST, FlowConstant.FLOW_COPY_LIST,
FlowConstant.MESSAGE_TYPE, FlowConstant.MESSAGE_TYPE,
FlowConstant.MESSAGE_NOTICE, FlowConstant.MESSAGE_NOTICE,
@ -217,7 +213,7 @@ public class WorkflowGlobalListener implements GlobalListener {
if (flwTaskService.isTaskEnd(instanceId)) { if (flwTaskService.isTaskEnd(instanceId)) {
String status = BusinessStatusEnum.FINISH.getStatus(); String status = BusinessStatusEnum.FINISH.getStatus();
// 更新流程状态为已完成 // 更新流程状态为已完成
instanceService.updateStatus(instanceId, status); flwInstanceService.updateStatus(instanceId, status);
log.info("流程已结束,状态更新为: {}", status); log.info("流程已结束,状态更新为: {}", status);
return status; return status;
} }

View File

@ -11,9 +11,8 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.mail.utils.MailUtils;
import org.dromara.common.sse.dto.SseMessageDto; import org.dromara.common.sse.dto.SseMessageDto;
import org.dromara.common.sse.utils.SseMessageUtils; import org.dromara.common.sse.utils.SseMessageUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.Node; import org.dromara.warm.flow.core.entity.Node;
import org.dromara.warm.flow.core.enums.SkipType;
import org.dromara.warm.flow.core.service.NodeService;
import org.dromara.warm.flow.orm.entity.FlowTask; import org.dromara.warm.flow.orm.entity.FlowTask;
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.MessageTypeEnum;
@ -21,8 +20,10 @@ import org.dromara.workflow.service.IFlwCommonService;
import org.dromara.workflow.service.IFlwTaskService; import org.dromara.workflow.service.IFlwTaskService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.Set;
/** /**
@ -35,19 +36,27 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class FlwCommonServiceImpl implements IFlwCommonService { public class FlwCommonServiceImpl implements IFlwCommonService {
private final NodeService nodeService;
private static final String DEFAULT_SUBJECT = "单据审批提醒";
/** /**
* 发送消息 * 根据流程实例发送消息给当前处理人
* *
* @param flowName 流程定义名称 * @param flowName 流程定义名称
* @param messageType 消息类型 * @param instId 流程实例ID
* @param message 消息内容为空则发送默认配置的消息内容 * @param messageType 消息类型列表
* @param message 消息内容为空则使用默认消息
*/ */
@Override @Override
public void sendMessage(String flowName, Long instId, List<String> messageType, String message) { public void sendMessage(String flowName, Long instId, List<String> messageType, String message) {
if (CollUtil.isNotEmpty(messageType)) {
return;
}
IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class); IFlwTaskService flwTaskService = SpringUtils.getBean(IFlwTaskService.class);
List<FlowTask> list = flwTaskService.selectByInstId(instId); List<FlowTask> list = flwTaskService.selectByInstId(instId);
if (CollUtil.isEmpty(list)) {
return;
}
if (StringUtils.isBlank(message)) { if (StringUtils.isBlank(message)) {
message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。"; message = "有新的【" + flowName + "】单据已经提交至您,请您及时处理。";
} }
@ -55,19 +64,25 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
if (CollUtil.isEmpty(userList)) { if (CollUtil.isEmpty(userList)) {
return; return;
} }
sendMessage(messageType, message, "单据审批提醒", userList); sendMessage(messageType, message, DEFAULT_SUBJECT, userList);
} }
/** /**
* 发送消息 * 发送消息给指定用户列表
* *
* @param messageType 消息类型 * @param messageType 消息类型列表
* @param message 消息内容 * @param message 消息内容
* @param subject 邮件标题 * @param subject 邮件标题
* @param userList 接收用户 * @param userList 接收用户列表
*/ */
@Override @Override
public void sendMessage(List<String> messageType, String message, String subject, List<UserDTO> userList) { public void sendMessage(List<String> messageType, String message, String subject, List<UserDTO> userList) {
if (CollUtil.isEmpty(messageType) || CollUtil.isEmpty(userList)) {
return;
}
List<Long> userIds = new ArrayList<>(StreamUtils.toSet(userList, UserDTO::getUserId));
Set<String> emails = StreamUtils.toSet(userList, UserDTO::getEmail);
for (String code : messageType) { for (String code : messageType) {
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
if (ObjectUtil.isEmpty(messageTypeEnum)) { if (ObjectUtil.isEmpty(messageTypeEnum)) {
@ -76,13 +91,11 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
switch (messageTypeEnum) { switch (messageTypeEnum) {
case SYSTEM_MESSAGE -> { case SYSTEM_MESSAGE -> {
SseMessageDto dto = new SseMessageDto(); SseMessageDto dto = new SseMessageDto();
dto.setUserIds(StreamUtils.toList(userList, UserDTO::getUserId).stream().distinct().collect(Collectors.toList())); dto.setUserIds(userIds);
dto.setMessage(message); dto.setMessage(message);
SseMessageUtils.publishMessage(dto); SseMessageUtils.publishMessage(dto);
} }
case EMAIL_MESSAGE -> { case EMAIL_MESSAGE -> MailUtils.sendText(emails, subject, message);
MailUtils.sendText(StreamUtils.join(userList, UserDTO::getEmail), subject, message);
}
case SMS_MESSAGE -> { case SMS_MESSAGE -> {
//todo 短信发送 //todo 短信发送
} }
@ -100,8 +113,7 @@ public class FlwCommonServiceImpl implements IFlwCommonService {
*/ */
@Override @Override
public String applyNodeCode(Long definitionId) { public String applyNodeCode(Long definitionId) {
Node startNode = nodeService.getStartNode(definitionId); List<Node> firstBetweenNode = FlowEngine.nodeService().getFirstBetweenNode(definitionId, new HashMap<>());
Node nextNode = nodeService.getNextNode(definitionId, startNode.getNodeCode(), null, SkipType.PASS.getKey()); return firstBetweenNode.get(0).getNodeCode();
return nextNode.getNodeCode();
} }
} }

View File

@ -46,6 +46,7 @@ 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.FlowInstanceBizExt; import org.dromara.workflow.domain.FlowInstanceBizExt;
import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.FlowCopyVo;
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;
import org.dromara.workflow.domain.vo.NodeExtVo; import org.dromara.workflow.domain.vo.NodeExtVo;
@ -602,13 +603,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
//设置按钮权限 //设置按钮权限
flowTaskVo.setButtonList(nodeExtVo.getButtonPermissions()); flowTaskVo.setButtonList(nodeExtVo.getButtonPermissions());
if (CollUtil.isNotEmpty(nodeExtVo.getCopySettings())) { if (CollUtil.isNotEmpty(nodeExtVo.getCopySettings())) {
List<FlowCopyBo> list = StreamUtils.toList(nodeExtVo.getCopySettings(), x -> { List<FlowCopyVo> list = StreamUtils.toList(nodeExtVo.getCopySettings(), x -> new FlowCopyVo(Convert.toLong(x)));
FlowCopyBo bo = new FlowCopyBo();
Long id = Convert.toLong(x);
bo.setUserId(id);
bo.setUserName(userService.selectUserNameById(id));
return bo;
});
flowTaskVo.setCopyList(list); flowTaskVo.setCopyList(list);
} else { } else {
flowTaskVo.setCopyList(new ArrayList<>()); flowTaskVo.setCopyList(new ArrayList<>());