Activiti工作流使用之项目实例

Activiti工作流使用之项目实例Activiti工作流使用之项目实例文章目录Activiti工作流使用之项目实例一、配置文件1.1pom依赖引入1.2application.properties文件二、BPMN文件三、控制层Controller四、实现类Service4.1流程启动(不进入下一环节)4.2流程启动(直接进入下一环节)4.3审批任务4.4查询我发起的流程4.5流程下任务详情4.6删除流程4.7我待审核的任务五、监听器六、流程示意一、配置文件1.1pom依赖引入<dependency>

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

Activiti工作流使用之项目实例

一、配置文件

1.1 pom依赖引入
<dependency>
           <groupId>org.activiti</groupId>
           <artifactId>activiti-spring-boot-starter-basic</artifactId>
           <version>6.0.0</version>
       </dependency>
1.2 application.properties文件
spring.datasource.url= jdbc:mysql://192.168.xx.xx:3306/activiti?useSSL=true
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.username= root
spring.datasource.password= root123


# mybatis
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.mapper-locations=classpath:mybatis/*.xml


# activiti default configuration true代表自动生成数据库表
spring.activiti.database-schema-update= true
# 自动部署验证设置:true-开启(默认)、false-关闭
spring.activiti.check-process-definitions= false
spring.activiti.process-definition-location-prefix= classpath:/
#    process-definition-location-suffixes:
#      - **.bpmn
#      - **.bpmn20.xml
spring.activiti.history-level= full
spring.activiti.db-history-used= true
spring.activiti.db-identity-used= true

二、BPMN文件

这里实例是积分审核流程

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="pointsRequestProcesses" name="积分审批流程" isExecutable="true">
   <startEvent id="startEventPoint" name="开始" />
   <userTask id="userTaskPointsRequest" name="积分申请" activiti:assignee="${applicantUser}" activiti:exclusive="true">
     <outgoing>Flow_0z08cw6</outgoing>
   </userTask>
   <userTask id="userTaskCompanyApproval" name="省公司审批" activiti:candidateUsers="${reviewerUser}" activiti:exclusive="true">
     <incoming>Flow_0z08cw6</incoming>
   </userTask>
   <exclusiveGateway id="exclusivegateway02" name="省公司审批exclusivegateway02" />
   <endEvent id="endEventPoint" />
   <sequenceFlow id="flow1" sourceRef="startEventPoint" targetRef="userTaskPointsRequest" />
   <sequenceFlow id="flow4" sourceRef="userTaskCompanyApproval" targetRef="exclusivegateway02" />
   <sequenceFlow id="flowrightexclusivegateway2" name="省公司审批通过" sourceRef="exclusivegateway02" targetRef="endEventPoint">
     <extensionElements>
       <activiti:executionListener class="com.awifi.capacity.project.manager.activiti.provider.listener.MyTaskListener" event="take" />
     </extensionElements>
     <conditionExpression xsi:type="tFormalExpression">
                    ${isOk == true}
               </conditionExpression>
   </sequenceFlow>
   <sequenceFlow id="flowleftexclusivegateway2" name="省公司审批未通过" sourceRef="exclusivegateway02" targetRef="userTaskPointsRequest">
     <extensionElements>
       <activiti:executionListener class="com.awifi.capacity.project.manager.activiti.provider.listener.MyTaskListener" event="take" />
     </extensionElements>
     <conditionExpression xsi:type="tFormalExpression">
                    ${isOk == false}
               </conditionExpression>
   </sequenceFlow>
   <sequenceFlow id="Flow_0z08cw6" sourceRef="userTaskPointsRequest" targetRef="userTaskCompanyApproval" />
 </process>
 <bpmndi:BPMNDiagram id="BPMNDiagram_pointsRequest">
   <bpmndi:BPMNPlane id="BPMNPlane_pointsRequest" bpmnElement="pointsRequestProcesses">
     <bpmndi:BPMNEdge id="BPMNEdge_flowleftexclusivegateway2" bpmnElement="flowleftexclusivegateway2">
       <omgdi:waypoint x="769.402004454343" y="69.40200445434299" />
       <omgdi:waypoint x="383.75" y="162.88046485888214" />
       <bpmndi:BPMNLabel>
         <omgdc:Bounds x="533" y="91" width="88" height="14" />
       </bpmndi:BPMNLabel>
     </bpmndi:BPMNEdge>
     <bpmndi:BPMNEdge id="BPMNEdge_flowrightexclusivegateway2" bpmnElement="flowrightexclusivegateway2">
       <omgdi:waypoint x="798.9766063630692" y="71.02339363693075" />
       <omgdi:waypoint x="1056.795793598862" y="176.69071224016682" />
       <bpmndi:BPMNLabel>
         <omgdc:Bounds x="889" y="99" width="77" height="14" />
       </bpmndi:BPMNLabel>
     </bpmndi:BPMNEdge>
     <bpmndi:BPMNEdge id="BPMNEdge_flow4" bpmnElement="flow4">
       <omgdi:waypoint x="785" y="135" />
       <omgdi:waypoint x="785" y="85" />
     </bpmndi:BPMNEdge>
     <bpmndi:BPMNEdge id="BPMNEdge_flow1" bpmnElement="flow1">
       <omgdi:waypoint x="189.99732231181528" y="177.7165860350523" />
       <omgdi:waypoint x="283.75" y="175.9448818897638" />
     </bpmndi:BPMNEdge>
     <bpmndi:BPMNEdge id="Flow_0z08cw6_di" bpmnElement="Flow_0z08cw6">
       <omgdi:waypoint x="384" y="175" />
       <omgdi:waypoint x="735" y="175" />
     </bpmndi:BPMNEdge>
     <bpmndi:BPMNShape id="BPMNShape_startEvent1" bpmnElement="startEventPoint">
       <omgdc:Bounds x="160" y="163" width="30" height="30" />
       <bpmndi:BPMNLabel>
         <omgdc:Bounds x="164" y="193" width="22" height="14" />
       </bpmndi:BPMNLabel>
     </bpmndi:BPMNShape>
     <bpmndi:BPMNShape id="BPMNShape_userTask1" bpmnElement="userTaskPointsRequest">
       <omgdc:Bounds x="284" y="135" width="100" height="80" />
     </bpmndi:BPMNShape>
     <bpmndi:BPMNShape id="BPMNShape_userTask3" bpmnElement="userTaskCompanyApproval">
       <omgdc:Bounds x="735" y="135" width="100" height="80" />
     </bpmndi:BPMNShape>
     <bpmndi:BPMNShape id="BPMNShape_exclusivegateway02" bpmnElement="exclusivegateway02" isMarkerVisible="true">
       <omgdc:Bounds x="765" y="45" width="40" height="40" />
       <bpmndi:BPMNLabel>
         <omgdc:Bounds x="742" y="85" width="86" height="27" />
       </bpmndi:BPMNLabel>
     </bpmndi:BPMNShape>
     <bpmndi:BPMNShape id="BPMNShape_sid-5477B73E-9754-4A01-B13D-B6B61CC509E0" bpmnElement="endEventPoint">
       <omgdc:Bounds x="1056" y="168" width="28" height="28" />
     </bpmndi:BPMNShape>
   </bpmndi:BPMNPlane>
 </bpmndi:BPMNDiagram>
</definitions>

三、控制层Controller

初始化流程的DTO


package com.awifi.capacity.project.manager.activiti.provider.bean.dto;

import lombok.Data;

/** * @ClassName InitiationProcessDTO * @Description TODO * @Author 张鑫 * @Date 2022/5/25 * @Version 1.0 **/
@Data
public class InitiationProcessDTO extends TaskApprovalDTO{ 
    
