工作流自动化
通过「触发器 → 条件 → 动作」规则引擎,将实验室中的重复性工作自动化,减少人工干预,提升团队响应速度。本页提供规则引擎的完整操作指引、所有触发器和动作的详细说明,以及 5 个实际应用场景示例。
工作流引擎架构
工作流引擎持续监听系统事件。当事件发生时,引擎查找所有匹配该事件类型的规则,对每条规则评估其条件,仅在条件满足时执行配置的动作序列。每次执行结果写入执行日志供审计和排查。
什么是工作流自动化
工作流自动化允许你定义「当 X 事件发生时,如果满足 Y 条件,则执行 Z 动作」的规则,无需手动触发。规则一旦创建并启用,在后台持续运行,7×24 小时不间断。
对于非技术用户,可以把工作流规则理解为「实验室助理的值班规则」:你告诉助理「如果库存的乙醇少于 5 瓶,立刻通知李管理员补货」,此后你不用再记着检查库存,助理会自动帮你盯着。
自动化能解决什么问题
消除人工监控
不再需要每天手动检查库存水位、任务截止日期、仪器鉴定状态。
加速合规响应
高影响偏差发生时,自动创建 CAPA 并通知质量经理,而非等到周会才发现。
减少沟通成本
实验完成时自动通知 PI 审阅,不需要逐一发消息提醒。
系统集成
通过 Webhook 将 PonyLab 事件推送到 Slack、企业微信、自定义 LIMS 等外部系统。
自动化规则在 系统 → 自动化 中管理。每个规则的执行结果记录在「执行日志」中,支持排查问题。
创建规则(逐步操作)
- 前往「系统 → 自动化」,点击右上角「+ 新建规则」蓝色按钮,打开规则创建向导。
- 第一步:设置触发器
从触发器下拉列表中选择触发该规则的事件类型。触发器按类别分组(实验事件/任务事件/样品事件/库存事件/合规事件/团队事件/定时触发),见下方触发器完整列表。
选择触发器后,某些触发器会显示附加配置项。例如选择
experiment.status_changed后,需要指定「目标状态」(如 COMPLETED),规则只在状态变更为指定值时触发,而非任意状态变更都触发。 - 第二步:添加条件(可选)
条件进一步筛选触发范围。点击「+ 添加条件」,每个条件由三部分组成:
- 字段:触发实体的字段(如
experiment.type、inventory.quantity) - 运算符:等于 / 不等于 / 大于 / 小于 / 包含 / 以…开头 / 为空 / 不为空
- 值:比较的目标值
多个条件之间通过「AND」(所有条件都满足)或「OR」(任意条件满足)逻辑连接。默认为 AND 逻辑。
示例:触发器
experiment.status_changed目标状态=COMPLETED,添加条件「实验类型 等于 PCR」,则规则只在 PCR 类型实验完成时触发。 - 字段:触发实体的字段(如
- 第三步:配置动作
点击「+ 添加动作」,从动作类型列表中选择(见下方动作完整列表)。一条规则可以配置多个动作,按列表顺序依次执行。
每种动作有各自的配置参数。在配置文本内容时,可以使用
{{变量名}}语法引用触发事件的上下文数据(见「模板变量」章节)。 - 第四步:命名规则
给规则起一个描述性名称,建议格式:「[触发条件] → [执行动作]」,例如:「PCR 实验完成 → 通知 PI」、「库存低于阈值 → 创建补货任务」。清晰的命名有助于团队成员理解规则用途。
- 第五步(推荐):Dry-run 测试
点击「测试此规则」,在规则正式启用前验证逻辑是否正确(见「Dry-run 测试」章节)。
- 点击「保存并启用」完成。规则立即进入激活状态,从下一个匹配事件开始执行。
提示
可用触发器完整列表
以下是所有可用触发器,按类别分组,每个触发器包含事件名称、触发时机和典型用途。
实验事件
| 触发器 | 触发时机 | 可附加配置 | 典型用途 |
|---|---|---|---|
| experiment.created | 新实验记录被创建 | 可指定实验类型 | 新建实验时自动创建关联任务;通知 PI 有新实验开始 |
| experiment.status_changed | 实验状态变更(任意变更或指定目标状态) | 目标状态:DRAFT / IN_PROGRESS / COMPLETED / ARCHIVED | 实验完成时通知 PI 签名;状态变为归档时自动生成摘要 |
| experiment.completed | 实验状态变更为 COMPLETED(experiment.status_changed 的快捷方式) | 无 | 最常用的触发器之一,比 status_changed 配置更简单 |
| experiment.signed | 实验记录被电子签名(任意签名人) | 可指定签名含义类型 | 实验签名后通知数据分析员开始处理;签名完成后触发 Webhook 同步到外部系统 |
| experiment.deviation_reported | 在实验协议执行中记录了偏差 | 可指定影响级别(低/中/高) | 高影响偏差自动创建 CAPA;偏差记录后通知 QA 经理 |
| experiment.updated | 实验记录内容被修改 | 可指定变更字段 | 已签名实验被修改(应极少发生)时立即通知 PI |
任务事件
| 触发器 | 触发时机 | 可附加配置 | 典型用途 |
|---|---|---|---|
| task.created | 新任务被创建 | 可指定项目 ID 或优先级 | 高优先级任务创建时立即通知负责人 |
| task.completed | 任务状态变更为「已完成」 | 可指定项目 ID | 任务完成后通知 PI;检查项目中所有任务是否完成,触发项目收尾流程 |
| task.overdue | 任务截止日期已过但状态不是「已完成」或「已取消」(每天检查一次,默认早上 8:00) | 可指定逾期天数(如「逾期超过 2 天才触发」) | 逾期任务通知负责人和 PI;超过 3 天逾期发送 Webhook 到 Slack |
| task.assigned | 任务被分配给新成员(或分配人变更) | 无 | 发送个性化欢迎通知给新分配成员,包含任务背景说明 |
| task.status_changed | 任务状态变更(任意变更或指定目标状态) | 目标状态 | 任务进入「待审阅」状态时通知审阅人 |
样品事件
| 触发器 | 触发时机 | 典型用途 |
|---|---|---|
| sample.created | 新样品记录被创建(包括自动派生的子样品) | 关键样品创建时通知存储管理员分配存储位置 |
| sample.depleted | 样品状态变更为「已用尽」 | 稀有样品用尽时通知 PI;自动创建重新制备/采购任务 |
| sample.expiring_soon | 样品有效期在 N 天内到期(N 可配置,默认 30 天) | 提醒研究员优先使用即将过期的样品;安排使用计划 |
| sample.location_changed | 样品存储位置变更 | 贵重样品移动时通知 PI;更新外部 LIMS 系统中的位置记录 |
库存事件
| 触发器 | 触发时机 | 典型用途 |
|---|---|---|
| inventory.low_stock | 库存数量降到设定阈值以下(在库存条目上设置「最低库存量」) | 最常用的库存触发器:自动创建补货任务,通知实验室管理员 |
| inventory.adjusted | 库存数量通过手动调整操作发生变化(不包括日常使用消耗) | 大幅调整库存数量时通知 PI(防止未经授权的库存操作) |
| inventory.expiring_soon | 库存有效期在 N 天内到期(N 可配置,默认 30 天) | 提醒研究员优先使用即将过期的试剂;通知管理员准备废弃处置 |
| inventory.out_of_stock | 库存数量降到零 | 紧急通知所有可能使用该试剂的研究员;创建紧急采购任务 |
合规事件
| 触发器 | 触发时机 | 典型用途 |
|---|---|---|
| deviation.reported | 协议执行中记录了偏差(快捷触发器,等同于 experiment.deviation_reported) | 自动通知质量经理;高影响偏差自动创建 CAPA |
| capa.created | 新 CAPA 记录被创建 | 通知 CAPA 责任人;发送 Webhook 到质量管理系统 |
| capa.overdue | CAPA 截止日期已过但状态未关闭(每天检查) | 升级通知给 PI 和 SUPER_ADMIN;超过 7 天发送到 Slack |
| instrument.qualification_expiring | 仪器 IQ/OQ/PQ 鉴定有效期在 N 天内到期(N 可配置,默认 30 天) | 提前通知设备管理员安排重新鉴定;防止鉴定过期导致合规风险 |
| protocol.expiring | 协议有效期在 N 天内到期 | 通知协议作者和审核人安排周期审核 |
团队事件与定时触发
| 触发器 | 触发时机 | 典型用途 |
|---|---|---|
| team.member_joined | 新成员接受邀请并完成注册加入团队 | 自动发送入职欢迎邮件;创建新成员培训任务清单 |
| team.member_left | 成员被移出团队或离职 | 通知 PI 重新分配该成员负责的未完成任务 |
| scheduled.daily | 每天指定时间触发(可设置具体时间,默认 08:00 团队时区) | 每日早上 8 点发送当天到期任务汇总;每日检查库存水位 |
| scheduled.weekly | 每周指定星期几指定时间触发 | 每周一早上生成周任务摘要;每周五下午提醒更新实验进度 |
| scheduled.monthly | 每月指定日期指定时间触发 | 每月 1 日生成月度合规报告;每月底检查仪器鉴定状态 |
条件语法
条件允许你精确控制规则在什么情况下执行动作。没有条件的规则在每次触发事件发生时都执行;有条件的规则只在条件满足时执行。
条件结构
每个条件由三个部分组成:字段 运算符 值
| 运算符 | 适用字段类型 | 示例 |
|---|---|---|
| equals(等于) | 字符串、枚举、数字 | experiment.type equals PCR |
| not_equals(不等于) | 字符串、枚举、数字 | task.priority not_equals LOW |
| greater_than(大于) | 数字 | inventory.quantity greater_than 0 |
| less_than(小于) | 数字 | inventory.quantity less_than 5 |
| contains(包含) | 字符串、数组 | experiment.title contains 关键实验 |
| starts_with(以…开头) | 字符串 | experiment.title starts_with SOP- |
| is_empty(为空) | 所有类型 | task.assignee is_empty(未分配负责人的任务) |
| in(属于列表) | 字符串、枚举 | experiment.type in [PCR, Western_Blot, ELISA] |
可用字段(按触发器类型)
条件字段使用点号路径格式,引用触发实体的属性:
| 触发实体 | 可用字段 |
|---|---|
| experiment.* | title, type, status, priority, projectId, researchDirectionId, createdBy |
| task.* | title, status, priority, projectId, assigneeIds, dueDate, overdueDays |
| inventory.* | name, quantity, unit, category, location, expirationDate, minimumQuantity |
| sample.* | name, type, status, storageLocation, expirationDate, quantity |
| deviation.* | type, severity, experimentId, protocolId, reportedBy |
| capa.* | type, severity, status, responsibleUserId, dueDate, overdueDays |
复合条件示例
以下示例展示如何用 AND/OR 组合多个条件:
示例 1:只在高优先级的 PCR 任务逾期时触发
task.priority equals HIGH
AND
task.overdueDays greater_than 0
AND
experiment.type equals PCR (通过关联实验获取)
示例 2:库存低于阈值且分类为「关键试剂」时触发
inventory.quantity less_than 3
AND
inventory.category equals 关键试剂
可用动作完整列表
每条规则可以配置多个动作,按顺序依次执行。某个动作失败不会阻止后续动作执行(除非配置了「失败则停止」选项)。
SEND_NOTIFICATION:发送应用内通知
| 配置参数 | 说明 | 示例 |
|---|---|---|
| 接收人 | 按角色(PI/RESEARCHER/ADMIN/ALL)或指定成员(从成员列表中选择);也可填写触发实体相关人员(如「实验创建者」「任务负责人」) | 角色=PI;或 指定成员: 张研究员、李博士 |
| 通知标题 | 简短的通知标题,支持模板变量,最多 100 字符 | {{experiment.title}} 已完成 |
| 通知内容 | 详细通知内容,支持模板变量和富文本链接,最多 500 字符 | {{user.name}} 完成了实验,请点击审阅 |
| 跳转链接 | 可选的快捷跳转链接(如直接跳转到相关记录页面),支持变量 | {{experiment.url}} |
提示
CREATE_TASK:创建任务
| 配置参数 | 说明 | 示例 |
|---|---|---|
| 任务标题 | 自动创建任务的标题,支持模板变量 | 补货:{{inventory.name}} |
| 任务描述 | 任务的详细描述,支持模板变量和 Markdown | 当前库存:{{inventory.quantity}}{{inventory.unit}} |
| 分配给 | 按角色(如 ADMIN)或指定成员;也可以设置为「触发人」(谁触发的事件就分配给谁) | 角色=ADMIN(实验室管理员) |
| 关联项目 | 自动创建的任务归属到哪个项目;可以从下拉选择固定项目,或使用「触发实体的关联项目」 | 实验室运营项目 |
| 优先级 | URGENT / HIGH / MEDIUM / LOW | HIGH |
| 截止日期 | 固定日期,或「触发时间 + N 天」(相对截止日期) | 触发时间 + 3 天 |
TRIGGER_WEBHOOK:触发 Webhook
| 配置参数 | 说明 |
|---|---|
| 目标 URL | 接收 Webhook 请求的 HTTPS 端点(必须使用 HTTPS) |
| HTTP 方法 | POST(默认)或 GET |
| 自定义请求头 | 键值对格式,常用于传递认证 Token(如 Authorization: Bearer xxx);值可以引用环境变量(安全存储 Token) |
| Payload 模板 | JSON 格式的请求体模板,支持模板变量。若不填写,系统自动发送标准事件 Payload(包含触发实体的完整数据) |
| 重试策略 | 请求失败时(非 2xx 响应或超时)的重试次数(默认 3 次)和间隔(指数退避:1s, 5s, 15s) |
| 超时时间 | 等待目标服务器响应的最大时间(默认 10 秒) |
标准 Webhook Payload 示例(system 自动生成):
{
"event": "experiment.completed",
"timestamp": "2024-03-15T08:30:00.000Z",
"teamId": "team_abc123",
"triggeredBy": {
"userId": "usr_xyz",
"name": "张研究员",
"email": "[email protected]"
},
"data": {
"experiment": {
"id": "exp_001",
"title": "PCR 退火温度优化实验",
"type": "PCR",
"status": "COMPLETED",
"url": "https://app.ponylab.io/experiments/exp_001"
}
}
}CREATE_CAPA:自动创建 CAPA
| 配置参数 | 说明 |
|---|---|
| CAPA 类型 | 纠正措施(CA)/ 预防措施(PA) |
| 问题描述模板 | 支持模板变量,自动填充触发事件的上下文信息 |
| 严重性 | 固定值(LOW/MEDIUM/HIGH/CRITICAL)或「继承偏差严重性」 |
| 责任人 | 按角色指定,或「实验创建者的 PI」 |
| 截止日期 | 触发时间 + N 天 |
| 关联到触发记录 | 自动将触发该规则的实验/偏差记录关联到新创建的 CAPA |
UPDATE_STATUS:更新记录状态
自动将触发实体的状态更新为指定值。仅允许合规的状态跃迁(不能跳过中间状态)。
| 配置参数 | 说明 |
|---|---|
| 目标实体 | 触发实体本身,或关联实体(如「该任务所属的项目」) |
| 新状态 | 目标状态值(仅显示从当前状态可以跃迁到的状态,防止非法状态变更) |
| 变更备注 | 自动记录在审计日志中的变更原因说明 |
注意
ADD_TAG:添加标签
自动为触发实体添加标签,用于后续筛选和分类。例如:任务逾期超过 7 天时自动添加「逾期-升级」标签,方便 PI 在列表视图中快速筛选。
模板变量
在动作的文本配置中(通知标题/内容、任务标题/描述、Webhook Payload、CAPA 描述),使用 {{变量名}} 语法引用触发事件的上下文数据。
通用变量(所有触发器可用)
| 变量 | 值 | 示例输出 |
|---|---|---|
| {{user.name}} | 触发操作的用户姓名 | 张研究员 |
| {{user.email}} | 触发操作的用户邮箱 | [email protected] |
| {{timestamp}} | 事件发生时间(格式:YYYY-MM-DD HH:mm,团队时区) | 2024-03-15 08:30 |
| {{team.name}} | 团队名称 | 李课题组 |
实体特定变量
| 触发实体 | 可用变量 |
|---|---|
| 实验 | {{experiment.title}} {{experiment.id}} {{experiment.type}} {{experiment.status}} {{experiment.url}} {{experiment.createdAt}} |
| 任务 | {{task.title}} {{task.id}} {{task.status}} {{task.priority}} {{task.dueDate}} {{task.url}} {{task.project.name}} |
| 库存 | {{inventory.name}} {{inventory.quantity}} {{inventory.unit}} {{inventory.category}} {{inventory.minimumQuantity}} |
| 样品 | {{sample.name}} {{sample.id}} {{sample.type}} {{sample.status}} {{sample.location}} |
| 偏差 | {{deviation.type}} {{deviation.severity}} {{deviation.description}} {{deviation.experiment.title}} |
| CAPA | {{capa.id}} {{capa.title}} {{capa.status}} {{capa.dueDate}} {{capa.responsibleUser.name}} |
提示
{{task.dueDate}} 会渲染为空字符串。建议在通知模板中避免单独依赖可能为空的变量,或使用条件格式:{{task.dueDate | 未设置}}(竖线后为默认值)。Dry-run 测试
Dry-run(试运行)测试允许你在规则正式启用前验证触发器、条件和动作的配置是否正确,而不会实际发送通知或创建记录。
执行 Dry-run 测试(逐步操作)
- 在规则编辑页面(或已保存规则的详情页),点击「测试此规则」按钮,打开测试面板。
- 选择测试事件数据来源:
- 使用真实事件:从最近的真实事件历史中选择一条作为测试输入(点击「加载最近事件」,从下拉列表中选择一条过去 7 天内的同类型事件)
- 构造测试事件:手动填写测试事件的关键字段(系统为未填写字段使用默认值)
- 确认测试输入数据后,点击「运行测试」,系统在约 2–5 秒内执行规则逻辑。
- 查看测试结果面板,分为三个部分:
- 触发器匹配:匹配 或 不匹配,不匹配时显示原因
- 条件评估:每个条件的评估结果(通过 / 不满足),显示实际值和条件值的比对
- 动作预览:每个动作的「如果真正执行」会产生的效果,例如通知内容渲染后的完整文本、将创建的任务的所有字段值
- 若测试结果与预期一致,点击「关闭测试面板」,然后点击「保存并启用」正式启用规则。
提示
X-PonyLab-Dryrun: true,便于目标服务在接收端区分测试请求和真实事件,并选择性处理。执行日志
每次规则被触发(无论条件是否满足、动作是否成功)都记录在执行日志中,用于审计、调试和性能监控。
查看执行日志
- 在自动化规则列表页,找到目标规则,点击「执行日志」标签(或进入规则详情页点击「日志」标签)。
- 默认显示最近 50 条执行记录,按时间倒序排列。
- 使用筛选器:按执行结果(全部/成功/失败/条件不满足)或日期范围筛选。
- 点击任意日志条目,展开详情:
- 执行时间:精确到毫秒的 UTC 时间戳
- 触发事件:触发的事件类型和相关记录 ID(可点击跳转到触发实体页面)
- 触发人:哪个用户的操作触发了此事件(定时触发显示「系统」)
- 条件评估详情:每个条件的字段路径、运算符、条件值、实际值、评估结果
- 动作执行结果:每个动作的执行状态(成功 / 失败 / 跳过),失败时显示详细错误信息
- 总执行耗时:从事件触发到所有动作完成的总时间
失败处理和重试
- 动作执行失败(如 Webhook 目标不可达、通知服务暂时故障)时,系统自动按指数退避策略重试:1 秒后重试 → 5 秒后重试 → 15 秒后重试,共 3 次。
- 全部重试失败后,在执行日志中标记为「最终失败」,并发送错误通知给团队 SUPER_ADMIN。
- 可在规则详情页点击失败的日志条目,选择「手动重试」立即重新执行该次动作。
- 连续失败超过 10 次的规则会被自动暂停,并发送告警通知给 SUPER_ADMIN,防止循环错误消耗资源。
提示
5 个详细示例规则
示例 1:实验被签名时通知 PI
最常见的自动化规则。当任意研究员完成实验签名后,立即通知 PI 审阅并进行 PI 签名,确保签名链完整。
触发器
experiment.signed附加配置:签名含义 = 「作者批准」(只在作者签名时触发,避免 PI 签名后再次触发)
条件
(无额外条件,所有实验签名都触发)
动作 1:发送应用内通知
接收人:角色 = PI
标题:{{experiment.title}} 已签名,等待 PI 审阅
内容:{{user.name}} 于 {{timestamp}} 完成了实验「{{experiment.title}}」的签名。请点击链接审阅并完成 PI 签名。
链接:{{experiment.url}}
动作 2:触发 Webhook(可选,同步到外部系统)
URL:https://your-lims.example.com/webhooks/ponylab
用途:通知外部 LIMS 系统有新的已签名实验数据可以同步
示例 2:库存低于最低水位时创建补货任务
实验室最常见的库存管理自动化:当关键试剂数量下降到最低水位以下时,自动创建补货任务,分配给实验室管理员,设置 3 天截止日期。
触发器
inventory.low_stock条件(AND 逻辑)
inventory.category equals 关键试剂
AND
inventory.quantity less_than inventory.minimumQuantity
(第二个条件确保只在真正低于阈值时触发,避免重复触发)
动作 1:创建任务
标题:补货:{{inventory.name}}(当前:{{inventory.quantity}}{{inventory.unit}})
描述:库存已低于最低水位。当前数量:{{inventory.quantity}}{{inventory.unit}},最低水位:{{inventory.minimumQuantity}}{{inventory.unit}}。请尽快向供应商下单补货。
分配给:角色 = ADMIN(实验室管理员)
优先级:HIGH
截止日期:触发时间 + 3 天
动作 2:发送通知
接收人:角色 = PI 和 角色 = ADMIN
标题:⚠ 库存预警:{{inventory.name}} 低于最低水位
示例 3:偏差报告后自动创建 CAPA
合规自动化的核心规则:当高影响协议偏差被记录时,自动创建 CAPA 并通知 PI,确保合规响应时间在 24 小时以内。
触发器
deviation.reported条件
deviation.severity equals HIGH
动作 1:创建 CAPA
类型:纠正措施(CA)
问题描述:实验「{{deviation.experiment.title}}」({{timestamp}})记录了高影响协议偏差:{{deviation.description}}。偏差类型:{{deviation.type}}。需要进行根因分析和纠正措施。
严重性:继承偏差严重性(HIGH)
责任人:角色 = PI
截止日期:触发时间 + 5 天
关联到触发偏差记录:✓
动作 2:发送应用内通知
接收人:角色 = PI 和 角色 = SUPER_ADMIN
标题:🚨 高影响偏差 - 已自动创建 CAPA
内容:实验「{{deviation.experiment.title}}」记录了高影响偏差,CAPA 已自动创建并分配给你。请在 5 天内完成调查。
示例 4:任务逾期时发送 Webhook 到 Slack
将 PonyLab 的任务逾期通知推送到实验室的 Slack 频道,让团队在熟悉的工具中收到提醒。
触发器
task.overdue附加配置:逾期天数 ≥ 2 天
条件
task.priority in [URGENT, HIGH]
动作:触发 Webhook
URL:https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
HTTP 方法:POST
Payload(Slack Block Kit 格式):
{
"text": "⚠️ 任务逾期提醒",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*⚠️ 高优先级任务已逾期 {{task.overdueDays}} 天*\n任务:<{{task.url}}|{{task.title}}>\n项目:{{task.project.name}}\n负责人:{{task.assigneeNames}}"
}
}
]
}示例 5:项目所有任务完成时更新实验状态
当项目中所有关联任务都完成时,自动将关联的实验状态更新为「COMPLETED」,并通知 PI 进行最终签名,实现实验-任务的自动联动。
触发器
task.completed条件
task.project.completionRate equals 100
(只有在该任务完成后,项目完成率达到 100% 时才触发后续动作)
动作 1:更新项目状态
目标实体:该任务所属的项目
新状态:已完成
变更备注:由自动化规则触发:所有任务于 {{timestamp}} 完成
动作 2:发送通知
接收人:角色 = PI
标题:项目「{{task.project.name}}」的所有任务已完成
内容:所有任务已于 {{timestamp}} 全部完成。请前往审阅并对关联实验进行最终签名。
最佳实践
最佳实践
最佳实践
最佳实践
X-PonyLab-Signature HMAC 签名验证)。防止伪造的请求触发接收端逻辑。最佳实践
注意
典型使用场景
场景 1:小型课题组(5–10 人)基础自动化套装
推荐从以下 3 条规则开始,覆盖日常最高频需求:
- 实验完成 → 通知 PI 签名(示例 1 变体)
- 任务逾期 → 通知负责人和 PI
- 关键库存低于阈值 → 创建补货任务(示例 2)
场景 2:受监管实验室合规自动化套装
在基础套装基础上,增加以下合规相关规则:
- 高影响偏差 → 自动创建 CAPA(示例 3)
- CAPA 逾期 3 天 → 升级通知给 SUPER_ADMIN
- 仪器鉴定 30 天内到期 → 通知设备管理员
- 协议有效期 30 天内到期 → 通知协议作者安排审核
场景 3:与外部系统集成(ERP / Slack / 自研 LIMS)
利用 Webhook 动作构建 PonyLab 与外部系统的实时数据流:
- 实验签名完成 → Webhook 到 ERP 系统(同步实验数据用于成本核算)
- 库存调整 → Webhook 到 Slack #lab-inventory 频道
- 样品创建 → Webhook 到自研 LIMS(同步样品元数据)
- 每日 07:00 定时 → Webhook 到看板工具(获取今日任务摘要)
常见问题(FAQ)
Q: 一个团队可以创建多少条自动化规则?
A: 免费版最多 5 条规则;标准版最多 50 条;企业版无限制。当前规则数量和限制可在「系统 → 自动化」页面顶部查看。
Q: 如果规则的 Webhook 目标 URL 长期不可用,规则会怎样?
A: 连续 10 次执行失败后,规则会被自动暂停(状态变为「已暂停-错误」),并发送告警通知给 SUPER_ADMIN。修复目标 URL 后,在规则详情页点击「恢复规则」即可重新启用。
Q: 定时触发器的时区是以哪个为准?
A: 定时触发器使用团队时区(在「系统 → 团队设置 → 时区」中配置,默认 UTC+8)。修改团队时区后,所有定时规则立即按新时区计算下次触发时间。
Q: 自动化规则创建的 CAPA 和手动创建的有什么区别?
A: 功能完全一样,唯一的区别是:自动创建的 CAPA 在「创建方式」字段显示「自动化规则:[规则名称]」,在审计追踪中显示由系统自动创建。此外,自动创建的 CAPA 问题描述中会包含触发规则时自动填入的上下文信息(如偏差描述),节省手动填写时间。
Q: 可以在规则中引用当前登录用户吗?
A: 不可以。自动化规则在后台执行,没有「当前登录用户」的概念。触发规则的用户可以通过 {{user.name}} 引用,但如果是定时触发,user 相关变量为空。如需根据触发者动态路由通知,使用「接收人 = 触发人」选项。
Q: Webhook 请求体支持嵌套 JSON 吗?
A: 支持。Payload 模板可以是任意合法的 JSON 结构,包括嵌套对象和数组。系统会先解析模板变量,然后将结果作为 JSON 请求体发送。注意:变量值中若含有引号或特殊字符,系统会自动 JSON 转义。
Q: 同一个事件可以匹配多条规则吗?
A: 是的。当一个事件发生时,所有匹配该事件类型且条件满足的规则都会执行(并行执行,互不影响)。执行顺序不保证,但通常按规则创建时间排序。建议避免依赖多条规则的执行顺序。
Q: 规则能访问历史数据吗?(如「最近 30 天内已经创建了 3 次 CAPA」)
A: 当前规则引擎不支持聚合查询(如计数、求和)。规则只能访问触发事件本身的数据。如果需要基于历史数据的复杂条件,建议通过 Webhook 将事件推送到外部系统,在外部系统中实现复杂逻辑后再调用 PonyLab API。
Q: 如何暂时禁用某条规则(如节假日期间)?
A: 在自动化规则列表页,找到目标规则,点击最右侧的开关图标(绿色=启用,灰色=禁用)即可切换。禁用状态下规则不会执行,但配置保留,随时可以重新启用。也可以设置「规则有效期」(在规则详情页),在指定时间范围外自动禁用。
Q: 动作执行的顺序有保证吗?如果动作 1 失败,动作 2 还会执行吗?
A: 动作按列表顺序串行执行,顺序有保证。默认情况下,动作 1 失败不影响动作 2 执行(每个动作独立重试)。如果业务逻辑要求动作 1 成功才执行动作 2,可以勾选「失败时停止」选项,此时动作 1 失败后后续动作不再执行。
故障排查
问题:规则已启用,事件发生后但没有执行
原因:① 触发器类型与实际事件不匹配;② 条件评估不满足(最常见原因);③ 规则被自动暂停(连续失败 10 次)。
解决方法:① 在执行日志中查找该事件发生时间附近的记录(有日志代表规则被触发,哪怕条件不满足也会记录);② 若日志中没有记录,检查触发器类型是否正确;③ 若日志中有「条件不满足」记录,展开详情查看哪个条件的实际值与预期不符;④ 检查规则状态是否为「已暂停-错误」。
问题:Webhook 请求成功发送但目标服务没有收到
原因:① 目标服务的防火墙/白名单未放行 PonyLab 的 IP;② 目标 URL 使用 HTTP 而非 HTTPS(PonyLab 只支持 HTTPS);③ 目标服务响应超时(超过 10 秒)被误认为失败。
解决方法:① 将 PonyLab Webhook 出口 IP 段加入白名单(IP 范围在「系统 → 自动化 → Webhook 设置」中查看);② 确认目标 URL 以 https:// 开头;③ 在执行日志中查看 HTTP 响应状态码,超时的会显示「Timeout」。
问题:模板变量在通知中显示为 {{experiment.title}} 而不是实际值
原因:变量名拼写错误(区分大小写),或该触发器不支持该变量。
解决方法:参照「模板变量」章节检查变量名拼写(全小写,点号分隔)。使用 Dry-run 测试查看变量渲染后的实际内容,确认哪些变量有值、哪些为空。
问题:定时规则没有在预期时间触发
原因:① 团队时区设置与预期不符(如设置了 UTC+8 但实际使用 UTC);② 规则配置的是每周二,但当天是周一;③ 规则在目标时间前被暂停了。
解决方法:① 在「系统 → 团队设置 → 时区」确认当前时区;② 在规则详情页确认定时配置;③ 检查执行日志,查看上次成功触发的时间;④ 注意定时触发器有 ±5 分钟的执行窗口(不精确到秒),可能稍早或稍晚触发。
问题:CREATE_CAPA 动作创建了大量重复的 CAPA
原因:触发器 inventory.low_stock 在库存量一直低于阈值时,每次有库存变动(如消耗)都会触发,导致反复创建 CAPA。
解决方法:在条件中添加「最近 N 天内未创建同类 CAPA」的防重条件(如果系统支持),或改用定时触发器(每周检查一次库存水位)代替事件触发。也可以在创建 CAPA 的动作后,添加「为库存条目添加标签『已处理』」的动作,并在条件中增加「inventory.tags not_contains 已处理」。
问题:通知发送了,但接收人只收到应用内通知,没有收到邮件
原因:① 该用户在「个人设置 → 通知」中关闭了自动化规则的邮件通知;② 邮件被邮件服务商标记为垃圾邮件。
解决方法:① 通知该用户检查个人通知设置;② 提示用户将 [email protected] 加入邮件白名单/受信发件人;③ 检查该团队的邮件发送配置是否使用了自定义 SMTP 且配置正确。
问题:规则触发后动作执行很慢(超过 1 分钟)
原因:① Webhook 目标响应慢;② 系统在高负载状态下队列积压。
解决方法:① 检查 Webhook 目标服务的响应时间(在执行日志中查看动作执行耗时);② 若 Webhook 目标不需要等待完整处理,配置目标服务立即返回 200(异步处理),而非等处理完再响应;③ 系统队列积压情况可在「系统 → 状态」中查看。
问题:无法选择某个团队成员作为通知接收人
原因:该成员可能已被移出团队,或其账号处于禁用状态。
解决方法:在「设置 → 团队成员」中确认该成员的账号状态。若成员已离职,应更新规则的接收人为当前在职成员,避免通知发送到无效账号。