Activiti任务的处理以及进阶使用

news2024/11/21 0:28:36

1.什么是流程实例

流程实例(ProcessInstance)代表流程定义的执行实例
一个流程实例包括所有的运行节点Task,所以我们一般使用来了解当前流程的进度信息

taskService.createTaskQuery()
                .processDefinitionKey(key)

例如:用户或者程序安装流程定义的内容发起了一个流程,这个就是一个流程实例
在这里插入图片描述

2.业务管理

如果我们要将我们的流程实例和业务数据关联,这时我们需要使用到Activiti中预留的**BusinessKey(业务标识)**来关联
在这里插入图片描述

2.1启动实例,并给流程实例启动start时添加businessKey

/**
* 启动流程实例,添加businessKey
*/
@Test
public void test01(){
// 1.获取ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3.启动流程实例
ProcessInstance instance = runtimeService
.startProcessInstanceByKey("evection", "1001");
// 4.输出processInstance相关属性
System.out.println("businessKey = "+instance.getBusinessKey());
}

在这里插入图片描述

2.2流程的挂起与激活

**目的:**在实际场景中可能由于流程变更需要将当前运行的流程暂停而不是删除,流程暂停后将不能继续执行。

2.21全部流程挂起

该流程定义下的所有流程实例全部暂停

/**
* 全部流程挂起实例与激活
*/
@Test
public void test02(){
// 1.获取ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RepositoryService对象
RepositoryService repositoryService = engine.getRepositoryService();
// 3.查询流程定义的对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
               .processDefinitionKey("evection")
               .singleResult();
// 4.获取当前流程定义的状态
boolean suspended = processDefinition.isSuspended();
String id = processDefinition.getId();
// 5.如果挂起就激活,如果激活就挂起
if(suspended){
// 表示当前定义的流程状态是 挂起的
repositoryService.activateProcessDefinitionById(
id // 流程定义的id
,true // 是否激活
,null // 激活时间
);
System.out.println("流程定义:" + id + ",已激活");
}else{
// 非挂起状态,激活状态 那么需要挂起流程定义
repositoryService.suspendProcessDefinitionById(
id // 流程id
,true // 是否挂起
,null // 挂起时间
);
System.out.println("流程定义:" + id + ",已挂起");
}
}
然后再去操作对于的流程实例会抛异常信息
我们再将挂起的流程转变为

核心就在于:根据RepositoryService.createProcessDefinitionQuery().processDefinitionKey(“流程实例”)——>得到流程定义的对象。然后根据这个对象获取当前状态——>根据状态进行激活与挂起

在这里插入图片描述

2.22单个实例的挂起

操作流程实例对象,针对单个流程执行挂起操作,某个流程实例挂起则此流程不再继续执行,当前流程定义的其他流程实例是不受干扰的。完成该流程实例的当前任务会抛异常

/**
* 单个流程实例挂起与激活
*/
@Test
public void test03(){
// 1.获取ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RuntimeService
RuntimeService runtimeService = engine.getRuntimeService();
// 3.获取流程实例对象
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
              .processInstanceId("25001")
              .singleResult();
// 4.获取相关的状态操作
boolean suspended = processInstance.isSuspended();
String id = processInstance.getId();
if(suspended){
// 挂起--》激活
runtimeService.activateProcessInstanceById(id);
System.out.println("流程定义:" + id + ",已激活");
}else{
// 激活--》挂起
runtimeService.suspendProcessInstanceById(id);
System.out.println("流程定义:" + id + ",已挂起");
  }
}

在这里插入图片描述

3.任务分配

3.1简单手动填充任务分配

