万字解析Activiti7流程框架(四)

简介: 万字解析Activiti7流程框架

5.3.1-拾取任务操作:


    //拾取任务
    @Test
    public void claimTask(){
//        Task task=taskService.createTaskQuery().taskId("").singleResult();
        taskService.claim("","bajie");
    }

image.png


我们可以看到在我们给候选任务分配了执行人之后,任务节点就已经产生.并且查询其他没有被分配的执行人时可以看到都是没有的.


5.3.2-退还任务操作:

    //退还任务
    @Test
    public void setTaskAssignee(){
        taskService.setAssignee("",null);//退任务
    }


image.png


可以看到我们是接着上一步操作的,我们直接将任务退回之后,接着分别取我们分配的三个执行人下面查找,发现三个人都是没有改任务节点的,并且直接查找任务节点列表也是显示为空,这就表示我们的任务的确已经退回成功.


5.3.3-交办任务操作:


    //交办任务
    @Test
    public void setTaskAssignee(){
        taskService.setAssignee("","wukong");//交办任务
    }


image.png


以看到我们还是接着上一步,我们先是给我们已经退回的任务重新先分配了一个执行人bajie,然后再重新把任务交办给执行人wukong的,之后我们先是查找bajie下面的任务节点,发现是没有的,之后我们再去查找wukong下面的任务节点,发现是有的,这样我们的任务就已经交办成功了.


并且其实大家看完上述三个操作之后可以发现,其实这三者操作的代码是类似的,只不过是修改执行人的名称即可,所以其实这三部的代码是完全可以放在一个方法里面执行的,只要稍微注意一下情况的区分即可,比如说如果没有任务节点那么显然就是拾取操作,剩下的操作就是退还与交办了.


6.HistoricTaskInstance-历史任务:


关于历史任务,主要就是操作下面这几张表


act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);

act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);

act_hi_comment:历史意见表,可改造用于保存节点审批意见、备注;

act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);

act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;

act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);

act_hi_taskinst:历史流程任务表,存储历史任务节点;

act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;


6.1-HistoricTaskInstance根据执行人查询历史信息操作:

@Autowired
    private HistoryService historyService;
    //根据执行人查询历史任务信息
    @Test
    public void HistoricTaskInstanceByAssignee(){
        List<HistoricTaskInstance> historicTaskInstances=historyService.createHistoricTaskInstanceQuery()
                .orderByHistoricTaskInstanceEndTime().asc()
                .taskAssignee("bajie")
                .list();
        for(HistoricTaskInstance historicTaskInstance:historicTaskInstances){
            System.out.println("Id:"+historicTaskInstance.getId());
            System.out.println("Assignee:"+historicTaskInstance.getAssignee());
            System.out.println("ProcessInstanceId:"+historicTaskInstance.getProcessInstanceId());
            System.out.println("EndTime:"+historicTaskInstance.getEndTime());
            System.out.println("Name:"+historicTaskInstance.getName());
        }
    }


image.png


运行完成之后我们可以看到bajie所执行的所有历史历史任务了


6.2-HistoricTaskInstance根据流程实例ID查询历史信息操作:


    //根据流程实例ID查询历史任务信息
    @Test
    public void HistoricTaskInstanceByProcessInstanceId(){
        List<HistoricTaskInstance> historicTaskInstances=historyService.createHistoricTaskInstanceQuery()
                .processInstanceId("")
                .list();
        for(HistoricTaskInstance historicTaskInstance:historicTaskInstances){
            System.out.println("Id:"+historicTaskInstance.getId());
            System.out.println("Assignee:"+historicTaskInstance.getAssignee());
            System.out.println("ProcessInstanceId:"+historicTaskInstance.getProcessInstanceId());
            System.out.println("EndTime:"+historicTaskInstance.getEndTime());
            System.out.println("Name:"+historicTaskInstance.getName());
        }
    }

image.png


7.UEL表达式:


7.1-UEL-传递执行人:


${变量名}

我们重新创建一个BPMN文件:


20201216110750732.gif


