# R2 Goods

> R2-CLI 商品管理：上架、下架、改价、编辑、挂售、查询。当用户提到商品、上架、下架、改价、修改商品、挂售、选品、库存、店铺、淘宝阿里资产、SPU、SKU、商家编码等关键词时使用此 skill。覆盖闲鱼、淘宝两个平台的所有商品操作。即使用户只是说'帮我看看商品'或'查一下上架情况'，也应触发此 skill。

- Skill: `round2ai/r2-goods` (Agent Skill, multi-file: 9 files)
- Install (CLI): `npx skillmds@latest add round2ai/r2-goods`
- Raw SKILL.md: https://api.skillmd.com/api/skills/round2ai/r2-goods/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: round2ai (https://skillmd.com/u/round2ai)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/round2ai/r2-goods

---


# R2-Goods (v1.3)

商品管理：覆盖闲鱼、淘宝两大平台的商品上架、下架、改价、编辑、挂售、查询。

> **前置**：先读取 **r2-shared** skill（执行规则、版本检查、错误格式、Token 恢复），再读取 **r2-auth** skill 确保已登录。

**Tip**：获取数据后展示给用户选择，不要让用户自己提供 ID。遵守「友好输出原则」（r2-shared）。

**Tip**：上架、改价、编辑提交前，必须提醒用户可选 `--transport-fee`（运费，默认 0 包邮）和 `--yhb`（验货宝）。

## 平台路由决策

闲鱼、淘宝是两套独立体系，ID 互不通用。

### 通用判断规则

| 条件 | 判断 |
|------|------|
| 用户明确说了平台（"闲鱼下架"、"淘宝改价"） | 用对应平台的命令 |
| 用户从之前的列表中选了商品 | 从数据推断：有 `jbpSpuId` → 淘宝，有 `stockGoodsId` + `status` → 闲鱼 |
| 用户未指定且无上下文 | **先查所有平台列表**，让用户选商品，再根据平台执行 |

> **禁止**：凭上下文猜测平台。刚操作过淘宝不意味着"下架"就一定是淘宝。

### 上架路由

| 条件 | 方式 | 流程 |
|------|------|------|
| "选品上架" 或商品在选品库 | `goods xianyu up` | 店铺 → 仓库 → 选品 → 价格 → 提交 |
| "挂售" 或用户提供了图片 | `goods xianyu hang-up` | 上传图片 → AI 读图 → 类目/属性 → 提交 |
| "阿里资产" 或 "alzc" | `goods taobao alzc` | SPU 查询 → SKU 详情 → 选择+价格 → 申请 |

用户只说"上架"未指定方式 → **必须询问**："选品上架、挂售上架还是阿里资产上架？"

**平台明确但方式未定**：

| 用户说了 | 判断 | 回复 |
|----------|------|------|
| "闲鱼上架" / "上架到闲鱼" | 平台=闲鱼，方式未定 | **询问**："选品上架还是挂售上架？" |
| "淘宝上架" / "上架到淘宝" | 淘宝只有阿里资产 | **直接走** `goods taobao alzc` |

### 查询路由

用户说"查上架列表"/"查询上架情况"且未指定平台：

1. `r2-cli goods shops --json` → 按 `platform` 分组
2. 有 `xianyu` 店铺 → `r2-cli goods xianyu listing --json`
3. 有 `taobao` 店铺 → `r2-cli goods taobao listing --shop-id <id> --json`（每个淘宝店铺都要查）
4. 分区块展示

**查询意图细化**：

| 用户措辞 | 判断 | 命令 |
|----------|------|------|
| "可以上架的"、"选品"、"仓库里的" | 选品商品 | `goods list --stock-id <id>` |
| "已上架的"、"上架列表"、"在卖的" | 已上架 | 走查询路由（多平台） |
| "卖出去的"、"已售出" | 已售出 | `goods xianyu listing --status sold` |
| 模糊（仅"商品"、"看看商品"） | **先问** | "看选品商品还是已上架商品？" |

**按名称定位商品**：用户提名称没给 ID → 先查列表模糊匹配 `goodsName`/`brand`，匹配到多个展示候选，未匹配到自动展示完整列表。

