Activiti7-任务分配

news2024/11/22 23:51:51

上面这些已经在流程变量设置的时候学会了 ,这里略。

参考:Activiti7-流程变量_ZHOU_VIP的博客-CSDN博客


错别字:认领任务 

设计一个流程,设置候选人

错了,应该设置在候选人那里

由于修改了流程设计,需要重新部署流程,所以改成leave17.bpmn20.xml

后来又改成leave18.bpmn20.xml 

部署流程: 

启动流程: 

张三提交申请:

查询任务:

奇怪,候选人都没有接受到任务,因为张三提交申请中if(task != null)做了判断,没有执行

taskService.complete(task.getId());

查询候选人任务:

任务责任人为null,所以需要候选人认领任务

候选人认领任务:

查询任务:

wangwu已经收到了任务

查询组任务:

什么都没有,说明wangwu已经把组任务变成了个人任务

任务的归还:

归还后查询组任务:

候选人lisi认领任务:

查询任务:

lisi完成任务:

查询任务:

上面文档说的很明白,只要有一个候选人审批就可以

奇怪, 总经理的责任人id为null,想了下,原来是流程设计的时候忘记设置了

可以补充设置下:

map.put("assignee2","周总经理");

这个后面再测试吧

还有任务的交接也后面再测试吧

参考代码:

package com.nanjing;

import com.nanjing.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.List;
import java.util.Map;


/**
 * 测试候选人
 */
public class TestCandidate {
    /**
     * 流程部署
     */
    @Test
    public void testDeployment(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RepositoryServcie
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
        Deployment deploy = repositoryService.createDeployment()
                .name("出差申请流程-Candidate")
                .addClasspathResource("leave18.bpmn20.xml")
                .deploy();
//        4、输出部署信息
        System.out.println("流程部署id="+deploy.getId());
        System.out.println("流程部署名字="+deploy.getName());
    }

    /**
     * 启动流程 的时候设置流程变量
     */
    @Test
    public void testStartProcess(){
//        获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        流程定义的Key
        String key = "myEvection18";
//        启动流程
        //runtimeService.startProcessInstanceByKey(key);

//       创建变量集合
        Map<String, Object> map = new HashMap<>();
//        创建出差pojo对象
        Evection evection = new Evection();
//      定义流程变量,把出差pojo对象放入map
        map.put("evection",evection);
        map.put("assignee0","张三");
        map.put("assignee2","周总经理");
//        启动流程实例,并设置流程变量的值(把map传入)
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey(key, map);
    }

    /**
     * 查询组任务
     */
    @Test
    public void findGroupTaskList(){
        //        流程定义的Key
        String key = "myEvection18";
//        任务候选人
        String candidateUser = "wangwu";
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = processEngine.getTaskService();
//        查询组任务
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUser) //根据候选人查询任务
                .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());
        }
    }

    /**
     * 候选人拾取任务
     */
    @Test
    public void claimTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = processEngine.getTaskService();
//        当前任务的id
        String taskId = "5002";
//        任务候选人
        String candidateUser = "lisi";
//        查询任务
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskCandidateUser(candidateUser)
                .singleResult();
        if(task != null){
//            拾取任务
            taskService.claim(taskId,candidateUser);
            System.out.println("taskid-"+taskId+"-用户-"+candidateUser+"-拾取任务完成");
        }
    }

    /**
     * 任务的归还
     */
    @Test
    public void testAssigneeToGroupTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = processEngine.getTaskService();
//        当前任务的id
        String taskId = "5002";
//        任务负责人
        String assignee = "wangwu";
