- Activiti学习——模型管理模块
需求
拆解咖啡兔项目,分离出模型管理模块 实现 【查询】功能 实现 【新增】功能 实现 【删除】功能 实现 【编辑】功能 实现 【部署】功能 实现 【导出】功能前提
项目已经集成ActivitiModeler 可参考 Activiti学习——整合ActivitiModeler到项目中实现
查询
使用activiti提供的接口,创建Model查询 指定排序字段和排序方式 返回集合list 页面展示
1
2
3
4
5
6
7
8
9
10
11
12
|
<code
class
=
"language-java hljs "
>
/**
* 查询 客户端分页
* @return
*/
@RequestMapping
(value=
"/selectAll"
)
@ResponseBody
public
String selectAll(){
List<model> resultList = repositoryService.createModelQuery().orderByCreateTime().desc().list();
JSONObject resultJson =
new
JSONObject();
resultJson.put(
"data"
, resultList);
return
resultJson.toString();
}</model></code>
|
新增
创建模型对象 设置对象值 存储模型对象(表act_re_model) 存储模型对象基础数据(表act_ge_bytearray) 跳转到ActivitiModeler,编辑流程图,存储流程图片和流程定义等(表act_ge_bytearray)
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
|
<code
class
=
"language-java hljs "
>
/**
* 新增
* @return
*/
@RequestMapping
(value =
"/create"
,method = RequestMethod.POST)
public
void
getEditor(
@RequestParam
(
"description"
) String description,
@RequestParam
(
"name"
) String name,
@RequestParam
(
"key"
) String key,
HttpServletRequest request, HttpServletResponse response){
try
{
ObjectMapper objectMapper =
new
ObjectMapper();
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put(
"id"
,
"canvas"
);
editorNode.put(
"resourceId"
,
"canvas"
);
ObjectNode stencilSetNode = objectMapper.createObjectNode();
editorNode.put(
"stencilset"
, stencilSetNode);
Model modelData = repositoryService.newModel();
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, name);
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION,
1
);
description = StringUtils.defaultString(description);
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
modelData.setMetaInfo(modelObjectNode.toString());
modelData.setName(name);
modelData.setKey(StringUtils.defaultString(key));
repositoryService.saveModel(modelData);
repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes(
"utf-8"
));
System.out.println(
"跳转页面"
);
response.sendRedirect(request.getContextPath() +
"/service/editor?id="
+ modelData.getId());
}
catch
(Exception e) {
System.out.println(
"创建模型失败"
);
}
} </code>
|
删除
根据modelId删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<code
class
=
"language-java hljs "
>
/**
* 批量删除
* @param ids
* @param request
* @return
*/
@RequestMapping
(value =
"deleteByIds"
)
@ResponseBody
public
String deleteByIds(String[] ids,HttpServletRequest request) {
JSONObject result =
new
JSONObject();
for
(String id : ids){
repositoryService.deleteModel(id);
}
result.put(
"msg"
,
"删除成功"
);
result.put(
"type"
,
"success"
);
return
result.toString();
}</code>
|
编辑
编辑和新增的跳转接口是一样的 跳转到ActivitiModeler,带上modelId 这里使用a标签直接跳转 ActivitiDemo5是项目名 row.id是modelId target=”_blank切换到新的标签页,同样适用于新增成功时,跳转新页面,写在form表单上
1
|
<code
class
=
"language-html hljs "
>编辑</code>
|
导出
获取节点信息 转换为xml数据 写入流中输出
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
|
<code
class
=
"language-java hljs "
>
/**
* 导出model的xml文件
*/
@RequestMapping
(value =
"export/{modelId}"
)
public
void
export(
@PathVariable
(
"modelId"
) String modelId, HttpServletResponse response) {
response.setCharacterEncoding(
"UTF-8"
);
response.setContentType(
"application/json; charset=utf-8"
);
try
{
Model modelData = repositoryService.getModel(modelId);
BpmnJsonConverter jsonConverter =
new
BpmnJsonConverter();
//获取节点信息
byte
[] arg0 = repositoryService.getModelEditorSource(modelData.getId());
JsonNode editorNode =
new
ObjectMapper().readTree(arg0);
//将节点信息转换为xml
BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);
BpmnXMLConverter xmlConverter =
new
BpmnXMLConverter();
byte
[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);
ByteArrayInputStream in =
new
ByteArrayInputStream(bpmnBytes);
IOUtils.copy(in, response.getOutputStream());
// String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
String filename = modelData.getName() +
".bpmn20.xml"
;
response.setHeader(
"Content-Disposition"
,
"attachment; filename="
+ java.net.URLEncoder.encode(filename,
"UTF-8"
));
response.flushBuffer();
}
catch
(Exception e){
PrintWriter out =
null
;
try
{
out = response.getWriter();
}
catch
(IOException e1) {
e1.printStackTrace();
}
out.write(
"未找到对应数据"
);
e.printStackTrace();
}
}</code>
|
部署
根据modelId获取模型信息 转换为xml对象 部署对象以模型对象的名称命名 部署转换出来的xml对象 部署方式有很多种,可以再扩展研究
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<code
class
=
"language-java hljs "
>
/**
* 部署
*/
@RequestMapping
(value =
"deploy"
,method=RequestMethod.POST)
@ResponseBody
public
String deploy(
@RequestParam
(
"modelId"
) String modelId, HttpServletRequest request) {
JSONObject result =
new
JSONObject();
try
{
Model modelData = repositoryService.getModel(modelId);
ObjectNode modelNode = (ObjectNode)
new
ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
byte
[] bpmnBytes =
null
;
BpmnModel model =
new
BpmnJsonConverter().convertToBpmnModel(modelNode);
bpmnBytes =
new
BpmnXMLConverter().convertToXML(model);
String processName = modelData.getName() +
".bpmn20.xml"
;
Deployment deployment = repositoryService.createDeployment().name(modelData.getName()).addString(processName,
new
String(bpmnBytes,
"utf-8"
)).deploy();
result.put(
"msg"
,
"部署成功"
);
result.put(
"type"
,
"success"
);
}
catch
(Exception e) {
result.put(
"msg"
,
"部署失败"
);
result.put(
"type"
,
"error"
);
e.printStackTrace();
}
return
result.toString();
}</code>
|
总结
模型这块,主要使用到了RepositoryService,引用手册的话
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<code
class
=
"hljs lasso"
>RepositoryService可能是使用Activiti引擎时最先接触的服务。
它提供了管理和控制发布包和流程定义的操作。
这里不涉及太多细节,流程定义是BPMN
2.0
流程的java实现。
它包含了一个流程每个环节的结构和行为。
发布包是Activiti引擎的打包单位。
一个发布包可以包含多个BPMN
2.0
xml文件和其他资源。
开发者可以自由选择把任意资源包含到发布包中。
既可以把一个单独的BPMN
2.0
xml文件放到发布包里,也可以把整个流程和相关资源都放在一起。
(比如,
'hr-processes'
实例可以包含hr流程相关的任何资源)。
可以通过RepositoryService来部署这种发布包。
发布一个发布包,意味着把它上传到引擎中,所有流程都会在保存进数据库之前分析解析好。
从这点来说,系统知道这个发布包的存在,发布包中包含的流程就已经可以启动了。
除此之外,服务可以
查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。
获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。 </code>
|
查询全部
1
|
<code
class
=
"language-java hljs "
>List<model> resultList = repositoryService.createModelQuery().orderByCreateTime().desc().list();</model></code>
|
分页查询
1
|
<code
class
=
"language-java hljs "
>List<model> resultList = repositoryService.createModelQuery().listPage(
0
,
10
);</model></code>
|
使用原生sql查询
1
|
<code
class
=
"language-java hljs "
>List<model> resultList = repositoryService.createNativeModelQuery().sql(
"sql"
).list();</model></code>
|
等等
3. 有什么了解的再继续补充