Commit 5437775172bacfa97459e9b8158a17384a396b3a

Authored by YunaiV
1 parent 7c62b1a2

增加 BpmProcessInstanceResultEvent 实现,实现自定义的流程实例的状态的监听

Showing 15 changed files with 224 additions and 64 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java
1 package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; 1 package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo;
2 2
3 -import lombok.*;  
4 -import io.swagger.annotations.*;  
5 -import org.springframework.format.annotation.DateTimeFormat; 3 +import io.swagger.annotations.ApiModel;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
6 7
7 -import javax.validation.constraints.NotNull;  
8 -import java.util.Date;  
9 -import java.util.Map;  
10 -  
11 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 8 +import javax.validation.constraints.AssertTrue;
12 9
13 @ApiModel("请假申请创建 Request VO") 10 @ApiModel("请假申请创建 Request VO")
14 @Data 11 @Data
15 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
16 @ToString(callSuper = true) 13 @ToString(callSuper = true)
17 public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO { 14 public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO {
  15 +
  16 + @AssertTrue(message = "结束时间,需要在开始时间之后")
  17 + public boolean isEndTimeValid() {
  18 + return !getEndTime().before(getStartTime());
  19 + }
  20 +
18 } 21 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP @@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP
5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO;
6 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 6 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
7 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; 7 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  8 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent;
8 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; 9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
9 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; 10 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
10 import cn.iocoder.yudao.framework.common.pojo.PageResult; 11 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -98,4 +99,22 @@ public interface BpmProcessInstanceConvert { @@ -98,4 +99,22 @@ public interface BpmProcessInstanceConvert {
98 void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); 99 void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to);
99 BpmProcessInstanceRespVO.User convert2(SysUserDO bean); 100 BpmProcessInstanceRespVO.User convert2(SysUserDO bean);
100 101
  102 + default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) {
  103 + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
  104 + event.setId(instance.getId());
  105 + event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
  106 + event.setBusinessKey(instance.getBusinessKey());
  107 + event.setResult(result);
  108 + return event;
  109 + }
  110 +
  111 + default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) {
  112 + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
  113 + event.setId(instance.getId());
  114 + event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
  115 + event.setBusinessKey(instance.getBusinessKey());
  116 + event.setResult(result);
  117 + return event;
  118 + }
  119 +
