• activiti相关总结


      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格式,通过RepositoryServiceaddModelEditorSourceExtra方法将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

    个人学习笔记,记录日常学习,便于查阅及加深,仅为方便个人使用。
  • 相关阅读:
    22、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
    21、我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
    20、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
    19、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
    【待补充】算法导论 笔记
    18、大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39
    17、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
    二分查找算法
    16、用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
    15、输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
  • 原文地址:https://www.cnblogs.com/wq-9/p/15437588.html
Copyright © 2020-2023  润新知