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

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


相关文章
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
41 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 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
126 3
|
2月前
|
JavaScript 前端开发 开发者
Vue执行流程及渲染解析
【10月更文挑战第2天】
109 58
|
24天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
23 0
|
2月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。
|
2月前
|
JavaScript 前端开发 UED
Vue执行流程及渲染解析
【10月更文挑战第5天】
|
2月前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
36 3
|
2月前
|
人工智能 缓存 Java
深入解析Spring AI框架:在Java应用中实现智能化交互的关键
【10月更文挑战第12天】Spring AI 是 Spring 框架家族的新成员,旨在满足 Java 应用程序对人工智能集成的需求。它支持自然语言处理、图像识别等多种 AI 技术,并提供与云服务(如 OpenAI、Azure Cognitive Services)及本地模型的无缝集成。通过简单的配置和编码,开发者可轻松实现 AI 功能,同时应对模型切换、数据安全及性能优化等挑战。
137 3
|
2月前
|
存储 缓存 边缘计算
揭秘直播带货背后的黑科技:播放流程全解析!
大家好,我是小米,今天聊聊社区直播带货的技术细节。我们将探讨直播播放流程中的关键技术,包括 HTTP DASH 协议、POP(Point of Presence)缓存和一致性哈希算法等。通过这些技术,直播流能根据网络状况动态调整清晰度,保证流畅体验。POP 和 DC 的多层次缓存设计减少了延迟,提升了观看效果。无论是技术人员还是直播运营者,都能从中受益。希望通过本文,你能更好地理解直播背后的技术原理。
49 3
|
2月前
|
分布式计算 Java 应用服务中间件
NettyIO框架的深度技术解析与实战
【10月更文挑战第13天】Netty是一个异步事件驱动的网络应用程序框架,由JBOSS提供,现已成为Github上的独立项目。
46 0

推荐镜像

更多