java 调⽤Activiti 实现⼆次开发
activiti 发展到现在,发布版本已经到7了。Activiti 项⽬是⼀项新的基于Apache 许可的开源BPM 平台,从基础开始构建,旨在提供⽀持新的BPMN 2.0标准,包括⽀持对象管理组(OMG ),可以定义流程、执⾏流程并以不同⽅式对其实现运⾏。⼀、activiti 数据库表结构说明
表名默认以“ACT_”开头,并且表名的第⼆部分⽤两个字母表明表的⽤例,⽽这个⽤例也基本上跟Service API 匹配。ACT_GE_* : “GE”代表“General”(通⽤),⽤在各种情况下;
ACT_HI_* : “HI”代表“History”(历史),这些表中保存的都是历史数据,⽐如执⾏过的流程实例、变量、任务,等等。Activit 默认提供了4种历史级别:ACT_RE_* : “RE”代表“Repository”(仓库),这些表中保存⼀些‘静态’信息,如流程定义和流程资源(如图⽚、规则等);
ACT_RU_* : “RU”代表“Runtime”(运⾏时),这些表中保存⼀些流程实例、⽤户任务、变量等的运⾏时数据。Activiti 只保存流程实例在执⾏过程中的运⾏时数据,并且当流程结束后会⽴即移除这些数据;
表分类表名称表含义资源库流程规则表
act_re_deployment 部署信息表act_re_model 流程设计模型部署表act_re_procdef 流程定义数据表流程历史记录
act_hi_actinst 历史的流程实例act_hi_attachment 历史的流程附件act_hi_comment
历史的说明性信息act_hi_detail 历史的流程运⾏中的细节信息act_hi_identitylink 历史的流程运⾏过程中⽤户关系
act_hi_procinst 历史的流程实例act_hi_taskinst 历史的任务实例act_hi_varinst 历史的流程运⾏中的变量信息
流程运⾏实例记录
act_ru_deadletter_job 执⾏失败任务表
act_ru_integration 运⾏时流程⼈员表,主要存储任务节点与参与者的相关信息
act_ru_event_subscr 运⾏时事件act_ru_execution
运⾏时流程执⾏实例act_ru_identitylink
运⾏时⽤户关系信息
act_ru_job 运⾏时作业act_ru_suspended_job
运⾏时暂停任务act_ru_task 运⾏时任务act_ru_timer_job 运⾏时定时任务act_ru_variable
运⾏时变量表通⽤数据表
act_ge_bytearray ⼆进制数据表
act_ge_property
属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插⼊三条记录
⼆、activiti 提供服务的七⼤对象
RepositoryService : Activiti 中每⼀个不同版本的业务流程的定义都需要使⽤⼀些定义⽂件,部署⽂件和⽀持数据 ( 例如 BPMN2.0 XML ⽂件,表单定义⽂件,流程定义图像⽂件等 ),这些⽂件都存储在 Activiti 内建的 Repository 中。Repository Service 提供了对 repository 的存取服务。
RuntimeService : 在 Activiti 中,每当⼀个流程定义被启动⼀次之后,都会⽣成⼀个相应的流程对象实例。Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。
TaskService : 在 Activiti 中业务流程定义中的每⼀个执⾏节点被称为⼀个 Task ,对流程中的数据存取,状态变更等操作均需要在 Task 中完成。Task Service 提供了对⽤户Task 和 Form 相关的操作。它提供了运⾏时任务查询、领取、完成、删除以及变量设置等功能。
IdentityService : Activiti 中内置了⽤户以及组管理的功能,必须使⽤这些⽤户和组的信息才能获取到相应的 Task 。Identity Service 提供了对 Activiti 系统中的⽤户和组的管理功能。
ManagementService : Management Service 提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在⼯作流驱动的应⽤程序中使⽤,主要⽤于 Activiti 系统的⽇常维护。HistoryService : Activiti 中的流程和状态 Task 均可以关联业务相关的数据。通过使⽤ Form Service 可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单。FormService : Activiti 中的流程和状态 Task 均可以关联业务相关的数据。通过使⽤ Form Service 可以存取启动和完成任务所需的表单数据并且根据需要来渲染表单。三、java 封装实例1
、前端界⾯效果图
2、⼆次开发类图
3、代码展⽰
如下是具体实现的类信息,当前实例封装的是通过具体⼈和⼈员⾓⾊两个维度来实现业务节点审核,要实现业务功能只需要实现BaseBusinessActivitiOption类的⽅法,并扩充业务实现就好。
1)NumrangeEntity 审核流条件表达式类,⽤于记录审核流条件分⽀的条件信息
1public class NumrangeEntity {
2
3public NumrangeEntity(){}
4
5public NumrangeEntity(String expression){
6 expression = place("${","").replace("}","");
ains("&&")){
8 String[] branchExpression = expression.split("&&");
9 String[] params = expressionBackwardAnalysis(branchExpression[0]);
10this.variable = params[0];
11this.minValue = Double.parseDouble(params[2]);
12 params = expressionBackwardAnalysis(branchExpression[1]);
13this.maxValue = Double.parseDouble(params[2]);
14this.op = "6";
15 }else{
16 String[] params = expressionBackwardAnalysis(expression);
17this.variable = params[0];
18this.op = params[1];
19this.value = Double.parseDouble(params[2]);
20 }
21
22 getConditionName();
23 }
24
25private String[] expressionBackwardAnalysis(String expression){
26 String[] params = expression.split(" ");
27switch(params[1]){
28case "==":
29 params[1] = "1";
30break;
31case ">":
32 params[1] = "2";
33break;
34case "<":
35 params[1] = "3";
36break;
37case ">=":
38 params[1] = "4";
39break;
40case "<=":
41 params[1] = "5";
42break;
43 }
44
45return params;
46 }
47
48/**
49 * 操作类型:1-等于;2-⼤于;3-⼩于;4-⼤于等于;5-⼩于等于;6-介于
50*/
51private String op;
52
53/**
54 *⽐较值
55*/
56private double value;
57
58/**
59 * 区间最⼩值
60*/
61private double minValue;
62
63/**
64 * 区间最⼤值
65*/
66private double maxValue;
67
68private String variable;
69
71
72public String getOp() {
73return op;
74 }
75
76public String getExpression(){
77 StringBuffer expression = new StringBuffer();
78 expression.append("${");
79switch(op){
80case "1#等于":
81 expression.append(variable + " == " + value);
82break;
83case "2#⼤于":
84 expression.append(variable + " > " + value);
85break;
86case "3#⼩于":
87 expression.append(variable + " < " + value);
88break;
89case "4#⼤于等于":
90 expression.append(variable + " >= " + value);
91break;
92case "5#⼩于等于":
93 expression.append(variable + " <= " + value);
94break;
95case "6#介于":
96 expression.append(variable + " > " + minValue + "&&" + variable + " < " + maxValue); 97break;
98 }
99
100 expression.append("}");
101
String();
103 }
104
105public void getConditionName(){
106 StringBuffer name = new StringBuffer();
107 name.append(Variable.UpperCase()).getText());
108
109switch (op){
110case "1":
111 name.append("等于");
112 op = "1#等于";
113break;
114case "2":
115 name.append("⼤于");
116 op = "2#⼤于";
117break;
118case "3":
119 name.append("⼩于");
120 op = "3#⼩于";
121break;
122case "4":
123 name.append("⼤于等于");
124 op = "4#⼤于等于";
125break;
126case "5":
127 name.append("⼩于等于");
128 op = "5#⼩于等于";
129break;
130case "6":
131 name.append("介于");
132 op = "6#介于";
133 }
134if(op.equals("6#介于")){
135 name.append(minValue);
136 name.append(Variable.UpperCase()).getUnit());
137 name.append("-");
138 name.append(maxValue);
139 }else{
140 name.append(value);
141 }
142
143 name.append(Variable.UpperCase()).getUnit());
144
145 conditionName = String();
146 }
147
148public void setOp(String op) {
149this.op = op;
150 }
151
152public double getValue() {
153return value;
154 }
155
156public void setValue(double value) {
157this.value = value;
158 }
159
160public double getMinValue() {
161return minValue;
162 }
163
164public void setMinValue(double minValue) {
165this.minValue = minValue;
166 }
167
168public double getMaxValue() {
169return maxValue;
170 }
171
172public void setMaxValue(double maxValue) {
173this.maxValue = maxValue;
174 }
175
176public String getVariable() {
177return variable;
178 }
179
180public void setVariable(String variable) {
181this.variable = variable;
182 }
183
184enum Variable{
185
186 CONTRACTAMOUNT("contractAmount","合同⾦额","万元");
187 Variable(String name,String text,String unit){
188this.name = name;
< = text;
190this.unit = unit;
191 }
192
194private String text;
195private String unit;
196
197public String getName(){
198return name;
199 }
200
201public String getText(){
202return text;
203 }
204
205public String getUnit(){
206return unit;
207 }
208 }
209 }
View Code
2)TaskNodeEntity 审核流任务节点类,⽤于记录审核节点信息
1public class TaskNodeEntity {
2
3public TaskNodeEntity(){}
4
5public TaskNodeEntity(String nodeType,String nodeTitleName,String nodeTitle,int order){
10 }
11
12/**
13 * 任务节点类型:role-⾓⾊;people-具体⼈
14*/
15private String nodeType;
16
17/**
18 * 任务节点标题名称:⾓⾊名称/⽤户名称
19*/
20private String nodeTitleName;
21
22/**
23 * 任务节点标题:⾓⾊编码/⽤户ID
24*/
25private String nodeTitle;
26
27/**
28 * 任务节点位置
29*/
30private int order;
31
32public String getNodeType() {
33return nodeType;
34 }
35
36public void setNodeType(String nodeType) {
38 }
39
40public String getNodeTitleName() {
41return nodeTitleName;
42 }
43
44public void setNodeTitleName(String nodeTitleName) {
46 }
47
48public String getNodeTitle() {
49return nodeTitle;
50 }
51
52public void setNodeTitle(String nodeTitle) {
54 }
55
56public int getOrder() {
57return order;
58 }
59
60public void setOrder(int order) {
62 }
63
64 @Override
65public boolean equals(Object obj) {
66if(this == obj){
67return true;
68 }
69
70if(obj == null){
71return false;
72 }
73
74if(obj instanceof TaskNodeEntity){
75 TaskNodeEntity taskNodeEntity = (TaskNodeEntity) obj;
76if(NodeType()) && NodeTitle())){ 77return true;
78 }
79 }
80return false;
81 }
82
83 @Override
84public int hashCode() {
85return Objects.deTitle);
86 }
87
88private boolean equalsStr(String str1, String str2){
89if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2)){
90return true;equals不等于
91 }
92if(!StringUtils.isEmpty(str1) && str1.equals(str2)){
93return true;
94 }
95return false;
96 }
97 }
View Code
3)RuleEntity 审核流⼦流程信息类
1public class RuleEntity {
2
3public RuleEntity(){};
4
5public RuleEntity(String ruleName,String ruleType,NumrangeEntity numrangeitem){ 6this.ruleName = ruleName;
7this.ruleType = ruleType;
8this.numrangeitem = numrangeitem;
9 }
10
11/**
12 * 任务节点
13*/
14private List<TaskNodeEntity> taskNodes;
15
16/**
17 * 规则名称名称
18*/
19private String ruleName;
20
21/**
22 * 规则类型:default-默认;condition-条件
23*/
24private String ruleType;
25
26/**
27 * 条件参数
28*/
29private NumrangeEntity numrangeitem;
30
31public List<TaskNodeEntity> getTaskNodes() {
32if(null == taskNodes){
33return taskNodes = new ArrayList<TaskNodeEntity>();
34 }
35return taskNodes;
36 }
37
38public void setTaskNodes(List<TaskNodeEntity> taskNodes) {
39this.taskNodes = taskNodes;
40 }
41
42public String getRuleName() {
43return ruleName;
44 }
45
46public void setRuleName(String ruleName) {
47this.ruleName = ruleName;
48 }
49
50public String getRuleType() {
51return ruleType;
52 }
53
54public void setRuleType(String ruleType) {
55this.ruleType = ruleType;
56 }
57
58public NumrangeEntity getNumrangeitem() {
59return numrangeitem;
60 }
61
62public void setNumrangeitem(NumrangeEntity numrangeitem) {
63this.numrangeitem = numrangeitem;
64 }
65 }
View Code
4)ProcessEntity 审核流全流程信息
1public class ProcessEntity {
2
3/**
4 * ⼦流程集合
5*/
6private List<RuleEntity> rules;
7
8/**
9 * 流程类型:认定、终⽌合同、废标、建议删除
10*/
11private String processType;
12
13/**
14 * 流程类型名称
15*/
16private String processTypeName;
17
18/**
19 * 所属机构名称
20*/
21private String orgName;
22
23/**
24 * 所属机构编码
25*/
26private String orgId;
27
28public List<RuleEntity> getRules() {
29if(null == rules){
30return rules = new ArrayList<RuleEntity>();
31 }
32return rules;
33 }
34
35public void setRules(List<RuleEntity> rules) {
36this.rules = rules;
37 }
38
39public String getProcessType() {
40return processType;
41 }
42
43public void setProcessType(String processType) {
44this.processType = processType;
45 }
46
47public String getProcessTypeName() {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论