首页 > 工作流 > 工作流Activiti5入门(下)

工作流Activiti5入门(下)

2015年11月29日 发表评论 阅读评论

看了工作流上和中的人,相信已经在慢慢入门了,因为本教程也只是致力于做一个入门而已,然后在用的过程中再慢慢学习,用来工作也许是一点问题都没有了,如果没有看过请看这篇这篇,所以本没有必要再写下了,但实在感觉留下一个小尾巴:数据库还没有给大家介绍,这个入门实在是太过简陋,所以今天就把这篇文章来一个扫尾,下面先看最后一个想用的task

六. 组任务

流程图:
9
其实和用户任务看起来并无差别,下面看实现

1. 分配组任务方式一(直接指定办理人)

具体配置:

11

完成任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
    /**查询当前人的个人任务*/
    @Test
    public void findMyPersonalTask(){
        String assignee = "小A";
        List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
                        .createTaskQuery()//创建任务查询对象
                        /**查询条件(where部分)*/
                        .taskAssignee(assignee)//指定个人任务查询,指定办理人
//                      .taskCandidateUser(candidateUser)//组任务的办理人查询
                        /**排序*/
                        .orderByTaskCreateTime().asc()//使用创建时间的升序排列
                        /**返回结果集*/
                        .list();//返回列表
        if(list!=null && list.size()>0){
            for(Task task:list){
                System.out.println("任务ID:"+task.getId());
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务的创建时间:"+task.getCreateTime());
                System.out.println("任务的办理人:"+task.getAssignee());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
                System.out.println("执行对象ID:"+task.getExecutionId());
                System.out.println("流程定义ID:"+task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }
     
    /**查询当前人的组任务*/
    @Test
    public void findMyGroupTask(){
        String candidateUser = "大大";
        List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
                        .createTaskQuery()//创建任务查询对象
                        /**查询条件(where部分)*/
                        .taskCandidateUser(candidateUser)//组任务的办理人查询
                        /**排序*/
                        .orderByTaskCreateTime().asc()//使用创建时间的升序排列
                        /**返回结果集*/
                        .list();//返回列表
        if(list!=null && list.size()>0){
            for(Task task:list){
                System.out.println("任务ID:"+task.getId());
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务的创建时间:"+task.getCreateTime());
                System.out.println("任务的办理人:"+task.getAssignee());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
                System.out.println("执行对象ID:"+task.getExecutionId());
                System.out.println("流程定义ID:"+task.getProcessDefinitionId());
                System.out.println("########################################################");
            }
        }
    }
     
    /**完成我的任务*/
    @Test
    public void completeMyPersonalTask(){
        //任务ID
        String taskId = "6905";
        processEngine.getTaskService()//与正在执行的任务管理相关的Service
                    .complete(taskId);
        System.out.println("完成任务:任务ID:"+taskId);
    }
     
     
    /**查询正在执行的任务办理人表*/
    @Test
    public void findRunPersonTask(){
        //任务ID
        String taskId = "6204";
        List<IdentityLink> list = processEngine.getTaskService()//
                    .getIdentityLinksForTask(taskId);
        if(list!=null && list.size()>0){
            for(IdentityLink identityLink:list){
                System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getProcessInstanceId()+"   "+identityLink.getUserId());
            }
        }
    }
    /**查询历史任务的办理人表*/
    @Test
    public void findHistoryPersonTask(){
        //流程实例ID
        String processInstanceId = "6201";
        List<HistoricIdentityLink> list = processEngine.getHistoryService()//
                        .getHistoricIdentityLinksForProcessInstance(processInstanceId);
        if(list!=null && list.size()>0){
            for(HistoricIdentityLink identityLink:list){
                System.out.println(identityLink.getTaskId()+"   "+identityLink.getType()+"   "+identityLink.getProcessInstanceId()+"   "+identityLink.getUserId());
            }
        }
    }
     
     
    /**拾取任务,将组任务分给个人任务,指定任务的办理人字段*/
    @Test
    public void claim(){
        //将组任务分配给个人任务
        //任务ID
        String taskId = "6905";
        //分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
        String userId = "大大";
        processEngine.getTaskService()//
                    .claim(taskId, userId);
    }
     
     
    /**将个人任务回退到组任务,前提,之前一定是个组任务*/
    @Test
    public void setAssigee(){
        //任务ID
        String taskId = "6204";
        processEngine.getTaskService()//
                    .setAssignee(taskId, null);
    }
     
    /**向组任务中添加成员*/
    @Test
    public void addGroupUser(){
        //任务ID
        String taskId = "6204";
        //成员办理人
        String userId = "大H";
        processEngine.getTaskService()//
                    .addCandidateUser(taskId, userId);
    }
     
    /**从组任务中删除成员*/
    @Test
    public void deleteGroupUser(){
        //任务ID
        String taskId = "6204";
        //成员办理人
        String userId = "小B";
        processEngine.getTaskService()//
                    .deleteCandidateUser(taskId, userId);
    }

2. 分配组任务方式二(使用流程变量)

具体配置:

13

完成任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
    // 2 启动流程
    //启动流程实例,同时设置流程变量,用来指定组任务的办理人
    Map<String, Object> variables = new HashMap<String, Object>();
    variables.put("userIDs", "大大,小小,中中");
    ProcessInstance pi = processEngine.getRuntimeService()//
                    .startProcessInstanceByKey("taskProcess",variables);
    System.out.println("pid:" + pi.getId());
}
 
//查询我的个人任务列表
@Test
public void findMyTaskList(){
    String userId = "大大";
    List<Task> list = processEngine.getTaskService()//
                    .createTaskQuery()//
                    .taskAssignee(userId)//指定个人任务查询
                    .list();
    for(Task task:list ){
        System.out.println("id="+task.getId());
        System.out.println("name="+task.getName());
        System.out.println("assinee="+task.getAssignee());
        System.out.println("assinee="+task.getCreateTime());
        System.out.println("executionId="+task.getExecutionId());
         
    }
}
 
//查询组任务列表
@Test
public void findGroupList(){
    String userId = "大大";
    List<Task> list = processEngine.getTaskService()//
                    .createTaskQuery()//
                    .taskCandidateUser(userId)//指定组任务查询
                    .list();
    for(Task task:list ){
        System.out.println("id="+task.getId());
        System.out.println("name="+task.getName());
        System.out.println("assinee="+task.getAssignee());
        System.out.println("assinee="+task.getCreateTime());
        System.out.println("executionId="+task.getExecutionId());
        System.out.println("##################################");
         
    }
}
 
//查询组任务成员列表
@Test
public void findGroupUser(){
    String taskId = "3709";
    List<IdentityLink> list = processEngine.getTaskService()//
                    .getIdentityLinksForTask(taskId);
    for(IdentityLink identityLink:list ){
        System.out.println("userId="+identityLink.getUserId());
        System.out.println("taskId="+identityLink.getTaskId());
        System.out.println("piId="+identityLink.getProcessInstanceId());
        System.out.println("######################");
    }
}
 
//查询组任务成员历史列表
@Test
public void findGroupHisUser(){
    String taskId = "3709";
    List<HistoricIdentityLink> list = processEngine.getHistoryService()//
                    .getHistoricIdentityLinksForTask(taskId);
    for(HistoricIdentityLink identityLink:list ){
        System.out.println("userId="+identityLink.getUserId());
        System.out.println("taskId="+identityLink.getTaskId());
        System.out.println("piId="+identityLink.getProcessInstanceId());
        System.out.println("######################");
    }
}
 
//完成任务
@Test
public void completeTask(){
    String taskId = "3709";
    processEngine.getTaskService()//
                .complete(taskId);//
    System.out.println("完成任务");
}
 
 /**将组任务分配给个人任务,拾取任务*/
//由1个人去完成任务
@Test
public void claim(){
    //任务ID
    String taskId = "5908";
    //分配的办理人
    String userId = "小B";
    processEngine.getTaskService()//
                .claim(taskId, userId);
}

七. 数据库

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。

再具体的各个表结构操作如下,至于各个表的每个字段什么含义,就靠读者自己学习了:
1:资源库流程规则表
act_re_deployment 部署信息表
act_re_model 流程设计模型部署表
act_re_procdef 流程定义数据表
2:运行时数据库表
act_ru_execution 运行时流程执行实例表
act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
act_ru_task 运行时任务节点表
act_ru_variable 运行时流程变量数据表
3:历史数据库表
act_hi_actinst 历史节点表
act_hi_attachment 历史附件表
act_hi_comment 历史意见表
act_hi_identitylink 历史流程人员表
act_hi_detail 历史详情表,提供历史变量的查询
act_hi_procinst 历史流程实例表
act_hi_taskinst 历史任务实例表
act_hi_varinst 历史变量表
4:组织机构表
act_id_group 用户组信息表
act_id_info 用户扩展信息表
act_id_membership 用户与用户组对应信息表
act_id_user 用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
5:通用数据表
act_ge_bytearray 二进制数据表
act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

至于这些表的ER图,则如下:

acticiti_er_1

activiti_er_2
写到这里,工作流activiti的一个基本教程就完了,因为这几篇博客,是老夫随性所写,并无一个整体的计划,所以很散漫,但老夫相信看完这个系列的教程,读者对activiti一定有了一个初步的概念,聪明如读者,再加上自己的使用过程中的自学,在工作中一定可以如鱼得水

全文完,如果本文对您有所帮助,请花 1 秒钟帮忙点击一下广告,谢谢。

作 者: BridgeLi,https://www.bridgeli.cn
原文链接:http://www.bridgeli.cn/archives/233
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: 工作流 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

请输入正确的验证码