Commit c2db893fb898ccf0b66806cecfb7e20c60c91493

Authored by YunaiV
1 parent e3b86b3d

bpm 增加流程被通过、不通过时,发送短信通知

yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/message/BpmMessageConvert.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.convert.message;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
3 5 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
4 6 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
5 7 import org.activiti.api.task.model.Task;
... ... @@ -36,4 +38,20 @@ public interface BpmMessageConvert {
36 38 })
37 39 void copyTo(Task task, @MappingTarget BpmMessageSendWhenTaskCreatedReqDTO to);
38 40  
  41 + default BpmMessageSendWhenProcessInstanceRejectReqDTO convert(ProcessInstance processInstance, String comment) {
  42 + BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceRejectReqDTO();
  43 + copyTo(processInstance, reqDTO);
  44 + reqDTO.setComment(comment);
  45 + return reqDTO;
  46 + }
  47 + @Mapping(source = "name", target = "processInstanceName")
  48 + void copyTo(ProcessInstance from, @MappingTarget BpmMessageSendWhenProcessInstanceRejectReqDTO to);
  49 +
  50 + @Mappings({
  51 + @Mapping(source = "id", target = "processInstanceId"),
  52 + @Mapping(source = "name", target = "processInstanceName"),
  53 + @Mapping(source = "initiator", target = "startUserId")
  54 + })
  55 + BpmMessageSendWhenProcessInstanceApproveReqDTO convert(org.activiti.api.process.model.ProcessInstance processInstance);
  56 +