这样耦合太高了,如果指定的人离职了得重新对图进行操作,而不是代码解决(Assiginee
在这里插入图片描述

3.2表达式分配

在Activiti中支持使用UEL表达式,UEL表达式是Java EE6 规范的一部分, UEL(Unified Expression
Language) 即 统一表达式语音, Activiti支持两种UEL表达式: UEL-value 和UEL-method

变量语法:
${assignee0}
在这里插入图片描述
部署流程到数据库中
主要使用利用deploy()

/**
* 先将新定义的流程部署到Activiti中数据库中
*/
@Test
public void test01(){
// 1.获取ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RepositoryService进行部署操作
RepositoryService service = engine.getRepositoryService();
// 3.使用RepositoryService进行部署操作
Deployment deploy = service.createDeployment()
                .addClasspathResource("bpmn/evection-uel.bpmn") // 添加bpmn资源
                .addClasspathResource("bpmn/evection-uel.png") // 添加png资源
                .name("出差申请流程-UEL")
                .deploy();// 部署流程
// 4.输出流程部署的信息
System.out.println("流程部署的id:" + deploy.getId());
System.out.println("流程部署的名称:" + deploy.getName());
}

然后我们对流程实例关联UEL表达式
它会创建在我们的act_variable变量表中,利用Runtimeservice在调用startProcessInstanceByKey指定一个map变量里面存放UEL表达式

@Test
public void test02(){
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
// 设置 assignee 的取值,
Map<String,Object> map = new HashMap<>();
map.put("assignee0","张三");
map.put("assignee1","李四");
map.put("assignee2","王五");
map.put("assignee3","赵财务");
// 创建流程实例
runtimeService.startProcessInstanceByKey("evection-uel",map);
}

在这里插入图片描述

3.3业务方法分配UEL-method

userBean 是 spring 容器中的一个 bean,表示调用该 bean 的 getUserId()方法
在这里插入图片描述

3.4监听器分配

可以使用监听器来完成很多Activiti的流程业务。
我们在此处使用监听器来完成负责人的指定,那么我们在流程设计的时候就不需要指定assignee
Event选项

如何给流程图指定一个监听器?
对于任务task有四种场景:

  • create:任务创建后触发
  • assignment:任务分配后触发
  • Delete:任务完成后触发
  • All:所有事件都触发
  <userTask id="usertask1" name="创建请假单">
      <extensionElements>
        <activiti:taskListener event="create" class="com.bobo.activiti.listener.MyTaskListener"></activiti:taskListener>
      </extensionElements>
    </userTask>

然后接下来我们定义一个监听类
当前task的name满足为创建请假单,就给这个当前任务赋值负责人

package com.bobo.activiti.listener;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
       if("创建请假单".equals(delegateTask.getName())
        && "create".equals(delegateTask.getEventName())){
            System.out.println("测试");
            // 指定任务的负责人
            delegateTask.setAssignee("张三-Listener");
        }

    }
}

工作流测试类

/**
     * 1.将流程部署到Activiti数据库中
     */
    @Test
    public void test01() {
        //1.获取ProcessEngine对象
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService
        RepositoryService service = engine.getRepositoryService();
        //3.进行部署操作
        Deployment deploy = service.createDeployment()
                .addClasspathResource("activiti/evection-listener.bpmn20.xml") //添加bpmn资源
                .addClasspathResource("activiti/listener.png")
                .name("出差申请listener")
                .deploy();
        //4.输出流程部署的信息
        System.out.println("流程部署的id:" + deploy.getId());
        System.out.println("流程部署的名称:" + deploy.getName());
    }

    /**
     * 2.执行引擎
     */
    @Test
    public void test02() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //得到RuntimeService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //执行流程实例
        runtimeService.startProcessInstanceByKey("evection-listener");
    }
3.5查看用户是否有权限

思路:TaskService根据任务id和负责人查询任务是否存在即可,或者可以根据流定义的id查询当前执行到的任务是否存在,如果存在就将其执行

/**
     * 完成任务,判断用户是否有权限
     */
    @Test
    public void completeTask(){
         //1.任务id
        String taskId="10002";
        //2.任务负责人
        String assingee="张三";
        //3.获取ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //4.创建TaskService
        TaskService taskService = processEngine.getTaskService();
        //5.完成任务前需要校验负责人是否可以完成当前任务
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskAssignee(assingee)
                .singleResult();
        if(task!=null){
            taskService.complete(taskId);
            System.out.println("完成任务");
        }
    }
