AI PLAY玩法更新持续收录
← 回到更新流

2026-09-02 · 原文发布日

恶劣天气自动冻结配送并开工单

n8n免费模板:每15分钟查Open-Meteo天气,判定大雪、洪水预警或低能见度后先查Postgres冷却期防重复告警,再拉当日配送清单交Gemini判断哪些门店受影响并生成事件摘要和优先级,自动建ServiceNow工单、更新告警状态、Slack通知运营,出错也会落库并告警。

原文要点

原作者iamvaar发布的免费n8n模板:每15分钟轮询Open-Meteo天气接口,对配置区域判定大雪、洪水预警或低能见度;命中后先查Postgres的weather_alert_log表冷却期抑制重复告警,无重复则插入processing记录并取当日该邮编的delivery_manifests配送行,交给Gemini(models/gemini-3.1-flash-lite,带结构化输出的agent)判断受影响门店、生成事件摘要、优先级与预计延误;随后用ServiceNow Basic Auth建工单,把告警记录更新为active或no_impact,并发Slack运营摘要;任一出错会把失败细节写入weather_workflow_error_log并向Slack发含执行链接的告警。需自建三张Postgres表并配置区域、邮编、经纬度和冷却小时数。

这次做成什么

照着本页在n8n里搭出同链路的最小可用版:天气触发→冷却去重→配送清单→AI判定→工单与通知。因原模板未附表结构和提示词全文,下方SQL与提示词为本站独立设计的练习方案,需与原模板节点字段逐一核对。

准备什么

  • 一个可联网的n8n实例(自托管或云版)及编辑工作流权限
  • Postgres数据库账号密码及建表权限,用于建三张日志与清单表
  • Google Gemini(PaLM)API凭据,ServiceNow实例Basic Auth账号且有建事件权限
  • Slack工作区凭据、一个告警频道ID和一个接收运营摘要的用户或频道
  • Open-Meteo无需密钥,但要知道目标区域邮编与经纬度

具体怎么做

  1. 建三张Postgres表

    在Postgres凭据下用n8n的Postgres节点或psql执行下方DDL:delivery_manifests存当日配送行(含zip、store_name、delivery_window),weather_alert_log存告警状态(status取值processing/active/no_impact),weather_workflow_error_log存失败详情与执行链接。建完插入两条测试配送数据。

  2. 配置定时触发与区域参数

    加Schedule Trigger设为每15分钟;其后接Set节点定义region_name、zip_code、latitude、longitude、cooldown_hours(示例设6)。再接HTTP Request节点GET https://api.open-meteo.com/v1/forecast,query参数带latitude、longitude、current=snowfall,visibility、daily=precipitation_probability。

  3. 严重天气判定与冷却去重

    用Code或IF节点实现判定:当前snowfall>0且累计偏大判大雪,visibility<1000米判低能见度,降水概率超阈值且强度大判洪水预警(阈值为本站示例值,请在原模板核对)。命中后执行Postgres查询:SELECT id FROM weather_alert_log WHERE region=$1 AND event_type=$2 AND status IN ('processing','active') AND created_at > NOW() - ($3 || ' hours')::interval;有结果则Stop并结束,无则INSERT一条status=processing记录并取其id。

  4. 拉配送清单并交Gemini判定

    Postgres节点查询当日该邮编配送行,结果作为JSON传给AI Agent节点(Gemini模型设为models/gemini-3.1-flash-lite),开启结构化输出,提示词用下方材料,要求返回affected_stores数组、incident_summary、priority、estimated_delay。若affected_stores为空,走分支把告警记录UPDATE为no_impact并结束。

  5. 建ServiceNow工单并通知

    HTTP Request节点POST到https://你的实例.service-now.com/api/now/table/incident,Basic Auth,body含short_description=incident_summary、urgency映射priority。成功后UPDATE weather_alert_log为active并写入工单号,再用Slack节点向运营用户发送摘要文本(模板见材料)。

  6. 错误兜底

    在工作流Settings里启用Error Workflow或在关键节点接Error分支:把error.message、execution.id、当前URL拼成文本INSERT进weather_workflow_error_log,并发Slack到告警频道。

可直接复制的材料

三张Postgres表DDL与测试数据

本站独立编写的示例结构,字段名需与原模板查询语句逐一对照;测试数据为虚构门店。

