mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	工作流 Flowable 取消流程实例实现
This commit is contained in:
		@ -2,10 +2,7 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 | 
					import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 | 
				
			||||||
import io.swagger.annotations.Api;
 | 
					import io.swagger.annotations.Api;
 | 
				
			||||||
import io.swagger.annotations.ApiImplicitParam;
 | 
					import io.swagger.annotations.ApiImplicitParam;
 | 
				
			||||||
@ -50,4 +47,12 @@ public class BpmProcessInstanceController {
 | 
				
			|||||||
    public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
 | 
					    public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
 | 
				
			||||||
        return success(processInstanceService.getProcessInstanceVO(id));
 | 
					        return success(processInstanceService.getProcessInstanceVO(id));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @DeleteMapping("/cancel")
 | 
				
			||||||
 | 
					    @ApiOperation(value = "取消流程实例", notes = "撤回发起的流程")
 | 
				
			||||||
 | 
					    @PreAuthorize("@ss.hasPermission('bpm:process-instance:cancel')")
 | 
				
			||||||
 | 
					    public CommonResult<Boolean> cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) {
 | 
				
			||||||
 | 
					        processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO);
 | 
				
			||||||
 | 
					        return success(true);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,18 +5,23 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI
 | 
				
			|||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
 | 
				
			||||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 | 
					import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 | 
				
			||||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 | 
					import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 | 
				
			||||||
import org.flowable.engine.history.HistoricProcessInstance;
 | 
					import org.flowable.engine.history.HistoricProcessInstance;
 | 
				
			||||||
import org.flowable.engine.repository.ProcessDefinition;
 | 
					import org.flowable.engine.repository.ProcessDefinition;
 | 
				
			||||||
 | 
					import org.flowable.engine.runtime.ProcessInstance;
 | 
				
			||||||
import org.flowable.task.api.Task;
 | 
					import org.flowable.task.api.Task;
 | 
				
			||||||
import org.mapstruct.Mapper;
 | 
					import org.mapstruct.Mapper;
 | 
				
			||||||
import org.mapstruct.Mapping;
 | 
					import org.mapstruct.Mapping;
 | 
				
			||||||
import org.mapstruct.MappingTarget;
 | 
					import org.mapstruct.MappingTarget;
 | 
				
			||||||
 | 
					import org.mapstruct.Mappings;
 | 
				
			||||||
import org.mapstruct.factory.Mappers;
 | 
					import org.mapstruct.factory.Mappers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.Optional;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 流程实例 Convert
 | 
					 * 流程实例 Convert
 | 
				
			||||||
