zoukankan      html  css  js  c++  java
  • taskService 流程任务组件

    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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    A Node Influence Based Label Propagation Algorithm for Community detection in networks 文章算法实现的疑问
    Fast Newman-FN算法以及模块度定义介绍
    Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现
    设计一个smartnic
    Intel GEN11 GPU
    Intel GEN9 GPU
    Shared Virtual Memory (SVM) Functions
    connect via ssh to virtualbox guest vm without knowing ip address
    smartnic
    技术精品翻译
  • 原文地址:https://www.cnblogs.com/bootdo/p/10687934.html
Copyright © 2011-2022 走看看