39 57 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/message/BpmMessageEnum.java
... ... @@ -13,6 +13,8 @@ import lombok.Getter;
13 13 @Getter
14 14 public enum BpmMessageEnum {
15 15  
  16 + PROCESS_INSTANCE_APPROVE("bpm_process_instance_approve"), // 流程任务被审批通过时,发送给申请人
  17 + PROCESS_INSTANCE_REJECT("bpm_process_instance_reject"), // 流程任务被审批不通过时,发送给申请人
16 18 TASK_ASSIGNED("bpm_task_assigned"); // 任务被分配时,发送给审批人
17 19  
18 20 /**
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java
... ... @@ -12,7 +12,7 @@ import lombok.Getter;
12 12 @AllArgsConstructor
13 13 public enum BpmProcessInstanceDeleteReasonEnum {
14 14  
15   - REJECT_TASK("驳回任务");
  15 + REJECT_TASK("不通过任务,原因:{}");
16 16  
17 17 private final String reason;
18 18  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/BpmMessageService.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.message;
2 2  
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
3 5 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
4 6  
5 7 import javax.validation.Valid;
... ... @@ -13,6 +15,26 @@ import javax.validation.Valid;
13 15 */
14 16 public interface BpmMessageService {
15 17  
  18 + /**
  19 + * 发送流程实例被通过的消息
  20 + *
  21 + * @param reqDTO 发送信息
  22 + */
  23 + void sendMessageWhenProcessInstanceApprove(@Valid BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO);
  24 +
  25 +
  26 + /**
  27 + * 发送流程实例被不通过的消息
  28 + *
  29 + * @param reqDTO 发送信息
  30 + */
  31 + void sendMessageWhenProcessInstanceReject(@Valid BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO);
  32 +
  33 + /**
  34 + * 发送任务被分配的消息
  35 + *
  36 + * @param reqDTO 发送信息
  37 + */
16 38 void sendMessageWhenTaskAssigned(@Valid BpmMessageSendWhenTaskCreatedReqDTO reqDTO);
17 39  
18 40 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceApproveReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import javax.validation.constraints.NotEmpty;
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * BPM 发送流程实例被通过 Request DTO
  10 + */
  11 +@Data
  12 +public class BpmMessageSendWhenProcessInstanceApproveReqDTO {
  13 +
  14 + /**
  15 + * 流程实例的编号
  16 + */
  17 + @NotEmpty(message = "流程实例的编号不能为空")
  18 + private String processInstanceId;
  19 + /**
  20 + * 流程实例的名字
  21 + */
  22 + @NotEmpty(message = "流程实例的名字不能为空")
  23 + private String processInstanceName;
  24 + @NotNull(message = "发起人的用户编号")
  25 + private Long startUserId;
  26 +
  27 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenProcessInstanceRejectReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import javax.validation.constraints.NotEmpty;
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * BPM 发送流程实例被不通过 Request DTO
  10 + */
  11 +@Data
  12 +public class BpmMessageSendWhenProcessInstanceRejectReqDTO {
  13 +
  14 + /**
  15 + * 流程实例的编号
  16 + */
  17 + @NotEmpty(message = "流程实例的编号不能为空")
  18 + private String processInstanceId;
  19 + /**
  20 + * 流程实例的名字
  21 + */
  22 + @NotEmpty(message = "流程实例的名字不能为空")
  23 + private String processInstanceName;
  24 + @NotNull(message = "发起人的用户编号")
  25 + private Long startUserId;
  26 +
  27 + /**
  28 + * 不通过理由
  29 + */
  30 + @NotEmpty(message = "不通过理由不能为空")
  31 + private String comment;
  32 +
  33 +}
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/dto/BpmMessageSendWhenTaskCreatedReqDTO.java
... ... @@ -6,7 +6,7 @@ import javax.validation.constraints.NotEmpty;
6 6 import javax.validation.constraints.NotNull;
7 7  
8 8 /**
9   - * BPM 发送任务创建的 Request DTO
  9 + * BPM 发送任务被分配 Request DTO
10 10 */
11 11 @Data
12 12 public class BpmMessageSendWhenTaskCreatedReqDTO {
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/message/impl/BpmMessageServiceImpl.java
... ... @@ -2,6 +2,8 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.message.impl;
2 2  
3 3 import cn.iocoder.yudao.adminserver.modules.bpm.enums.message.BpmMessageEnum;
4 4 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
5 7 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
6 8 import cn.iocoder.yudao.coreservice.modules.system.service.sms.SysSmsCoreService;
7 9 import lombok.extern.slf4j.Slf4j;
... ... @@ -30,17 +32,36 @@ public class BpmMessageServiceImpl implements BpmMessageService {
30 32 private String adminUiUrl;
31 33  
32 34 @Override
  35 + public void sendMessageWhenProcessInstanceApprove(BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO) {
  36 + Map<String, Object> templateParams = new HashMap<>();
  37 + templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
  38 + templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
  39 + smsCoreService.sendSingleSmsToAdmin(null, reqDTO.getStartUserId(),
  40 + BpmMessageEnum.PROCESS_INSTANCE_APPROVE.getSmsCode(), templateParams);
  41 + }
  42 +
  43 + @Override
  44 + public void sendMessageWhenProcessInstanceReject(BpmMessageSendWhenProcessInstanceRejectReqDTO reqDTO) {
  45 + Map<String, Object> templateParams = new HashMap<>();
  46 + templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
  47 + templateParams.put("comment", reqDTO.getComment());
  48 + templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
  49 + smsCoreService.sendSingleSmsToAdmin(null, reqDTO.getStartUserId(),
  50 + BpmMessageEnum.PROCESS_INSTANCE_REJECT.getSmsCode(), templateParams);
  51 + }
  52 +
  53 + @Override
33 54 public void sendMessageWhenTaskAssigned(BpmMessageSendWhenTaskCreatedReqDTO reqDTO) {
34 55 Map<String, Object> templateParams = new HashMap<>();
35 56 templateParams.put("processInstanceName", reqDTO.getProcessInstanceName());
36 57 templateParams.put("taskName", reqDTO.getTaskName());
37 58 templateParams.put("startUserNickname", reqDTO.getStartUserNickname());
38   - templateParams.put("taskDetailUrl", getTaskDetailUrl(reqDTO.getTaskId()));
  59 + templateParams.put("detailUrl", getProcessInstanceDetailUrl(reqDTO.getProcessInstanceId()));
39 60 smsCoreService.sendSingleSmsToAdmin(null, reqDTO.getAssigneeUserId(),
40 61 BpmMessageEnum.TASK_ASSIGNED.getSmsCode(), templateParams);
41 62 }
42 63  
43   - private String getTaskDetailUrl(String taskId) {
  64 + private String getProcessInstanceDetailUrl(String taskId) {
44 65 return adminUiUrl + "bpm/process-instance/detail?id=" + taskId;
45 66 }
46 67  
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
... ... @@ -47,15 +47,6 @@ public interface BpmProcessInstanceService {
47 47 void deleteProcessInstance(String id, String reason);
48 48  
49 49 /**
50   - * 更新流程实例的结果
51   - * 1. 如果更新为已拒绝时,会进行任务的删除
52   - *
53   - * @param id 流程编号
54   - * @param result 结果,{@link BpmProcessInstanceResultEnum}
55   - */
56   - void updateProcessInstanceResult(String id, Integer result);
57   -
58   - /**
59 50 * 获得流程实例的分页
60 51 *
61 52 * @param userId 用户编号
... ... @@ -153,4 +144,12 @@ public interface BpmProcessInstanceService {
153 144 */
154 145 void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance);
155 146  
  147 + /**
  148 + * 更新 ProcessInstance 拓展记录为不通过
  149 + *
  150 + * @param id 流程编号
  151 + * @param comment 理由。例如说,审批不通过时,需要传递该值
  152 + */
  153 + void updateProcessInstanceExtReject(String id, String comment);
  154 +
156 155 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
... ... @@ -2,9 +2,9 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.lang.Assert;
5   -import cn.hutool.core.util.NumberUtil;
6 5 import cn.hutool.core.util.StrUtil;
7 6 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.*;
  7 +import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert;
8 8 import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert;
9 9 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
10 10 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
... ... @@ -13,6 +13,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDel
13 13 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;
14 14 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum;
15 15 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
  16 +import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService;
16 17 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
17 18 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
18 19 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
... ... @@ -28,7 +29,6 @@ import org.activiti.engine.history.HistoricProcessInstance;
28 29 import org.activiti.engine.repository.ProcessDefinition;
29 30 import org.activiti.engine.runtime.ProcessInstance;
30 31 import org.activiti.engine.task.Task;
31   -import org.mapstruct.ap.shaded.freemarker.template.utility.StringUtil;
32 32 import org.springframework.context.annotation.Lazy;
33 33 import org.springframework.stereotype.Service;
34 34 import org.springframework.transaction.annotation.Transactional;
... ... @@ -72,6 +72,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
72 72 private BpmTaskService taskService;
73 73 @Resource
74 74 private BpmProcessDefinitionService processDefinitionService;
  75 + @Resource
  76 + private BpmMessageService messageService;
75 77  
76 78 @Resource
77 79 private BpmProcessInstanceExtMapper processInstanceExtMapper;
... ... @@ -133,18 +135,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
133 135 }
134 136  
135 137 @Override
136   - @Transactional(rollbackFor = Exception.class)
137   - public void updateProcessInstanceResult(String id, Integer result) {
138   - // 删除流程实例,以实现驳回任务时,取消整个审批流程
139   - if (Objects.equals(result, BpmProcessInstanceResultEnum.REJECT.getResult())) {
140   - deleteProcessInstance(id, BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.getReason());
141   - }
142   - // 更新 status + result
143   - processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(id)
144   - .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()).setResult(result));
145   - }
146   -
147   - @Override
148 138 public PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId,
149 139 BpmProcessInstanceMyPageReqVO pageReqVO) {
150 140 // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页
... ... @@ -251,6 +241,26 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
251 241 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
252 242 .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过
253 243 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
  244 +
  245 + // 发送流程被通过的消息
  246 + messageService.sendMessageWhenProcessInstanceApprove(BpmMessageConvert.INSTANCE.convert(instance));
  247 + }
  248 +
  249 + @Transactional(rollbackFor = Exception.class)
  250 + public void updateProcessInstanceExtReject(String id, String comment) {
  251 + ProcessInstance processInstance = getProcessInstance(id);
  252 + // 删除流程实例,以实现驳回任务时,取消整个审批流程
  253 + deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.getReason(), comment));
  254 +
  255 + // 更新 status + result
  256 + // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法,
  257 + // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的
  258 + processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(id)
  259 + .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
  260 + .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()));
  261 +
  262 + // 发送流程被不通过的消息
  263 + messageService.sendMessageWhenProcessInstanceReject(BpmMessageConvert.INSTANCE.convert(processInstance, comment));
254 264 }
255 265  
256 266 }
... ...
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
1 1 package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.thread.ThreadUtil;
5 4 import cn.hutool.core.util.StrUtil;
6 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*;
7 6 import cn.iocoder.yudao.adminserver.modules.bpm.convert.message.BpmMessageConvert;
... ... @@ -38,7 +37,6 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
38 37 import javax.annotation.Resource;
39 38 import javax.validation.Valid;
40 39 import java.util.*;
41   -import java.util.concurrent.TimeUnit;
42 40  
43 41 import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*;
44 42 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
... ... @@ -254,8 +252,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
254 252 }
255 253  
256 254 // 更新流程实例为不通过
257   - processInstanceService.updateProcessInstanceResult(instance.getProcessInstanceId(),
258   - BpmProcessInstanceResultEnum.REJECT.getResult());
  255 + processInstanceService.updateProcessInstanceExtReject(instance.getProcessInstanceId(), reqVO.getComment());
259 256  
260 257 // 更新任务拓展表为不通过
261 258 taskExtMapper.updateByTaskId(new BpmTaskExtDO().setTaskId(task.getId())
... ...