我们重新创建了一个BPMN文件,并且这次我们并没有给他直接分配执行人,而是通过通过UEL表达式进行动态的分配的.


    //启动流程实例带参数--执行人
    @Test
    public void initProcessInstanceWithArgs(){
        //流程实例变量
        Map<String,Object> map=new HashMap<>();
        map.put("Staff","wukong");
//        map.put("Staff1","");
//        map.put("Staff2","");
        ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("myProcess_UEL_V1","test001",map);
        System.out.println("ID:"+processInstance.getId());
        System.out.println("Name:"+processInstance.getName());
        System.out.println("ProcessDefinitionId:"+processInstance.getProcessDefinitionId());
    }



这里我们首先显示部署我们刚才生成的BPMN文件,之后我们便去实例化我们的流程实例,并且在这个过程中我们同事赋予该流程实例的执行人是wukong,之后我们便去查询wukong下的所有任务节点可以发现wukong下面的确多出来一个任务节点.说明我们赋予执行人的操作已经成功执行了.


7.2-UEL-传递流程变量:


我们在创建一个BPMN文件:


image.gif


我们这里定义了一个条件转移过程,如果报销费用小于等于100的话就由悟空审核,超过100的话就由唐僧审核,这个费用的变量值就是在八戒的任务节点产生,并且直接判断之后转移到下一个任务节点.


    @Test
    public void CompletetaskWithArgs(){
        Map<String,Object> map=new HashMap<>();
        map.put("pay","120");
        taskService.complete("a61d9134-3f49-11eb-97e4-3c58c24c1a1b",map);
        System.out.println("该任务节点已经处理完毕");
    }


image.png


我们可以看我们首先先将我们刚才定义的BPMN文件部署号,之后我们再去创建该流程定义的流程实例,之后我们先去查询一下tangseng下面时候有任务节点,应该是没有的,因为我们之前就没有给他分配过任务.


image.png


之后我们再去获取该流程实例生成的关于bajie的任务节点的ID号,这样我们才能去执行我们的任务节点,执行完任务节点之后,按道理这时候任务节点就已经转接到tangseng的任务节点了.这时候我们再去查询tangseng的任务节点我们就能发现的确是已经将任务节点流转到tangseng这里了,这就说明我们关于传递流程变量的操作已经成功执行了.


7.3-UEL-传递实体类的流程变量以及候选任务的执行人:


还是先来看看我们的BPMN文件:


image.gif


这次可以看到我们的任务节点中的变量不再是我们直接定义的变量名了,而是换成了我们定义的实体类的一个属性,注意这里要注意,实体类的属性只能使用小写字母,不能使用大写字母,否则会出错.


接着就是我们的候选任务了,其实这里的变量定义和我们之前的定义是一样不一样的是我们之后为这个变量赋值的时候需要注意一下.


接着就是我们的代码了:


我们先看变量是实体类:


    //启动流程实例带参数--实体类
    @Test
    public void initProcessInstanceWithClassArgs(){
        UELDao uelDao=new UELDao();
        uelDao.setStaff("wukong");
        //流程实例变量
        Map<String,Object> map=new HashMap<>();
        map.put("uel",uelDao);
//        map.put("Staff1","");
//        map.put("Staff2","");
        ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("myProcess_UEL_V3","test001",map);
        System.out.println("ID:"+processInstance.getId());
        System.out.println("Name:"+processInstance.getName());
        System.out.println("ProcessDefinitionId:"+processInstance.getProcessDefinitionId());
    }


这其中我们定义的实体类必须要实现序列化,否则也是不会生效的.


image.png


为了节省时间我们就不重复录制部署的过程了,直接开始我们赋予实体类流程变量的过程,之后就是查看该角色下的任务节点时候有一个叫做 “实体类任务” 的任务节点,可以发现的确有这样一个任务节点,说明我们通过实体类赋值的操作已经执行成功了.


接下来就是赋予候选人执行人:


    //任务执行完成后赋予候选任务节点多个候选人
    @Test
    public void initTaskWithCandiDateArgs(){
        Map<String,Object>map=new HashMap<>();
        map.put("staffs","bajie,shaseng,tangseng");
        taskService.complete("",map);
        System.out.println("任务节点已完成,候选任务执行人变量已赋予,带拾取");
    }


