流程规划
建议编辑步骤
流程设计的建议步骤如下:
- 使用设计器设计出流程的拓扑结构,不用配置任何变量、负责人等额外信息,专注在流程的拓扑和逻辑上;
- 在流程流向上添加选项文本,这些选项在流程运行过程中,将作为可选项提供给用户,MTC 将根据用户的不同决策来决定流程的不同流向;
- 预演,此时所有工作都将下发给设计者本人,此时可检查流程的流向是否合理
- 留意流程的逻辑流向,是否符合设计目标。 如否,先修改再进行下一步
- 定义流程参数 流程参数将提供给用户填写,也有特殊目的参数,后续将逐步说明;
- 定义控制逻辑 使用 Javascript 脚本来对流程进行高级控制
- 添加参与人 指定不同任务的承担人
- 预演 多轮预演,保证流程的运行符合预期
流程设计器
工作流设计器提供图形方式用户界面,用于设计一个流程
左侧的工具箱里的工具,用于切换当前工具,每种工具对应一种节点类型
指针
在编辑状态下任意时间按下 ESC 键即可回到指针. 在指针模式下,你可以:
- 通过点击一个节点或连接,以选中它
- 按住 SHIFT 的同时点击一个节点或连接,以打开它的属性窗口
- 按住鼠标拖动一个节点
- 在空白区域按下并拖动鼠标,以拖动画板
除指针以外的其它工具对应一个流程节点类型
节点类型
设计器支持多种节点类型,包括活动、通知、脚本、定时器、子流程、与、或、接地及连接
- 活动:指一个需要人来完成的动作
- 通知:指发送邮件给特定人
- 脚本:用于在流程中嵌入 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。 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 开始,我们也支持直接在活动节点上设置脚本
需要设置活动级脚本的场景可能包括:
- 需要对用户的选择通过脚本进行修改时
- 需要在活动完成后,执行一定操作,但又不想单独放置一个脚本节点时
活动节点的脚本代码无须返回值, 如果有返回值,这个返回值将替换用户在操作界面上所作的选择作为节点的结果
下面的代码在活动节点上设置了一个流程变量 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 节点运行方式设置为 同步 然后,
- 在脚本中同样使用 MtcAPIAgent 调用远程 API。
- 向远程服务,发送回调节点代码, 远程服务需要自行保存这个节点代码
MtcSendCBPid(remote_service_uri, extraPayloadJSON);
//remote_service_uri 服务将能拿到一个名为 cbpid 的参数, 以及 extraPayloadJSON 的内容
- 远程服务在完成工作后(可以持续任意时间),发起向 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
移动节点
点击并拖动,可移动单个节点 多选/框选/全选节点后, 移动其中一个,即可移动全部