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无需密钥,但要知道目标区域邮编与经纬度
具体怎么做
建三张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存失败详情与执行链接。建完插入两条测试配送数据。
配置定时触发与区域参数
加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。
严重天气判定与冷却去重
用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。
拉配送清单并交Gemini判定
Postgres节点查询当日该邮编配送行,结果作为JSON传给AI Agent节点(Gemini模型设为models/gemini-3.1-flash-lite),开启结构化输出,提示词用下方材料,要求返回affected_stores数组、incident_summary、priority、estimated_delay。若affected_stores为空,走分支把告警记录UPDATE为no_impact并结束。
建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节点向运营用户发送摘要文本(模板见材料)。
错误兜底
在工作流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