4.查询任务
4.1查询任务负责人的待办任务
// 查询当前个人待执行的任务
@Test
public void findPersonalTaskList() {
  // 流程定义key
  String processDefinitionKey = "myEvection1";
  // 任务负责人
  String assignee = "张三";
  // 获取TaskService
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
                      .processDefinitionKey(processDefinitionKey)
                      .includeProcessVariables()
                      .taskAssignee(assignee)
                      .list();
for (Task task : taskList) {
System.out.println("----------------------------");
System.out.println("流程实例id: " + task.getProcessInstanceId());
System.out.println("任务id: " + task.getId());
System.out.println("任务负责人: " + task.getAssignee());
System.out.println("任务名称: " + task.getName());
 }
}

关联 businessKey

在 activiti 实际应用时,查询待办任务可能要显示出业务系统的一些相关信息。
1.比如:查询待审批出差任务列表需要将出差单的日期、 出差天数等信息显示出来。
出差天数等信息在业务系统中存在,而并没有在 activiti 数据库中存在,所以是无法通过 activiti 的 api
查询到出差天数等信息。
2.实现:
在查询待办任务时,通过 businessKey(业务标识 )关联查询业务系统的出差单表,查询出出差天数等
信息。

@Test
public void findProcessInstance(){
// 1.获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.获取TaskService
TaskService taskService = processEngine.getTaskService();
// 3.获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 4.查询流程定义的对象
Task task = taskService.createTaskQuery()
          .processDefinitionKey("myEvection1")
          .taskAssignee("张三")
          .singleResult();
// 5.使用task对象获取流程实例id
String processInstanceId = task.getProcessInstanceId();
// 6.使用实例id,获取流程实例对象
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                 .processInstanceId(processInstanceId)
                 .singleResult();
// 7.使用processInstance,得到 businessKey
String businessKey = processInstance.getBusinessKey();
System.out.println("businessKey=="+businessKey);

4.2办理任务权限判断

在实际应用中,完成任务前需要校验任务的负责人是否具有该任务的办理权限 。

@Test
public void completTask() {
//任务id
String taskId = "15005";
// 任务负责人
String assingee = "张三";
//获取processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 创建TaskService
TaskService taskService = processEngine.getTaskService();
// 完成任务前,需要校验该负责人可以完成当前任务
// 校验方法:
// 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assingee)
.singleResult();
if(task != null){
taskService.complete(taskId);
System.out.println("完成任务");
}
}

4.流程变量

场景:在出差申请流程流转时如果出差天数大于 3 天则由总经理审核,否则由人事直接审核, 出差天数就可以设置为流程变量,在流程流转时使用

4.1流程变量类型

如果将 pojo 存储到流程变量中,必须实现序列化接口 serializable,为了防止由于新增字段无法反序列化,需要生成 serialVersionUID。
在这里插入图片描述

4.2代码演示

Pojo实体类

package com.bobo.activiti.pojo;

import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 出差申请的POJO对象
 */
@Data
public class Evection implements Serializable {

    private long id; //流程id

    private String evectionName; //流程名字


    /**
     * 出差的天数
     */
    private double num;

    private Date beginDate;

    private Date endDate;

    private String destination; //目的地

    private String reson; //理由
}

package com.bobo.activiti.test;

import com.bobo.activiti.pojo.Evection;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

public class Test05Variable {

    @Test
    public void test01() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = engine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("activiti/evection-variable.bpmn20.xml")
                .addClasspathResource("activiti/variable.png")
                .name("出差申请流程-流程变量")
                .deploy();//部署流程
        System.out.println("流程部署的id:" + deploy.getId());
        System.out.println("流程部署的名称:" + deploy.getName());
    }

    /**
     * 2.启动流程,设置流程变量
     * task任务里面就有一行这样的数据
     */
    @Test
    public void test02() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = engine.getRuntimeService();
        //流程key
        String key = "evection-variable";
        //创建变量集合
        Map<String, Object> variables = new HashMap<String, Object>();
        //创建出差对象
        Evection evection = new Evection();
        //设置出差天数
        evection.setNum(4d);
        //将流程变量注入到集合中
        variables.put("evection", evection);
        //设置assignee
        variables.put("assignee0", "张三");
        variables.put("assignee1", "李四");
        variables.put("assignee2", "王五");
        variables.put("assignee3", "赵财务");

        //执行流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, variables);
        //输出信息
        System.out.println("获取流程实例名称:" + processInstance.getName());
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());

    }

    /**
     * 完成任务
     */
    @Test
    public void test03() {
        String key = "evection-variable";
        String assignee = "李四";
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key) //流程定义的id
                .taskAssignee(assignee) //设置任务的人
                .singleResult();//单个执行

        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("任务执行完成...");
        }
        System.out.println("任务为空");
    }

    /**
     * 启动流程实例,设置流程变量
     */
    @Test
    public void test04() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = engine.getRuntimeService();
