act_ru_task:任务表
act_ru_identitylink:权限表(流程定义和用户组(用户)之间的权限数据)
act_ru_variable:参数表
act_hi_attachment:任务附件(可以以流的方式存储到act_ge_bytearray表中(父表),外键CONTENT_ID_(没有强制物理关系))
act_hi_comment:任务评论和事件记录表(由type决定,"event":事件的记录,"comment":流程的评论数据)
1.创建
//获取任务服务组件
TaskService taskService = engine.getTaskService();
//保存第一个Task,不设置ID
Task task1 = taskService.newTask();
taskService.saveTask(task1);
//保存第二个Task,设置ID
Task task2 = taskService.newTask("审核任务");
taskService.saveTask(task2);
2.删除
// 删除task(不包括历史数据和子任务)
taskService.deleteTask("1");
// 删除task(包括历史数据和子任务)
taskService.deleteTask("2", true);
// 删除多个task(不包括历史数据和子任务)
List<String> ids = new ArrayList<String>();
ids.add("3");
ids.add("4");
taskService.deleteTasks(ids);
//删除多个task(包括历史数据和子任务)
ids = new ArrayList<String>();
ids.add("5");
ids.add("6");
taskService.deleteTasks(ids, true);
// 再删除ID为3的task,此时3的历史数据也会被删除(如果有的话)
taskService.deleteTask("3", true);

3.设置任务持有人
taskService.setOwner(task1.getId(), user.getId());
//该用户持有的任务数量
taskService.createTaskQuery().taskOwner(user.getId()).count()

4. 设置任务受理人
taskService.setAssignee(task1.getId(), user.getId());
//该用户受理的任务数量
taskService.createTaskQuery().taskAssignee(user.getId()).count()

5. 任务候选组(绑定权限) act_ru_identitylink
taskService.addCandidateGroup("task1", groupA.getId());

6.任务候选人(绑定权限) act_ru_identitylink
taskService.addCandidateUser("task1", user.getId());

7. 查询
//根据用户组查询任务
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup(groupA.getId()).list();

//根据用户查询任务
tasks = taskService.createTaskQuery().taskCandidateUser(user.getId()).list();
查询的SQL语句: Preparing: select distinct RES.* from ACT_RU_TASK RES inner join ACT_RU_IDENTITYLINK I on I.TASK_ID_ = RES.ID_ WHERE RES.ASSIGNEE_ is null and I.TYPE_ = 'candidate' and ( I.USER_ID_ = ? ) order by RES.ID_ asc LIMIT ? OFFSET ?
Parameters: djl(String), 2147483647(Integer), 0(Integer)

//查询权限数据(任务-->权限)
List<IdentityLink> links = taskService.getIdentityLinksForTask(task.getId());
//调用taskCandidateGroupIn
List<String> groupIds = new ArrayList<String>();
groupIds.add(groupA.getId());
groupIds.add(groupB.getId());
tasks = taskService.createTaskQuery().taskCandidateGroupIn(groupIds).list();

8.添加任务权限数据
//调用addGroupIdentityLink方法
taskService.addGroupIdentityLink(task1.getId(), groupA.getId(), IdentityLinkType.CANDIDATE); -->addCandidateGroup(); 任务候选组
//调用addUserIdentityLink方法
taskService.addUserIdentityLink(task1.getId(), user.getId(), IdentityLinkType.CANDIDATE); --> setOwner(); 任务持有人
taskService.addUserIdentityLink(task1.getId(), user.getId(), IdentityLinkType.OWNER); -->addCandidateUser() 任务候选人
taskService.addUserIdentityLink(task1.getId(), user.getId(), IdentityLinkType.ASSIGNEE); --> setAssignee(); 任务受理人

9.删除
//删除用户组权限
taskService.deleteGroupIdentityLink(task1.getId(), groupA.getId(),
IdentityLinkType.CANDIDATE);
taskService.deleteCandidateGroup(task1.getId(), groupA.getId());
//删除用户权限
taskService.deleteUserIdentityLink(task1.getId(), user.getId(), IdentityLinkType.OWNER);
taskService.deleteCandidateUser(task1.getId(), user.getId());

