Activiti学习——模型管理模块

Activiti学习——模型管理模块
 转自:https://www.2cto.com/kf/201607/526938.html

需求

拆解咖啡兔项目,分离出模型管理模块 实现 【查询】功能 实现 【新增】功能 实现 【删除】功能 实现 【编辑】功能 实现 【部署】功能 实现 【导出】功能

\

前提

项目已经集成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();
         stencilSetNode.put( "namespace" , "http://b3mn.org/stencilset/bpmn2.0#" );
         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>
Activiti的查询提供了很多接口
查询全部
?
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. 有什么了解的再继续补充

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值