Commit d30bf0601c92ade4c24a4c0e723164f77feb383f

Authored by jason
1 parent 075dd83b

工作流 Flowable 取消流程实例实现

yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
@@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task; @@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;  
6 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;  
7 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;  
8 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
9 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 6 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
10 import io.swagger.annotations.Api; 7 import io.swagger.annotations.Api;
11 import io.swagger.annotations.ApiImplicitParam; 8 import io.swagger.annotations.ApiImplicitParam;
@@ -50,4 +47,12 @@ public class BpmProcessInstanceController { @@ -50,4 +47,12 @@ public class BpmProcessInstanceController {
50 public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) { 47 public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
51 return success(processInstanceService.getProcessInstanceVO(id)); 48 return success(processInstanceService.getProcessInstanceVO(id));
52 } 49 }
  50 +
  51 + @DeleteMapping("/cancel")
  52 + @ApiOperation(value = "取消流程实例", notes = "撤回发起的流程")
  53 + @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')")
  54 + public CommonResult<Boolean> cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) {
  55 + processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO);
  56 + return success(true);
  57 + }
53 } 58 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
@@ -5,18 +5,23 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI @@ -5,18 +5,23 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
6 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 6 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
7 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; 7 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
  8 +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
  9 +import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
8 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 10 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
9 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 11 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
10 import org.flowable.engine.history.HistoricProcessInstance; 12 import org.flowable.engine.history.HistoricProcessInstance;
11 import org.flowable.engine.repository.ProcessDefinition; 13 import org.flowable.engine.repository.ProcessDefinition;
  14 +import org.flowable.engine.runtime.ProcessInstance;
12 import org.flowable.task.api.Task; 15 import org.flowable.task.api.Task;
13 import org.mapstruct.Mapper; 16 import org.mapstruct.Mapper;
14 import org.mapstruct.Mapping; 17 import org.mapstruct.Mapping;
15 import org.mapstruct.MappingTarget; 18 import org.mapstruct.MappingTarget;
  19 +import org.mapstruct.Mappings;
16 import org.mapstruct.factory.Mappers; 20 import org.mapstruct.factory.Mappers;
17 21
18 import java.util.List; 22 import java.util.List;
19 import java.util.Map; 23 import java.util.Map;
  24 +import java.util.Optional;