// 流程定义key
        String key = "evection-variable";
// 创建变量集合
        Map<String, Object> variables = new HashMap<String, Object>();
// 设置assignee的取值
        variables.put("assignee0", "张三1");
        variables.put("assignee1", "李四1");
        variables.put("assignee2", "王五1");
        variables.put("assignee3", "赵财务1");
        ProcessInstance processInstance =
                runtimeService.startProcessInstanceByKey(key, variables);
// 输出信息
        System.out.println("获取流程实例名称:" + processInstance.getName());
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
    }

    /**
     * 完成任务
     */
    @Test
    public void test05(){
        String key="evection-variable";
        String assignee="李四1";
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        //得到单个任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key) //流程定义的key
                .taskAssignee(assignee) //任务的人
                .singleResult();

        Map<String,Object> variables=new HashMap<String, Object>();
        //创建出差对象
        Evection evection = new Evection();
        evection.setNum(4d);
        //将对象注入到流程变量的map中
        variables.put("evection",evection);

        if(task!=null){
            taskService.complete(task.getId(),variables);
            System.out.println("任务执行完成...");
        }
        System.out.println("任务为空");

    }
}

local变量的使用

package com.bobo.activiti.test;

import com.bobo.activiti.pojo.Evection;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

public class Test06Variable {

    @Test
    public void test01() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = engine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("activiti/evection-variable.bpmn20.xml")
                .addClasspathResource("activiti/variable.png")
                .name("出差申请流程-流程变量")
                .deploy();//部署流程
        System.out.println("流程部署的id:" + deploy.getId());
        System.out.println("流程部署的名称:" + deploy.getName());
    }

    /**
     * 2.启动流程,设置流程变量
     * task任务里面就有一行这样的数据
     */
    @Test
    public void test02() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = engine.getRuntimeService();
        //流程key
        String key = "evection-variable";
        //创建变量集合
        Map<String, Object> variables = new HashMap<String, Object>();
        //创建出差对象
        Evection evection = new Evection();
        //设置出差天数
        evection.setNum(4d);
        //将流程变量注入到集合中
        variables.put("evection", evection);
        //设置assignee
        variables.put("assignee0", "张三");
        variables.put("assignee1", "李四");
        variables.put("assignee2", "王五");
        variables.put("assignee3", "赵财务");

        //执行流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key, variables);
        //输出信息
        System.out.println("获取流程实例名称:" + processInstance.getName());
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());

    }

    /**
     * 完成任务
     */
    @Test
    public void test03() {
        String key = "evection-variable";
        String assignee = "李四";
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key) //流程定义的id
                .taskAssignee(assignee) //设置任务的人
                .singleResult();//单个执行

        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("任务执行完成...");
        }
        System.out.println("任务为空");
    }

    /**
     * 启动流程实例,设置流程变量
     */
    @Test
    public void test04() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = engine.getRuntimeService();
