产出标签与报告
一次运行记录在开始时和完成时产出什么、按什么顺序、经过哪个队列、什么被冻结进运行记录文件,以及每一次送达怎么被记录下来。
一次运行记录通过它的模型的那些动作产出自己的纸面材料:一组组具名的命令,每一条命令在这次运行记录开始时或者完成时产出一张标签或者一份报告,声明在设定 > 动作下面,由流程整组整组地选中。这些命令渲染时所用的模板就是这个根节点的两个库:报告命令的版式来自报告,标签命令的文件来自标签。这一页讲的是一次运行记录到达一个时机之后会发生什么。
两个时机
到了一个时机,那些命令按选中的各组在模型列表里的顺序、以及每组自己内部的顺序依次发出,标签在报告之前。每一条命令都是彼此隔离的:模板不见了、拼装过程抛出异常、队列拒收,这些都会记进日志,不改变这次运行记录的任何东西,也绝不会拦住它后面的命令。
| 时机 | 什么时候 | 有什么可用 | 产出什么 |
|---|---|---|---|
| 开始 | 在这次运行记录成形的时候,此时流水号计数器已经预留、元数据已经写下;文档拼装期间这次运行记录已经在记录了,拼装走的是它自己那个还开着的文件。 | 这次运行记录的标识、元数据、开始时刻,以及“运行中”这个状态。 | 每一条触发时机为开始的标签命令;每一条触发时机为开始并且带版式的报告命令:一份随行单据,上面还没有证据的那些节被略去,配方那一行印的是计划中的配方。 |
| 完成 | 在这次运行记录的最终状态和快照封存好、单元被释放之后;先是标签,紧接着在后台是报告。 | 开始时的一切,外加结束时刻、时长、最终状态、结论、结束原因和判过的那些判据。 | 每一条触发时机为完成、并且它的结论筛选放行这次运行记录结论的标签命令和报告命令。 |
结论筛选(合格、不合格、无法判定、没有结论)只在完成时读;开始时还没有结论。以失败结束的运行记录没有最终快照:它完成时的标签记下一件失败的存档件,完成时的报告一份也不发布。版式被删掉的报告命令,以及没有版式的报告命令,什么也不发布。重启应用绝不会把开始时的文档再出一遍:重启之后继续下去的运行记录,带着它已经产出过的那些存档件。
报告
带版式的报告命令,无论它还要求了什么,都会在它的时机发布自己的 PDF。文件名是这次运行记录的导出基名加上这一组的名称(<基名> - <组名>.pdf),因此同一次运行记录的随行单据和收尾报告并排立着;两组名称会落到同一个文件上时,用命令自己的身份把它们分开。同一条命令日后再渲染一次,只替换这条命令的那份文档,别的都不动。这条命令的两个选项决定这份文档的去向:
| 选项 | 效果 |
|---|---|
| 自动打印 | 已发布的 PDF 还会提交给这个单元在那个时机上生效的报告队列。那一格里没有队列的单元,会把这次尝试记为失败(“No printer queue is configured for this action on the Unit.”)。 |
| 把它留在运行记录里 | 做好的 PDF 存进运行记录文件,因此即使版式后来被编辑或者删掉,或者已发布的文件被后来的一次渲染替换掉,日后重新发送提交的仍然是原样的那些字节。这次运行记录随之带上这份文档的大小。 |
只要要求了两者之一,这条命令就会把这份文档登记在运行记录上(历史里在报告下面列出的那条登记);两者都没要求的命令只发布文件,什么也不登记,因为生成是对运行记录文件的一次导出,绝不是对它的一次写入。
标签
标签命令用每个标记一个来源来渲染它的模板。开始时只有在启动被受理那一刻就已确定的那些来源解析得开:元数据、模型名称和修订号、单元名称和代号、流程名称和代号、运行记录标识、开始时刻和运行状态;映射到别的东西的标记会让开始时的标签被拒绝(“Marker '{{RESULT}}' is not available when a run starts.”)。完成时整份目录都解析得开,一条判据的结果按它稳定的身份加上一个明确的循环号来取(省掉循环号绝不等于“最近的那一个”)。
每一次生成都先往运行记录文件里追加一件不可变的存档件:最终的命令字节、模板的名称、源文件和内容哈希、这一组的名称、触发时机、解析出来的那些值连同它们的来源,或者一条也生成不出来的理由。随后这些字节作为一份名叫 Ganter Lab · <组名> 的 RAW 文档,送给这个单元在那个时机上生效的标签队列。那一格里没有队列的单元记下一次失败的尝试(“No printer queue is configured for this label on the Unit.”);模板已经不在了则记下“The configured label template is missing.”。每一次送达尝试都追加到这件存档件上:在调用后台打印程序之前先写正在发送,随后是已送入队列或者失败;应用中途停掉的那一次尝试停在发送结果不确定上,而且绝不自动重试,因为打印机可能已经把标签打出来了。“已送入队列”确认的是 Windows 接受了这份内容,不是纸真的出来了。
打印机
一份文档落到哪个队列,是在定义 > 打印机上决定的:模型声明四个默认格子,产出什么和什么时候产出的每一种组合各一个(标签或者报告,开始时或者完成时),而每个单元要么跟随模型的这四个,要么自己保留四个。一条命令按自己的种类和触发时机来解析目的地,跟随模型的单元走模型,自成一体的单元走单元自己的格子,因此两个流程共用的一组,只选一次目的地就通过它打印。这些队列就是为工作站运行所用的那个用户安装的 Windows 打印队列;标签以 RAW 字节送出去,报告则被光栅化后画到设备上,因此报告由普通文档打印机承担,标签由标签打印机承担。
之后
一次运行记录产出的一切,都在它在历史里的那份档案上读到(标签与报告):那些存档件、那些登记,以及每一次尝试和它的状态。在那里,两种介质的那对动作是一样的:从这次运行记录冻结下来的证据出一份新的文档(用一条配置好的命令或者一个手工映射的模板出一张新标签,用任意一份版式出一份新的 PDF),以及把一份已记录的重新出一遍(把一件存档件冻结的字节重新打印一次,把已登记的 PDF 重新发送一次),后者不会重新解析任何东西。
产出不做的事
它从不读取实时值:标签只解析运行记录文件冻结下来的东西,报告也只从这个文件渲染。它从不改变一次运行记录:一份文档失败了,结论、状态和文件仍然和原来一模一样。它从不确认打印出来了。而且它绝不为一次快照或者一次立即判定的运行记录产出任何东西,因为那种运行记录既没有流程也没有动作。