20 25
21 /** 26 /**
22 * 流程实例 Convert 27 * 流程实例 Convert
@@ -73,7 +78,22 @@ public interface BpmProcessInstanceConvert { @@ -73,7 +78,22 @@ public interface BpmProcessInstanceConvert {
73 78
74 BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean); 79 BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
75 80
  81 + default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) {
  82 + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
  83 + event.setId(instance.getId());
  84 + event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
  85 + event.setBusinessKey(instance.getBusinessKey());
  86 + event.setResult(result);
  87 + return event;
  88 + }
76 89
77 - 90 + default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){
  91 + Long startUserId = instance.getStartUserId() == null ? null : Long.valueOf(instance.getStartUserId());
  92 + BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceApproveReqDTO()
  93 + .setStartUserId(startUserId)
  94 + .setProcessInstanceId(instance.getId())
  95 + .setProcessInstanceName(instance.getName());
  96 + return reqDTO;
  97 + }
78 98
79 } 99 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
@@ -101,7 +101,17 @@ public interface BpmTaskConvert { @@ -101,7 +101,17 @@ public interface BpmTaskConvert {
101 }) 101 })
102 BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser); 102 BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser);
103 103
104 - 104 + default BpmTaskExtDO convert2TaskExt(Task task){
  105 + Long assigneeUserId = task.getAssignee() == null ? null : Long.valueOf(task.getAssignee());
  106 + BpmTaskExtDO taskExtDO = new BpmTaskExtDO()
  107 + .setTaskId(task.getId())
  108 + .setAssigneeUserId(assigneeUserId)
  109 + .setName(task.getName())
  110 + .setProcessDefinitionId(task.getProcessDefinitionId())
  111 + .setProcessInstanceId(task.getProcessInstanceId());
  112 + taskExtDO.setCreateTime(task.getCreateTime());
  113 + return taskExtDO;
  114 + }
105 } 115 }
106 116
107 117
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmProcessInstanceEventListener.java
@@ -28,8 +28,8 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent @@ -28,8 +28,8 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent
28 28
29 public static final Set<FlowableEngineEventType> PROCESS_INSTANCE_EVENTS = ImmutableSet.<FlowableEngineEventType>builder() 29 public static final Set<FlowableEngineEventType> PROCESS_INSTANCE_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
30 .add(FlowableEngineEventType.PROCESS_CREATED) 30 .add(FlowableEngineEventType.PROCESS_CREATED)
31 - .add(FlowableEngineEventType.PROCESS_STARTED)  
32 .add(FlowableEngineEventType.PROCESS_CANCELLED) 31 .add(FlowableEngineEventType.PROCESS_CANCELLED)
  32 + .add(FlowableEngineEventType.PROCESS_COMPLETED)
33 .build(); 33 .build();
34 34
35 public BpmProcessInstanceEventListener(){ 35 public BpmProcessInstanceEventListener(){
@@ -42,13 +42,12 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent @@ -42,13 +42,12 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent
42 } 42 }
43 43
44 @Override 44 @Override
45 - protected void processStarted(FlowableProcessStartedEvent event) {  
46 - super.processStarted(event); 45 + protected void processCancelled(FlowableCancelledEvent event) {
  46 + processInstanceService.updateProcessInstanceExtCancel(event);
47 } 47 }
48 48
49 -  
50 @Override 49 @Override
51 - protected void processCancelled(FlowableCancelledEvent event) {  
52 - super.processCancelled(event); 50 + protected void processCompleted(FlowableEngineEntityEvent event) {
  51 + processInstanceService.updateProcessInstanceExtComplete((ProcessInstance)event.getEntity());
53 } 52 }
54 } 53 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/listener/BpmTaskEventListener.java
@@ -39,4 +39,9 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener { @@ -39,4 +39,9 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
39 protected void taskCreated(FlowableEngineEntityEvent event) { 39 protected void taskCreated(FlowableEngineEntityEvent event) {
40 taskService.createTaskExt((Task) event.getEntity()); 40 taskService.createTaskExt((Task) event.getEntity());
41 } 41 }
  42 +
  43 + @Override
  44 + protected void taskCompleted(FlowableEngineEntityEvent event) {
  45 + super.taskCompleted(event);
  46 + }
42 } 47 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
@@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.bpm.service.task; @@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.bpm.service.task;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;  
6 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;  
7 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;  
8 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 5 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
9 import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; 6 import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
  7 +import org.flowable.engine.delegate.event.FlowableCancelledEvent;
10 import org.flowable.engine.history.HistoricProcessInstance; 8 import org.flowable.engine.history.HistoricProcessInstance;
11 import org.flowable.engine.runtime.ProcessInstance; 9 import org.flowable.engine.runtime.ProcessInstance;
12 10
@@ -23,6 +21,14 @@ import java.util.Set; @@ -23,6 +21,14 @@ import java.util.Set;
23 public interface BpmProcessInstanceService { 21 public interface BpmProcessInstanceService {
24 22
25 /** 23 /**
  24 + * 获得流程实例
  25 + *
  26 + * @param id 流程实例的编号
  27 + * @return 流程实例
  28 + */
  29 + ProcessInstance getProcessInstance(String id);
  30 +
  31 + /**
26 * 获得流程实例列表 32 * 获得流程实例列表
27 * 33 *
28 * @param ids 流程实例的编号集合 34 * @param ids 流程实例的编号集合
@@ -68,6 +74,14 @@ public interface BpmProcessInstanceService { @@ -68,6 +74,14 @@ public interface BpmProcessInstanceService {
68 BpmProcessInstanceRespVO getProcessInstanceVO(String id); 74 BpmProcessInstanceRespVO getProcessInstanceVO(String id);
69 75
70 /** 76 /**
  77 + * 取消流程实例
  78 + *
  79 + * @param userId 用户编号
  80 + * @param cancelReqVO 取消信息
  81 + */
  82 + void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO);
  83 +
  84 + /**
71 * 获得历史的流程实例 85 * 获得历史的流程实例
72 * 86 *
73 * @param id 流程实例的编号 87 * @param id 流程实例的编号
@@ -81,4 +95,20 @@ public interface BpmProcessInstanceService { @@ -81,4 +95,20 @@ public interface BpmProcessInstanceService {
81 * @param instance 流程任务 95 * @param instance 流程任务
82 */ 96 */
83 void createProcessInstanceExt(ProcessInstance instance); 97 void createProcessInstanceExt(ProcessInstance instance);
  98 +
  99 + /**
  100 + * 更新 ProcessInstance 拓展记录为取消
  101 + *
  102 + * @param event 流程取消事件
  103 + */
  104 + void updateProcessInstanceExtCancel(FlowableCancelledEvent event);
  105 +
  106 + /**
  107 + * 更新 ProcessInstance 拓展记录为完成
  108 + *
  109 + * @param instance 流程任务
  110 + */
  111 + void updateProcessInstanceExtComplete(ProcessInstance instance);
  112 +
  113 +
