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. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165318

    2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 20165318 下载地址 Kali官网,选择Kali Linux 64 bit VMware 安装步骤 以下步 ...

  2. (一 ) 天猫精灵接入Home Assistant-服务器搭建

    ()1登陆阿里云 https://ecs.console.aliyun.com/?spm=5176.2020520001.0.0.6B1Uov#/home 账号dongdongmqtt 密码***** ...

  3. Codeforces Global Round 1 - D. Jongmah(动态规划)

    Problem   Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...

  4. 如何在自己设计的页面中调用metamask-2

    参考: 1)https://www.colabug.com/3204345.html 2)https://www.toptal.com/ethereum/one-click-login-flows-a ...

  5. npm和node的版本过低时的解决办法

    npm版本过低时的解决办法npm全名Node Package Manager 1.配置源的三种方法:1).npmrc文件的作用,就是配置npm源:使用淘宝源的方法就是在文件.npmrc中加入下面的语句 ...

  6. Java中static、final、static final的区别【转】

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  7. 理解Express中间件

    阅读目录 一:body-parser中间件 二:cookie-parser中间件 三:express-session 中间件 四:理解使用morgan记录操作日志 回到顶部 一:body-parser ...

  8. ubuntu下修改网卡名称

    Ubuntu下把网卡eth0修改为eth1的步骤: 1.打开配置文件 /etc/udev/rules.d/70-persistent-net.rules,文件内容如下: # This file was ...

  9. linux gcc nginx

    1.安装GCC[root@rekfan.com opt]# rpm -ivh cpp-4.1.2-48.el5.i386.rpm[root@rekfan.com opt]# rpm -ivh kern ...

  10. thymeleaf参考手册

    1.创建 html <!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"></html&g ...