   String applicantUser;
   String reviewerUser;
   String processInstanceId;
   String processType;
   String deleteReason;
}

任务审核DTO


package com.awifi.capacity.project.manager.activiti.provider.bean.dto;

import lombok.Data;

import java.util.HashMap;

/** * @ClassName TaskApprovalDTO * @Description TODO * @Author 张鑫 * @Date 2022/5/25 * @Version 1.0 **/
@Data
public class TaskApprovalDTO { 
    
   String taskId;
   String processInstanceId;
   String userName;
   String field = "isOk";
   String isOk = "true";
   String comment = "同意";

   HashMap<String, Object> hashMap;

}

控制层

package com.awifi.capacity.project.manager.activiti.provider.controller;

import com.alibaba.fastjson.JSON;
import com.awifi.capacity.project.manager.activiti.provider.bean.dto.InitiationProcessDTO;
import com.awifi.capacity.project.manager.activiti.provider.bean.dto.TaskApprovalDTO;
import com.awifi.capacity.project.manager.activiti.provider.exception.UserAuthException;
import com.awifi.capacity.project.manager.activiti.provider.service.ActivitiService;
import com.awifi.capacity.project.manager.common.basic.EnumCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

/** * @ClassName ActivitiController * @Description activiti * @Author 张鑫 * @Date 2022/5/25 * @Version 1.0 **/
@RestController
@RequestMapping("/rest/pm/activiti")
public class ActivitiController { 
    
