如何把 CSV 可视化成一条工作流
工作流就是带返工的流程。如何在 CSV 文件里写一个回溯的连线到引用、给重试封顶让修改不会无限循环,以及怎样区分一条真实的循环和一个敲错的行号。
一份 CSV 文件之所以从清单变成工作流,就在于某一个连线到单元格里的数字比它所在行的行号更小——那个回溯引用,正是每条审批流程都有、而几乎每份导出文件都漏掉的返工循环。
简而言之
- 一个比自己行号更小的连线到数字就是一条回溯循环。没有别的东西标记它。
- 循环行都是多目标行,所以它们的单元格含有逗号,在 CSV 里必须加引号。
- 给重试封顶:一个数次数的决策,才是让循环不会永远转下去的东西。
- 返工那些行可以放在文件的任何位置——循环是那条连线,不是那个位置。
- 一个指回不会重做任何工作的行的回溯引用,是手误,不是循环。
循环藏在导出文件的什么地方
描述流程的 CSV 导出文件,来自那些记录既成事实的系统:一份审批日志、一份工单导出、一台工作流引擎背后的审计表。它们是扁平的,一行一个事件,通常按时间戳排序,对过去完备,对形状缄默。把这样一份文件读成一条工作流,意味着回答一个文件里并不包含的问题——这一步被驳回时,工作退回到哪里去?
在 QueryChart 里,答案是一个数字。连线到这一列装的是这一行所连向的、从 1 开始的行号,而没有任何规则要求这个数字必须大于它所在的行。第 16 行指向第 3 行就是一条循环:工作回到第 3 行,再往前走一遍。整套机制就这些。没有循环形状,没有重复标记,也没有单独的返回列——工作流与一条直线流程的区别,只在于有一个数字比预期的小。
有一个格式本身的原因,让这一个数字在 CSV 里比在电子表格里更难写对。会循环的那些行,正是有多个去处的行,所以它们的连线到单元格写着 3,17,连线文字单元格写着 第一次退回,第二次退回。两者都含有逗号,而在一个逗号分隔的文件里,逗号必须加引号,否则这一行会悄悄多出几列,与表头错开。/zh/guides/在csv中定义流程图连线 讲的是配对规则;本页讲的是这些单元格被解析出来之后意味着什么。
下面这个示例是一条折扣审批工作流,和 /zh/templates/csv审批工作流 是同一张图。它在二十四行里有三个回溯引用:一次退回到毛利核算的修改、一次退回到给总监的说明的上报,以及一次退回到修改环节的客户还价。请打开表格面板,对着行号读连线到这一列。
二十四行里的三个回溯引用
一条折扣审批工作流的四个完成度阶段。画布下方的表格面板显示填了哪些列——盯住连线到里比所在行更小的数字。
只有形状,没有连接
第 1 到第 6 行只填了形状列,别的什么都没有:“收到客户的折扣要求”是开始,三个流程行,判断“折后毛利率是否达到 40%?”,以及销售代表这一档的批准。此时还没有任何东西指向任何地方。一份原始导出文件给你的大致就是这个——一份外挂了一列类型的清单,那是一张表,不是一条工作流。
向前的路径
连线到填上了,审批阶梯显形:第 5 行分向 6 或 7,第 7 行分向 8 或 10,第 10 行分向 11 或 13,每一档都把这个毛利率区间交给更资深的审批人。这一段前缀里的每一个数字都大于装着它的那一行,所以所有箭头都朝前,这份文件仍然可以从上到下当成一份清单来读。
那个指向后方的数字
第 15 到第 17 行加上了返工区块,而第 16 行正是这份文件不再是清单的地方。“是否第二次被同一审批人退回?”的连线到是 3,17,连线文字是 第一次退回,第二次退回:3 比 16 小,于是第一次退回回到“计算折后毛利率”——价格变了毛利率也就变了,可能落进另一个档位。第二次退回改去第 17 行,那就是封顶。
带泳道的完整工作流
全部二十四行,顶上是报价、毛利核算、审批、返工和出单,侧边是销售代表、销售经理、财务和商务总监。返工那一列现在明明白白地收着第 15 到第 17 行,这正是循环在画布上读得出来、在导出文件里却看不见的原因。最后一个回溯引用在第 20 行,那里的“要求更大折扣”把客户的还价送回第 15 行,而不是送去一份新报价单。
运作方式
把导出文件重排成流程顺序
系统导出文件出来时是按时间戳或工单号排序的,那是事情发生的顺序,不是流程运行的顺序。请在写下第一个连线到值之前,先把这些行排成一个案子实际走过的次序,因为那些值是行的位置,事后重新排序会让每一个都失效。
检查表头行有没有在导出中幸存
列是按表头名称匹配的,所以表头行是这份文件里唯一必须完全正确的部分。请确认它写的是形状、方框文字、连线到、连线文字。一次 UTF-8 导出留下的字节顺序标记会黏在第一个表头名称上,而一份欧洲系统的分号分隔导出文件会把整行塞进一个单元格——两种情况下这一列都匹配不上,会被当作未使用的多余列带过,而不会大声报错。
先写向前的路径
只为一路直行的情形填连线到,让每一个数字都大于它所在的那一行。先让这条工作流在完全没有返工的情况下从头跑到尾。往一条你还没验证过的路径上加循环,几乎不可能读回来,因为当两者都指向一个你自己都不确定的行时,你分不清哪个是返回连线、哪个是错号。
加一行返工,并把返回连线指向它
给修改环节单独一行——“调整折扣、价格或条款”——并把每一个驳回的判断都送到这一行,而不是在每个审批人下面各复制一个返工步骤。然后写出返工区块的返回连线,指向那个会重新评估已变输入的行。在示例里那是第 3 行,毛利核算,而不是第 1 行。
给重试封顶
一条不封顶的循环,是一条可以永远跑下去的工作流,而在真实流程里它并不会。请在返工行之后加一个判断,问这件事已经退回过几次——第 16 行“是否第二次被同一审批人退回?”——连线到写 3,17:绕一圈,第二次就上报。请给这个单元格加引号,让逗号留在里面。
把文件拖进去,读那些回溯箭头
把 .csv 拖到一张新图表的表格区域上,或者把文本直接粘贴进去,图就画出来了。然后把每一支往回跑的箭头读一遍。其中每一支都应当是一个你能当场说出名字的情形——一次修改、一次上报、一次还价。说不出名字的箭头是一个敲颠倒了的行号,而这是唯一能让它一目了然的视图。
应避免的错误
连线到单元格里的那个逗号
有两个去处的一行装着 3,17,有三个去处的装着 19,15,22。在一个逗号分隔的文件里不加引号,它们会变成三列和四列,之后的每一列都往左挪,而这份错位恰好落在承载循环的那几行上。电子表格导出时默认会给这种单元格加引号;手写的和脚本生成的文件往往不会。
编号之后又给文件排了序
连线到的值是行的位置而不是标识符,所以对表格排一次序,就会让每一行重新编号,每一个引用都指向现在占着那个位置的东西。图照样画得出来,而且彻头彻尾是错的。请先把顺序定下来——见 /zh/guides/流程图csv文件结构——再编号。
回得太早的循环
把返回连线指向第 1 行,等于重启受理,也就等于宣称客户又提交了一次申请。请把它送到第一个会因为这次返工而结果发生改变的行。在示例里,修改之后回到毛利核算,因为价格变了,而毛利率跟着价格走。
循环没有出口
一条旁边没有计数的回溯连线,做出的是一条永不终止的工作流,还藏起了所有人都怕的那种情形:一笔绕了三圈最后照样黄掉的交易。封顶就是一个带第二条出口分支的判断——第 16 行走向 17,而第 17 行要么上报给商务总监,要么止于“因毛利率过低而放弃该交易”。
打开这个审批工作流示例
把这个示例作为你自己的图表打开,然后换成你自己文件里的行,并检查每一个回溯数字都落在工作真正被重做的地方。
相关指南
常见问题
连线到的值能指向更早的一行吗?
能,而这正是返工的全部机制。连线到取的是目标行从 1 开始的位置,没有任何东西约束它必须大于它所在的行,所以第 16 行单元格里的一个 3,会从 16 往上画一支箭头到 3。渲染器会替你绕开那些方框选路;位置不用你摆。因为没有单独的循环标记,读一份 CSV 找它的循环,就意味着扫描那些比自己行号更小的数字——那是文件里唯一的信号。
怎样让返工循环不至于永远转下去?
在返回路径上放一个数次数的判断。示例里第 16 行问“是否第二次被同一审批人退回?”,连线到是 3,17,连线文字是 第一次退回,第二次退回,于是第一次绕一圈,第二次离开循环去第 17 行“坚持这个折扣还是放弃?”。次数并不存在任何地方——图记录的是这条规则,而人们遵循的正是这条规则。要紧的是这条循环在图上有一个带标签的出口,而不是藏在某人脑子里的一个默契。
在别人的文件里,怎么区分一条真循环和一个写错的行号?
三个检验。目标行是否重做了这次返工确实改动过的工作?一条回到某个输出这次不可能不同的步骤的循环,是一个错误。这支回溯连线是不是从一个判断出来的?一个流程行如果唯一的连线到指向后方、又没有向前的出口,会让文件其余部分不可达,这几乎总是一次数字颠倒。以及,这条分支有没有标签?真循环带着一个说明情形的连线文字;手误从来没有,因为没有人会给一条自己本没打算画的连线贴标签。
我的导出文件是一行一次审批事件,不是一行一个步骤,该怎么办?
把它压缩掉。审计表会把同一个步骤按发生次数重复记录,所以一笔被改过两次的交易会出现两行“退回给申请人”,而直接把它导进来,得到的是一个案子的图,不是这条流程的定义。请把不同的步骤抽出来,每个留一行,让回溯引用去承载重复——这个替换正是循环存在的意义。
循环跨越泳道之后,图还读得下去吗?
选路是算出来的而不是画出来的,所以一支从返工列回到报价列的返回连线,会在你不移动任何东西的情况下绕开那些方框。让一条带循环的工作流读不下去的不是箭头,而是行的顺序:请把返工那些行放在一起,就像示例里的第 15 到第 17 行,而不要在每个审批人下面各撒一个修改步骤。三个审批人各带一行返工,产生的是三条其实是同一条的循环。