万字解析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的,很明显我在设置的时候使用的是中文状态的标点符号,所以他把整体都算成是一个执行人了.这里大家一定要注意.


相关文章
|
1月前
|
存储 域名解析 弹性计算
阿里云上云流程参考:云服务器+域名+备案+域名解析绑定,全流程图文详解
对于初次通过阿里云完成上云的企业和个人用户来说,很多用户不仅是需要选购云服务器,同时还需要注册域名以及完成备案和域名的解析相关流程,从而实现网站的上线。本文将以上云操作流程为核心,结合阿里云的活动政策与用户系统梳理云服务器选购、域名注册、备案申请及域名绑定四大关键环节,以供用户完成线上业务部署做出参考。
|
10月前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
1583 11
|
7月前
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
393 27
|
7月前
|
人工智能 自然语言处理 搜索推荐
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
ViDoRAG 是阿里巴巴通义实验室联合中国科学技术大学和上海交通大学推出的视觉文档检索增强生成框架,基于多智能体协作和动态迭代推理,显著提升复杂视觉文档的检索和生成效率。
398 8
ViDoRAG:开源多模态文档检索框架,多智能体推理+图文理解精准解析文档
|
8月前
|
编解码 缓存 Prometheus
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
本期内容为「ximagine」频道《显示器测试流程》的规范及标准,我们主要使用Calman、DisplayCAL、i1Profiler等软件及CA410、Spyder X、i1Pro 2等设备,是我们目前制作内容数据的重要来源,我们深知所做的仍是比较表面的活儿,和工程师、科研人员相比有着不小的差距,测试并不复杂,但是相当繁琐,收集整理测试无不花费大量时间精力,内容不完善或者有错误的地方,希望大佬指出我们好改进!
551 16
「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
|
7月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
7月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
411 3
|
8月前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
973 12

推荐镜像

更多
  • DNS