84 } 114 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -4,17 +4,17 @@ import cn.hutool.core.collection.CollUtil; @@ -4,17 +4,17 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 6 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;  
8 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;  
9 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;  
10 -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 7 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
11 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; 8 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
13 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
14 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
  12 +import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
15 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum; 13 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
16 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; 14 import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
  15 +import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher;
17 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; 16 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
  17 +import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
18 import cn.iocoder.yudao.module.system.api.dept.DeptApi; 18 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
19 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 19 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
20 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 20 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
@@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; @@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
22 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
23 import org.flowable.engine.HistoryService; 23 import org.flowable.engine.HistoryService;
24 import org.flowable.engine.RuntimeService; 24 import org.flowable.engine.RuntimeService;
  25 +import org.flowable.engine.delegate.event.FlowableCancelledEvent;
25 import org.flowable.engine.history.HistoricProcessInstance; 26 import org.flowable.engine.history.HistoricProcessInstance;
26 import org.flowable.engine.repository.ProcessDefinition; 27 import org.flowable.engine.repository.ProcessDefinition;
27 import org.flowable.engine.runtime.ProcessInstance; 28 import org.flowable.engine.runtime.ProcessInstance;
@@ -32,15 +33,12 @@ import org.springframework.validation.annotation.Validated; @@ -32,15 +33,12 @@ import org.springframework.validation.annotation.Validated;
32 33
33 import javax.annotation.Resource; 34 import javax.annotation.Resource;
34 import javax.validation.Valid; 35 import javax.validation.Valid;
35 -import java.util.List;  
36 -import java.util.Map;  
37 -import java.util.Optional;  
38 -import java.util.Set; 36 +import java.util.*;
39 37
40 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 38 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; 39 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
42 -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;  
43 -import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS; 40 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
  41 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF;