这里面我们主要需要注意一点就是多位候选人中间需要通过英文状态下的,隔开,否则不会生效的.


image.png


这里我们将我们的实体类任务执行完成的同时将候选任务的执行人变量赋予,之后我们再去查找所有的任务节点会发现有一个任务节点的执行人为null.为null就和我们上面的候选任务一样,只有在我们已经对该任务进行拾取操作之后才会显示执行人,否则是会显示为null的,很明显我在设置的时候使用的是中文状态的标点符号,所以他把整体都算成是一个执行人了.这里大家一定要注意.


相关文章
|
28天前
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
36 0
|
1月前
|
消息中间件 Unix Linux
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
Linux进程间通信(IPC)介绍:详细解析IPC的执行流程、状态和通信机制
51 1
|
1月前
|
数据采集 数据可视化 大数据
Python在数据科学中的实际应用:从数据清洗到可视化的全流程解析
Python在数据科学中的实际应用:从数据清洗到可视化的全流程解析
37 1
|
1月前
|
XML 存储 JavaScript
Fiori Elements 框架里 Smart Table 控件工作原理的深入解析
Fiori Elements 框架里 Smart Table 控件工作原理的深入解析
17 0
|
10天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。
|
12天前
|
机器学习/深度学习 分布式计算 BI
Flink实时流处理框架原理与应用:面试经验与必备知识点解析
【4月更文挑战第9天】本文详尽探讨了Flink实时流处理框架的原理,包括运行时架构、数据流模型、状态管理和容错机制、资源调度与优化以及与外部系统的集成。此外,还介绍了Flink在实时数据管道、分析、数仓与BI、机器学习等领域的应用实践。同时,文章提供了面试经验与常见问题解析,如Flink与其他系统的对比、实际项目挑战及解决方案,并展望了Flink的未来发展趋势。附带Java DataStream API代码样例,为学习和面试准备提供了实用素材。
34 0
|
20天前
|
C++
C++ While 和 For 循环:流程控制全解析
本文介绍了C++中的`switch`语句和循环结构。`switch`语句根据表达式的值执行匹配的代码块,可以使用`break`终止执行并跳出`switch`。`default`关键字用于处理没有匹配`case`的情况。接着,文章讲述了三种类型的循环:`while`循环在条件满足时执行代码,`do/while`至少执行一次代码再检查条件,`for`循环适用于已知循环次数的情况。`for`循环包含初始化、条件和递增三个部分。此外,还提到了嵌套循环和C++11引入的`foreach`循环,用于遍历数组元素。最后,鼓励读者关注微信公众号`Let us Coding`获取更多内容。
20 0
|
1月前
|
物联网 调度 开发者
构建高效Python Web应用:异步编程与Tornado框架解析
【2月更文挑战第27天】 在处理高并发的Web应用场景时,传统的同步阻塞模型往往难以满足性能需求。本文将深入探讨Python世界中的异步编程概念,并结合Tornado这一轻量级、非阻塞式Web服务器及框架,展示如何构建高性能的Web应用。通过实例驱动的方法论,我们将剖析Tornado的核心组件,包括其IOLoop、异步HTTP客户端和服务器端处理机制,以及与协程集成的细节。文章旨在为开发者提供一套实践指南,帮助他们利用Python实现快速响应和资源高效的Web服务。
29 2
|
1月前
|
算法 Java API
探索Java并发编程:Fork/Join框架的深度解析
【2月更文挑战第26天】随着多核处理器的普及,并发编程在软件开发中的重要性日益凸显。Java语言提供了多种并发工具,其中Fork/Join框架是处理分而治之问题的一个强大工具。本文将深入探讨Fork/Join框架的设计原理、使用场景及与传统线程池的区别,并通过实例演示如何有效利用该框架提升程序性能。
|
1月前
|
SQL API 数据处理
新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析
本文整理自阿里云开源大数据平台吕宴全关于新一代实时数据集成框架 Flink CDC 3.0 的核心技术架构解析。
708 0
新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析

推荐镜像

更多