101 } 120 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java
@@ -13,7 +13,8 @@ import lombok.Getter; @@ -13,7 +13,8 @@ import lombok.Getter;
13 @AllArgsConstructor 13 @AllArgsConstructor
14 public enum BpmProcessInstanceDeleteReasonEnum { 14 public enum BpmProcessInstanceDeleteReasonEnum {
15 15
16 - REJECT_TASK("不通过任务,原因:{}"); // 修改文案时,需要注意 isRejectReason 方法 16 + REJECT_TASK("不通过任务,原因:{}"), // 修改文案时,需要注意 isRejectReason 方法
  17 + CANCEL_TASK("主动取消任务,原因:{}");
17 18
18 private final String reason; 19 private final String reason;
19 20
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config;
2 2
3 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; 3 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory;
4 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; 4 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher;
5 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; 6 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager;
6 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; 7 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener;
7 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; 8 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService;
@@ -11,6 +12,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermiss @@ -11,6 +12,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermiss
11 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; 12 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
12 import org.activiti.api.runtime.shared.identity.UserGroupManager; 13 import org.activiti.api.runtime.shared.identity.UserGroupManager;
13 import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; 14 import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
  15 +import org.springframework.context.ApplicationEventPublisher;
14 import org.springframework.context.annotation.Bean; 16 import org.springframework.context.annotation.Bean;
15 import org.springframework.context.annotation.Configuration; 17 import org.springframework.context.annotation.Configuration;
16 18
@@ -71,4 +73,9 @@ public class BpmActivitiConfiguration { @@ -71,4 +73,9 @@ public class BpmActivitiConfiguration {
71 return bpmActivityBehaviorFactory; 73 return bpmActivityBehaviorFactory;
72 } 74 }
73 75
  76 + @Bean
  77 + public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) {
  78 + return new BpmProcessInstanceResultEventPublisher(publisher);
  79 + }
  80 +
74 } 81 }
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  4 +import lombok.Data;
  5 +import org.springframework.context.ApplicationEvent;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +
  9 +/**
  10 + * 流程实例的结果发生变化的 Event
  11 + * 定位:由于额外增加了 {@link BpmProcessInstanceExtDO#getResult()} 结果,所以增加该事件
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@SuppressWarnings("ALL")
  16 +@Data
  17 +public class BpmProcessInstanceResultEvent extends ApplicationEvent {
  18 +
  19 + /**
  20 + * 流程实例的编号
  21 + */
  22 + @NotNull(message = "流程实例的编号不能为空")
  23 + private String id;
  24 + /**
  25 + * 流程实例的 key
  26 + */
  27 + @NotNull(message = "流程实例的 key 不能为空")
  28 + private String processDefinitionKey;
  29 + /**
  30 + * 流程实例的结果
  31 + */
  32 + @NotNull(message = "流程实例的结果不能为空")
  33 + private Integer result;
  34 + /**
  35 + * 流程实例对应的业务标识
  36 + * 例如说,请假
  37 + */
  38 + private String businessKey;
  39 +
  40 + public BpmProcessInstanceResultEvent(Object source) {
  41 + super(source);
  42 + }
  43 +
  44 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event;
  2 +
  3 +import cn.hutool.core.util.StrUtil;
  4 +import org.springframework.context.ApplicationListener;
  5 +
  6 +/**
  7 + * {@link BpmProcessInstanceResultEvent} 的监听器
  8 + *
  9 + * @author 芋道源码
  10 + */
  11 +public abstract class BpmProcessInstanceResultEventListener
  12 + implements ApplicationListener<BpmProcessInstanceResultEvent> {
  13 +
  14 + @Override
  15 + public final void onApplicationEvent(BpmProcessInstanceResultEvent event) {
  16 + if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) {
  17 + return;
  18 + }
  19 + onEvent(event);
  20 + }
  21 +
  22 + /**
  23 + * @return 返回监听的流程定义 Key
  24 + */
  25 + protected abstract String getProcessDefinitionKey();
  26 +
  27 + /**
  28 + * 处理事件
  29 + *
  30 + * @param event 事件
  31 + */
  32 + protected abstract void onEvent(BpmProcessInstanceResultEvent event);
  33 +
  34 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import org.springframework.context.ApplicationEventPublisher;
  5 +import org.springframework.validation.annotation.Validated;
  6 +
  7 +import javax.validation.Valid;
  8 +
  9 +/**
  10 + * {@link BpmProcessInstanceResultEvent} 的生产者
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@AllArgsConstructor
  15 +@Validated
  16 +public class BpmProcessInstanceResultEventPublisher {
  17 +
  18 + private final ApplicationEventPublisher publisher;
  19 +
  20 + public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceResultEvent event) {
  21 + publisher.publishEvent(event);
  22 + }
  23 +
  24 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java 0 → 100644
  1 +/**
  2 + * 自定义 Event 实现,提供方便业务接入的 Listener!
  3 + *
  4 + * @author 芋道源码
  5 + */
  6 +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java
