自动化

工作流自动化

通过「触发器 → 条件 → 动作」规则引擎,将实验室中的重复性工作自动化,减少人工干预,提升团队响应速度。本页提供规则引擎的完整操作指引、所有触发器和动作的详细说明,以及 5 个实际应用场景示例。

工作流引擎架构

事件来源实验/任务/库存用户操作 / 定时触发事件规则引擎匹配触发器查找所有匹配的规则规则列表条件检查评估 AND/OR 逻辑字段比较 / 值匹配条件不满足 → 跳过通过动作执行器按顺序执行动作通知/任务/Webhook执行日志(结果存档)

工作流引擎持续监听系统事件。当事件发生时,引擎查找所有匹配该事件类型的规则,对每条规则评估其条件,仅在条件满足时执行配置的动作序列。每次执行结果写入执行日志供审计和排查。

什么是工作流自动化

工作流自动化允许你定义「当 X 事件发生时,如果满足 Y 条件,则执行 Z 动作」的规则,无需手动触发。规则一旦创建并启用,在后台持续运行,7×24 小时不间断。

对于非技术用户,可以把工作流规则理解为「实验室助理的值班规则」:你告诉助理「如果库存的乙醇少于 5 瓶,立刻通知李管理员补货」,此后你不用再记着检查库存,助理会自动帮你盯着。

自动化能解决什么问题

消除人工监控

不再需要每天手动检查库存水位、任务截止日期、仪器鉴定状态。

加速合规响应

高影响偏差发生时,自动创建 CAPA 并通知质量经理,而非等到周会才发现。

减少沟通成本

实验完成时自动通知 PI 审阅,不需要逐一发消息提醒。

系统集成

通过 Webhook 将 PonyLab 事件推送到 Slack、企业微信、自定义 LIMS 等外部系统。

自动化规则在 系统 → 自动化 中管理。每个规则的执行结果记录在「执行日志」中,支持排查问题。

创建规则(逐步操作)

  1. 前往「系统 → 自动化」,点击右上角「+ 新建规则」蓝色按钮,打开规则创建向导。
  2. 第一步:设置触发器

    从触发器下拉列表中选择触发该规则的事件类型。触发器按类别分组(实验事件/任务事件/样品事件/库存事件/合规事件/团队事件/定时触发),见下方触发器完整列表。

    选择触发器后,某些触发器会显示附加配置项。例如选择 experiment.status_changed 后,需要指定「目标状态」(如 COMPLETED),规则只在状态变更为指定值时触发,而非任意状态变更都触发。

  3. 第二步:添加条件(可选)

    条件进一步筛选触发范围。点击「+ 添加条件」,每个条件由三部分组成:

    • 字段:触发实体的字段(如 experiment.typeinventory.quantity
    • 运算符:等于 / 不等于 / 大于 / 小于 / 包含 / 以…开头 / 为空 / 不为空
    • :比较的目标值

    多个条件之间通过「AND」(所有条件都满足)或「OR」(任意条件满足)逻辑连接。默认为 AND 逻辑。

    示例:触发器 experiment.status_changed 目标状态=COMPLETED,添加条件「实验类型 等于 PCR」,则规则只在 PCR 类型实验完成时触发。

  4. 第三步:配置动作

    点击「+ 添加动作」,从动作类型列表中选择(见下方动作完整列表)。一条规则可以配置多个动作,按列表顺序依次执行。

    每种动作有各自的配置参数。在配置文本内容时,可以使用 {{变量名}} 语法引用触发事件的上下文数据(见「模板变量」章节)。

  5. 第四步:命名规则

    给规则起一个描述性名称,建议格式:「[触发条件] → [执行动作]」,例如:「PCR 实验完成 → 通知 PI」、「库存低于阈值 → 创建补货任务」。清晰的命名有助于团队成员理解规则用途。

  6. 第五步(推荐):Dry-run 测试

    点击「测试此规则」,在规则正式启用前验证逻辑是否正确(见「Dry-run 测试」章节)。

  7. 点击「保存并启用」完成。规则立即进入激活状态,从下一个匹配事件开始执行。

提示

建议先用「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.overdueCAPA 截止日期已过但状态未关闭(每天检查)升级通知给 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 / LOWHIGH
截止日期固定日期,或「触发时间 + 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:更新记录状态

自动将触发实体的状态更新为指定值。仅允许合规的状态跃迁(不能跳过中间状态)。

配置参数说明
目标实体触发实体本身,或关联实体(如「该任务所属的项目」)
新状态目标状态值(仅显示从当前状态可以跃迁到的状态,防止非法状态变更)
变更备注自动记录在审计日志中的变更原因说明

注意

UPDATE_STATUS 动作会直接修改记录状态,此操作记录在审计追踪中,显示为「由自动化规则 [规则名称] 触发的状态变更」。在 GxP 环境中使用此动作前,请确认自动状态变更符合你的 SOP 要求。

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 测试(逐步操作)

  1. 在规则编辑页面(或已保存规则的详情页),点击「测试此规则」按钮,打开测试面板。
  2. 选择测试事件数据来源:
    • 使用真实事件:从最近的真实事件历史中选择一条作为测试输入(点击「加载最近事件」,从下拉列表中选择一条过去 7 天内的同类型事件)
    • 构造测试事件:手动填写测试事件的关键字段(系统为未填写字段使用默认值)
  3. 确认测试输入数据后,点击「运行测试」,系统在约 2–5 秒内执行规则逻辑。
  4. 查看测试结果面板,分为三个部分:
    • 触发器匹配匹配 不匹配,不匹配时显示原因
    • 条件评估:每个条件的评估结果(通过 / 不满足),显示实际值和条件值的比对
    • 动作预览:每个动作的「如果真正执行」会产生的效果,例如通知内容渲染后的完整文本、将创建的任务的所有字段值
  5. 若测试结果与预期一致,点击「关闭测试面板」,然后点击「保存并启用」正式启用规则。

提示

对于 Webhook 动作,Dry-run 会向目标 URL 发送真实的 HTTP 请求,但请求头中包含 X-PonyLab-Dryrun: true,便于目标服务在接收端区分测试请求和真实事件,并选择性处理。

执行日志

每次规则被触发(无论条件是否满足、动作是否成功)都记录在执行日志中,用于审计、调试和性能监控。

查看执行日志

  1. 在自动化规则列表页,找到目标规则,点击「执行日志」标签(或进入规则详情页点击「日志」标签)。
  2. 默认显示最近 50 条执行记录,按时间倒序排列。
  3. 使用筛选器:按执行结果(全部/成功/失败/条件不满足)或日期范围筛选。
  4. 点击任意日志条目,展开详情:
    • 执行时间:精确到毫秒的 UTC 时间戳
    • 触发事件:触发的事件类型和相关记录 ID(可点击跳转到触发实体页面)
    • 触发人:哪个用户的操作触发了此事件(定时触发显示「系统」)
    • 条件评估详情:每个条件的字段路径、运算符、条件值、实际值、评估结果
    • 动作执行结果:每个动作的执行状态(成功 / 失败 / 跳过),失败时显示详细错误信息
    • 总执行耗时:从事件触发到所有动作完成的总时间

失败处理和重试

  • 动作执行失败(如 Webhook 目标不可达、通知服务暂时故障)时,系统自动按指数退避策略重试:1 秒后重试 → 5 秒后重试 → 15 秒后重试,共 3 次。
  • 全部重试失败后,在执行日志中标记为「最终失败」,并发送错误通知给团队 SUPER_ADMIN。
  • 可在规则详情页点击失败的日志条目,选择「手动重试」立即重新执行该次动作。
  • 连续失败超过 10 次的规则会被自动暂停,并发送告警通知给 SUPER_ADMIN,防止循环错误消耗资源。

提示

定期检查执行日志是良好的运维习惯。建议每周查看「失败」筛选结果,确保关键自动化规则(如 CAPA 创建、合规通知)正常运行。

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}} 全部完成。请前往审阅并对关联实验进行最终签名。

