2026-10-13 · 原文发布日
光伏项目回款卡点每日调度计划
每周一到周六早上从Google Sheets拉取站点、排期、电力审批、技师、回款节点、配件和历史消息记录,先算出审批阻塞、配件到货、客户时间和欠款情况,交给Gemini生成技师上门、办公室行动、延期取消和对外消息的调度计划;再用确定性规则剔除违规安排(如配件未到仍上门、催款超限),写回Action_Plan表并按计划发WhatsApp模板消息,支持先跑干跑模式。
原文要点
原工作流每周一到周六早上7点定时运行,从Google Sheets读取Sites、Scheduled_Visits、Utility_Approvals、Technicians、Payment_Milestones、Parts_Required、Outbound_Log七个标签页,先在工作流内算出审批阻塞、配件到货时间、客户可约时间、技师邻近度和欠款金额,再把这份预计算上下文交给Gemini生成包含技师上门、办公室行动、延期取消和对外消息的结构化计划;随后用确定性规则剔除违规安排,把计划写回Action_Plan表,解析收件人号码后按dry_run或live模式发WhatsApp模板消息(模板接受一个正文参数),发送结果记入Outbound_Log。模板免费,需自备Google服务账号、Gemini API和WhatsApp Business Cloud凭据。
这次做成什么
在本站练习环境里复刻这条「读表→预计算→Gemini生成→规则护栏→写回→发消息」的调度链路:用合成光伏项目数据跑通干跑模式,验证Action_Plan输出与Outbound_Log日志后再考虑切换live。
准备什么
- n8n实例(自托管或云端)并已导入该免费模板
- 一个Google Sheets工作簿,建好Sites、Scheduled_Visits、Utility_Approvals、Technicians、Payment_Milestones、Parts_Required、Action_Plan、Outbound_Log八个标签页
- 对该表有权限的Google Sheets服务账号凭据,并选中到所有Sheets节点
- Google Gemini(Google PaLM)API凭据
- WhatsApp Business Cloud API凭据、Phone Number ID和一个接受一个正文参数的已审批模板;干跑阶段可先用测试号
具体怎么做
建表并填入合成数据
新建Google Sheets工作簿,按上面八个名字建标签页。Sites列建议:site_id、customer_name、address、lat、lng;Scheduled_Visits:visit_id、site_id、scheduled_date、purpose、technician_id;Utility_Approvals:site_id、approval_status、expected_date;Parts_Required:site_id、part_name、eta_date、received;Payment_Milestones:site_id、milestone、amount_due、due_date、paid;Outbound_Log留空待写入。把本站artifacts里的合成CSV粘进对应标签页,再把工作簿ID填进工作流config节点。
配置凭据与运行参数
在n8n里创建Google服务账号凭据并逐个点选到全部Sheets节点;添加Gemini(Google PaLM)凭据给聊天模型节点;在config节点填spreadsheet_id、send_mode=dry_run、test_phone(你的测试号)、office_phone、WhatsApp Phone Number ID和模板名/语言。先不要激活定时器。
核对预计算与Gemini提示词
找到拼接上下文的节点,确认它在调模型前已算出每站点的approval阻塞、配件ETA、客户可约性、欠款合计,而不是让模型自己翻原始表。把本站提供的调度提示词与模板内提示词对照,缺失的输出字段(technician_visits、office_actions、deferred、messages、guardrail_notes)在提示词里补齐。
干跑并检查护栏
手动执行一次工作流。打开Action_Plan表,应看到summary、visit_plan、actions、messages、guardrail_notes几类行;核对护栏确实剔除了「配件未到仍上门」「同一客户催款超上限」之类的安排。Outbound_Log在dry_run下应记录消息但路由到test_phone,不发给真实客户。
验证后再切live
连续几天干跑确认计划合理、号码解析正确后,才把send_mode改为live并激活周一至周六早7点的定时触发;切换当天盯Outbound_Log的发送状态列,失败的行要有错误原因。
可直接复制的材料
Gemini每日调度计划生成提示词(本站编写,对照补齐用)
本站独立编写的对齐提示词,模板内已有自己的提示词,此份用于核对字段和规则是否齐全;{{$json.context}}占位符需与上游拼接节点输出字段名一致。
你是光伏运维公司的每日调度员。下面是今天已预计算好的项目上下文(JSON),其中blockers字段已包含审批状态、配件到货日期、客户可约性和欠款金额,不要再自行推断。
请输出严格的JSON,不要输出任何其他文字,结构如下:
{
"summary": "今日调度要点,50字以内",
"technician_visits": [{"visit_id": "", "site_id": "", "technician_id": "", "reason": "", "planned_time": "HH:MM"}],
"office_actions": [{"site_id": "", "action": "call_customer|chase_utility|chase_payment|order_parts", "detail": ""}],
"deferred_or_cancelled": [{"visit_id": "", "decision": "deferred|cancelled", "reason": ""}],
"outbound_messages": [{"recipient_type": "customer|technician|utility_officer|office", "site_id": "", "body_param": "填入WhatsApp模板唯一正文参数,60字以内"}]
}
硬性规则:
1. 配件未到货(received=false且eta_date在今天之后)的站点不得安排上门;
2. 电力审批approval_status不是approved的站点不安排并网类上门,只能派办公室催办;
3. 同一技师一天最多4单,按地址邻近度合并路线;
4. 同一客户7天内催款消息最多2条;客户明确说今天不方便的不安排上门;
5. 每条延期或取消都必须给出原因。
今日上下文:
{{$json.context}}合成示例数据(Sites与Payment_Milestones,CSV)
本站虚构的合成练习数据,直接粘进对应标签页;其余标签页按steps第1步的列建议自行补两三行即可。
site_id,customer_name,address,lat,lng
S001,陈建国,广州市天河区体育西路12号,23.132,113.321
S002,李秀兰,广州市天河区中山大道88号,23.128,113.356
S003,王志强,广州市越秀区东风中路301号,23.129,113.275
site_id,milestone,amount_due,due_date,paid
S001,并网尾款,18000,2026-10-05,false
S002,安装中期款,9000,2026-10-20,false
S003,定金,5000,2026-09-28,trueconfig节点参考值(JSON)
本站设定的参考值,非原模板原文;字段名需在导入的工作流config节点里核对后再改。测试号用你控制的号码,不要填真实客户号码。
{
"spreadsheet_id": "替换为你的Google工作簿ID",
"send_mode": "dry_run",
"test_phone": "8613800000000",
"office_phone": "8613900000000",
"whatsapp_phone_number_id": "替换为Meta后台的Phone Number ID",
"whatsapp_template_name": "替换为已审批模板名",
"whatsapp_template_language": "zh_CN",
"max_visits_per_technician": 4,
"payment_reminder_cooldown_days": 7,
"payment_reminder_max_per_cooldown": 2
}输入与输出示例
本站虚构演示,未真实调用Gemini;用于说明上下文与计划输出的字段对应关系。
输入
今日上下文片段:S001配件received=false、eta_date=2026-10-15,欠款18000元已逾期8天;S002审批approved、配件已到、客户今天方便,欠款9000元未到期;技师T01距两站都在5公里内。对应输出
{"summary":"S002安排T01上门并网,S001配件未到改催件与催款","technician_visits":[{"visit_id":"V201","site_id":"S002","technician_id":"T01","reason":"审批通过与配件齐备","planned_time":"10:00"}],"office_actions":[{"site_id":"S001","action":"chase_payment","detail":"并网尾款18000元逾期8天,电话催缴"},{"site_id":"S001","action":"order_parts","detail":"确认配件10月15日到货"}],"deferred_or_cancelled":[{"visit_id":"V101","decision":"deferred","reason":"配件未到货,不得安排上门"}],"outbound_messages":[{"recipient_type":"customer","site_id":"S002","body_param":"李秀兰女士您好,技师今天10点上门并网"}]}做完检查这些
- 手动执行一次后,Action_Plan表新增summary、visit_plan、actions、messages、guardrail_notes五类记录且日期为当天
- 配件标记未到的S001不出现在任何technician_visits行里,且对应visit被标为deferred并带原因
- dry_run模式下Outbound_Log有记录但recipient全部是test_phone,没有真实客户号码
- 同一客户在日志中7天内催款消息不超过2条
- config的spreadsheet_id、模板名、Phone Number ID均已替换为真实值
容易卡住的地方
- Gemini凭据要选Google PaLM类型的聊天模型凭据,选错类型节点会报模型不可用
- WhatsApp模板只接受一个正文参数,提示词里让模型输出多段长文会导致模板变量塞不下而发送失败
- 护栏在工作流内是确定性规则,不经过模型;若发现违规安排仍写进Action_Plan,先查护栏节点的字段映射是否因改表头而失效
- 切live前务必连续几天干跑核对号码解析,错配号码会把催款消息发给无关客户
- 早7点定时触发按n8n实例所在时区执行,自托管服务器时区不对会导致调度时间偏移
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Plan solar revenue recovery visits with Google Sheets, Gemini and WhatsApp
- 原作者
- iamvaar
- 原始发布日期
- 2026-10-13T05:30:56.125Z
- 来源
- https://n8n.io/workflows/20841