• .NET 开源工作流: Slickflow流程引擎快速入门之四:--SlickGraph 流程模型编码建模工具使用手册


    前言: 业务人员绘制流程时,通常使用图形GUI界面交互操作来完成,然而对于需要频繁操作或者管理较多流程的系统管理用户,就需要一款辅助工具,来帮助他们快速完成流程的创建和编辑更新。Slickflow.Graph 图形编码建模工具通过命令行直接编写代码创建图形,实现了流程图形绘制效率的快速提升。

    申明: 本篇文章为Slickflow原创文章,任何网站或个人不得私自转载,博客园为作者授权的中文文章唯一来源。

    1. 图形创建代码文本

     首先通过一个代码片段来进行说明,这个代码片段创建了一个简单的序列流程。代码如下:

    using Slickflow.Graph;
    using Slickflow.Engine.Common;
    
    //firstly, create a process model builder
    var pmb = ProcessModelBuilder.CreateProcess("BookSellerProcess", "BookSellerProcessCode", "3"); 
    var process = pmb.Start("Start")
            .Task("Package Books", "003")       //task name, code
            .Task("Deliver Books", "005")       //task name, code
            .End("End")
            .Store();

    图形截图如下:

    1.1 流程创建命令

    命令示例:

    var pmb = ProcessModelBuilder.CreateProcess("BookSellerProcess", "BookSellerProcessCode", "3");
    

    参数: (processName, processCode, processVersion)

    1.2 活动节点创建命令

    1.2.1 开始节点创建: Start()

    命令示例: 

    pmb.Start("Start")

    参数: (activityName, activityCode)

    1.2.2 结束节点创建: End()

    命令示例: 

    pmb.End("End")

    参数: (activityName, activityCode)

    1.2.3 任务节点创建: Task()

    1.2.3.1 基本方法

    命令示例:  

    pmb.Task("Package Books", "003")
    

    参数: (activityName, activityCode)

    1.2.3.2 扩展方法

    命令示例: 

                       pmb.Task(
                            VertexBuilder.CreateTask("Task-001")
                                       .SetUrl("http://www.slickflow.com")
                                       .AddRole("TestRole")
                                       .AddAction(
                                            VertexBuilder.CreateAction(ActionTypeEnum.Event,
                                                FireTypeEnum.Before,
                                                "Slickflow.Module.External.OrderSubmitService"
                                            ))
                        )
    

    1) CreateTask(): 创建任务节点

    参数: (task)

    2) SetUrl(): 设置节点Url页面属性

    参数: (pageUrl) 页面地址字符串

    3) AddRole(): 设置节点绑定角色数据

    参数: (roleCode) 角色代码

    4) AddAction(): 添加Action操作明细项目

    参数: (action) 对象

    5) CreateAction(): 创建Action操作明细对象

    参数: (actionType, fireType, methodName)

    1.2.4 分支节点创建: Split()

    分支和合并通常作为一个整体的代码片段来创建,如下图,创建了两个分支的流程图,每个分支上又有两个任务节点,完整的代码片段示例如下:

                   pmb.Split("split")
                      .Parallels(
                            () => pmb.Branch(
                                () => pmb.Task("task-010"),
                                () => pmb.Task("task-011")
                            )
                            , () => pmb.Branch(
                                 () => pmb.Task("task-020"),
                                 () => pmb.Task("task-021")
                             )
                      )
                      .Join("join")

    图形截图如下:

    1) Split(): 创建分支节点

    参数: (activityName, activityCode)

    2) Parallels(): 创建多个分支的外部方法

    参数: 

    (params Func<ProcessModelBuilder>[] branches)
    

    描述: 参数branches 表示分支列表的组合, 一个并行模式可以由多个分支组成,params表示是可变参数列表关键字。

    3) Branch(): 分支具体创建方法

    参数: 

    (params Func<ProcessModelBuilder>[] nodes)

    描述: 参数nodes表示节点列表的组合,一个分支可以由多个节点组成,params表示是可变参数列表关键字。

    4) Join(): 创建合并节点

    参数: (activityName, activityCode)

    说明: 合并和分支通常是对应成对出现的,用于表达决策类型的分支选择模式。

    1.3 图形存储命令

    命令示例: 

    pmb.Store();
    

    存储命令会把上述图形按照XML序列化后,作为数据库中的一条记录进行存储。

    2. 图形维护命令

    2.1 流程载入命令

    1) 命令: 

    var pmb = ProcessModelBuilder.LoadProcess("BookSellerProcessCode", "3");

    参数: (processCode, processVersion)

     说明: 流程代码和版本组成唯一关键字标识用于唯一确定流程记录。

    2.2 图形节点编辑代码

    1) 命令:

    using Slickflow.Graph;
    using Slickflow.Engine.Common;
    
    //firstly load a process model builder
    var pmb = ProcessModelBuilder.LoadProcess("BookSellerProcessCode", "3");
    
    //execute deffrient task operation once together
    pmb.Add("003", ActivityTypeEnum.TaskNode, "zzz", "zzz-code")
       .Insert("003", ActivityTypeEnum.TaskNode, "task004", "004")
       .Set("003", (a) => pmb.GetBuilder(a).SetUrl("slickflow.com").SetName("mer-sss-ryxmas"))
       .Replace("004", ActivityTypeEnum.TaskNode, "task222", "222")
       .Exchange("222", "zzz-code")
       .Fork("zzz-code", ActivityTypeEnum.TaskNode, "yyy", "555")
       .Remove("222", true)
       .Update();

    说明:对图形节点元素的增加、插入、交换、取代、分支、编辑和删除等所有更新操作,可以通过链式服务接口一次执行完成。

    2.3 节点编辑命令详解

    2.3.1 增加节点: Add()

    1) 命令: 

    //add a new task node zzz after task with code 003(Package Books)
    pmb.Add("003", ActivityTypeEnum.TaskNode, "zzz", "zzz-code")

    参数: (currentActivityCode, addActivityType, addActivityName, addActivityCode)

    说明: Add()方法是在当前节点的后面增加一个新的节点,而且继续保持新增加的节点也是在流程的连线上。

    2) 命令执行后的图形示例:

     

    2.3.2 插入节点: Insert()

    1) 命令: 

    //insert a new task node named task004 before task 003(Package Books)
    pmb.Insert("003", ActivityTypeEnum.TaskNode, "task004", "004")

    参数: (currentActivityCode, addActivityType, addActivityName, addActivityCode)

    说明: Insert()方法是在当前节点的前面增加一个新的节点,而且继续保持新增加的节点也是在流程的连线上。

    2) 命令执行后的图形示例:

     

    2.3.3 更新节点属性: Set()

    1) 命令:

    //set task 003(Package Books) property url and name
    pmb.Set("003", (a) => pmb.GetBuilder(a).SetUrl("slickflow.com").SetName("mer-sss-ryxmas"))

    参数: (currentActivityCode, vertexBuilder)

    说明: 根据当前节点的代码表示,获取当前节点对象,然后更新Url属性和Name属性。

    2) 命令执行后的图形示例:

    2.3.4 替换节点: Replace()

    1) 命令:

    //replace task 004(task004) by the new task named task222
    pmb.Replace("004", ActivityTypeEnum.TaskNode, "task222", "222")

    参数: (currentActivityCode, replacedByActivityType, replacedByActivityName, replacedByActivityCode)

    说明: 可以把当前节点用一个新增的节点进行代替,新增的节点为: replacedByActivity,取代操作,相当于先执行删除(Remove)操作,然后再执行新增(Add)操作。节点取代之后原来的连线Transition的唯一标识GUID也会发生改变。

    2) 命令执行后的图形示例:

    2.3.5 互换节点: Exchange()

    1) 命令: 

    //exchange task 222 to zzz
    pmb.Exchange("222", "zzz-code")

    参数: (firstActivityCode, secondActivityCode)

    说明: 该方法将两个节点进行位置调换,其它节点的属性保持不变。此外说明的是:调换之后节点之间的连线Transition重新赋予唯一标识GUID,因为连线的节点已经发生变化,需要改变连线标识GUID的取值。

    2) 命令执行后的图形示例:

    2.3.6 分支节点: Fork()

    1) 命令: 

    //fork a new Task 555 from task zzz
    pmb.Fork("zzz-code", ActivityTypeEnum.TaskNode, "yyy", "555")

    参数: (currentActivityCode, forkActivityType, forkActivityName, forkActivityCode)

    说明: 该方法是在当前节点上增加分支路径,如果当前节点的没有后续节点,则等同于新增Add方法。如果当前节点已经有后续节点,则在邻近位置新增加一个节点。

    2) 命令执行后的图形示例:

    2.3.7 删除节点: Remove()

    1) 命令:

    //remove the task 222, and afterward nodes will be caught up
    pmb.Remove("222", true)

    参数: (currentActivityCode, isCaughtUp)

    说明: 删除当前节点,并且如果当前节点已经有后续节点,则需要前置该后续节点到当前已经删除节点的位置,包括重新增加连线。

    2) 命令执行后的图形示例:

    2.3.8 添加分支/合并: Cover()

    1) 命令:

    //cover a split/join pattern into canvas
    pmb.Cover("003", "005",
      VertexBuilder.CreateSplit(GatewayDirectionEnum.AndSplit,"AndSplit", "AndSplicCode"),                    
    VertexBuilder.CreateJoin(GatewayDirectionEnum.AndJoin, "AndJoin", "AndJoinCode"),
    VertexBuilder.CreateTask("branchTask001", "b001"), VertexBuilder.CreateTask("branchTask002", "b002") ) .Update();

    2) 命令执行后的图形示例: 

    2.3.9 删除分支/合并: Uncover()

    1) 命令

    //uncover a split/join pattern from canvas
    pmb.Uncover("003", "005")
       .Update();

    2) 命令执行后的图形示例:

     2.3.10 连接节点: Connect()

    1) 命令

    //connect two task node
    pmb.Connect("003", "005")
          .Update();

    2) 命令执行后的图形示例:

    2.3.11 断开节点: Disconnect()

    1) 命令:

    //disconnect two task node
    pmb.Disconnect("003", "005")
          .Update();

    2) 命令执行后的图形示例:

    2.4 流程更新命令Update()

    1) 命令: 

    pmb.Update();

    说明: 将会重新对流程节点和连线数据进行XML序列化处理,并且保存数据到数据库。

    3. 编程环境

    目前代码编程建模工具已经提供线上使用体验工具,左侧为纯文本代码输入区域,右侧为更新后的图形显示区域。每次执行代码文本后,将会更新右侧的图形显示。

    4. 在线地址

    为方便流程爱好者用户学习和掌握Slickflow流程图形语言模型,特意提供了网上编写代码的示例环境,请按照如下地址进行访问:

    http://demo.slickflow.com/sfd/model

    5. 总结

    代码编程建模工具的实现,方便了用户快速创建和更新图形,代码命令简单易学,建议流程技术人员、流程管理用户和系统分析人员可以投入时间学习掌握,从而提升流程开发效率。

  • 相关阅读:
    jqGrid api 中文说明
    jsp + js + 前端弹出框
    js中关于带数字类型参数传参丢失首位数字0问题
    java中WGS84坐标(ios)转换BD-09坐标(百度坐标)
    Java中的“浅复制”与“深复制”
    Git错误:error:failed to push some refs to 'git@gitee.com:name/project.git'
    git操作教程
    线程调度及进程调度
    同步锁Lock
    多线程案例
  • 原文地址:https://www.cnblogs.com/slickflow/p/11936786.html
Copyright © 2020-2023  润新知