activiti7和activiti5相比较而言,个人认为是增加了些api,还有优化了流程节点操作( PVM,ActivitiImpl,PvmTransition ,ExecutionImpl, TransitionImpl 可以通过bpmnModel和process获取)
关于在线流程设计器,activiti5官网有提供相应的editor-app、diagram-viewer文件,其实也可以去http://bpmn.io 上去下载。
在了解activiti之前,首先应该充分了解这二十五张表,网上这些教学视频关于表结构都讲的很粗略,其实只有表结构掌握完全后,才能更好的去用activiti。
从某种程度上讲,activiti其实就是这二十五张表的表单操作。相关api也就是教会我们如何更好的对这些进行增删改查。
网上讲述的都是基础的使用案例,只是告诉你怎么用。如果说要你给公司搭一个activiti底层架子,跟公司业务结合起来(功能权限、数据权限、部门角色关系、短信等其他业务),
还是有些难度的,一般都要自己建些辅助表来优化这些操作。
相关表
https://www.devdoc.cn/activiti-table-summary.html
流程定义数据表 ( act_re_procdef )
流程设计模型部署表 ( act_re_model )
部署信息表 ( act_re_deployment )
进制数据表,存储通用的流程定义和流程资源。(act_ge_bytearray)
属性数据表 (act_ge_property)
运行时流程执行实例表 ( act_ru_execution )
act_ru_event_subscr
运行时流程人员表 ( act_ru_identitylink )
运行时定时任务数据表 ( act_ru_job )
运行时任务节点表 ( act_ru_task )
运行时流程变量数据表 ( act_ru_variable )
历史节点表 (act_hi_actinst)
历史附件表 ( act_hi_attachment )
历史意见表 ( act_hi_comment )
历史详情表 ( act_hi_detail )
历史流程人员表 ( act_ru_identitylink )
历史流程实例表 (act_hi_procinst)
历史任务实例表 ( act_hi_taskinst )
历史变量表 ( act_hi_varinst )
用户组信息表 ( act_id_group )
用户扩展信息表 ( act_id_info )
用户与分组对应信息表 ( act_id_membership )
用户信息表 ( act_id_user )
在线流程设计器设计好后,可以用此来保存模型
流程模型:
- 通过RepositoryService的saveModel方法将模型的元数据存入数据库的ACT_RE_MODEL表
- 通过RepositoryService的addModelEditorSource方法将模型JSON数据UTF8字符串存入数据库的ACT_GE_BYTEARRAY表
- 通过Apache™ Batik SVG Toolkit将模型的SVG图像数据转换成PNG格式,通过RepositoryService的addModelEditorSourceExtra方法将PNG图像存入数据库的ACT_GE_BYTEARRAY表
package com.hainei.service.workflow; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Model; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import static org.activiti.editor.constants.ModelDataJsonConstants.MODEL_ID; import static org.activiti.editor.constants.ModelDataJsonConstants.MODEL_NAME; /** * FileName: EditorService * Author: Administrator * Date: 2019/4/18 9:48 * Description: */ @Service public class EditorService { @Autowired private RepositoryService repositoryService; @Autowired private ObjectMapper objectMapper; public Object getStencilset() throws IOException { InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); String s= IOUtils.toString(stencilsetStream, "utf-8"); return com.alibaba.fastjson.JSON.parse(s); } /** * 在线流程设计器查看返参 * @param modelId * @return * @throws IOException */ public Object getEditorJson(String modelId) throws IOException { ObjectNode modelNode = null; Model model = repositoryService.getModel(modelId); if (model != null) { // if (StringUtils.isNotEmpty(model.getMetaInfo())) { // modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); // } else { modelNode = objectMapper.createObjectNode(); modelNode.put(MODEL_NAME, model.getName()); // } byte[] source = repositoryService.getModelEditorSource(model.getId()); modelNode.put(MODEL_ID, model.getId()); if(source !=null) { ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree(new String(source, "utf-8")); modelNode.set("model", editorJsonNode); } else{ modelNode.set("model", null); } return com.alibaba.fastjson.JSON.parse(modelNode.toString()); } return null; } /** * 在线流程设计器保存模型 * * @param modelId * @param name * @param description * @param json_xml * @param svg_xml * @throws IOException */ //保存模型 public void saveModel(String modelId, String name, String description, String json_xml, String svg_xml) throws IOException{ Model model = repositoryService.getModel(modelId); String metaInfo = model.getMetaInfo(); // ObjectNode modelJson = null; // if(metaInfo ==null || metaInfo.length() == 0){ // modelJson = objectMapper.createObjectNode(); // }else { // modelJson = (ObjectNode) objectMapper.readTree(metaInfo); // } // modelJson.put(MODEL_NAME, name); // modelJson.put(MODEL_DESCRIPTION, description); // model.setMetaInfo(modelJson.toString()); model.setMetaInfo(metaInfo); model.setName(name); repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8")); InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8")); TranscoderInput input = new TranscoderInput(svgStream); // Setup output ByteArrayOutputStream outStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(outStream); // PNGTranscoder transcoder = new PNGTranscoder(); // Do the transformation // transcoder.transcode(input, output); final byte[] result = outStream.toByteArray(); repositoryService.addModelEditorSourceExtra(model.getId(), result); outStream.close(); } }
我司 工作流流程:
1.流程模型act_re_model新增信息,接着 流程设计器在线绘制流程图 根据 modelId,以及xml 保存流程图到 act_ge_bytearray表中。
2.部署流程模型后,会在act_re_deployment保存部署信息,接着在流程定义表中 act_re_procdef上 留下记录。
3.接着初始化流程实例,提交businessKey ,选择相应的processDefinitionKey。会生成流程实例。
11111