//        根据key 和负责人来查询任务
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskAssignee(assignee)
                .singleResult();
        if(task != null){
//            归还任务 ,就是把负责人 设置为空
            taskService.setAssignee(taskId,null);
            System.out.println("taskid-"+taskId+"-归还任务完成");
        }
    }


    /**
     * 任务的交接
     */
    @Test
    public void testAssigneeToCandidateUser(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取TaskService
        TaskService taskService = processEngine.getTaskService();
//        当前任务的id
        String taskId = "5002";
//        任务负责人
        String assignee = "lisi";
//        任务候选人
        String candidateUser = "wangwu";
//        根据key 和负责人来查询任务
        Task task = taskService.createTaskQuery()
                .taskId(taskId)
                .taskAssignee(assignee)
                .singleResult();
        if(task != null){
//            交接任务 ,就是把负责人 设置为空
            taskService.setAssignee(taskId,candidateUser);
            System.out.println("taskid-"+taskId+"-交接任务完成");
        }
    }
    /**
     * 完成个人任务
     */
    @Test
    public void completTask(){
//        流程定义的Key
        String key = "myEvection18";
//        任务负责人
        String assingee = "lisi";
//        String assingee = "";
        //        获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskservice
        TaskService taskService = processEngine.getTaskService();
//        查询任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assingee)
                .singleResult();
        if(task != null){
            //     根据任务id来   完成任务
            taskService.complete(task.getId());
        }

    }

    @Test
    public void queryTask(){
//        流程定义的Key
        String key = "myEvection18";
//        任务负责人

        //String assingee = "张财务";
        //        获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskservice
        TaskService taskService = processEngine.getTaskService();
//        查询任务
        final List<Task> tasks = taskService.createTaskQuery()
                .processDefinitionKey(key)
//                .taskAssignee(assingee)
                .list();
        for(Task task:tasks){
            //     根据任务id来   完成任务
            System.out.println(task.getId());
            System.out.println(task.getName());
            System.out.println(task.getAssignee());
        }

    }
}

参考:

学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot_努力敲代码买猪脚啃的博客-CSDN博客_activiti bpmn visualizer

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

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

相关文章

被勒索后的72 小时“生死时速”

编者按 数字化浪潮蓬勃兴起&#xff0c;企业面临的安全挑战亦日益严峻。 腾讯安全近期将复盘2022年典型的攻击事件&#xff0c;帮助企业深入了解攻击手法和应对措施&#xff0c;完善自身安全防御体系。 本篇是第四期&#xff0c;复盘了一次勒索病毒的紧急应对事件。一旦染上…

【ML】异常检测、PCA、混淆矩阵、调参综合实践(基于sklearn)

【ML】异常检测、PCA、混淆矩阵、调参综合实践&#xff08;基于sklearn&#xff09;加载数据可视化数据异常点检测PCA降维使用KNN进行分类并可视化计算混淆矩阵调节n_neighbors参数找到最优值加载数据 数据集&#xff1a;https://www.kaggle.com/datasets/yuanheqiuye/data-cl…

数据分析之描述性统计

当我们打开一份有十几列&#xff0c;几万行的明细数据时&#xff0c;那种感觉我相信用铺天盖地、头晕目眩来形容是再合适不过了。 面对如此令人崩溃的场景&#xff0c;必须要求我们要求能够快速找到数据的特征。描述性统计正是为此而生&#xff0c;它通过几个简单的分析方法就…

k8s——基于集群部署工具kubeadm部署k8s

角色和IP 通过网络镜像下载和配置k8s 操作系统初始化 关闭防火墙&#xff1a; $ systemctl stop firewalld $ systemctl disable firewalld关闭 selinux&#xff1a; $ sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 $ setenforce 0 # 临时关闭 swap&#xff1…

OpenCV C++实现 图片批量重命名、格式转换