// 流程定义key
        String key = "evection-variable";
// 创建变量集合
        Map<String, Object> variables = new HashMap<String, Object>();
// 设置assignee的取值
        variables.put("assignee0", "张三1");
        variables.put("assignee1", "李四1");
        variables.put("assignee2", "王五1");
        variables.put("assignee3", "赵财务1");
        ProcessInstance processInstance =
                runtimeService.startProcessInstanceByKey(key, variables);
// 输出信息
        System.out.println("获取流程实例名称:" + processInstance.getName());
        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());
    }

    /**
     * 完成任务后绑定流程变量,而不是在启动流程实例的时候指定
     */
    @Test
    public void test05() {
        String key = "evection-variable";
        String assignee = "李四1";
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        //得到单个任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key) //流程定义的key
                .taskAssignee(assignee) //任务的人
                .singleResult();

        Map<String, Object> variables = new HashMap<String, Object>();
        //创建出差对象
        Evection evection = new Evection();
        evection.setNum(4d);
        //将对象注入到流程变量的map中
        variables.put("evection", evection);

        if (task != null) {
            taskService.complete(task.getId(), variables);
            System.out.println("任务执行完成...");
        }
        System.out.println("任务为空");

    }

    /**
     * 变量与变量之间是隔离的,任务办理的时候完成——>设置local流程变量,只在当前运行的流程实例使用
     */
    @Test
    public void completTask(){
        //1.定义流程的定义id和执行的人
        String key="evection-variable";
        String assignee="王五";
        //2.得到TaskService
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        //3.定义流程变量
        HashMap<String, Object> map = new HashMap<String, Object>();
        Evection evection = new Evection();
        evection.setNum(4d);
        map.put("evection",evection);
        //4.得到任务实例
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)
                .singleResult();
        //5.设置local变量
        taskService.setVariablesLocal(task.getId(),map);
        //6.执行任务
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("任务执行完成...");
        }

    }
}

5.组任务

在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn
文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。
针对这种情况可以给任务设置多个候选人可以从候选人中选择参与者来完成任务。

bpmn20.xml文件:
我们可以看到部门经理的审核人已经设置为 lisi,wangwu 这样的一组候选人,可以使用activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人

5.2组任务办理流程:

  • a、查询组任务
    指定候选人,查询该候选人当前的待办任务。
    候选人不能立即办理任务。
  • b、拾取(claim)任务
    该组任务的所有候选人都能拾取。
    将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
    如果拾取后不想办理该任务?
    需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
  • c、查询个人任务
    查询方式同个人任务部分,根据assignee查询用户负责的个人任务。
<userTask activiti:candidateUsers="lisi,wangwu" activiti:exclusive="true"
id="_3" name="经理审批"/>
d、办理个人任
package com.bobo.activiti.test;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.List;

public class Test07Group {

    /**
     * 3.根据候选人查询组任务
     */
    @Test
    public void test03() {
        String key = "evection1";
        String candidateUser = "lisi";
        //1.得到TaskService
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        //2.去查询指定条件下所有的Task
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key) //流程定义的key
                .taskCandidateUser(candidateUser) //候选人
                .list();
        for (Task task : list) {
            System.out.println("流程实例Id:" + task.getProcessInstanceId());
            System.out.println("任务ID:" + task.getId());
            System.out.println("负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());
        }
    }

    /**
     * 候选人:拾取任务
     */
    public void test04(){
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = defaultProcessEngine.getTaskService();
        String key = "evection1";
        String candidateUser = "lisi";
        //拾取任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUser)
                .singleResult();
        if(task!=null){
            //可以拾取任务,任务变成自己的任务
            taskService.claim(task.getId(),candidateUser);
            System.out.println("拾取成功");
        }
    }

    /**
     * 完成个人任务
     */
    @Test
    public void test05(){
        String key = "evection-variable";
        String candidateUser = "lisi";
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        //根据流程定义key得到任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .singleResult();
        //验证一下任务目前到哪里来了:发现在赵财务
        if(task!=null){
            System.out.println(task.getId()+":"+task.getAssignee());
        }
        //我们完成当前任务
        taskService.complete(task.getId());
        System.out.println("完成任务");
    }

