Activiti学习——模型管理模块

本文介绍了如何在咖啡兔项目中实现模型管理模块的各项功能,包括查询、新增、删除、编辑、部署及导出等,并详细说明了这些功能的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

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

前提

  1. 项目已经集成ActivitiModeler
  2. 可参考Activiti学习——整合ActivitiModeler到项目中

实现

查询

  1. 使用activiti提供的接口,创建Model查询
  2. 指定排序字段和排序方式
  3. 返回集合list
  4. 页面展示
/**
 * 查询 客户端分页
 * @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();
 }

新增

  1. 创建模型对象
  2. 设置对象值
  3. 存储模型对象(表act_re_model)
  4. 存储模型对象基础数据(表act_ge_bytearray)
  5. 跳转到ActivitiModeler,编辑流程图,存储流程图片和流程定义等(表act_ge_bytearray)
/** 
 * 新增
 * @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("创建模型失败");
    }
}  

删除

  1. 根据modelId删除
/**
 * 批量删除
 * @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();
}

编辑

  1. 编辑和新增的跳转接口是一样的
  2. 跳转到ActivitiModeler,带上modelId
  3. 这里使用a标签直接跳转
  4. ActivitiDemo5是项目名
  5. row.id是modelId
  6. target=”_blank切换到新的标签页,同样适用于新增成功时,跳转新页面,写在form表单上
<a class="btn btn-success" href="/ActivitiDemo5/service/editor?id='+row.id+'" target="_blank">编辑</a>

导出

  1. 获取节点信息
  2. 转换为xml数据
  3. 写入流中输出
/**
 * 导出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();
    }
}

部署

  1. 根据modelId获取模型信息
  2. 转换为xml对象
  3. 部署对象以模型对象的名称命名
  4. 部署转换出来的xml对象
  5. 部署方式有很多种,可以再扩展研究
/**
 * 部署
 */
@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();
}

总结

  1. 模型这块,主要使用到了RepositoryService,引用手册的话
RepositoryService可能是使用Activiti引擎时最先接触的服务。 
它提供了管理和控制发布包和流程定义的操作。 
这里不涉及太多细节,流程定义是BPMN 2.0流程的java实现。 
它包含了一个流程每个环节的结构和行为。 
发布包是Activiti引擎的打包单位。
一个发布包可以包含多个BPMN 2.0 xml文件和其他资源。 
开发者可以自由选择把任意资源包含到发布包中。 
既可以把一个单独的BPMN 2.0 xml文件放到发布包里,也可以把整个流程和相关资源都放在一起。 
(比如,'hr-processes'实例可以包含hr流程相关的任何资源)。 
可以通过RepositoryService来部署这种发布包。 
发布一个发布包,意味着把它上传到引擎中,所有流程都会在保存进数据库之前分析解析好。 
从这点来说,系统知道这个发布包的存在,发布包中包含的流程就已经可以启动了。
除此之外,服务可以
查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。
获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml
  1. Activiti的查询提供了很多接口
    查询全部
List<Model> resultList =  repositoryService.createModelQuery().orderByCreateTime().desc().list();

分页查询

List<Model> resultList =  repositoryService.createModelQuery().listPage(0, 10);

使用原生sql查询

List<Model> resultList =  repositoryService.createNativeModelQuery().sql("sql").list();

等等
3. 有什么了解的再继续补充

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-贫寒豌豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值