44 42
45 /** 43 /**
46 * 流程实例 Service 实现类 44 * 流程实例 Service 实现类
@@ -74,6 +72,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -74,6 +72,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
74 private AdminUserApi adminUserApi; 72 private AdminUserApi adminUserApi;
75 @Resource 73 @Resource
76 private DeptApi deptApi; 74 private DeptApi deptApi;
  75 + @Resource
  76 + private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher;
  77 + @Resource
  78 + private BpmMessageService messageService;
  79 + @Override
  80 + public ProcessInstance getProcessInstance(String id) {
  81 + return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
  82 + }
  83 +
77 @Override 84 @Override
78 public List<ProcessInstance> getProcessInstances(Set<String> ids) { 85 public List<ProcessInstance> getProcessInstances(Set<String> ids) {
79 return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); 86 return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list();
@@ -134,6 +141,24 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -134,6 +141,24 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
134 processDefinition, processDefinitionExt, bpmnXml, startUser, dept); 141 processDefinition, processDefinitionExt, bpmnXml, startUser, dept);
135 } 142 }
136 143
  144 + @Override
  145 + public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) {
  146 + // 校验流程实例存在
  147 + ProcessInstance instance = getProcessInstance(cancelReqVO.getId());
  148 + if (instance == null) {
  149 + throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS);
  150 + }
  151 + // 只能取消自己的
  152 + if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) {
  153 + throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF);
  154 + }
  155 +
  156 + // 通过删除流程实例,实现流程实例的取消,
  157 + // 删除流程实例,正则执行任务ACT_RU_TASK. 任务会被删除。通过历史表查询
  158 + runtimeService.deleteProcessInstance(cancelReqVO.getId(),
  159 + BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason()));
  160 + }
  161 +
137 /** 162 /**
138 * 获得历史的流程实例 163 * 获得历史的流程实例
139 * 164 *
@@ -162,6 +187,51 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -162,6 +187,51 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
162 processInstanceExtMapper.insert(instanceExtDO); 187 processInstanceExtMapper.insert(instanceExtDO);
163 } 188 }
164 189
  190 + @Override
  191 + public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) {
  192 + // 判断是否为 Reject 不通过。如果是,则不进行更新
  193 + if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) {
  194 + return;
  195 + }
  196 +
  197 + // 需要主动查询,因为 instance 只有 id 属性
  198 + // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance
  199 + HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId());
  200 + // 更新拓展表
  201 + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO()
  202 + .setProcessInstanceId(event.getProcessInstanceId())
  203 + .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
  204 + .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
  205 + .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult());
  206 +
  207 + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
  208 +
  209 + // 发送流程实例的状态事件
  210 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  211 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
  212 + }
  213 +
  214 + @Override
  215 + public void updateProcessInstanceExtComplete(ProcessInstance instance) {
  216 + // 需要主动查询,因为 instance 只有 id 属性
  217 + // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance
  218 + HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId());
  219 + // 更新拓展表
  220 + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO()
  221 + .setProcessInstanceId(instance.getProcessInstanceId())
  222 + .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
  223 + .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
  224 + .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过
  225 + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
  226 +
  227 + // 发送流程被通过的消息
  228 + messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance));
  229 +
  230 + // 发送流程实例的状态事件
  231 + processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
  232 + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
  233 + }
  234 +
165 private String createProcessInstance0(Long userId, ProcessDefinition definition, 235 private String createProcessInstance0(Long userId, ProcessDefinition definition,
166 Map<String, Object> variables, String businessKey) { 236 Map<String, Object> variables, String businessKey) {
167 // 校验流程定义 237 // 校验流程定义
@@ -181,7 +251,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -181,7 +251,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
181 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId()) 251 processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId())
182 .setFormVariables(variables)); 252 .setFormVariables(variables));
183 253
184 -  
185 return instance.getId(); 254 return instance.getId();
186 } 255 }
187 } 256 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
@@ -61,4 +61,11 @@ public interface BpmTaskService { @@ -61,4 +61,11 @@ public interface BpmTaskService {
61 */ 61 */
62 void createTaskExt(Task task); 62 void createTaskExt(Task task);
63 63
  64 + /**
  65 + * 更新 Task 拓展记录为完成
  66 + *
  67 + * @param task 任务实体
  68 + */
  69 + void updateTaskExtComplete(Task task);
  70 +
64 } 71 }
yudao-module-bpm/yudao-module-bpm-impl-flowable/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -27,10 +27,7 @@ import org.flowable.task.api.history.HistoricTaskInstance; @@ -27,10 +27,7 @@ import org.flowable.task.api.history.HistoricTaskInstance;
27 import org.springframework.stereotype.Service; 27 import org.springframework.stereotype.Service;
28 28
29 import javax.annotation.Resource; 29 import javax.annotation.Resource;
30 -import java.util.Collections;  
31 -import java.util.List;  
32 -import java.util.Map;  
33 -import java.util.Set; 30 +import java.util.*;
34 31
35 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 32 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
36 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 33 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -128,13 +125,16 @@ public class BpmTaskServiceImpl implements BpmTaskService{ @@ -128,13 +125,16 @@ public class BpmTaskServiceImpl implements BpmTaskService{
128 125
129 @Override 126 @Override
130 public void createTaskExt(Task task) { 127 public void createTaskExt(Task task) {
131 - BpmTaskExtDO taskExtDO = new BpmTaskExtDO()  
132 - .setTaskId(task.getId())  
133 - .setAssigneeUserId(task.getAssignee() == null ? null : Long.valueOf(task.getAssignee()))  
134 - .setProcessDefinitionId(task.getProcessDefinitionId())  
135 - .setProcessInstanceId(task.getProcessInstanceId())  
136 - .setName(task.getName()) 128 + BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)
137 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); 129 .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
138 taskExtMapper.insert(taskExtDO); 130 taskExtMapper.insert(taskExtDO);
139 } 131 }
  132 +
  133 + @Override
  134 + public void updateTaskExtComplete(Task task) {
  135 + BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)
  136 + .setEndTime(new Date()) // 此时不能使用 task 的 completeData,因为还是空的。
  137 + .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult());
  138 + taskExtMapper.updateByTaskId(taskExtDO);
  139 + }
140 } 140 }