From 06bf090b525b5a1b633ba008e2000d27ac0c25cc Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Tue, 24 Oct 2023 13:40:28 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=BF=98=E5=8E=9F=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=EF=BC=8C=E6=B7=BB=E5=8A=A0=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/ruoyi-workflow/pom.xml | 15 ++++ .../common/enums/MessageTypeEnum.java | 31 ++++++++ .../workflow/domain/bo/BackProcessBo.java | 6 ++ .../workflow/domain/bo/CompleteTaskBo.java | 6 ++ .../workflow/mapper/ActHiProcinstMapper.java | 2 + .../workflow/mapper/ActTaskMapper.java | 30 -------- .../impl/ActHiProcinstServiceImpl.java | 13 ++-- .../service/impl/ActTaskServiceImpl.java | 75 +++++++++++++------ .../dromara/workflow/utils/WorkflowUtils.java | 46 +++++++++++- .../mapper/workflow/ActTaskMapper.xml | 69 ----------------- 10 files changed, 162 insertions(+), 131 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java delete mode 100644 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml index fafc0c897..3dedb40be 100644 --- a/ruoyi-modules/ruoyi-workflow/pom.xml +++ b/ruoyi-modules/ruoyi-workflow/pom.xml @@ -53,6 +53,21 @@ ruoyi-system + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-mail + + + + org.dromara + ruoyi-common-sms + + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java new file mode 100644 index 000000000..d7ba1bf01 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java @@ -0,0 +1,31 @@ +package org.dromara.workflow.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 消息类型枚举 + * + * @author may + */ +@Getter +@AllArgsConstructor +public enum MessageTypeEnum { + /** + * 站内信 + */ + SYSTEM_MESSAGE("1", "站内信"), + /** + * 邮箱 + */ + EMAIL_MESSAGE("2", "邮箱"), + /** + * 短信 + */ + SMS_MESSAGE("3", "短信"); + + private final String code; + + private final String desc; +} + diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java index 8b24e9247..7ac6b38e5 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/BackProcessBo.java @@ -6,6 +6,7 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; +import java.util.List; /** @@ -25,6 +26,11 @@ public class BackProcessBo implements Serializable { @NotBlank(message = "任务ID不能为空", groups = AddGroup.class) private String taskId; + /** + * 消息类型 + */ + private List messageType; + /** * 驳回的节点id(目前未使用,直接驳回到申请人) */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java index 65bd42a49..87c742e0b 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/CompleteTaskBo.java @@ -7,6 +7,7 @@ import org.dromara.common.core.validate.AddGroup; import java.io.Serial; import java.io.Serializable; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -27,6 +28,11 @@ public class CompleteTaskBo implements Serializable { @NotBlank(message = "任务id不能为空", groups = {AddGroup.class}) private String taskId; + /** + * 消息类型 + */ + private List messageType; + /** * 办理意见 */ diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java index 788fca6ea..cd8fabfa3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiProcinstMapper.java @@ -1,5 +1,6 @@ package org.dromara.workflow.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -9,6 +10,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; * @author may * @date 2023-07-22 */ +@InterceptorIgnore(tenantLine = "true") public interface ActHiProcinstMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java deleted file mode 100644 index 2f51461ec..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dromara.workflow.mapper; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Param; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.workflow.domain.vo.TaskVo; - -import java.util.List; - -/** - * 运行时任务Mapper接口 - * - * @author may - * @date 2023-10-19 - */ -public interface ActTaskMapper extends BaseMapperPlus { - - /** - * 获取待办信息 - * - * @param page 分页 - * @param queryWrapper 条件 - * @param userId 用户id - * @param groupIds 用户角色id - * @return 结果 - */ - Page getTaskWaitByPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper, @Param("userId") String userId, @Param("groupIds") List groupIds); -} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java index e0ec0a794..1d3bf06fe 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiProcinstServiceImpl.java @@ -31,11 +31,9 @@ public class ActHiProcinstServiceImpl implements IActHiProcinstService { */ @Override public List selectByBusinessKeyIn(List businessKeys) { - return TenantHelper.ignore(() -> - baseMapper.selectList(new LambdaQueryWrapper() + return baseMapper.selectList(new LambdaQueryWrapper() .in(ActHiProcinst::getBusinessKey, businessKeys) - .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())) - ); + .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())); } /** @@ -45,10 +43,9 @@ public class ActHiProcinstServiceImpl implements IActHiProcinstService { */ @Override public ActHiProcinst selectByBusinessKey(String businessKey) { - return TenantHelper.ignore(() -> - baseMapper.selectOne(new LambdaQueryWrapper() + return baseMapper.selectOne(new LambdaQueryWrapper() .eq(ActHiProcinst::getBusinessKey, businessKey) - .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())) - ); + .eq(ActHiProcinst::getTenantId, TenantHelper.getTenantId())); + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index 722b498ee..aefe8f1c9 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -5,14 +5,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.helper.TenantHelper; @@ -23,7 +20,6 @@ import org.dromara.workflow.domain.bo.*; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.cmd.*; -import org.dromara.workflow.mapper.ActTaskMapper; import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.utils.WorkflowUtils; import org.flowable.common.engine.impl.identity.Authentication; @@ -38,6 +34,7 @@ import org.flowable.task.api.TaskQuery; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstanceQuery; import org.flowable.task.service.impl.persistence.entity.TaskEntity; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -61,7 +58,6 @@ public class ActTaskServiceImpl implements IActTaskService { private final HistoryService historyService; private final IdentityService identityService; private final ManagementService managementService; - private final ActTaskMapper actTaskMapper; /** * 启动任务 @@ -142,6 +138,7 @@ public class ActTaskServiceImpl implements IActTaskService { if (task.isSuspended()) { throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); } + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult(); //办理委托任务 if (ObjectUtil.isNotEmpty(task.getDelegationState()) && FlowConstant.PENDING.equals(task.getDelegationState().name())) { taskService.resolveTask(completeTaskBo.getTaskId()); @@ -159,6 +156,8 @@ public class ActTaskServiceImpl implements IActTaskService { if (CollUtil.isEmpty(list)) { UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); managementService.executeCommand(updateBusinessStatusCmd); + } else { + sendMessage(list, processInstance.getName(), completeTaskBo.getMessageType(),null); } return true; } catch (Exception e) { @@ -166,6 +165,19 @@ public class ActTaskServiceImpl implements IActTaskService { } } + /** + * 发送消息 + * + * @param list 任务 + * @param name 流程名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + @Async + public void sendMessage(List list, String name, List messageType,String message) { + WorkflowUtils.sendMessage(list, name, messageType,message); + } + /** * 查询当前用户的待办任务 * @@ -173,33 +185,47 @@ public class ActTaskServiceImpl implements IActTaskService { */ @Override public TableDataInfo getTaskWaitByPage(TaskBo taskBo) { - PageQuery pageQuery = new PageQuery(); - pageQuery.setPageNum(taskBo.getPageNum()); - pageQuery.setPageSize(taskBo.getPageSize()); - QueryWrapper queryWrapper = new QueryWrapper<>(); List roles = LoginHelper.getLoginUser().getRoles(); String userId = String.valueOf(LoginHelper.getUserId()); - queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus()); - queryWrapper.eq("t.tenant_id_", TenantHelper.getTenantId()); + TaskQuery query = taskService.createTaskQuery(); + query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); + if (CollUtil.isNotEmpty(roles)) { + List groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())); + query.taskCandidateGroupIn(groupIds); + } if (StringUtils.isNotBlank(taskBo.getName())) { - queryWrapper.like("t.name_", taskBo.getName()); + query.taskNameLike("%" + taskBo.getName() + "%"); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { - queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName()); + query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); } if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { - queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey()); + query.processDefinitionKey(taskBo.getProcessDefinitionKey()); } - Page page = TenantHelper.ignore(() -> - actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper, userId, StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()))) - ); - List taskList = page.getRecords(); - for (TaskVo task : taskList) { - task.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(task.getBusinessStatus())); - task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); - task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + List taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); + List processInstanceList = null; + if (CollUtil.isNotEmpty(taskList)) { + Set processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); + processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); } - return new TableDataInfo<>(taskList, page.getTotal()); + List list = new ArrayList<>(); + for (Task task : taskList) { + TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); + if (CollUtil.isNotEmpty(processInstanceList)) { + processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { + taskVo.setBusinessStatus(e.getBusinessStatus()); + taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); + taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey()); + taskVo.setProcessDefinitionName(e.getProcessDefinitionName()); + }); + } + taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null); + taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId())); + taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); + list.add(taskVo); + } + long count = query.count(); + return new TableDataInfo<>(list, count); } /** @@ -569,6 +595,9 @@ public class ActTaskServiceImpl implements IActTaskService { for (Task t : list) { taskService.setAssignee(t.getId(), historicTaskInstance.getAssignee()); } + //发送消息 + String message = "您的【" + processInstance.getName() + "】单据已经被驳回,请您注意查收。"; + sendMessage(list, processInstance.getName(), backProcessBo.getMessageType(),message); //删除流程实例垃圾数据 for (ExecutionEntity executionEntity : executionEntities) { DeleteExecutionCmd deleteExecutionCmd = new DeleteExecutionCmd(executionEntity.getId()); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index ed009c1be..7af9b3f3f 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -11,11 +11,15 @@ import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.mail.utils.MailUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.websocket.dto.WebSocketMessageDto; +import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.SysUserRole; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; +import org.dromara.workflow.common.enums.MessageTypeEnum; import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.ParticipantVo; @@ -36,7 +40,6 @@ import org.flowable.identitylink.api.history.HistoricIdentityLink; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntity; - import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -334,4 +337,45 @@ public class WorkflowUtils { } } } + + /** + * 发送消息 + * + * @param list 任务 + * @param name 流程名称 + * @param messageType 消息类型 + * @param message 消息内容,为空则发送默认配置的消息内容 + */ + public static void sendMessage(List list, String name, List messageType,String message) { + Set userIds = new HashSet<>(); + if(StringUtils.isBlank(message)){ + message = "有新的【" + name + "】单据已经提交至您的待办,请及时处理。"; + } + for (Task t : list) { + ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId()); + if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { + List sysUserRoles = I_WORK_FLOW_USER_SERVICE.getUserRoleListByRoleIds(taskParticipant.getGroupIds()); + if (CollUtil.isNotEmpty(sysUserRoles)) { + userIds.addAll(StreamUtils.toList(sysUserRoles, SysUserRole::getUserId)); + } + } + List candidate = taskParticipant.getCandidate(); + if (CollUtil.isNotEmpty(candidate)) { + userIds.addAll(candidate); + } + } + if (CollUtil.isNotEmpty(userIds)) { + List sysUserVoList = I_WORK_FLOW_USER_SERVICE.getUserListByIds(new ArrayList<>(userIds)); + if (messageType.contains(MessageTypeEnum.SYSTEM_MESSAGE.getCode())) { + WebSocketMessageDto dto = new WebSocketMessageDto(); + dto.setSessionKeys(new ArrayList<>(userIds)); + dto.setMessage(message); + WebSocketUtils.publishMessage(dto); + } else if (messageType.contains(MessageTypeEnum.EMAIL_MESSAGE.getCode())) { + MailUtils.sendText(StreamUtils.join(sysUserVoList, SysUserVo::getEmail), "单据审批提醒", message); + } else if (messageType.contains(MessageTypeEnum.SMS_MESSAGE.getCode())) { + //todo 短信发送 + } + } + } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml deleted file mode 100644 index fdc74ff34..000000000 --- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -