activiti5、activiti7相关总结

  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格式,通过RepositoryServiceaddModelEditorSource
    和 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。会生成流程实例。

  

 

 

相关问题:

  1.若用户节点 执行人为空,有候选人、候选组,任务执行到当前节点时,候选人审批需要签收当前任务。

11111

posted @ 2021-10-22 10:28  wq9  阅读(1584)  评论(0编辑  收藏  举报