@@ -2,10 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; @@ -2,10 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO;  
6 import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; 5 import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum;
7 -import com.baomidou.mybatisplus.annotation.TableField;  
8 -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;  
9 import lombok.Data; 6 import lombok.Data;
10 7
11 import javax.validation.constraints.AssertTrue; 8 import javax.validation.constraints.AssertTrue;
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java
@@ -25,6 +25,14 @@ public interface BpmOALeaveService { @@ -25,6 +25,14 @@ public interface BpmOALeaveService {
25 Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); 25 Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO);
26 26
27 /** 27 /**
  28 + * 更新请假申请的状态
  29 + *
  30 + * @param id 编号
  31 + * @param result 结果
  32 + */
  33 + void updateLeaveResult(Long id, Integer result);
  34 +
  35 + /**
28 * 删除请假申请 36 * 删除请假申请
29 * 37 *
30 * @param id 编号 38 * @param id 编号
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/LeaveApplyEndProcessor.java deleted
1 -package cn.iocoder.yudao.adminserver.modules.bpm.service.oa;  
2 -  
3 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO;  
4 -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.BpmOALeaveMapper;  
5 -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;  
6 -import org.activiti.engine.delegate.DelegateExecution;  
7 -import org.activiti.engine.delegate.ExecutionListener;  
8 -import org.springframework.stereotype.Component;  
9 -import org.springframework.transaction.annotation.Transactional;  
10 -  
11 -import javax.annotation.Resource;  
12 -import java.util.Objects;  
13 -  
14 -  
15 -/**  
16 - * 请假流程结束流程监听处理服务, 根据请假申请审批通过,还是未通过, 更新请假表单  
17 - */  
18 -@Component  
19 -public class LeaveApplyEndProcessor implements ExecutionListener {  
20 -  
21 - @Resource  
22 - private BpmOALeaveMapper leaveMapper;  
23 -  
24 - @Override  
25 - @Transactional(rollbackFor = Exception.class)  
26 - public void notify(DelegateExecution delegateExecution) {  
27 - final String businessKey = delegateExecution.getProcessInstanceBusinessKey();  
28 - final Object approved = delegateExecution.getVariable("approved");  
29 - OALeaveDO updateDo = new OALeaveDO();  
30 - updateDo.setId(Long.valueOf(businessKey));  
31 - if (Objects.equals(approved, true)) {  
32 - updateDo.setResult(BpmProcessInstanceResultEnum.APPROVE.getResult());  
33 - } else {  
34 - updateDo.setResult(BpmProcessInstanceResultEnum.REJECT.getResult());  
35 - }  
36 -  
37 - leaveMapper.updateById(updateDo);  
38 - }  
39 -  
40 -}  
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java
@@ -34,7 +34,7 @@ public class OALeaveServiceImpl implements BpmOALeaveService { @@ -34,7 +34,7 @@ public class OALeaveServiceImpl implements BpmOALeaveService {
34 /** 34 /**
35 * OA 请假对应的流程定义 KEY 35 * OA 请假对应的流程定义 KEY
36 */ 36 */
37 - private static final String PROCESS_KEY = "oa_leave"; 37 + public static final String PROCESS_KEY = "oa_leave";
38 38
39 @Resource 39 @Resource
40 private BpmOALeaveMapper leaveMapper; 40 private BpmOALeaveMapper leaveMapper;
@@ -45,14 +45,8 @@ public class OALeaveServiceImpl implements BpmOALeaveService { @@ -45,14 +45,8 @@ public class OALeaveServiceImpl implements BpmOALeaveService {
45 @Override 45 @Override
46 @Transactional(rollbackFor = Exception.class) 46 @Transactional(rollbackFor = Exception.class)
47 public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { 47 public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) {
48 - // TODO 芋道源码  
49 - // 校验是否超过请假天数的上限;  
50 - long day = DateUtil.betweenDay(createReqVO.getStartTime(), createReqVO.getEndTime(), false);  
51 - if (day <= 0) {  
52 - throw ServiceExceptionUtil.exception(OA_DAY_LEAVE_ERROR);  
53 - }  
54 -  
55 // 插入 OA 请假单 48 // 插入 OA 请假单
  49 + long day = DateUtil.betweenDay(createReqVO.getStartTime(), createReqVO.getEndTime(), false);
56 OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) 50 OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day)
57 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); 51 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
58 leaveMapper.insert(leave); 52 leaveMapper.insert(leave);
@@ -70,6 +64,11 @@ public class OALeaveServiceImpl implements BpmOALeaveService { @@ -70,6 +64,11 @@ public class OALeaveServiceImpl implements BpmOALeaveService {
70 } 64 }
71 65
72 @Override 66 @Override
  67 + public void updateLeaveResult(Long id, Integer result) {
  68 + leaveMapper.updateById(new OALeaveDO().setId(id).setResult(result));
  69 + }
  70 +
  71 + @Override
73 public void cancelLeave(Long id) { 72 public void cancelLeave(Long id) {
74 // TODO 需要重新实现 73 // TODO 需要重新实现
75 // 校验存在 74 // 校验存在
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java 0 → 100644
  1 +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.listener;
  2 +
  3 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent;
  4 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener;
  5 +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService;
  6 +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl.OALeaveServiceImpl;
  7 +import org.springframework.stereotype.Component;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * OA 请假单的结果的监听器实现类
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@Component
  17 +public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListener {
  18 +
  19 + @Resource
  20 + private BpmOALeaveService leaveService;
  21 +
  22 + @Override
  23 + protected String getProcessDefinitionKey() {
  24 + return OALeaveServiceImpl.PROCESS_KEY;
  25 + }
  26 +
  27 + @Override
  28 + protected void onEvent(BpmProcessInstanceResultEvent event) {
  29 + leaveService.updateLeaveResult(Long.parseLong(event.getBusinessKey()), event.getResult());
  30 + }
  31 +
  32 +}
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
@@ -152,7 +152,6 @@ public interface BpmProcessInstanceService { @@ -152,7 +152,6 @@ public interface BpmProcessInstanceService {
152 * 更新 ProcessInstance 拓展记录为完成 152 * 更新 ProcessInstance 拓展记录为完成
153 * 153 *
154 * @param instance 流程任务 154 * @param instance 流程任务
155 - * @param reason 原因  
156 */ 155 */
157 void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance); 156 void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance);
158 157
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
@@ -12,6 +12,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanc @@ -12,6 +12,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanc
12 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; 12 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
13 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; 13 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum;
14 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; 14 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum;
  15 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent;
  16 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener;
  17 +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher;
15 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; 18 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
16 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; 19 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService;
17 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; 20 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
@@ -77,6 +80,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -77,6 +80,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
77 private BpmMessageService messageService; 80 private BpmMessageService messageService;
78 81
79 @Resource 82 @Resource
  83 + private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher;
  84 +
  85 + @Resource
80 private BpmProcessInstanceExtMapper processInstanceExtMapper; 86 private BpmProcessInstanceExtMapper processInstanceExtMapper;
81 87
82 @Override 88 @Override
@@ -141,7 +147,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -141,7 +147,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
141 } 147 }
142 148
143 // 通过删除流程实例,实现流程实例的取消 149 // 通过删除流程实例,实现流程实例的取消
144 - runtimeService.deleteProcessInstance(cancelReqVO.getId(), cancelReqVO.getReason()); 150 + runtimeService.deleteProcessInstance(cancelReqVO.getId(),
  151 + BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason()));
145 } 152 }
146 153
147 @Override 154 @Override
@@ -247,16 +254,26 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -247,16 +254,26 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
247 return; 254 return;
248 } 255 }
249 256
  257 + // 需要主动查询,因为 instance 只有 id 属性
  258 + ProcessInstance processInstance = getProcessInstance(instance.getId());