   @Autowired
   private ActivitiService activitiService;

   // 开始流程(新增流程)
   /** * 开启申请流程 只进行流程启动不进入下一步 * * @Author 张鑫 * @Date 2022/5/25 * @Param [initiationProcessDTO] * @return java.lang.String **/
   @PostMapping(value = "/startProcess", produces = "text/html;charset=UTF-8")
   @ResponseBody
   public String startProcess(@RequestBody String params) { 
    
       InitiationProcessDTO initiationProcessDTO = JSON.parseObject(params, InitiationProcessDTO.class);
       Optional.ofNullable(initiationProcessDTO.getApplicantUser()).orElseThrow(() -> new UserAuthException(EnumCode.ACTIVITI_APPLICANTUSER_ISMISS.getCode(),EnumCode.ACTIVITI_APPLICANTUSER_ISMISS.getText()));
       Optional.ofNullable(initiationProcessDTO.getProcessType()).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_PROCESSTYPE_ISMISS.getCode(),EnumCode.ACTICITI_PROCESSTYPE_ISMISS.getText()));
       return activitiService.startProcess(initiationProcessDTO);

   }

   /** * 开启申请流程 进行流程启动且进入下一步 * * @Author 张鑫 * @Date 2022/5/25 * @Param [initiationProcessDTO] * @return java.lang.String **/
   @PostMapping(value = "/initiationProcess", produces = "text/html;charset=UTF-8")
   @ResponseBody
   public String startProcessTo(@RequestBody String params) { 
    
       InitiationProcessDTO initiationProcessDTO = JSON.parseObject(params, InitiationProcessDTO.class);
       Optional.ofNullable(initiationProcessDTO.getApplicantUser()).orElseThrow(() -> new UserAuthException(EnumCode.ACTIVITI_APPLICANTUSER_ISMISS.getCode(),EnumCode.ACTIVITI_APPLICANTUSER_ISMISS.getText()));
       Optional.ofNullable(initiationProcessDTO.getProcessType()).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_PROCESSTYPE_ISMISS.getCode(),EnumCode.ACTICITI_PROCESSTYPE_ISMISS.getText()));
       Optional.ofNullable(initiationProcessDTO.getReviewerUser()).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_REVIEWERUSER_ISMISS.getCode(),EnumCode.ACTICITI_REVIEWERUSER_ISMISS.getText()));
       return activitiService.startProcessTo(initiationProcessDTO);

   }
   // 流程审批
   /** * 任务审批 * * @Author 张鑫 * @Date 2022/5/25 * @Param [taskApprovalDTO] * @return java.lang.String **/
   @PutMapping("/approval")
   @ResponseBody
   public String approvalTask(@RequestBody String params) { 
    
       TaskApprovalDTO taskApprovalDTO = JSON.parseObject(params, TaskApprovalDTO.class);
       Optional.ofNullable(taskApprovalDTO.getUserName()).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_USERNAME_IS_MISS.getCode(),EnumCode.ACTICITI_USERNAME_IS_MISS.getText()));
       Optional.ofNullable(taskApprovalDTO.getProcessInstanceId()).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_PROCESSINSTANCEID_IS_MISS.getCode(),EnumCode.ACTICITI_PROCESSINSTANCEID_IS_MISS.getText()));

       return activitiService.approvalTask(taskApprovalDTO);
   }
   // 查询流程列表
   /** * 查询我流程列表 * * @return java.lang.String * @Author 张鑫 * @Date 2022/5/25 * @Param [user] **/
   @GetMapping("/myProcess")
   @ResponseBody
   public String myProcess(String userName) { 
    
       Optional.ofNullable(userName).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_USERNAME_IS_MISS.getCode(),EnumCode.ACTICITI_USERNAME_IS_MISS.getText()));

       return activitiService.myProcess(userName);
   }
   // 查询单个流程的详情
   /** * 查询流程详情 * * @return java.lang.String * @Author 张鑫 * @Date 2022/5/25 * @Param [user] **/
   @GetMapping("/processInfo")
   @ResponseBody
   public String processInfo(String processInstanceId) { 
    
       Optional.ofNullable(processInstanceId).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_PROCESSINSTANCEID_IS_MISS.getCode(),EnumCode.ACTICITI_PROCESSINSTANCEID_IS_MISS.getText()));

       return activitiService.processInfo(processInstanceId);
   }
   // 删除流程
   /** * 删除流程 包含历史记录 * * @Author 张鑫 * @Date 2022/5/26 * @Param [processInstanceId] * @return java.lang.String **/
   @DeleteMapping("/deleteProcess")
   @ResponseBody
   public String deleteProcess(@RequestBody String params) { 
    
       InitiationProcessDTO deleteProcessDto = JSON.parseObject(params, InitiationProcessDTO.class);
       Optional.ofNullable(deleteProcessDto.getProcessInstanceId()).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_PROCESSINSTANCEID_IS_MISS.getCode(),EnumCode.ACTICITI_PROCESSINSTANCEID_IS_MISS.getText()));

       return activitiService.deleteProcess(deleteProcessDto);
   }
   // 查询我待审核的任务
   /** * 查询我的待审核的任务列表 * * @return java.lang.String * @Author 张鑫 * @Date 2022/5/25 * @Param [user] **/
   @GetMapping("/taskCandidateIsMe")
   @ResponseBody
   public String taskCandidateIsMe(String userName) { 
    
       Optional.ofNullable(userName).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_USERNAME_IS_MISS.getCode(),EnumCode.ACTICITI_USERNAME_IS_MISS.getText()));

       return activitiService.taskCandidateIsMe(userName);
   }

   /** * 查询我是代理人的任务列表(用户重新申请时调用进行查询我的任务列表来获取taskid) * * @Author 张鑫 * @Date 2022/5/25 * @Param [user] * @return java.lang.String **/
   @GetMapping("/taskAssigneeIsMe")
   @ResponseBody
   public String taskAssigneeIsMe(String userName) { 
    
       Optional.ofNullable(userName).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_USERNAME_IS_MISS.getCode(),EnumCode.ACTICITI_USERNAME_IS_MISS.getText()));

       return activitiService.taskAssigneeIsMe(userName);
   }
   // 查询我开始的流程下的所有任务
   /** * 查看用户发起的所有流程下的任务 * * @Author 张鑫 * @Date 2022/5/25 * @Param [user] * @return java.lang.String **/
   @GetMapping("/taskListByInitiator")
   @ResponseBody
   public String taskListByInitiator(String userName) { 
    
       Optional.ofNullable(userName).orElseThrow(() -> new UserAuthException(EnumCode.ACTICITI_USERNAME_IS_MISS.getCode(),EnumCode.ACTICITI_USERNAME_IS_MISS.getText()));

       return activitiService.taskListByInitiator(userName);
   }
   // 查询我未完成的流程
   // 查询我完成的流程

}