10.任务参数
参数作用域
setVariable:整个流程中都可以使用
setVariableLocal:当前任务中使用
两个作用域不交集 确定
taskService.setVariableLocal(task.getId(), "target", "欧洲");
Object data3 = taskService.getVariableLocal(task.getId(), "target");
//初始化参数
Map<String,Object> vars = new HashMap<String, Object>();
vars.put("days", 10);
vars.put("target", "欧洲");
taskService.setVariables(task1.getId(), vars);
Date d = new Date();
short s = 3;
//设置各种基本类型参数
taskService.setVariable(task1.getId(), "arg0", false);
Object arg0 = taskService.getVariable(task1.getId(), "arg0");
taskService.setVariable(task1.getId(), "arg1", d);
taskService.setVariable(task1.getId(), "arg2", 1.5D);
taskService.setVariable(task1.getId(), "arg3", 2);
taskService.setVariable(task1.getId(), "arg4", 10L);
taskService.setVariable(task1.getId(), "arg5", null);
taskService.setVariable(task1.getId(), "arg6", s);
taskService.setVariable(task1.getId(), "arg7", "test");
taskService.setVariable(task1.getId(), "target", new TestVO("北京"));
(TestVO要实现序列化
/**
* 序列化对象
* @author yangenxiong
*
*/
public class TestVO implements Serializable {

private String name;
public TestVO(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
//获取参数

11.附件
// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/vacation.bpmn").deploy();
// 查找流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceById(pd.getId());
// 查找任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
// 设置任务附件
Attachment att1 = taskService.createAttachment("web url", task.getId(), pi.getId(), "Attachement1",
"163 web page", "http://www.163.com");
// 创建图片输入流
InputStream is = new FileInputStream(new File("resource/artifact/result.png"));
// 设置输入流为任务附件
Attachment att2 = taskService.createAttachment("web url", task.getId(), pi.getId(), "Attachement2",
"Image InputStream", is);
// 根据流程实例ID查询附件
List<Attachment> attas1 = taskService.getProcessInstanceAttachments(pi.getId());
System.out.println("流程附件数量:" + attas1.size());
// 根据任务ID查询附件
List<Attachment> attas2 = taskService.getTaskAttachments(task.getId());
System.out.println("任务附件数量:" + attas2.size());
// 根据附件ID查询附件
Attachment attResult = taskService.getAttachment(att1.getId());
System.out.println("附件1名称:" + attResult.getName());
// 根据附件ID查询附件内容
InputStream stream1 = taskService.getAttachmentContent(att1.getId());
System.out.println("附件1的输入流:" + stream1);
InputStream stream2 = taskService.getAttachmentContent(att2.getId());
System.out.println("附件2的输入流:" + stream2);

12.事件记录(事件和评论)
// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/vacation.bpmn").deploy();
// 查找流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceById(pd.getId());
// 查找任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
// 调用各个记录事件的方法
taskService.addComment(task.getId(), pi.getId(), "this is comment message");
taskService.addUserIdentityLink(task.getId(), "1", "user");
taskService.deleteUserIdentityLink(task.getId(), "1", "user");
taskService.addGroupIdentityLink(task.getId(), "1", "group");
taskService.deleteGroupIdentityLink(task.getId(), "1", "group");
Attachment atta = taskService.createAttachment("test", task.getId(), pi.getId(), "test", "test", "");
taskService.deleteAttachment(atta.getId());
// 查询Comment和Event
List<Comment> comments = taskService.getTaskComments(task.getId());
System.out.println("总共的评论数量:" + comments.size());
List<Event> events = taskService.getTaskEvents(task.getId());
System.out.println("总共的事件数量:" + events.size());
// 查询事件与评论
List<Comment> commonts1 = taskService.getProcessInstanceComments(pi.getId());
System.out.println("流程评论(事件)数量:" + commonts1.size());
commonts1 = taskService.getTaskComments(task.getId());
System.out.println("任务评论数量:" + commonts1.size());
List<Event> events = taskService.getTaskEvents(task.getId());
System.out.println("事件数量:" + events.size());

13.任务声明(签收)
taskService.claim(task.getId(), userID);
只能声明给同一个用户(可多次),不能再次声明,和setAssignee方法类似

14.任务完成
complete参数为两个时,效果同setVariable
只有一个参数taskID时,会将完成的相关Task数据从数据表中删除,放到历史数据表中,然后让执行流继续往下,如果发现这个任务为流程中的最后一个任务,则会连同实例的数据也一并删除,并且
按照历史配置来记录流程的历史数据。

// 部署流程描述文件
Deployment dep = repositoryService.createDeployment()
.addClasspathResource("bpmn/vacation2.bpmn").deploy();
// 查找流程定义
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runtimeService
.startProcessInstanceById(pd.getId());
// 查找任务
Task task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
// 调用complete方法完成任务,传入参数
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("days", 2);
taskService.complete(task.getId(), vars);
// 再次查找任务
task = taskService.createTaskQuery().processInstanceId(pi.getId())
.singleResult();
//得到参数
Integer days = (Integer)taskService.getVariable(task.getId(), "days");
if (days > 5) {
System.out.println("大于5天,不批");
} else {
System.out.println("小于5天,完成任务,流程结束");
taskService.complete(task.getId());
}

---------------------
作者:夜飛雪
来源:CSDN
原文:https://blog.csdn.net/qq_31678877/article/details/52937178
版权声明:本文为博主原创文章,转载请附上博文链接!

taskService 流程任务组件的更多相关文章

  1. Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合

    Django---FORM组件.FORM组件的字段,FORM组件校验流程,FORM组件的全局和局部钩子,FORM和Model的组合 一丶FORM的介绍 1.生成页面可用的HTML标签 2.对用户提交的 ...

  2. SpringMVC的工作流程以及组件说明

    1. SpringMVC处理流程 2. SpringMVC架构 2.1 框架结构 2.2 框架流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherSer ...

  3. SpringMVC的工作流程、组件说明以及常用注解说明

    1. SpringMVC处理流程 2. SpringMVC架构 2.1 框架结构 2.2 框架流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherSer ...

  4. 理解Yarn的执行流程和组件作用

    Yarn引入案例 1.学生找院长报到,院长给学生一个学号 2.院长比较忙,继续找主任处理学生事务 3.系主任找院办给学生分配资源(书本) 4.主任找张老师教授java 5.张老师给学生安排座位 6.学 ...

  5. 笔记37 Spring Web Flow——流程的组件

    在Spring Web Flow中,流程是由三个主要元素定义的:状态.转移和 流程数据. 一.状态 Spring Web Flow定义了五种不同类型的状态.通过选择Spring Web Flow的状态 ...

  6. Netty服务端创建流程及组件职责

    public class NettyServer { public static void main(String[] args) throws InterruptedException { NioE ...

  7. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

    RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部 ...

  8. 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web

    实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系 ...

  9. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台

    RDIFramework.NET ━ .NET快速信息化系统开发框架  工作流程组件Web业务平台 接前两篇: RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介 ...

随机推荐

  1. The Cat in the Hat POJ - 1289

    题意:给你来两个数A,B  .其中A=(n+1)k, B=nk    输出:(nk-1)/(n-1) 和  ∏ (n+1)k-i ni 思路:关键就是怎么求n和k.本来想这n一定是几个质因数的乘积,那 ...

  2. go标准库的学习-net/http

    参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

  3. OpenCV——轮廓填充drawContours函数解析

    函数的调用形式 void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const ...

  4. 深入浅出的webpack构建工具---HappyPack优化构建(九)

    阅读目录 一:什么是HappyPack? 作用是什么? 二:如何在配置中使用HappyPack? 回到顶部 一:什么是HappyPack? 作用是什么? Webpack是允许在NodeJS中的,它是单 ...

  5. PAT A1029 Median (25 分)——队列

    Given an increasing sequence S of N integers, the median is the number at the middle position. For e ...

  6. Ansible安装及配置

    ansible分为以下几个部份: Ansible:核心引擎 Modules:包括 Ansible 自带的核心模块(core modules)及自定义模块 (custom modules): 核心模块: ...

  7. Luogu4630 APIO2018 Duathlon 圆方树、树形DP

    传送门 要求的是一条按顺序经过\(s,t,c\)三个点的简单路径.简单路径的计数问题不难想到点双联通分量,进而使用圆方树进行求解. 首先将原图缩点,对于一个大小为\(size\)的点双联通分量内,在这 ...

  8. HTML5-应用程序缓存(Application Cache)

    一.什么是应用程序缓存? HTML5 引入了应用程序缓存(Application Cache),这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 二.优势 离线浏览 - 用户可在应用 ...

  9. (转)Syntax error:

    但是运行时总是报下面这个错,如下: test11-loop.sh: 5: Syntax error: Bad for loop variable 几经查找语法,没有问题,后来在网上找到问题原因: 代码 ...

  10. Luogu P1896 [SCOI2005]互不侵犯

    一道超级简单的状压DP题所以说状压是个好东西 看数据范围,同时我们发现一个格子要么放国王or不放,因此可以用二进制数来表示某一行的国王放置信息 于是我们马上想到用\(f_{i,j}\)表示放了前\(i ...