方法一:以0~n数字序命名方法二:指定字长 数字序命名方法三:指定前缀 数字序重命名全部源码下载通常拍摄的一组数据集,图片命名会比较长,不方便人眼查看; 可以按照制定规则重命名, 本文方法,可以重命名,也可以格式转换(不是简单的换后缀,这样图片有时会出问题,而是以…

[JavaEE] 线程与进程的区别详解

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 认识线程(Thread) 1. 线程是什么? 2. 为什么要有…

java 对接百度AI文字识别第三方接口--(api方式以及sdk方式)

平时在工作当中难免会需要对接第三方接口。今天就带领大家来实践一下百度ai的文字识别技术。我使用的是文字识别中名片识别服务&#xff0c;别问为什么&#xff0c;因为是免费的&#xff0c;其他的服务要钱。。。。。。 一&#xff1a;准备工作 首先需要在百度ai官方网站注册账…

【案例实践】基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法

【点击观看视频】基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技…

如何定位线上问题?

面试官&#xff1a;「你是怎么定位线上问题的&#xff1f;」 这个面试题我在两年社招的时候遇到过&#xff0c;前几天面试也遇到了。我觉得我每一次都答得中规中矩&#xff0c;今天来梳理复盘下&#xff0c;下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路…

景联文科技2D3D融合标注案例分享|数据标注

在自动驾驶场景中&#xff0c;激光雷达生成的点云数据可用于测量物体的形状和轮廓&#xff0c;并估算出周围物体的位置和速度&#xff0c;但由于激光雷达生成的点云数据缺少RGB数据中存在的纹理和颜色信息&#xff0c;无法精确地识别出路上的汽车、行人、障碍物、信号灯等。而2…

网络流及几种算法FF、EK、Dinic

终于要开始学习&&复习这个知识点了&#xff0c;说句实话半年多之前就该写这篇文章来加强理解&#xff0c;但是一直没有落实&#xff0c;因为又去练习了很多学过的算法&#xff0c;感觉这个算法不太常用哦&#xff0c;传说中的省选算法&#xff0c;比赛比较少见&#xf…

在2022 CCF上获得两项大奖!

喜报!      在日前举行的      2022全国高性能计算学术年会上      戴尔科技集团      获得两项大奖!      戴尔科技PowerEdge绿色数据中心      液冷解决方案荣获“解决方案奖”    PowerEdge R750 DAOS      高性能分布式存储系统荣获“产品…

基于springboot+mybatis+mysql+jsp网上书城管理系统

基于 springbootmybatismysqljsp 网上书城管理系统一、系统介绍二、功能展示1.主页(客户)2.登陆&#xff08;客户&#xff09;3.我的购物车(客户)4.我的订单&#xff08;客户&#xff09;5.我的图书&#xff08;商家&#xff09;6.新书上架&#xff08;商家&#xff09;7.订单管…

股指期货是怎么交易的?3分钟教你从入门到精通

相对比投资于单一的产品而言&#xff0c;越来越多的投资者开始爱上股指期货&#xff0c;因为指数的波动速度特别的快&#xff0c;再加上里面的收益空间也特别的饱满&#xff0c;所以这是绝大多数希望赚快钱的投资者最喜欢的类似期货、股票等产品。而且很多进入到这个市场的投资…

CodeQL代码静态污点分析引擎排查漏洞模式

文章目录前言环境搭建1.1 codeql基础1.2 vscode插件1.3 生成数据库1.4 HelloWorldcodeql语法2.1 语法结构2.2 常用类库2.3 谓词介绍2.4 污点分析漏洞检测3.1 初步结果3.2 解决误报总结前言 对于代码审计的工作&#xff0c;最早期的安全人员会以人工审计的方式来审计项目代码&a…

【学习笔记】jenkins持续集成入门

jenkins持续集成入门 文章目录学习源一、jenkins简介和安装安装&#xff1a;插件:安装插件&#xff1a;二、配置Jenkins系统邮箱三、使用jenkins实现持续集成&#xff08;一&#xff09;使用Jenkins实现简单的本地Python项目代码执行准备工作&#xff1a;使用Jenkins管理-手动构…

PHP开发工具PhpStorm v2022.3——完全支持PHP 8.2

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 PhpStorm v20…

PM说丨浅谈PDCA与Scrum的“异曲同工”之妙

文章目录一、前言二、PDCA与Scrum介绍1、 PDCA循环&#xff08;戴明环&#xff09;2、 Scrum三、PDCA与Scrum对比四、总结一、前言 笔者最近参与到一个生产制造型企业的ERP系统升级改造项目&#xff0c;实施过程中涉及到QMS与质量管理相关内容。 在了解质量管理体系的过程中发…

如何优雅地使用git?

文章目录Oh shit gitgitmojigit命令思维导图Oh shit git https://ohshitgit.com/ 这个网站针对一些在使用git中可能遇到的问题都做了详细介绍&#xff0c;并且形象生动。 例如&#xff1a;Oh shit&#xff0c;我想改个地方&#xff0c;但我已经提交&#xff08;commited&#…

现代C++ 05

智能指针与内存管理 1.1 RAII 与引用计数 了解 Objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。 基本想法是对于动态分配的对象&#xff0c;进行引用计数&#xff0c;每当增加一次对同一个对象的引用&#xff0c;那么引用对…