250 // 更新拓展表 259 // 更新拓展表
251 BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) 260 BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance)
252 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 261 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
253 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) 262 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
254 .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); 263 .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult());
255 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); 264 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
  265 +
  266 + // 发送流程实例的状态事件
  267 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  268 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
256 } 269 }
257 270
258 @Override 271 @Override
259 public void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance) { 272 public void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance) {
  273 + // 需要主动查询,因为 instance 只有 id 属性
  274 + // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance
  275 + HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId());
  276 + // 更新拓展表
260 BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) 277 BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance)
261 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 278 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
262 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) 279 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
@@ -265,10 +282,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -265,10 +282,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
265 282
266 // 发送流程被通过的消息 283 // 发送流程被通过的消息
267 messageService.sendMessageWhenProcessInstanceApprove(BpmMessageConvert.INSTANCE.convert(instance)); 284 messageService.sendMessageWhenProcessInstanceApprove(BpmMessageConvert.INSTANCE.convert(instance));
  285 +
  286 + // 发送流程实例的状态事件
  287 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  288 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
268 } 289 }
269 290
270 @Transactional(rollbackFor = Exception.class) 291 @Transactional(rollbackFor = Exception.class)
271 public void updateProcessInstanceExtReject(String id, String comment) { 292 public void updateProcessInstanceExtReject(String id, String comment) {
  293 + // 需要主动查询,因为 instance 只有 id 属性
272 ProcessInstance processInstance = getProcessInstance(id); 294 ProcessInstance processInstance = getProcessInstance(id);
273 // 删除流程实例,以实现驳回任务时,取消整个审批流程 295 // 删除流程实例,以实现驳回任务时,取消整个审批流程
274 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment))); 296 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment)));
@@ -276,12 +298,17 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -276,12 +298,17 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
276 // 更新 status + result 298 // 更新 status + result
277 // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, 299 // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法,
278 // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 300 // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的
279 - processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(id) 301 + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id)
280 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) 302 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
281 - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult())); 303 + .setResult(BpmProcessInstanceResultEnum.REJECT.getResult());
  304 + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
282 305
283 // 发送流程被不通过的消息 306 // 发送流程被不通过的消息
284 messageService.sendMessageWhenProcessInstanceReject(BpmMessageConvert.INSTANCE.convert(processInstance, comment)); 307 messageService.sendMessageWhenProcessInstanceReject(BpmMessageConvert.INSTANCE.convert(processInstance, comment));
  308 +
  309 + // 发送流程实例的状态事件
  310 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  311 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
285 } 312 }
286 313
287 } 314 }