Commit c2db893fb898ccf0b66806cecfb7e20c60c91493
1 parent
e3b86b3d
bpm 增加流程被通过、不通过时,发送短信通知
Showing
11 changed files
with
160 additions
and
31 deletions
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
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
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()) | ... | ... |