SuperAPI AI 工具集

fulfillment-status-digest

办公与效率

查看项目

更新于 10-15 09:31

技能介绍

用途

该技能用于生成每日运营分流摘要(triage digest),覆盖所有未履约(unfulfilled)和部分履约(partially-fulfilled)的订单,并按照订单已等待的时长进行分段。它会标记出处于活动保留状态的订单。该技能替代了人工在 Shopify 管理后台订单页面滚动查找超龄订单和异常订单的流程:它会抓取所有开放订单,计算订单年龄,将其分入可配置的时间分段桶,并展示当前处于履约保留状态的订单,从而以单次只读操作为运营团队提供完整的异常队列。

前提条件

  • 已认证的 Shopify CLI 会话:shopify auth login --store <domain>
  • API 权限范围:read_orders

参数

  • store(字符串,必填,无默认值):店铺域名(例如 mystore.myshopify.com)
  • format(字符串,可选,默认 human):输出格式,human 或 json
  • dry_run(布尔值,可选,默认 false):预览操作而不执行变更
  • aging_thresholds_days(数组,可选,默认 [1, 3, 7]):年龄分桶的天数边界(例如 [1,3,7] 会生成:0–1d、1–3d、3–7d、7d+)
  • include_holds(布尔值,可选,默认 true):是否在单独区块中包含处于活动履约保留状态的订单
  • limit(整数,可选,默认 250):每页最多抓取的订单数

工作流程步骤

操作 1:orders — 查询

  • 输入:first: <limit>,query: "fulfillment_status:unfulfilled OR fulfillment_status:partial",按 CREATED_AT 升序排序(最早优先),分页直至完成
  • 预期输出:所有开放订单及其 createdAt、name、displayFulfillmentStatus;计算年龄 = 当前时间 − createdAt(天);按 aging_thresholds_days 分段分桶

操作 2:fulfillmentOrders — 查询(通过嵌套的 order.fulfillmentOrders)

  • 输入:对步骤 1 的每个订单,调用 fulfillmentOrders(first: 5) 检查 status 和 requestStatus;标记任何 status: ON_HOLD 的订单
  • 预期输出:每个订单的保留状态,以及设置的 holdUntil;用于生成摘要中的保留区块

GraphQL 操作

# orders:query — 已针对 api_version 2025-01 验证
query FulfillmentStatusDigest($first: Int!, $after: String, $query: String) {
  orders(first: $first, after: $after, query: $query, sortKey: CREATED_AT) {
    edges {
      node {
        id
        name
        createdAt
        displayFulfillmentStatus
        displayFinancialStatus
        totalPriceSet {
          shopMoney { amount currencyCode }
        }
        customer {
          id
          firstName
          lastName
        }
        fulfillmentOrders(first: 5) {
          edges {
            node {
              id
              status
              requestStatus
              fulfillAt
            }
          }
        }
      }
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}

注:fulfillmentOrders 是 Order 类型上的嵌套字段——fulfillmentOrders:query frontmatter 条目说明该操作会访问履约订单数据。

会话跟踪

Claude 必须在每个阶段输出以下内容,这是强制要求。

启动时输出:

╔══════════════════════════════════════════════╗
║  SKILL: fulfillment-status-digest            ║
║  Store: <store domain>                       ║
║  Started: <YYYY-MM-DD HH:MM UTC>             ║
╚══════════════════════════════════════════════╝

每步之后输出:

[N/TOTAL] <QUERY|MUTATION>  <OperationName>
          → Params: <brief summary of key inputs>
          → Result: <count or outcome>

完成时输出:

当 format 为 human(默认)时:

══════════════════════════════════════════════
OUTCOME SUMMARY
  Total open orders:          <n>
  By age bucket (0-1d):       <n>
  By age bucket (1-3d):       <n>
  By age bucket (3-7d):       <n>
  By age bucket (7d+):        <n>
  Orders on hold:             <n>
  Errors:                     0
  Output:                     none
══════════════════════════════════════════════

当 format 为 json 时,输出:

{
  "skill": "fulfillment-status-digest",
  "store": "<domain>",
  "started_at": "<ISO8601>",
  "completed_at": "<ISO8601>",
  "dry_run": false,
  "steps": [
    { "step": 1, "operation": "FulfillmentStatusDigest", "type": "query", "params_summary": "limit: <n>, query: fulfillment_status:unfulfilled OR partial", "result_summary": "<n> orders fetched", "skipped": false },
    { "step": 2, "operation": "fulfillmentOrders", "type": "query", "params_summary": "nested per order, first: 5", "result_summary": "<n> orders on hold", "skipped": false }
  ],
  "outcome": {
    "total_open_orders": 0,
    "buckets": [
      { "label": "0-1d", "count": 0 },
      { "label": "1-3d", "count": 0 },
      { "label": "3-7d", "count": 0 },
      { "label": "7d+", "count": 0 }
    ],
    "orders_on_hold": 0,
    "errors": 0,
    "output_file": null
  }
}

输出格式

Fulfillment Age Digest — <store> — <date>

Age Bucket
Order Count
Oldest Order

0–1 days
n
#XXXX

1–3 days
n
#XXXX

3–7 days
n
#XXXX

7+ days
n
#XXXX (⚠️ review)

Orders On Hold (if include_holds: true and holds exist):

Order
Hold Since
Fulfillment Status

#XXXX
3 days
ON_HOLD

错误处理

  • No orders returned:原因—系统中无开放订单;恢复—店铺已完全履约,无需操作
  • fulfillmentOrders returns empty:原因—订单尚未分配履约任务;恢复—该订单可能尚未分配到某个地点
  • Rate limit (429):原因—订单量大且需要分页;恢复—将 limit 减小到 100

最佳实践

  • 每天早上处理任何订单之前首先运行此摘要——它在一屏中给出异常队列。
  • 7d+ 分桶中的订单是最高优先级;调查并要么履约,要么带原因显式保留。
  • 使用 format: json 将摘要管道接入 Slack 通知或仪表盘脚本。
  • 结合 order-hold-and-release,无需离开 CLI 即可对摘要中发现的异常采取行动。
  • 对于拥有 500+ 开放订单的店铺,设置 limit: 100 并预期分页——摘要仍会在所有页面间正确聚合。