### 下架/改价路由

用户说"下架"或"改价"且未指定平台 → 先查所有平台列表 → 用户选择 → 根据平台执行。

| 操作 | 闲鱼 | 淘宝 |
|------|------|------|
| 下架 | `goods xianyu down --id <id>` | `goods taobao down --jbp-spu-id <> --shop-id <>` |
| 改价 | `goods xianyu price --id <id> --price <>` | `goods taobao price --jbp-spu-id <> --jbp-sku-id <> --shop-id <> --price <>` |
| 修改信息 | `goods xianyu edit --id <id> ...` | 需通过 SPU 重新申请 |

## 命令概览

### 查询

| 命令 | 说明 | 详细文档 |
|------|------|----------|
| `goods shops [--json]` | 查看已授权店铺 | [r2-goods-query](references/r2-goods-query.md) |
| `goods stocks [--json]` | 查看仓库 | [r2-goods-query](references/r2-goods-query.md) |
| `goods list [--stock-id <id>] [--json]` | 查看选品商品 | [r2-goods-query](references/r2-goods-query.md) |
| `goods xianyu listing [--status <>] [--json]` | 闲鱼上架列表 | [r2-goods-listing](references/r2-goods-listing.md) |
| `goods taobao listing --shop-id <id> [--json]` | 淘宝上架列表 | [r2-goods-alzc](references/r2-goods-alzc.md) |

### 闲鱼操作

| 命令 | 说明 | 详细文档 |
|------|------|----------|
| `goods xianyu up --stock-goods-id <> --shop-id <> --price <> --json` | 选品上架 | [r2-goods-listing](references/r2-goods-listing.md) |
| `goods xianyu down --id <id> --json` | 下架 | [r2-goods-listing](references/r2-goods-listing.md) |
| `goods xianyu price --id <id> --price <> --json` | 改价 | [r2-goods-listing](references/r2-goods-listing.md) |
| `goods xianyu edit --id <id> [...] --json` | 修改商品信息 | [r2-goods-listing](references/r2-goods-listing.md) |
| `goods xianyu hang-up submit [...] --json` | 挂售上架 | [r2-goods-hangup](references/r2-goods-hangup.md) |

### 淘宝阿里资产

| 命令 | 说明 | 详细文档 |
|------|------|----------|
| `goods taobao alzc spu-query --shop-id <> --goods-no <> --json` | 查询可申请 SPU | [r2-goods-alzc](references/r2-goods-alzc.md) |
| `goods taobao alzc spu-detail --shop-id <> --jbp-spu-id <> --json` | SPU 详情（含 SKU） | [r2-goods-alzc](references/r2-goods-alzc.md) |
| `goods taobao alzc apply --shop-id <> --jbp-spu-id <> --apply-skus '<>' --json` | 申请上架 SKU | [r2-goods-alzc](references/r2-goods-alzc.md) |
| `goods taobao price --jbp-spu-id <> --jbp-sku-id <> --shop-id <> --price <> --json` | 改价 | [r2-goods-alzc](references/r2-goods-alzc.md) |
| `goods taobao stock --jbp-spu-id <> --jbp-sku-id <> --shop-id <> --quantity <> --json` | 改库存 | [r2-goods-alzc](references/r2-goods-alzc.md) |
| `goods taobao down --jbp-spu-id <> --shop-id <> --json` | 下架 | [r2-goods-alzc](references/r2-goods-alzc.md) |

## 选品上架 4 步流程

1. `r2-cli goods shops --json` → 展示店铺 → 用户选择 `shopId`
2. `r2-cli goods stocks --json` → 展示仓库 → 用户选择 `stockId`
3. `r2-cli goods list --stock-id <id> --json` → 展示商品 → 用户选择 `stockGoodsId`
4. `r2-cli goods xianyu up --stock-goods-id <id> --shop-id <id> --price <amount> --json` → 提交

必填：`--stock-goods-id`、`--shop-id`（取 `shopId` 不是 `id`）、`--price`