@ -73,7 +78,22 @@ public interface BpmProcessInstanceConvert {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
 | 
					    BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) {
 | 
				
			||||||
 | 
					        BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
 | 
				
			||||||
 | 
					        event.setId(instance.getId());
 | 
				
			||||||
 | 
					        event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
 | 
				
			||||||
 | 
					        event.setBusinessKey(instance.getBusinessKey());
 | 
				
			||||||
 | 
					        event.setResult(result);
 | 
				
			||||||
 | 
					        return event;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){
 | 
				
			||||||
 | 
					        Long startUserId = instance.getStartUserId() == null ? null : Long.valueOf(instance.getStartUserId());
 | 
				
			||||||
 | 
					        BpmMessageSendWhenProcessInstanceApproveReqDTO reqDTO = new BpmMessageSendWhenProcessInstanceApproveReqDTO()
 | 
				
			||||||
 | 
					                .setStartUserId(startUserId)
 | 
				
			||||||
 | 
					                .setProcessInstanceId(instance.getId())
 | 
				
			||||||
 | 
					                .setProcessInstanceName(instance.getName());
 | 
				
			||||||
 | 
					        return reqDTO;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -101,7 +101,17 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
    BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser);
 | 
					    BpmTaskTodoPageItemRespVO.ProcessInstance convert(HistoricProcessInstance processInstance, AdminUserRespDTO startUser);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default BpmTaskExtDO convert2TaskExt(Task task){
 | 
				
			||||||
 | 
					        Long assigneeUserId = task.getAssignee() == null ? null : Long.valueOf(task.getAssignee());
 | 
				
			||||||
 | 
					        BpmTaskExtDO taskExtDO = new BpmTaskExtDO()
 | 
				
			||||||
 | 
					                .setTaskId(task.getId())
 | 
				
			||||||
 | 
					                .setAssigneeUserId(assigneeUserId)
 | 
				
			||||||
 | 
					                .setName(task.getName())
 | 
				
			||||||
 | 
					                .setProcessDefinitionId(task.getProcessDefinitionId())
 | 
				
			||||||
 | 
					                .setProcessInstanceId(task.getProcessInstanceId());
 | 
				
			||||||
 | 
					        taskExtDO.setCreateTime(task.getCreateTime());
 | 
				
			||||||
 | 
					        return taskExtDO;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -28,8 +28,8 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public static final Set<FlowableEngineEventType> PROCESS_INSTANCE_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
 | 
					    public static final Set<FlowableEngineEventType> PROCESS_INSTANCE_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
 | 
				
			||||||
                     .add(FlowableEngineEventType.PROCESS_CREATED)
 | 
					                     .add(FlowableEngineEventType.PROCESS_CREATED)
 | 
				
			||||||
                     .add(FlowableEngineEventType.PROCESS_STARTED)
 | 
					 | 
				
			||||||
                     .add(FlowableEngineEventType.PROCESS_CANCELLED)
 | 
					                     .add(FlowableEngineEventType.PROCESS_CANCELLED)
 | 
				
			||||||
 | 
					                     .add(FlowableEngineEventType.PROCESS_COMPLETED)
 | 
				
			||||||
                     .build();
 | 
					                     .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public BpmProcessInstanceEventListener(){
 | 
					    public BpmProcessInstanceEventListener(){
 | 
				
			||||||
@ -42,13 +42,12 @@ public class BpmProcessInstanceEventListener extends AbstractFlowableEngineEvent
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    protected void processStarted(FlowableProcessStartedEvent event) {
 | 
					    protected void processCancelled(FlowableCancelledEvent event) {
 | 
				
			||||||
        super.processStarted(event);
 | 
					        processInstanceService.updateProcessInstanceExtCancel(event);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    protected void processCancelled(FlowableCancelledEvent event) {
 | 
					    protected void processCompleted(FlowableEngineEntityEvent event) {
 | 
				
			||||||
        super.processCancelled(event);
 | 
					        processInstanceService.updateProcessInstanceExtComplete((ProcessInstance)event.getEntity());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -39,4 +39,9 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
 | 
				
			|||||||
    protected void taskCreated(FlowableEngineEntityEvent event) {
 | 
					    protected void taskCreated(FlowableEngineEntityEvent event) {
 | 
				
			||||||
        taskService.createTaskExt((Task) event.getEntity());
 | 
					        taskService.createTaskExt((Task) event.getEntity());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected void taskCompleted(FlowableEngineEntityEvent event) {
 | 
				
			||||||
 | 
					        super.taskCompleted(event);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.bpm.service.task;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					 | 
				
			||||||
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
 | 
					import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
 | 
				
			||||||
 | 
					import org.flowable.engine.delegate.event.FlowableCancelledEvent;
 | 
				
			||||||
import org.flowable.engine.history.HistoricProcessInstance;
 | 
					import org.flowable.engine.history.HistoricProcessInstance;
 | 
				
			||||||
import org.flowable.engine.runtime.ProcessInstance;
 | 
					import org.flowable.engine.runtime.ProcessInstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -22,6 +20,14 @@ import java.util.Set;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
public interface BpmProcessInstanceService {
 | 
					public interface BpmProcessInstanceService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获得流程实例
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param id 流程实例的编号
 | 
				
			||||||
 | 
					     * @return 流程实例
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    ProcessInstance getProcessInstance(String id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获得流程实例列表
 | 
					     * 获得流程实例列表
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@ -67,6 +73,14 @@ public interface BpmProcessInstanceService {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    BpmProcessInstanceRespVO getProcessInstanceVO(String id);
 | 
					    BpmProcessInstanceRespVO getProcessInstanceVO(String id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 取消流程实例
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param userId 用户编号
 | 
				
			||||||
 | 
					     * @param cancelReqVO 取消信息
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获得历史的流程实例
 | 
					     * 获得历史的流程实例
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@ -81,4 +95,20 @@ public interface BpmProcessInstanceService {
 | 
				
			|||||||
     * @param instance 流程任务
 | 
					     * @param instance 流程任务
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    void createProcessInstanceExt(ProcessInstance instance);
 | 
					    void createProcessInstanceExt(ProcessInstance instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新 ProcessInstance 拓展记录为取消
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param event 流程取消事件
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void updateProcessInstanceExtCancel(FlowableCancelledEvent event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新 ProcessInstance 拓展记录为完成
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param instance 流程任务
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void updateProcessInstanceExtComplete(ProcessInstance instance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,17 +4,17 @@ import cn.hutool.core.collection.CollUtil;
 | 
				
			|||||||
import cn.hutool.core.lang.Assert;
 | 
					import cn.hutool.core.lang.Assert;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
 | 
					import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
 | 
					import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
 | 
					import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
 | 
					import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 | 
					import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService;
 | 
				
			||||||
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 | 
					import cn.iocoder.yudao.module.system.api.dept.DeptApi;
 | 
				
			||||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 | 
					import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 | 
				
			||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 | 
					import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
 | 
				
			||||||
@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 | 
				
			|||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.flowable.engine.HistoryService;
 | 
					import org.flowable.engine.HistoryService;
 | 
				
			||||||
import org.flowable.engine.RuntimeService;
 | 
					import org.flowable.engine.RuntimeService;
 | 
				
			||||||
 | 
					import org.flowable.engine.delegate.event.FlowableCancelledEvent;
 | 
				
			||||||
import org.flowable.engine.history.HistoricProcessInstance;
 | 
					import org.flowable.engine.history.HistoricProcessInstance;
 | 
				
			||||||
import org.flowable.engine.repository.ProcessDefinition;
 | 
					import org.flowable.engine.repository.ProcessDefinition;
 | 
				
			||||||
import org.flowable.engine.runtime.ProcessInstance;
 | 
					import org.flowable.engine.runtime.ProcessInstance;
 | 
				
			||||||
@ -32,15 +33,12 @@ import org.springframework.validation.annotation.Validated;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import javax.annotation.Resource;
 | 
					import javax.annotation.Resource;
 | 
				
			||||||
import javax.validation.Valid;
 | 
					import javax.validation.Valid;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.*;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.Optional;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
					import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;
 | 
					import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
 | 
				
			||||||
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS;
 | 
					import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 流程实例 Service 实现类
 | 
					 * 流程实例 Service 实现类
 | 
				
			||||||
@ -74,6 +72,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
 | 
				
			|||||||
    private AdminUserApi adminUserApi;
 | 
					    private AdminUserApi adminUserApi;
 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private DeptApi deptApi;
 | 
					    private DeptApi deptApi;
 | 
				
			||||||
 | 
					    @Resource
 | 
				
			||||||
 | 
					    private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher;
 | 
				
			||||||
 | 
					    @Resource
 | 
				
			||||||
 | 
					    private BpmMessageService messageService;
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public ProcessInstance getProcessInstance(String id) {
 | 
				
			||||||
 | 
					        return runtimeService.createProcessInstanceQuery().processInstanceId(id).singleResult();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public List<ProcessInstance> getProcessInstances(Set<String> ids) {
 | 
					    public List<ProcessInstance> getProcessInstances(Set<String> ids) {
 | 
				
			||||||
        return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list();
 | 
					        return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list();
 | 
				
			||||||
@ -134,6 +141,24 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
 | 
				
			|||||||
                processDefinition, processDefinitionExt, bpmnXml, startUser, dept);
 | 
					                processDefinition, processDefinitionExt, bpmnXml, startUser, dept);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) {
 | 
				
			||||||
 | 
					        // 校验流程实例存在
 | 
				
			||||||
 | 
					        ProcessInstance instance = getProcessInstance(cancelReqVO.getId());
 | 
				
			||||||
 | 
					        if (instance == null) {
 | 
				
			||||||
 | 
					            throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 只能取消自己的
 | 
				
			||||||
 | 
					        if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) {
 | 
				
			||||||
 | 
					            throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 通过删除流程实例,实现流程实例的取消,
 | 
				
			||||||
 | 
					        // 删除流程实例,正则执行任务ACT_RU_TASK. 任务会被删除。通过历史表查询
 | 
				
			||||||
 | 
					        runtimeService.deleteProcessInstance(cancelReqVO.getId(),
 | 
				
			||||||
 | 
					                BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason()));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获得历史的流程实例
 | 
					     * 获得历史的流程实例
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@ -162,6 +187,51 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
 | 
				
			|||||||
        processInstanceExtMapper.insert(instanceExtDO);
 | 
					        processInstanceExtMapper.insert(instanceExtDO);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void updateProcessInstanceExtCancel(FlowableCancelledEvent event) {
 | 
				
			||||||
 | 
					        // 判断是否为 Reject 不通过。如果是,则不进行更新
 | 
				
			||||||
 | 
					        if (BpmProcessInstanceDeleteReasonEnum.isRejectReason((String)event.getCause())) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 需要主动查询,因为 instance 只有 id 属性
 | 
				
			||||||
 | 
					        // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance
 | 
				
			||||||
 | 
					        HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId());
 | 
				
			||||||
 | 
					        // 更新拓展表
 | 
				
			||||||
 | 
					        BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO()
 | 
				
			||||||
 | 
					                .setProcessInstanceId(event.getProcessInstanceId())
 | 
				
			||||||
 | 
					                .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
 | 
				
			||||||
 | 
					                .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
 | 
				
			||||||
 | 
					                .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 发送流程实例的状态事件
 | 
				
			||||||
 | 
					        processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
 | 
				
			||||||
 | 
					                BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void updateProcessInstanceExtComplete(ProcessInstance instance) {
 | 
				
			||||||
 | 
					        // 需要主动查询,因为 instance 只有 id 属性
 | 
				
			||||||
 | 
					        // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance
 | 
				
			||||||
 | 
					        HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId());
 | 
				
			||||||
 | 
					        // 更新拓展表
 | 
				
			||||||
 | 
					        BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO()
 | 
				
			||||||
 | 
					                .setProcessInstanceId(instance.getProcessInstanceId())
 | 
				
			||||||
 | 
					                .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置
 | 
				
			||||||
 | 
					                .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus())
 | 
				
			||||||
 | 
					                .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); // 如果正常完全,说明审批通过
 | 
				
			||||||
 | 
					        processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 发送流程被通过的消息
 | 
				
			||||||
 | 
					        messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 发送流程实例的状态事件
 | 
				
			||||||
 | 
					        processInstanceResultEventPublisher.sendProcessInstanceResultEvent(
 | 
				
			||||||
 | 
					                BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult()));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private String createProcessInstance0(Long userId, ProcessDefinition definition,
 | 
					    private String createProcessInstance0(Long userId, ProcessDefinition definition,
 | 
				
			||||||
                                          Map<String, Object> variables, String businessKey) {
 | 
					                                          Map<String, Object> variables, String businessKey) {
 | 
				
			||||||
        // 校验流程定义
 | 
					        // 校验流程定义
 | 
				
			||||||
@ -181,7 +251,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
 | 
				
			|||||||
        processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId())
 | 
					        processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(instance.getId())
 | 
				
			||||||
                .setFormVariables(variables));
 | 
					                .setFormVariables(variables));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
        return instance.getId();
 | 
					        return instance.getId();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -61,4 +61,11 @@ public interface BpmTaskService {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    void createTaskExt(Task task);
 | 
					    void createTaskExt(Task task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新 Task 拓展记录为完成
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param task 任务实体
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void updateTaskExtComplete(Task task);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -27,10 +27,7 @@ import org.flowable.task.api.history.HistoricTaskInstance;
 | 
				
			|||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import javax.annotation.Resource;
 | 
					import javax.annotation.Resource;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.*;
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
				
			||||||
@ -128,13 +125,16 @@ public class BpmTaskServiceImpl implements BpmTaskService{
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void createTaskExt(Task task) {
 | 
					    public void createTaskExt(Task task) {
 | 
				
			||||||
        BpmTaskExtDO taskExtDO = new BpmTaskExtDO()
 | 
					        BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)
 | 
				
			||||||
                .setTaskId(task.getId())
 | 
					 | 
				
			||||||
                .setAssigneeUserId(task.getAssignee() == null ? null : Long.valueOf(task.getAssignee()))
 | 
					 | 
				
			||||||
                .setProcessDefinitionId(task.getProcessDefinitionId())
 | 
					 | 
				
			||||||
                .setProcessInstanceId(task.getProcessInstanceId())
 | 
					 | 
				
			||||||
                .setName(task.getName())
 | 
					 | 
				
			||||||
                .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
 | 
					                .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
 | 
				
			||||||
        taskExtMapper.insert(taskExtDO);
 | 
					        taskExtMapper.insert(taskExtDO);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void updateTaskExtComplete(Task task) {
 | 
				
			||||||
 | 
					        BpmTaskExtDO taskExtDO = BpmTaskConvert.INSTANCE.convert2TaskExt(task)
 | 
				
			||||||
 | 
					                .setEndTime(new Date()) // 此时不能使用 task 的 completeData,因为还是空的。
 | 
				
			||||||
 | 
					                .setResult(BpmProcessInstanceResultEnum.APPROVE.getResult());
 | 
				
			||||||
 | 
					        taskExtMapper.updateByTaskId(taskExtDO);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user