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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-