    /**
     * 归还任务
     */
    @Test
    public void test06(){
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        String key = "evection-variable";
        String candidateUser = "lisi";
        //根据流程定义key和用户得到当前的task
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(candidateUser)
                .singleResult();
        if(task!=null){
            //先输出当前任务负责人
            System.out.println(task.getId()+":"+task.getAssignee());
            taskService.setAssignee(task.getId(),null);
        }
    }

    /**
     * 任务交接
     */
    @Test
    public void test07() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = engine.getTaskService();
        String taskId = "75002";
        String userId = "zhangsan";
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskAssignee(userId)
                .singleResult();
        if (task != null) {
// 设置该任务的新的负责人
            taskService.setAssignee(taskId, "赵六");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣11.盛最多水的容器(双指针解法)

问题描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…

Mini MP3 Player播放器简介与STC12例程

文章目录1、DFRobot arduino DFPlayer官方资料1-1、简介2-2、 基本功能详述1-3、 用途1-4、 引脚说明1-5、工作模式1-5-1、 串口工作模式1-5-2、 ADC按键工作模式1-5-3、 普通按键工作模式2、串口模式电路搭建与例程参考文献1、DFRobot arduino DFPlayer官方资料 1-1、简介 Th…

KingbaseES运维案例之---服务进程(backend process)终止

​ 案例说明&#xff1a; 如下图所示&#xff1a;KingbaseES服务进程结构 KingbaseES使用客户端/服务器的模型。 对于每个客户端的连接&#xff0c;KingbaseES主进程接收到客户端连接后&#xff0c;会为其创建一个新的服务进程。 KingbaseES 用服务进程来处理连接到数据库服务的…

Java Swing JTextField:单行文本框组件

Swing 中使用 JTextField 类实现一个单行文本框&#xff0c;它允许用户输入单行的文本信息。该类的常用构造方法如下。 JTextField()&#xff1a;创建一个默认的文本框。JTextField(String text)&#xff1a;创建一个指定初始化文本信息的文本框。JTextField(int columns)&…

Nacos学习笔记 (4)Nacos整合SpringBoot流程

前提&#xff0c;先下载Nacos并启动 Nacos Server。 1. Nacos 融合 Spring Boot 为注册配置中心 实现&#xff1a; 通过 Nacos Server 和 nacos-config-spring-boot-starter 实现配置的动态变更&#xff1b;通过 Nacos Server 和 nacos-discovery-spring-boot-starter 实现服…

OpenAI 3D 模型生成器Point-E极速体验

OpenAI 3D 模型生成器Point-E极速体验 3090显卡&#xff0c;极速体验三维模型生成&#xff0c;体验地址&#xff1a;Gradio 文本生成图像的 AI 最近已经火到了圈外&#xff0c;不论是 DALL-E 2、DeepAI 还是 Stable Diffusion&#xff0c;人人都在调用 AI 算法搞绘画艺术&…

Unreal Engine工程项目目录及对应作用

目录 .vs Binaries&#xff1a;编译文件 Config&#xff1a;配置文件 Content&#xff1a;资产文件 DerivedDataCache&#xff1a;UE针对平台特化的资源版本 Intermediate&#xff1a;中间文件 Saved&#xff1a;自动保存的内容 Source&#xff1a;源&#xff08;代码&…

ADI Blackfin DSP处理器-BF533的开发详解66:MP3解码(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了读取工程目录下的一个 MP3 文件&#xff0c;对文件进行解码后&#xff0c;将生成的数据以 PCM 文件的形式保存在工程目录…

关于数组的一些题---获取数组对象的各种数据

关于数组的一些题—获取数组对象的各种数据 题目1:将数组对象中的属性值提出来生成新的对象 var arr [{label:男&#xff0c;value: 1}, {label:女&#xff0c;value: 0}]function f(arr) {// 写代码&#xff0c;得到 } var obj f(arr); console.log(obj) // obj {1: 男&am…

1 | Trerraform的使用及创建CVM

目录1 Trerraform简介2 Trerraform的安装2.1 参考地址2.2 安装方式3 使用Terraform管理腾讯云3.1 创建帐号并授权3.2 添加Terraform的环境变量3.3 配置provider文件3.4 terraform init3.5 terraform init -upgrade3.6 terraform plan3.7 terraform apply3.8 terraform destroy4…

5分钟让你做出HR一眼看中的简历,方法简单易操作

写简历&#xff0c;真的是个“力气活”。 但凡求职经验丰富的朋友们&#xff0c;可以仔细想一想&#xff0c;之前我们面试求职的过程中&#xff0c;哪次不是通宵达旦在修改和“润色”简历中&#xff0c;在写简历里费劲功夫&#xff0c;目的还是为了引起HR的关注&#xff0c;从…

DASOU知识星球学的知识图谱

1.经典课程 1.经典课程 东南大学研究生课程: 东南大学研究生课程&#xff1a; https://github.com/npubird/KnowledgeGraphCourse 书籍推荐: 知识图谱的书籍的话可以看下作者是王昊奋【知识图谱:方法、实践与应用】那本书&#xff0c;算是近些年出版的里面质量不错的了&…

解决问题:VMware Tools 启动脚本未能在虚拟机中成功运行。

目录 问题 解决 方法一、重装 open-vm-tools-desktop 方法二、重装 vmware-tools 问题 Ubuntu 虚拟机开机时提示报错&#xff0c;具体信息如下&#xff1a; VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本&#xff0c;请确保该脚本…

USB TO SPI(上海同旺电子)调试器调试TC77温度传感器(三线SPI)

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、TC77 带 SPI 接口的温度传感器; 特别注意TC77温度传感器(三线制SPI) 特性 • 5引脚 SOT-23A 和8引脚SOIC 封装的数字温度传感器 • 以13 位数字字格式输出温度值 • SPI 和 MICROWIRE™ 兼容接口 • 固态…

IB科学课程的Group 4 project是什么?

。IBDP第4科学科目组中的科学类课程是必选课程。中国IB学生常选物理、化学、生物、计算机科学这类IB科学课程。这些IBDP科学课程都有一个共同的课程项目&#xff0c;那就是——The group 4 project&#xff01; 什么是The group 4 project&#xff1f; The group 4 project是一…

图表控件TeeChart for .NET系列教程四:轴控制(中)

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 TeeChart for .NET最新…

【Python黑帽子】——简易的ZIP文件密码破解器

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

[翻译+笔记]生成对抗网络: 从GAN到WGAN

最近读了一篇社会力模型的论文, 里面用到了GAN, 发现自己不是很懂. 想翻译一下一个大神的博客, 做一下笔记. 并不是全文翻译, 只翻译一部分. 原文地址: from GAN to WGAN 1. K-L和J-S散度 在介绍GAN之前, 首先复习一下衡量两个概率分布相似度的两种指标. (1) K-L散度: KL散度…

java Lambda表达式 省略模式写法

我们先来看一个普通的Lambda表达式 我们创建一个包 下面创建一个接口 testInterface 参考代码如下 public interface testInterface {int eat(int max,int min); }text 测试类 参考代码如下 public class text {public static void main(String args[]) {newTestInterface(…

夺冠热度空前,梅西Instagram粉丝破4亿,跨境卖家如何借这股东风?

阿根廷队世界杯夺冠&#xff0c;35岁的梅西终于实现了职业生涯大满贯&#xff0c;全世界球迷都在为梅西欢呼。梅西夺冠的热度席卷全球&#xff0c;当前其Instagram账号的粉丝就突破了4亿&#xff0c;成为世界上第二个Instagram粉丝超4亿的人。 梅西夺冠当日在Instagram上的发帖…