CREATE TABLE delivery_manifests (
  id SERIAL PRIMARY KEY,
  delivery_date DATE NOT NULL,
  zip_code VARCHAR(10) NOT NULL,
  store_name VARCHAR(100) NOT NULL,
  delivery_window VARCHAR(50),
  status VARCHAR(20) DEFAULT 'scheduled'
);
CREATE TABLE weather_alert_log (
  id SERIAL PRIMARY KEY,
  region VARCHAR(100) NOT NULL,
  event_type VARCHAR(30) NOT NULL,
  status VARCHAR(20) NOT NULL DEFAULT 'processing',
  servicenow_ticket VARCHAR(40),
  created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE weather_workflow_error_log (
  id SERIAL PRIMARY KEY,
  error_message TEXT,
  execution_url TEXT,
  created_at TIMESTAMPTZ DEFAULT NOW()
);
INSERT INTO delivery_manifests (delivery_date, zip_code, store_name, delivery_window) VALUES
 (CURRENT_DATE, '10001', '曼哈顿中城店', '09:00-11:00'),
 (CURRENT_DATE, '10001', '切尔西店', '13:00-15:00');

Gemini受影响门店判定提示词

本站独立编写;原模板用带结构化输出的agent,建议在n8n AI Agent节点开require specific output format并配JSON schema,变量插值按你的上游节点名调整。

你是物流调度助手。现在区域【{{$json.region_name}}】出现恶劣天气事件:{{$json.event_type}},当前观测:降雪{{$json.snowfall}}厘米,能见度{{$json.visibility}}米。
以下是该区域今日配送清单(JSON):
{{JSON.stringify($json.manifests)}}
请判断哪些门店的配送会受影响,并只返回如下JSON,不要输出任何其他文字:
{"affected_stores":["门店名1"],"incident_summary":"一句话事件摘要","priority":"high|medium|low","estimated_delay":"预计延误时长,如2-4小时"}
判断规则:能见度低于1000米或大雪时所有当日配送均受影响;若清单为空,affected_stores返回空数组。

Slack运营摘要消息模板

本站示例文案,变量名需与Gemini结构化输出和ServiceNow返回字段对齐。

【恶劣天气配送冻结】区域:{{$json.region_name}}(邮编{{$json.zip_code}})
事件类型:{{$json.event_type}}
受影响门店:{{$json.affected_stores.join('、')}}
预计延误:{{$json.estimated_delay}}
ServiceNow工单:{{$json.ticket_number}}
优先级:{{$json.priority}}

输入与输出示例

本站虚构演示,非原模板实测结果;工单号、模型输出均为示意。

输入

区域=上海浦东示范仓,邮编200120,经纬度31.23,121.47;Open-Meteo返回当前能见度650米、降雪0;当日配送清单含“张江店 09:00-11:00”和“金桥店 14:00-16:00”两行;weather_alert_log近6小时内无同区域active记录。

对应输出

冷却查询返回0行→插入id=42的processing记录→Gemini返回{"affected_stores":["张江店","金桥店"],"incident_summary":"浦东区域大雾能见度650米,今日两单配送受影响","priority":"high","estimated_delay":"2-4小时"}→ServiceNow建单返回number=INC0012345→告警42更新为active并写入INC0012345→Slack发送含两店名与工单号的冻结摘要。

做完检查这些

  • 手动执行一次,weather_alert_log新增一条status=processing且region与event_type正确的记录
  • 15分钟内再次触发同区域同事件时,冷却查询返回已有记录且流程不再新建工单
  • delivery_manifests当日该邮编有数据时,Gemini返回的JSON能被解析且含affected_stores等四个键
  • 清单为空时记录被更新为no_impact且不调用ServiceNow建单接口
  • 故意填错ServiceNow密码后,weather_workflow_error_log新增一行且Slack告警频道收到含执行链接的消息

容易卡住的地方

  • 三张表必须提前建好且字段与模板查询一致,否则第一次运行就在Postgres节点报错
  • cooldown_hours只在Set节点改了还不够,Postgres查询里的间隔表达式要引用同一变量
  • Gemini节点没开结构化输出时模型可能返回带解释的文字,导致下游JSON解析失败
  • ServiceNow账号仅有Basic Auth不代表有incident表写权限,需先在实例里确认角色
  • Open-Meteo的visibility单位是米,阈值按千米写会永远或从不触发

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Route weather-based delivery holds with Open-Meteo, Gemini, Postgres, and ServiceNow
原作者
iamvaar
原始发布日期
2026-09-02T12:38:34.006Z
来源
https://n8n.io/workflows/19066