四、实现类Service

4.1 流程启动(不进入下一环节)
@Override
   public String startProcess(InitiationProcessDTO initiationProcessDTO) { 
    
       ResponseJson responseJson = new ResponseJson();
       // 根据流程类型获取processFile
       String processFile = EnumProcess.getEnumText(initiationProcessDTO.getProcessType());
       if (processFile == null) { 
    
           throw new UserAuthException(EnumCode.ACTICITI_PROCESSTYPE_ISWORRY.getCode(), EnumCode.ACTICITI_PROCESSTYPE_ISWORRY.getText());
       }
       // 生成businessKey
       String businessKey = IDGenerator.getID();
       identityService.setAuthenticatedUserId(initiationProcessDTO.getApplicantUser());
       // 申请人写入
       Map<String, Object> map = new HashMap<>();
       map.put("applicantUser", initiationProcessDTO.getApplicantUser());
       map.put("reviewerUser", initiationProcessDTO.getReviewerUser());
       // 流程启动
       ProcessInstance processInstance = ActivitiManager.startProcess(processFile, initiationProcessDTO.getProcessType(), activitiDeployMapper, businessKey, map);
       responseJson.setData(processInstance.getProcessInstanceId());
       return JSON.toJSONString(responseJson);
   }
4.2 流程启动(直接进入下一环节)
@Override
   public String startProcessTo(InitiationProcessDTO initiationProcessDTO) { 
    
       ResponseJson responseJson = new ResponseJson();
       // 根据流程类型获取processFile
       String processFile = EnumProcess.getEnumText(initiationProcessDTO.getProcessType());
       if (processFile == null) { 
    
           throw new UserAuthException(EnumCode.ACTICITI_PROCESSTYPE_ISWORRY.getCode(), EnumCode.ACTICITI_PROCESSTYPE_ISWORRY.getText());
       }
       // 生成businessKey
       String businessKey = IDGenerator.getID();
       // 申请人写入
       Map<String, Object> map = new HashMap<>();
       map.put("applicantUser", initiationProcessDTO.getApplicantUser());
       map.put("reviewerUser", initiationProcessDTO.getReviewerUser());
       identityService.setAuthenticatedUserId(initiationProcessDTO.getApplicantUser());

       // 流程启动
       ProcessInstance processInstance = ActivitiManager.startProcess(processFile, initiationProcessDTO.getProcessType(), activitiDeployMapper, businessKey, map);
       Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();

       taskService.complete(task.getId());  // 开启后,环节会走到发起请假请求,要完成这个环节,才能到下一个审核环节

       responseJson.setData(processInstance.getProcessInstanceId());
       return JSON.toJSONString(responseJson);
   }
