惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
D
DataBreaches.Net
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
Recent Announcements
Recent Announcements
The Register - Security
The Register - Security
S
Secure Thoughts
Y
Y Combinator Blog
The Last Watchdog
The Last Watchdog
L
LINUX DO - 最新话题
V2EX - 技术
V2EX - 技术
腾讯CDC
GbyAI
GbyAI
G
Google Developers Blog
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
Schneier on Security
Schneier on Security
Microsoft Security Blog
Microsoft Security Blog
Jina AI
Jina AI
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
MyScale Blog
MyScale Blog
Help Net Security
Help Net Security
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
AI
AI
MongoDB | Blog
MongoDB | Blog
Scott Helme
Scott Helme
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
H
Help Net Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
S
Security Affairs
TaoSecurity Blog
TaoSecurity Blog
The GitHub Blog
The GitHub Blog
Hacker News: Ask HN
Hacker News: Ask HN
Martin Fowler
Martin Fowler
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI

博客园 - slickflowteam

Slickflow.MCP-Server-工作流引擎接入AI编排平台实践 Slickflow.AI 基于 Harness 工程规范的多智能体交互过程实现 Slickflow 规则集与 NRules 集成实践:从设计到产品落地 Slickflow.NET 与 OpenClaw 结合实践:技术原理、集成方式与 Skill 说明 Slickflow.NET 智能客服系统--基于 AI 大模型和RAG增强检索实现 .NET 开源工作流:Slickflow 流程自动化运行技术指南 .NET 开源工作流: Slickflow.NET 工作流引擎关于AI大模型的应用实践 .NET 开源工作流: Slickflow流程引擎高级开发(十) -- BpmnJS流程设计器集成 .NET 开源工作流: Slickflow流程引擎高级开发(九) -- 条件事件模式解释及应用 .NET 工作流: Slickflow开源工作流引擎高级开发(八) -- 审批网关(ApprovalOrSplit)模式的应用 .NET 工作流: Slickflow开源工作流引擎高级开发(七)--消息队列(RabbitMQ)的集成使用 .NET 工作流: Slickflow开源工作流引擎快速入门之三: 简单或分支流程代码编写示例 .NET 工作流: Slickflow开源工作流引擎快速入门之二: 简单并行分支流程代码编写示例 .NET 工作流: Slickflow开源工作流引擎快速入门之一: 简单序列流程代码编写示例 .NET 工作流: Slickflow开源工作流引擎级开发(六) -- WebTest 引擎接口模拟测试工具集 .NET 工作流: Slickflow开源工作流引擎开发(五) -- 引擎和外部事件的交互 .NET 工作流: Slickflow开源工作流引擎高级开发(四) -- 硬核编码:代码式快速构建流程图 .NET 工作流: Slickflow开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合 .NET 工作流: Slickflow开源工作流引擎高级开发(二) -- 流程快速测试增值服务工具介绍 .NET 工作流: Slickflow开源工作流引擎高级开发(一) -- 流程外部事件的调用和变量存储实现 .NET 工作流: Slickflow开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成
.NET 工作流: Slickflow开源工作流引擎快速入门之四:--SlickGraph 流程模型编码建模工具使用手册
Slickflow · 2019-12-03 · via 博客园 - slickflowteam

前言: 业务人员绘制流程时,通常使用图形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()

命令示例: 

参数: (activityName, activityCode)

1.2.2 结束节点创建: 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 图形存储命令

命令示例: 

存储命令会把上述图形按照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) 命令: 

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

3. 编程环境

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

4. 在线地址

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

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

5. 总结

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