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

2026-10-07 · 原文发布日

n8n按效期风险分诊药店库存并代发调拨邮件

面向药店的n8n免费模板:每天早上6点读取Sheets里的库存批次、销售流水、分店库存和供应商退货政策,按销售速度和FEFO原则算出效期风险清单,给出调拨、退货、折扣或报废建议;Gemini生成三行药师简报发到Slack等待批准,获批后自动用Gmail向分店发调拨邮件、向供应商发退货请求,管制药品则仅发人工合规提醒,同时回写表格标记已处理批次避免重复。

原文要点

原模板为免费n8n工作流:每天早上6点运行,从Google Sheets读取Inventory_Batches、Sales_Log、Branch_Stock、Supplier_Policies四个标签页,按近期销售速度与FEFO原则计算效期风险并给出调拨、退货、折扣或报废建议;Gemini生成三行药师简报发到Slack等待批准/拒绝;批准后按动作类型用Gmail向分店发调拨邮件、向供应商发退货请求,管制药品仅在Slack发人工合规提醒;每个动作向Action_Queue追加审计行,并回写批次数为ACTIONED或QUARANTINED(含折扣百分比)避免下次重复处理,Reorder_Control用于补货控制。需用Google Service Account并分享表格、配置Slack与Gmail凭证及Gemini(PaLM)。

这次做成什么

用六个标签页的测试表格复现“每日效期风险分诊→Slack批准→按类型发邮件/提醒→回写状态”的闭环,并用三批次虚构库存做一轮完整练习。

准备什么

  • 可登录的n8n实例且有Google Service Account、Slack、Gmail、Gemini四类凭证配置权限
  • 一个已与Service Account邮箱共享的Google Sheets测试工作簿,含六个规定标签页
  • 一个Slack测试频道ID且工作流可用send and wait审批
  • 测试期间可用的email_override收件地址,把所有外发邮件转到自己邮箱

具体怎么做

  1. 准备六标签页表格与配置

    按下方配置材料建Inventory_Batches、Sales_Log、Branch_Stock、Supplier_Policies、Action_Queue、Reorder_Control六个标签页并填入示例数据;在n8n新建工作流,第一个配置节点写入Sheet ID、效期预警天数(如90天)、Slack频道ID和email_override地址。

  2. 风险计算分支

    加Google Sheets读取节点分别拉四个数据页;用代码/表达式节点按批次剩余效期天数、近30天销量推算可售天数,剩余效期小于可售天数即判为风险批次;按Supplier_Policies决定建议动作:效期内可退则return、其他分店月销量高则transfer、临近效期则discount、过期则dispose;管制药品标记只发合规提醒。

  3. Gemini简报与Slack审批

    加Gemini节点用下方简报提示词把风险清单压成三行中文简报;加Slack send and wait节点把简报和前几项动作预览发到测试频道,等批准/拒绝;用IF节点分流,拒绝则只在Action_Queue记录rejected。

  4. 批准后的路由与回写

    批准后用Switch节点按动作类型路由:transfer走Gmail向接收分店发调拨邮件、return走Gmail向供应商发退货请求、管制药品走Slack发人工合规提醒;每个动作向Action_Queue追加一行审计记录;最后更新Inventory_Batches对应批次状态为ACTIONED或QUARANTINED并写入折扣百分比,再次运行确认该批次被跳过。

可直接复制的材料

六标签页列结构配置(本站独立编写)

列名为按原文列出的六个标签页自行设计的示例,需与流程内读取映射及实际导入的模板一致。

{
  "spreadsheetId": "替换为测试工作簿ID",
  "tabs": {
    "Inventory_Batches": ["batch_id", "drug_name", "qty", "expiry_date", "branch", "controlled", "status", "discount_pct"],
    "Sales_Log": ["date", "drug_name", "branch", "qty_sold"],
    "Branch_Stock": ["branch", "drug_name", "qty"],
    "Supplier_Policies": ["drug_name", "returnable", "return_deadline_days"],
    "Action_Queue": ["ts", "batch_id", "action", "target", "decision", "note"],
    "Reorder_Control": ["drug_name", "branch", "reorder_paused"]
  },
  "config": {"expiry_horizon_days": 90, "slack_channel": "替换为频道ID", "email_override": "test@example.com"}
}

Gemini三行药师简报提示词(本站独立编写)

{{$json.riskList}}替换为风险计算节点的输出字段;模型设置沿用原模板Gemini节点配置。

你是药店库存助手。根据以下风险批次JSON生成简报,要求:恰好三行中文;第一行概括风险批次数与总金额;第二行列出最紧急的两个批次及建议动作(调拨/退货/折扣/报废);第三行提示管制药品是否需人工处理。不要输出第四行,不要使用表情符号。数据:
{{$json.riskList}}

Gmail调拨邮件正文模板(本站独立编写)

字段名按你流程实际输出替换;测试期务必保留email_override,避免误发真实分店。

主题:库存调拨请求 - {{$json.drug_name}} 批次 {{$json.batch_id}}
正文:
您好,{{$json.target_branch}}店:
总仓现有批次 {{$json.batch_id}}({{$json.drug_name}},数量 {{$json.qty}},效期至 {{$json.expiry_date}})面临效期风险,贵店近30天销量较高,建议接收调拨。
请于两个工作日内回复确认接收数量。
(本邮件由自动化流程发出,测试期间实际发送至统一测试邮箱)

输入与输出示例

本站虚构演示,效期与销量数字为自洽示例,未真实运行工作流或调用Gemini。

输入

Inventory_Batches三行:B001 阿莫西林胶囊 qty 200 效期2025-08-10 总仓 controlled=no;B002 布洛芬片 qty 500 效期2025-07-01 总仓 controlled=no;B003 可待因口服液 qty 40 效期2025-09-15 controlled=yes。Sales_Log显示布洛芬总仓近30天仅售20盒,分店A售180盒;Supplier_Policies显示阿莫西林可退、退货期限效期前60天。

对应输出

风险清单:B002判为transfer(分店A需求高)、B001判为return(可退且期限内);Slack收到三行简报,点批准后:Gmail向分店A邮箱发出B002调拨邮件、向供应商发出B001退货请求,B003在Slack生成人工合规提醒;Action_Queue追加三行decision=approved;Inventory_Batches中B001、B002状态改为ACTIONED,次日运行不再出现。

做完检查这些

  • Action_Queue中每个建议动作都有一行审计记录且decision与Slack点击结果一致
  • B001/B002回写ACTIONED后再次运行流程,风险清单中不再出现这两个批次
  • 管制药品B003不会触发任何Gmail外发,只在Slack出现人工合规提醒
  • 测试期所有Gmail邮件实际收件人都是email_override地址而非分店或供应商

容易卡住的地方

  • Service Account必须先以邮箱形式共享工作簿,否则读取节点报权限错误
  • Slack send and wait需要n8n可通过公网HTTPS访问才能恢复等待中的执行
  • 效期与销量比较依赖Sales_Log数据质量,缺销售记录会把慢销品误判或漏判
  • email_override仅用于测试,正式上线忘记移除会把真实调拨邮件发给一个人
  • 退货期限判断以效期前天数为准,日期格式不统一(如文本型日期)会导致判断失效

原文与作者资料 ↗

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

原文标题
Triage pharmacy expiry actions with Google Sheets, Slack, Gmail and Gemini
原作者
iamvaar
原始发布日期
2026-10-07T09:23:37.820Z
来源
https://n8n.io/workflows/20618