4.3 审批任务
@Override
   public String approvalTask(TaskApprovalDTO taskApprovalDTO) { 
    
       String user = taskApprovalDTO.getUserName();
       String isOk = taskApprovalDTO.getIsOk();

       //先查历史表 判断流程是否存在
       HistoricProcessInstance historicProcessInstance =historyService.createHistoricProcessInstanceQuery().processInstanceId(taskApprovalDTO.getProcessInstanceId()).singleResult();
       if(Objects.isNull(historicProcessInstance))
       { 
    
           throw new UserAuthException(EnumCode.ACTICITI_PROCESS_ISEXSIT.getCode(), EnumCode.ACTICITI_PROCESS_ISEXSIT.getText());
       }

       Task task = taskService.createTaskQuery().processInstanceId(taskApprovalDTO.getProcessInstanceId()).taskCandidateOrAssigned(user).singleResult();
       // 判断任务是否存在
       if (Objects.isNull(task)) { 
    
           throw new UserAuthException(EnumCode.ACTICITI_TASK_IS_NOTFOUND.getCode(), EnumCode.ACTICITI_TASK_IS_NOTFOUND.getText());
       }

       // 进行签收
       taskService.claim(task.getId(), user);
       //增加审批备注
       taskService.addComment(task.getId(), task.getProcessInstanceId(), taskApprovalDTO.getComment());
       //设置本地参数。在myListener1监听中获取。防止审核通过进行驳回
       taskService.setVariableLocal(task.getId(), taskApprovalDTO.getField(), isOk);
       // 传入变量
       Map<String, Object> map = new HashMap<>();
       map.put(taskApprovalDTO.getField(), taskApprovalDTO.getIsOk());
       taskService.complete(task.getId(), map);
       TaskVO taskVO = BeanUtil.copyProperties(task, TaskVO.class);
       taskVO.setTaskId(task.getId());
       taskVO.setProcessInstanceId(taskApprovalDTO.getProcessInstanceId());
       taskVO.setProcessInstanceName(historicProcessInstance.getProcessDefinitionName());
       taskVO.setTaskName(task.getName());
       // 查询流程信息(返回流程状态)
       ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(taskApprovalDTO.getProcessInstanceId()).singleResult();
       if (processInstance != null) { 
    
           taskVO.processInstanceIsEnd(processInstance.isEnded());
       } else { 
    
           taskVO.processInstanceIsEnd(true);
           taskVO.setEndTime(historicProcessInstance.getEndTime());
       }
       ResponseJson responseJson = new ResponseJson();
       responseJson.setData(taskVO);
       return JSON.toJSONString(responseJson);
4.4 查询我发起的流程
@Override
   public String myProcess(String userName) { 
    
       List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().startedBy(userName).list();

       ResponseJson responseJson = new ResponseJson();
       responseJson.setData(list);

       return JSON.toJSONString(responseJson);
   }
4.5 流程下任务详情
@Override
   public String processInfo(String processInstanceId) { 
    

       List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).list();
       ResponseJson responseJson = new ResponseJson();
       responseJson.setData(list);
       return JSON.toJSONString(responseJson);
   }
