Skip to content

流程规划

建议编辑步骤

流程设计的建议步骤如下:

  1. 使用设计器设计出流程的拓扑结构,不用配置任何变量、负责人等额外信息,专注在流程的拓扑和逻辑上;
  • 在流程流向上添加选项文本,这些选项在流程运行过程中,将作为可选项提供给用户,MTC 将根据用户的不同决策来决定流程的不同流向;
  • 预演,此时所有工作都将下发给设计者本人,此时可检查流程的流向是否合理
  • 留意流程的逻辑流向,是否符合设计目标。 如否,先修改再进行下一步
  1. 定义流程参数 流程参数将提供给用户填写,也有特殊目的参数,后续将逐步说明;
  2. 定义控制逻辑 使用 Javascript 脚本来对流程进行高级控制
  3. 添加参与人 指定不同任务的承担人
  4. 预演 多轮预演,保证流程的运行符合预期

流程设计器

工作流设计器提供图形方式用户界面,用于设计一个流程

desginer

左侧的工具箱里的工具,用于切换当前工具,每种工具对应一种节点类型

指针

在编辑状态下任意时间按下 ESC 键即可回到指针. 在指针模式下,你可以:

  1. 通过点击一个节点或连接,以选中它
  2. 按住 SHIFT 的同时点击一个节点或连接,以打开它的属性窗口
  3. 按住鼠标拖动一个节点
  4. 在空白区域按下并拖动鼠标,以拖动画板

除指针以外的其它工具对应一个流程节点类型

节点类型

设计器支持多种节点类型,包括活动、通知、脚本、定时器、子流程、与、或、接地及连接

  • 活动:指一个需要人来完成的动作
  • 通知:指发送邮件给特定人
  • 脚本:用于在流程中嵌入 Javascript 脚本,用于控制流程的运行逻辑,通过 WebAPI 调用运行在其它系统上的服务
  • 定时器:用于暂停流程一段时间,当需要在一个节点完成以后,暂停一段时间再继续下一个节点时,在两个节点之间插入一个定时器即可。定时器在间隔时间后循环运行一段流程时也非常有用。
  • 子流程:用于在一个流程中嵌入另一个流程;或者触发另一个流程的独立运行。
  • 与: 是一个用于判断前序节点是否已经全部完成的逻辑控制
  • 或: 是一个用于判断前序节点中任意一个已经完成的逻辑控制
  • 接地: 用于标识当前路径的结束,无须运行到 END 节点
  • 连接: 前后两个节点之间的连线。

节点属性

大部分节点类型都有属性,Shift-点击一个节点即可打开它的属性窗口,在没有 Shift 键的移动设备上,可以通过点击选中节点右上侧的小箭头图示来打开它的属性窗口。

连接也有属性,通过 Shift-点击来打开

节点 ID

每个节点都有一个自动生成的唯一 ID。 当我们在脚本中需要参考一个节点时,可能发现自动生成的 ID 不能表达意图,此时,最好的方法是把自动生成的 ID 修改为一个有业务意义的名字。

在节点的属性窗口中,输入自定义 ID,然后其右侧的“设置”按钮。这个按钮必须刻意点,否则,即便你点了属性窗口的确定按钮,ID 也不会被改变。

在设计器顶部菜单的最右侧,你可以通过切换 checkbox 来在设计器画布上显示和隐藏每个节点的 ID 信息

活动节点

任意时间按下 1 即可选中活动

活动是指一个需要由人来完成的动作

  • 点击画布上任意位置即可放置一个活动
  • 按下鼠标可拖动节点到其它位置
  • Shift-点击一个节点打开它的属性

标题

活动的名称中可嵌入流程参数值,用方括号括起来的变量名,连同方括号一起,将被替换为变量的值,如果变量不存在,替换后方括号也会被去除。

例如,如果流程中有一个变量名为"Interviewee_name", 它的值是"张三", 活动名称“请审批[Interviewee_name]的录用通知书”将被替换为“请审批张三的录用通知书”

参与

可视使用“参与人定义字符串”(PDS)来定义活动有哪些人参与执行

详细信息请参考 PDS page

投票

如果一个活动有多个参与人,此时每个参与人的决策可能不同,而这个节点的最终决策值可以使用投票模型来计算所得

投票模型包括:

  • 依最后一人的选择:

    总是使用最后一个人的选择为投票结果

  • 依最多人的选择

    用最多人的选择作为投票结果

  • 依最少人的选择

    用最少人的选择作为投票结果

  • 选择全部一样,否则

    如果所有人选择都一样,则这个唯一选择作为投票结果 否则,使用“否则”设置为投票结果

  • 某一选择超过比例,否则

    使用比例超过所设置数值的选项为投票结果 否则,使用“否则”设置为投票结果

  • 只要有选,否则依最后

    只要有人选择某个选项,则投票结束,投票结果为这个值 否则,依最后一个人的选择为投票结果

  • 只要有选,否则依最多

    只要有人选择某个选项,则投票结束,投票结果为这个值 否则,依最多人的选择为投票结果

  • 只要有选,否则依最少

    只要有人选择某个选项,则投票结束,投票结果为这个值 否则,依最少人的选择为投票结果

  • 只要有选,否则依统一选择 或最多

    只要有人选择某个选项,则投票结束,投票结果为这个值 否则,依全体人的选择为投票结果 如果,全体人员选择不统一, 则使用最多人的选择为投票结果

  • 只要有选,否则

    只要有人选择某个选项,则投票结束,投票结果为这个值 否则,使用“否则”设置为投票结果

任务要求说明

参与人接收到任务后,需要一些指引来对当前工作要求作出说明

说明中可以使用部分 HTML 标签,也可以使用 Handlebars 模版方式或者方括号中的变量名方式嵌入流程参数

HTML 标签

安全起见,只有部分 HTML 标签是可以使用的,包括:

"b", "i", "em", "strong", "a", "blockquote", "li", "ol", "ul", "br", "code", "span", "sub", "sup", "table", "thead", "th", "tbody", "tr", "td", "div", "p", "h1", "h2", "h3", "h4", "img", "video"

这些标签的属性会完全会保留,务必写正确的 HTML,否则,你的用户会看到乱套的页面

例子: 你可以在工作项的页面上显示图片和视频

图片:

<img
    src="/images/demo_image_1.jpg"
    width="100%" />
<br />

视频:

<video
    width="100%"
    controls
    autoPlay>
    <source
        src="/videos/demo_video_1.mp4"
        type="video/mp4" />
    Your browser does not support the video tag.
</video>

Handlebars

关于 Handlebars 格式的详细说明,请自动搜索

Handlebars 格式中可潜入流程参数,例如,如果一个流程中有参数 "days", 那么, handlebars 中的 {{days.value}} 将被替换为 days 这个参数的值。 也可以包含{{days.title}} {{days.type}} 等,分别是 days 的标题和类型

方括号中的参数名

[var_name] 将被替换为 var_name 的值

Crontab 定时重复

你可以对一个活动设置定时下发。如下图 crontab 了解 Crontab 标准,将有利于您理解定时器的设置方法。请搜索 crontab。 MTC 提供上图中的编辑器,方便你的定时器设置。

参数定义

定义参数名称,参数类型等。

参数名称:

参数名必须是一个合法的 Javascript 参数名称,意味着,参数名必须 以大小写字母,下划线开始,跟着一到多个字母、下划线或数字。 如果参数名称不合法,将会导致你的流程无法正常运行

参数类型:

参数类型通过在参数名称中添加固定的前缀来实现,前缀定义了 MTC 将按照何种类型来处理这个参数,以及在界面上如何向用户显示这个参数的输入方式

参数类型包括:

  • "email_" : 需要输入一个合法的邮箱地址
  • "password_" : 需要输入一个密码
  • "url_" : 输入一个 URL 地址
  • "range_" : 一个数值范围
  • "number_" : 一个数字,可设置最小、最大、步调的值
  • "dt_" : 一个日期+时间输入框
  • "datetime_" : 同上
  • "date_" : 一个日期输入框
  • "time_" : 时间输入框
  • "color_" : 颜色输入框
  • "search_" : 搜索输入框
  • "select_" : 下拉选择
  • "sl_" : 同上
  • "sel_" : 同上
  • "file_" : 文件选择上传
  • "radio_" : 单选
  • "textarea_" : 多行文本输入
  • "ta_" : 同上.
  • "checkbox_": 选择框
  • "cb_": 同上
  • "ou_": 选择组织结构中一个部门
  • "usr_": 用户输入(邮箱前缀)
  • "user_": 同上
  • "tbl_": 表格输入
  • 其它 : 一个普通的文本输入

组织结构选择

一个以"ou_" 开头的变量,将提供给用户一个针对组织结构的部门名称选择框。 组织结构由具备组织结构管理权限的用户进行管理。

例如, "ou_varname". 支持选项设置,设置用';'分隔, 比如"top_ou_id;[yes|no]", ';'前面是第一个组织的编号,';'后的 yes 或者 no 用来控制,是否包含这个组织, no 表示只能选择这个组织下面的组织

用户选择

"usr_" 或 "user_" 开始的变量表示需要输入一个用户, 当用户在输入的同时,MTC 会查询这个用户是否存在

文件上传

以"file_" 开头的变量,提供给用户一个文件选择框,用户可以拖放文件到这个区域,或者从文件浏览器选择文件,文件上传以后,用户可以查看、删除该文件(根据权限)

内部变量

下面的变量是内部变量,你可以直接使用,无须定义。

进程级变量:

  • starter: 进程启动者的用户 id
  • starterCN: 进程启动者的用户名
  • ou_SOU: 进程启动者的组织结构代码
  • ou_user_XYZ: 变量 user_XYZ 的值所指向的用户所在的组织结构代码

系统变量

  • $$isoWeek: 按年的星期数(第几周)
  • $$isoWeeksInISOWeekYear: 本年有多少个周
  • $$isoWeekYear: 当前是哪一年 (按完整周)
  • $$isoWeekDesc: 周的表示, 例如 W1, W13...
  • $$isoWeekDescFull: 周的完整表述, 例如 W1/52-2022

内部变量在下面场景也是可用的:

  • 流程上下文变量显示;
  • Handlebars, 例如: "{{starterCN.value}}"
  • 活动工作项的标题, 例如: "Activity started by [starterCN]"

下拉选择的可选项

以下前缀的变量支持可选项:"select_", "sel_", "sl_", or "ou_",

  • 可选项用英文';'分隔,例如"option1;option2;option3";
  • 对 "ou_" 变量,第一个可选项将被作为顶层组织结构,第二个是 yes 或者 no, 表示可选项中是否包含底层组织
  • 可选项也可以从预定列表中获得
    • 需要在列表定义中,定义一个列表, 一个列表定义中有多个 key,一个 key 下有多个可选值
    • "R:list_group_name", 将取出 list_group_name 的缺省可选项
    • "R:list_group_name:key" 将取出 list_group_name 中 key 值下的可选项
  • 列表项支持嵌套,你可以:
    • 使用 T:cascade_list_name, 例如,你可以设置一个下拉选择框"select_A", 其可选项定义为 "R:province_list;T:select_B", 然后,你可以定义下拉选择框"select_B" 为 "R:city_list"。 当用户从 "select_A"中选择一个省份时, "select_B"将获得 "select_A"中所选的省份值, 并将这个省份值作为 key,刷新"select_B"的可选项,也就是相应省份里面的城市。

Note: 有关 list 的定义请参考列表定义中的说明

表格

表格栏位支持使用表格设计器来直观地创建,详见表格设计器

下面的说明可帮助你理解表格设计器的背后设计 表格允许用户一行一行,一栏一栏地输入数据

表格栏位之间用|分隔

  • 单个栏位可以通过前缀来指定其类型
    • "date_" (日期输入),
    • "dt_" (日期时间输入).
    • "sel_" (下拉选择框)
      • 选择框的可选项用英文 ':'分隔, 例如(OPT1:OPT2:OPT3)
  • 栏位的标题用[title=TITLE]定义, 缺少方括号定义时,将使用变量名去除前缀后作为栏位标题
  • 栏位的缺省值通过[default=DEFAULT_VALUE]来定义,
  • 如果一个栏位需要计算平均值,可使用[avg]来标注
  • 如果一个栏位需要计算总值,可使用[sum]来标注
  • 计算两个日期之间的天数,使用 =datediff 来定义;
  • 计算两个时间之间的持续天数,使用=lastingdays 来定义;

例如:

date\_开始时间[title=开始日期]|date\_结束时间|从哪里[default=机场]|到哪里[default=公司]|sel\_出行方式(飞机:高铁:长途汽车:出租车)[default=高铁]|=datediff(date\_开始时间,date\_结束时间)+1[title=出差天数(天)][default=0][avg]|dt\_开始时点|dt\_结束时点|=lastingdays(dt\_开始时点,dt\_结束时点,0.5)[title=请假天数][default=0][sum]|number\_报销金额[sum][avg]

上述表格定义了以下栏位:

  • 开始时间:
    • 类型:日期
    • Title: 开始日期
  • 结束时间
    • 类型:日期
    • Title: 结束时间
  • 从哪里
    • 缺省值:机场
  • 到哪里
    • 缺省值:公司
  • 出行方式
    • 类型:选择列表
    • 可选项:飞机,高铁,长途汽车,出租车
    • 缺省值:高铁
  • 出差天数(天)
    • 类型:公式
    • 值:开始日期,与结束日期的天数差别+1,如为同一天,则值为 1.
    • 缺省值:0
    • 计算平均值
  • 开始时点
    • 类型:datetime
  • 结束时点
    • 类型:datetime
  • 请假天数
    • 类型:公式
    • 值:开始时点,与结束时点的差别,规整到 0.5 天
    • 缺省值:0
    • 计算总和
  • 报销金额
    • 类型:数字
    • 求总
    • 求平均

参数值

栏位的缺省值

  • 输入框类型的变量,显示输入框时,其缺省值直接显示在输入框中
  • 对 select/checkbox/radio, 显示时, 缺省值直接被选中

公式

可以把栏位的值设置为一个公式

公式定义在栏位值中,以‘=’开头

公式是一个合法的 Javascript 表达式,强烈建议使用简单的表达式

例如:

=first_name + " " + last_name

如果 first_name 栏位值是 "John", last_name 栏位值是 "Smith", 上述表达式的结果就是"John Smith".

=first_name.substring(1)

如果 first_name 的值"John", 那么结果就是 "ohn";

标题

该栏位的标题

占位字符

栏位输入框的占位字符

新启一行

下一个栏位新起一行

ID

可选,是否给它指定一个 ID

必须输入

此变量必须输入,才能继续

可见性

使用 PDS 指定谁能看到这个参数 详细信息请参考 PDS page

Note: 有些场景下,一些敏感数据需要对某些人保密,即便这些人参与在流程中。例如,在人事面试流程中,面试官参与到一个面试流程,但 offer 中的薪资数值可能不能让面试官看到,只能由 HR 或者管理层看到,那么,我们需要使用 PDS 指定薪资这个参数的可见行给到 HR 以及管理层即可。可见性在服务端计算,被可见性保护的数据,对不在可见性设置中的用户,根本不会从服务器端下传数据。

何时显示

使用"when expression"来控制一个参数何时显示出来供输入 可以使用逻辑判断来比较两个值,例如,两个参数分别是 RV 和 GV,可以定义 When Expression 其对比关系。语法为:

RV[=|==|===|>|>=|<|<=|!=]GV

比如我们有:

  • 一个名为 "checkbox_req"的变量,一个名为"reason"的变量,我们希望'reason'只在 checkbox_req 被选中的时候才显示,我们可以定义 reason 的"when expression"为
checkbox_req=true
  • 再比如,我们有一个参数名为"number_amount", 另一个参数名为"upper_price", 我们需要 upper_price 只在 number_amount 的值大于 100 时,才会显示出来供输入,我们可以定义 upper_price 的 when expression 为:
number_amount>100

GV 的类型将被自动转换为 RV 的类型,用于对比。 当前,我们仅支持字符串 string,数字 number,布尔 boolean 三个类型。 当 GV 是一个字符串时,可以忽略用'"'引起来, 除非它的值是 empty

例如,我们对比 kvar 的值是否等于 abcd, 我们直接使用

kvar=abcd

如果要对比一个变量的值是否为空,就需要使用引号了。例如:

kvar!=''

Note: 在浏览器客户端中, "when expression"只有在用户离开输入框时才会被触发.

活动节点脚本

除了在独立的脚本节点中嵌入 Javascript 脚本外,从 Mtc5.0 开始,我们也支持直接在活动节点上设置脚本

需要设置活动级脚本的场景可能包括:

  1. 需要对用户的选择通过脚本进行修改时
  2. 需要在活动完成后,执行一定操作,但又不想单独放置一个脚本节点时

活动节点的脚本代码无须返回值, 如果有返回值,这个返回值将替换用户在操作界面上所作的选择作为节点的结果

下面的代码在活动节点上设置了一个流程变量 week,值为 3

MtcSet('week', 3);

下面的代码将当前活动的结果设为 C

ret = "C";

请记住: 除非必要,保持活动节点的脚本为空。脚本写错会导致与预期不一致的结果

Info: 有关脚本的更多信息请参考 how to script

通知节点

  • 在任何时间,按下 2 即可切换到通知节点 通知节点用于向用户发送邮件

操作

  • 鼠标点击画板空白处,防止一个通知节点
  • Shift-点击通知节点,打开其属性配置
  • 拖动通知节点移动到另一个位置

邮件人:

  • 指定谁将收到邮件,使用PDS来定义

标题及内容

  • 可以使用方括号或 Handlebars 格式嵌入流程数据

脚本节点

  • 按下 3 切换到脚本节点

同步模式

以同步模式运行脚本

异部模式

以异步模式运行脚本,外部应用通过调用 MTC 回调节点,回调成功后,流程继续往后运行。

当脚本中调用一个外部应用,比如触发外部事件后,外部时间可能需要长时间才能完成,就可以使用异部模式来设计

脚本代码

可以嵌入 Javascript 脚本

脚本返回值


ret = "A";

Return value is used as routing option to decide where to go after this script node. 返回值将被作为脚本节点的返回值,用于控制后续流程流向哪个后续节点,比如,脚本节点指向后续两个节点,一个连接线上的路径值为 A, 另一个连接线上的路径值为 B,则上述脚本运行后,将沿着路径值为 A 的连接线,运行下一个节点。

向流程注入参数值

kvar(var_name, var_value, var_label)

MtcSet(var_name, var_value, var_label)

在流程的后续运行中, var_name 这个变量即可使用,

** 如果 var_name 已经存在,那么它的值将被覆盖

取得流程参数值

kvalue(var_name)

MtcGet(var_name)

设置内部团队

动态设置团队成员


setRoles({
SGT: "ab@email.com",
DIRECTOR: "cd@email.com",
});

在后面的节点中,分配给角色“SGT”的工作,将被下发给“ab@email.com”这个用户,分配给“DIRECTOR”这个角色工作,将被下发给“cd@email.com”这个用户。

请注意:, 灵活团队中的角色与组织结构中的角色不同。 组织结构中的角色相对固定,而灵活团队中的角色可以更加灵活地设置。

其它可以在脚本中使用的函数

// 设置某个节点的结果值
// 请注意,在放置一个节点时,其nodeid是自动生成的,不容易记忆,设计者可以在流程设计器中,手工修改nodeid为容易记忆的字符串,一般是英文单词组成的有业务意义、切符合javascript变量名称要求的字符串,以字母开始,后续多个连续字母和数字的组合

MtcSetDecision(nodeid, value)

//取得某个节点的结果值
//例如,某个节点的nodeid为approve,且有两个选项,"通过"和"不通过",使用这个方法可以取得用户的选择是”通过“还是”不通过“
MtcGetDecision(nodeid)

//判断一个PDS字符串中是否有某个用户
MtcPDSHasDoer(pds, who_email)

//向外部应用,传递回调接口的ID,外部系统需要记住这个ID,并在回调时使用这个ID。 在异步方式运行脚本节点时,需要向外部系统传递这个ID,否则,外部系统不知道调用那个回调接口
//url为外部系统的访问接口地址
MtcSendCBPid(url, extraPayload)

//向外部应用传递流程的所有参数
//当前进程的所有运行信息,将传递到这个endpoint
MtcSendContext(endpoint)

//流程信息将被打包在一个JSON中传递给endpoint, 例如
{
  "context":{
    "wfid":"...", //进程ID
    "tplid":"...",  //模版ID
    "starter": {...}, //启动者
    "data1":{...}, //流程数据
    "data2": {...}
  }
}

同步方式,调用一个远程服务 API

SCRIPT 节点运行方式设置为 同步 使用 MtcApiAgent.post(API_endpoint, payload, Axios_options); MtcAPIAgent 就是 axios,请参考 Axios 文档. 例如:

  ```
  let retFromRemoteAPI  = await MtcAPIAgent.post("http://Remote_API_SERVER:8008/demo/api",
  {}, {headers:{"Authorization": TOKEN_STRING}});
  ```

如果需要将远程 API 返回的数据写入流程上下文,可以使用前述的 MtcSet, 如

MtcSet("Key1", retFromRemoteAPI.keys);

也可以直接将数据一次性写入到 retkvars, 如:

retkvars = retFromRemoteAPI; //retFromRemtoeAPI 需要是一个JSON

retkvars = {...retkvars, ...retFromRemtoeAPI};  //保留retkvars之前的值,将retFromRemtoeAPI的值添加到retkvars

retkvars 的所有 key,value 将被写入流程上下文

一来,可以在前端显示, 二来,在后续的节点脚本中可以通过 MtcGet 获得其最新值

脚本中的 ret 的值将被用于判断流程后续流向。

异步方式,调用一个远程服务 API

SCRIPT 节点运行方式设置为 同步 然后,

  1. 在脚本中同样使用 MtcAPIAgent 调用远程 API。
  2. 向远程服务,发送回调节点代码, 远程服务需要自行保存这个节点代码
MtcSendCBPid(remote_service_uri, extraPayloadJSON);
//remote_service_uri 服务将能拿到一个名为 cbpid 的参数, 以及 extraPayloadJSON 的内容
  1. 远程服务在完成工作后(可以持续任意时间),发起向 MTC 的回调
POST("https://MTC_SERVER/workflow/docallback", {cbpid, decision, kvars});

cbpid 为之前所获得的 cbpid, decision 将决定流程下一步的走向, kvars 中的 KV 数据将被记录进流程的上下文

延时节点

延时节点,用于控制进程暂停时间,有三种方式:

  • 从进程启动时开始: 从进程启动时开始延时多长时间下发后续任务
  • 从现在开始: 从进程达到延时节点开始延时多长时间下发后续任务
  • 固定时间: 在固定时间,延时下发后续任务

注意: 延时节点的时间设置的目的与活动节点中的 crontab 重复执行时间设置的目的不同,延时节点用于控制后续节点的下发延时, 活动节点的 crontab 时间设置用于控制当前活动节点的重复下发时间。 参加 Crontab

子流程节点

子流程会被调用,在子流程运行完成以后,父流程继续运行

子流程最后的返回值将被当作子流程节点的结果值,用于判断后续运行路径

子流程也可以以独立运行方式运行,子流程独立运行时,父流程不会等待其结束。

AND 节点

并节点需要等待其前序节点,全部完成,才会进行后续工作。 如果流程中存在循环,AND 节点总是能做到使用最新一轮循环的结果。 例如,A 节点指向 B 和 C 节点,B 和 C 聚合到 AND, AND 后是 D, D 指向 END,D 也有一个路径指向到 A。 那么,当 BC 完成,AND 通过,D 完成后流向 A,开始新一轮。 新一轮中,B 完成,此时,即便上一轮的 C 有完成记录,AND 也不会通过,它会等待在新一轮中的 C 完成。

注意 对于一些复杂的流程,AND 的运行可能与你预期不同,比如,其中一个分支中的某个节点,在特殊条件下,流向了另一个分支,这样,上一个分支就没有机会流向到 AND。流程就会停在 AND 节点上。

注意 对于复杂流程,建议使用脚本节点来实现复杂并行控制。 参见脚本一节

OR 节点

只有前面有一条路径通过,OR 节点就会被通过。 其它路径上的工作会被忽略。

这一点与“衔接”节点不同,“衔接”节点的作用只是用于衔接线路,对运行逻辑不作控制

接地节点

接地节点后续没有节点,即便有节点,也不会继续运行其运行路径。 接地节点的意思是流程运行到该节点时,该条路径即不会继续

连接线

把两个节点连接起来,即建立了从前一个节点到后一个节点的运行路径。 点击一个节点 A 后,再点击另一个节点 B,将在 A 到 B 之间建立一个连接线。

Shift-点击一个连接线,将显示这个连接线的属性窗 在属性窗口中,给这个连接定义一个路径值,这个路径值将显示给用户,供用户选择,用户做出选择后,流程将根据其选择决定后续运行到哪里。

在 SaaS 服务中,路径值 以按钮方式显示给用户,用户点选做出选择 在 PaaS 服务中,开发者可以取得节点之后的所有路径值

如果 A 节点是一个脚本节点,则根据脚本的返回值来决定走哪条路径。 如果一个路径值不希望显示给用户,可以将其值以 h: h- 或 h_ 开头

改变连接的起止节点

  • 按下 Alt(Windows) (MAC: Opt), 点连接的前半段,然后点一个节点,即可改换连接的起始节点。
  • 按下 Alt(Windows) (MAC: Opt), 点连接的后半段,然后点一个节点,即可改换连接的终止节点。

或者:

  • 鼠标指在一个连接,按"cb",然后选择新的起始节点
  • 鼠标指在一个连接,按"ce",然后选择新的终止节点

取消连接选择

在选择起始或终止节点的过程中,随时按下 ESC 键盘或者双击空白区域,即可终止连接建立

删除一个连接

  • Mouse over a connection, then press Backspace or Delete
  • 鼠标指在一个连接,按下 Backspace/Delete 键或 d 键

给连接一个路径值

  • 按住 Shift 的同时点连接,在弹出的属性窗口中输入
  • 鼠标指向一个连接,按下'ct'删除其连接路径值
  • 鼠标指向一个连接,安详 Ctrl-C/Cmd-C 拷贝其路径值,然后指向另一个连接,按下 Ctrl-V/Cmd-V 粘贴其路径值

编辑操作

流程设计器支持拷贝、粘贴、剪切等操作,也支持多个键盘快捷键,以便方便你的操作 Ctrl 为 Windows 上的 Control 按键 Cmd 为 Mac 电脑上的 Command 按键,后续不再重复说明

拷贝、粘贴节点

当鼠标滑过一个节点时,Windows 上按 Ctrl-C, Mac 上按 Cmd-C 即可拷贝这个节点,然后,移动鼠标到另一个空白位置,按下 Ctrl-V 或 Cmd-V, 即可在空白位置粘贴出前述节点的一个拷贝。如在另一个节点上按下 Ctrl-V 或 Cmd-V, 这个节点将被替换为第一个节点的副本。

鼠标滑过一个节点时,按下 Ctrl-X/Cmd-X 将剪切掉该节点,然后在另一个位置按下 Ctrl-V/Cmd-V 将粘贴出该节点

连接线文本

鼠标滑过一个连接线时,按下 Ctrl-C/CMD-C 将拷贝该连接线上的路由文本,然后移动鼠标到另一个连接线,按下 Ctrl-V/Cmd-V 将把文本粘贴给这个新的连接线。如第二个连接线已有文本,其文本将被覆盖。

键盘快捷键

鼠标滑过一个节点时:

  • d: 删除这个节点
  • gt: 连接到另一个节点

鼠标滑过一个连接线时:

  • cb: 改变其起始节点
  • ce: 改变其结束节点
  • ct:改变其文本

单选-多选

单选: 单点节点 多选: 保持 Win/Mac 键按下,连续点击节点 框选: 保持 Shift 按下,滑动鼠标框出区域 全选: Ctrl-A / Cmd-A

移动节点

点击并拖动,可移动单个节点 多选/框选/全选节点后, 移动其中一个,即可移动全部