> 提交前提醒：运费默认包邮（`--transport-fee 0`），可选开启验货宝（`--yhb`）。
>
> 详细参数、返回字段和友好输出格式见 [r2-goods-listing](references/r2-goods-listing.md)。

## 修改商品信息（edit）

修改已上架商品的标题、描述、品牌、类目、图片、属性等。**不支持改价**，改价用 `goods xianyu price`。

**路由决策**：

| 用户意图 | 流程 |
|----------|------|
| 提供了图片文件 | 全自动：读图识别 → 上传图片 → 匹配类目/属性/品牌 → 展示变更 → 确认 → 提交 |
| 指定了具体字段（"改标题为X"） | 直接修改指定字段 |
| 说"修改商品信息"但没给细节 | 提示可提供图片或指定字段 |

**关键约束**（完整流程和参数见 [r2-goods-listing](references/r2-goods-listing.md)）：

- 定位优先用 `--id <goodsListingId>`，备选 `--stock-goods-id + --shop-id`
- `--category-id` 和 `--channel-cat-id` **后端必填**，即使不改类目也要传当前值
- `--item-attrs` **必须包含 props 中所有属性**，不只是修改的那一个。后端替换整个列表，漏传的属性会被清除
- 改品牌时建议同时传 `--item-attrs`（含全部属性+最新品牌值）
- AI 读图识别后的字段需展示给用户确认

> 带图片的全自动 8 步流程和详细注意事项见 [r2-goods-listing](references/r2-goods-listing.md) 和 [scenes/r2-scene-edit-with-images](scenes/r2-scene-edit-with-images.md)。

## 挂售（hang-up）

挂售模式支持完整商品信息（图片、类目、属性、品牌），与普通上架是不同流程。

**核心原则**：**图片里能看到的，就别问用户**。只问价格和商家编码，其他全部从图片自动提取。

**关键注意事项**（完整流程和参数见 [r2-goods-hangup](references/r2-goods-hangup.md)）：

- **品牌必须双传**：`--brand-name` + `--item-attrs` 中的品牌项（含 propName/channelCatId）
- **描述自动生成**：品牌+款式+颜色+材质+货号自动组合
- **标题自动组合**：品牌+款式+颜色+尺码+成色，最长 30 单位（半角 0.5/全角 1）
- **stuff-status 成色映射**：100=全新、-1=准新、99=99新、95=95新、90=9新
- **价格必填**：用户不提供时暂停流程，不要替用户决定价格

> 完整的 3 步流程、属性匹配、必填/可选参数表、常见错误见 [r2-goods-hangup](references/r2-goods-hangup.md)。

## 场景指南

| 场景 | 指南 |
|------|------|
| 服装/鞋包挂售 | [scenes/r2-scene-hangup-fashion.md](scenes/r2-scene-hangup-fashion.md) |
| 带图片修改商品 | [scenes/r2-scene-edit-with-images.md](scenes/r2-scene-edit-with-images.md) |
| 批量操作 | [scenes/r2-scene-batch-operations.md](scenes/r2-scene-batch-operations.md) |

## 错误处理

统一错误格式见 **r2-shared** skill。

| 错误 | 恢复 |
|------|------|
| `请先运行 r2-cli auth login 登录` | 执行 `r2-cli auth login --json` |
| `Agent 模式需要 --stock-goods-id, --shop-id, --price` | 补齐参数 |
| `请指定下架条件：--id 或 --stock-goods-id + --shop-id` | 补充定位参数 |
| `--price <amount> 为必填参数` | 询问用户新价格 |
| `getCategoryId() is null` | edit 缺少 `--category-id`，必须传 |
| `商家编码重复` | 更换唯一编码 |
| `该商品已上架` | 更换 out-item-no |
| `标题过长` | 缩短标题，保留品牌和核心款式 |
| `ITEM_CONDITION_NOT_SUPPORT_SIGN` | 默认关闭售后 |
| `YHB_PRICE_NOT_SUPPORT` | 验货宝价格不在允许范围，调整价格或关闭验货宝 |
| `轮询超时` | 稍后用 listing 命令查看 |
| `商品不存在` | 确认 id 值是否正确 |

