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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 万字解析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的,很明显我在设置的时候使用的是中文状态的标点符号,所以他把整体都算成是一个执行人了.这里大家一定要注意.


相关文章
|
5天前
|
监控 安全 开发工具
鸿蒙HarmonyOS应用开发 | HarmonyOS Next-从应用开发到上架全流程解析
HarmonyOS Next是华为推出的最新版本鸿蒙操作系统,强调多设备协同和分布式技术,提供丰富的开发工具和API接口。本文详细解析了从应用开发到上架的全流程,包括环境搭建、应用设计与开发、多设备适配、测试调试、应用上架及推广等环节,并介绍了鸿蒙原生应用开发者激励计划,帮助开发者更好地融入鸿蒙生态。通过DevEco Studio集成开发环境和华为提供的多种支持工具,开发者可以轻松创建并发布高质量的鸿蒙应用,享受技术和市场推广的双重支持。
132 11
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3
|
2天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
8天前
|
域名解析 弹性计算 安全
阿里云服务器租用、注册域名、备案及域名解析完整流程参考(图文教程)
对于很多初次建站的用户来说,选购云服务器和注册应及备案和域名解析步骤必须了解的,目前轻量云服务器2核2G68元一年,2核4G4M服务器298元一年,域名注册方面,阿里云推出域名1元购买活动,新用户注册com和cn域名2年首年仅需0元,xyz和top等域名首年仅需1元。对于建站的用户来说,购买完云服务器并注册好域名之后,下一步还需要操作备案和域名绑定。本文为大家展示阿里云服务器的购买流程,域名注册、绑定以及备案的完整流程,全文以图文教程形式为大家展示具体细节及注意事项,以供新手用户参考。
|
26天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
53 12
|
1月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
1月前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
34 0
|
2月前
|
JavaScript 前端开发 UED
Vue执行流程及渲染解析
【10月更文挑战第5天】
|
2月前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
50 3

推荐镜像

更多