4.6 删除流程
@Override
   public String deleteProcess(InitiationProcessDTO deleteProcessDto) { 
    
       try { 
    
           runtimeService.deleteProcessInstance(deleteProcessDto.getProcessInstanceId(),deleteProcessDto.getDeleteReason());
       } catch (Exception e) { 
    
           throw new UserAuthException(EnumCode.ACTICITI_DELETEPROCESS_ISWORRY.getCode(),EnumCode.ACTICITI_DELETEPROCESS_ISWORRY.getText());
       }

       ResponseJson responseJson = new ResponseJson();
       responseJson.setData("OK");
       return JSON.toJSONString(responseJson);
   }
4.7 我待审核的任务
@Override
   public String taskCandidateIsMe(String userName) { 
    
       ResponseJson responseJson = new ResponseJson();
       List<TaskVO> taskVOS = new ArrayList<>();
       List<Task> tasks = taskService//与任务相关的Service
               .createTaskQuery()//创建一个任务查询对象
               .taskCandidateOrAssigned(userName)
               .list();
       if(tasks !=null && tasks.size()>0){ 
    
           for(Task task:tasks){ 
    
               ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
               TaskVO taskVO = BeanUtil.copyProperties(task, TaskVO.class);
               taskVO.setApplicantUser(processInstance.getStartUserId());
               taskVO.setProcessInstanceName(processInstance.getProcessDefinitionName());
               taskVO.setTaskId(task.getId());
               taskVO.setTaskName(task.getName());
               taskVO.processInstanceIsEnd(processInstance.isEnded());
               taskVOS.add(taskVO);
           }
       }
       responseJson.setData(taskVOS);
       return JSON.toJSONString(responseJson);
   }

五、监听器

package com.awifi.capacity.project.manager.activiti.provider.listener;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.List;

/** * @ClassName MyTaskListener * @Description TODO * @Author 张鑫 * @Date 2022/5/24 * @Version 1.0 **/
@Service
public class MyTaskListener implements ExecutionListener { 
    
   @Override
   public void notify(DelegateExecution execution) { 
    
       ProcessEngine services = ProcessEngines.getDefaultProcessEngine();
       ExecutionEntity entity = (ExecutionEntity) execution;
       String processInstId = entity.getProcessInstanceId();          //流程实例Id
       //根据审批传入的参数判断是否打回
       Object value = execution.getVariableInstance("isOk").getValue();
       if (ObjectUtils.isEmpty(value)) { 
    
           value = execution.getParent().getVariableInstance("isOk").getValue();
       }
       ;
       if (!ObjectUtils.isEmpty(value) && "true".equals(value)) { 
    
           return;
       }
       List<HistoricTaskInstance> list = services.getHistoryService().createHistoricTaskInstanceQuery().orderByTaskCreateTime().asc()
               .processInstanceId(processInstId)
               .list();
       if (list != null) { 
    
           String user = list.get(0).getAssignee(); //获取最新的一个责任人信息回退给他
           execution.setVariable("applicantUser", user);
       }

   }

}

六、流程示意

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185622.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号