最佳实践

最佳实践

先 Dry-run 再启用:任何新建规则在正式启用前,都先用 Dry-run 测试验证逻辑。特别是包含「创建 CAPA」或「更新状态」动作的规则,错误配置可能创建大量不必要的记录或造成状态混乱。

最佳实践

规则命名遵循「触发 → 动作」格式:清晰的规则名称便于团队成员理解和排查。例如「高影响偏差 → 自动创建 CAPA」比「偏差规则 1」更直观。

最佳实践

为 Webhook 配置签名验证:在接收 Webhook 的服务端,始终验证 PonyLab 发送的请求是否真实(通过请求头中的 X-PonyLab-Signature HMAC 签名验证)。防止伪造的请求触发接收端逻辑。

最佳实践

避免规则循环触发:规则动作本身也可能触发事件(如「UPDATE_STATUS 动作」会产生一个 status_changed 事件)。设计规则时确保动作不会触发另一条规则从而形成无限循环。PonyLab 有循环检测(同一条规则 60 秒内最多触发 10 次),但最好从设计上避免。

注意

定期检查执行日志中的失败记录。关键自动化(如合规通知、CAPA 创建)静默失败比没有自动化更危险,因为你以为系统在工作,实际上它没有。

典型使用场景

场景 1:小型课题组(5–10 人)基础自动化套装

推荐从以下 3 条规则开始,覆盖日常最高频需求:

  1. 实验完成 → 通知 PI 签名(示例 1 变体)
  2. 任务逾期 → 通知负责人和 PI
  3. 关键库存低于阈值 → 创建补货任务(示例 2)

场景 2:受监管实验室合规自动化套装

在基础套装基础上,增加以下合规相关规则:

  1. 高影响偏差 → 自动创建 CAPA(示例 3)
  2. CAPA 逾期 3 天 → 升级通知给 SUPER_ADMIN
  3. 仪器鉴定 30 天内到期 → 通知设备管理员
  4. 协议有效期 30 天内到期 → 通知协议作者安排审核

场景 3:与外部系统集成(ERP / Slack / 自研 LIMS)

利用 Webhook 动作构建 PonyLab 与外部系统的实时数据流:

  1. 实验签名完成 → Webhook 到 ERP 系统(同步实验数据用于成本核算)
  2. 库存调整 → Webhook 到 Slack #lab-inventory 频道
  3. 样品创建 → Webhook 到自研 LIMS(同步样品元数据)
  4. 每日 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(异步处理),而非等处理完再响应;③ 系统队列积压情况可在「系统 → 状态」中查看。

问题:无法选择某个团队成员作为通知接收人

原因:该成员可能已被移出团队,或其账号处于禁用状态。

解决方法:在「设置 → 团队成员」中确认该成员的账号状态。若成员已离职,应更新规则的接收人为当前在职成员,避免通知发送到无效账号。