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 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 10 @ApiModel("请假申请创建 Request VO")
14 11 @Data
15 12 @EqualsAndHashCode(callSuper = true)
16 13 @ToString(callSuper = true)
17 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 5 import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO;
6 6 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
7 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 9 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
9 10 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
10 11 import cn.iocoder.yudao.framework.common.pojo.PageResult;
... ... @@ -98,4 +99,22 @@ public interface BpmProcessInstanceConvert {
98 99 void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to);
99 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 13 @AllArgsConstructor
14 14 public enum BpmProcessInstanceDeleteReasonEnum {
15 15  
16   - REJECT_TASK("不通过任务,原因:{}"); // 修改文案时,需要注意 isRejectReason 方法
  16 + REJECT_TASK("不通过任务,原因:{}"), // 修改文案时,需要注意 isRejectReason 方法
  17 + CANCEL_TASK("主动取消任务,原因:{}");
17 18  
18 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 2  
3 3 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory;
4 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 6 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager;
6 7 import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener;
7 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 12 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
12 13 import org.activiti.api.runtime.shared.identity.UserGroupManager;
13 14 import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
  15 +import org.springframework.context.ApplicationEventPublisher;
14 16 import org.springframework.context.annotation.Bean;
15 17 import org.springframework.context.annotation.Configuration;
16 18  
... ... @@ -71,4 +73,9 @@ public class BpmActivitiConfiguration {
71 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 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.StrUtil;
5   -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO;
6 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 6 import lombok.Data;
10 7  
11 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 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 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 34 /**
35 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 39 @Resource
40 40 private BpmOALeaveMapper leaveMapper;
... ... @@ -45,14 +45,8 @@ public class OALeaveServiceImpl implements BpmOALeaveService {
45 45 @Override
46 46 @Transactional(rollbackFor = Exception.class)
47 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 48 // 插入 OA 请假单
  49 + long day = DateUtil.betweenDay(createReqVO.getStartTime(), createReqVO.getEndTime(), false);
56 50 OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day)
57 51 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
58 52 leaveMapper.insert(leave);
... ... @@ -70,6 +64,11 @@ public class OALeaveServiceImpl implements BpmOALeaveService {
70 64 }
71 65  
72 66 @Override
  67 + public void updateLeaveResult(Long id, Integer result) {
  68 + leaveMapper.updateById(new OALeaveDO().setId(id).setResult(result));
  69 + }
  70 +
  71 + @Override
73 72 public void cancelLeave(Long id) {
74 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 152 * 更新 ProcessInstance 拓展记录为完成
153 153 *
154 154 * @param instance 流程任务
155   - * @param reason 原因
156 155 */
157 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 12 import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
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 +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 18 import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
16 19 import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService;
17 20 import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
... ... @@ -77,6 +80,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
77 80 private BpmMessageService messageService;
78 81  
79 82 @Resource
  83 + private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher;
  84 +
  85 + @Resource
80 86 private BpmProcessInstanceExtMapper processInstanceExtMapper;
81 87  
82 88 @Override
... ... @@ -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 154 @Override
... ... @@ -247,16 +254,26 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
247 254 return;
248 255 }
249 256  
  257 + // 需要主动查询,因为 instance 只有 id 属性
  258 + ProcessInstance processInstance = getProcessInstance(instance.getId());
250 259 // 更新拓展表
251 260 BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance)
252 261 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
253 262 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
254 263 .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult());
255 264 processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
  265 +
  266 + // 发送流程实例的状态事件
  267 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  268 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
256 269 }
257 270  
258 271 @Override
259 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 277 BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance)
261 278 .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
262 279 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
... ... @@ -265,10 +282,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
265 282  
266 283 // 发送流程被通过的消息
267 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 291 @Transactional(rollbackFor = Exception.class)
271 292 public void updateProcessInstanceExtReject(String id, String comment) {
  293 + // 需要主动查询,因为 instance 只有 id 属性
272 294 ProcessInstance processInstance = getProcessInstance(id);
273 295 // 删除流程实例,以实现驳回任务时,取消整个审批流程
274 296 deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment)));
... ... @@ -276,12 +298,17 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
276 298 // 更新 status + result
277 299 // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法,
278 300 // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的
279   - processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(id)
  301 + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id)
280 302 .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
281   - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()));
  303 + .setResult(BpmProcessInstanceResultEnum.REJECT.getResult());
  304 + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
282 305  
283 306 // 发送流程被不通过的消息
284 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 }
... ...