---
name: meitu-ota-order-sync
description: >-
  Syncs today's OTA merchant-backend orders into Meitu ERP draft orders via
  computer use (user logs into OTA admin) then MCP create_draft_order.
  Matches Meitu products with list_products; skips duplicates by vendorOrderId.
  Use when the user asks to 同步OTA订单 / 拉取OTA后台订单 / 批量导入订单.
---

# Meitu · 同步 OTA 订单

用 **computer use** 登录用户提供的 OTA **商家后台**，按订单列表批量读取详情，再通过美途云端 MCP / OpenAPI 写入草稿订单。

## Prerequisites

1. Meitu Cloud MCP（Streamable HTTP）+ 租户 PAT：
   - Endpoint: `https://service.meitu.io/api/mcp`（或客户域名）
   - Header: `Authorization: Bearer <API_Token>`
2. Token 权限至少含：`orders.create`、`orders.list`、`products.list`（游客名单可选 `orders.guests`）
3. Agent 具备 computer use / 浏览器自动化；写操作必须 `confirm: true`
4. **禁止**把 OTA 账号、密码、Cookie、PAT 写入本 Skill、仓库或公开页面

Token：ERP「用户 → OpenAPI Token」。Docs：https://meitu.io/mcp · https://meitu.io/openapi

## Defaults（用户未另行指定时）

| 项 | 默认 |
|----|------|
| 筛选窗口 | **今天（下单日）**，时区 `Asia/Shanghai` |
| 写入形态 | 草稿订单 `create_draft_order`（服务端 orderStatus=1） |
| 产品匹配 | OTA 产品名 / 外部产品编号 → `list_products`；0 条或多条则询问用户 |
| 去重 | `list_orders(vendorOrderId=OTA订单号)`，已存在则 **跳过** |
| 外部单号 | `vendorOrderId` = OTA 订单号（必填，用于去重） |

## Workflow

```
- [ ] 1. 取得 OTA 商家后台 URL（用户提供，不写死品牌域名）
- [ ] 2. Computer use 打开后台；用户交互登录（会话内凭证，不落盘）
- [ ] 3. 进入订单列表；筛「今天 / 下单日」（可被用户覆盖）
- [ ] 4. 收集本页订单号列表（翻页直到取完或用户叫停）
- [ ] 5. 逐单打开详情，抽取字段（见下表）
- [ ] 6. 对每个订单：匹配 productId → 去重 → create_draft_order
- [ ] 7. 汇报：新建 / 跳过 / 失败（含原因）
```

### 1–2. 登录商家后台

1. 用户给出商家后台入口 URL（例如「打开某某 OTA 分销后台」）。
2. Agent 用 computer use 打开页面；若出现登录框，**等待用户输入账号密码 / 验证码**，不要代填已泄露的密钥，也不要截图保存密码。
3. 登录成功后再继续；会话 Cookie 仅用于本次任务。

### 3–4. 订单列表

- 找到「订单列表 / 订单管理」类菜单。
- 将下单日期（或后台等价筛选项）设为 **今天**；用户可改为自定义起止日或状态。
- 记录可见订单的 **OTA 订单号**；有分页则继续翻页。
- 若列表为空：停止并告知用户。

### 5. 详情字段抽取

从订单详情页（或列表行展开）抽取：

| Meitu 字段 | 来源提示 |
|------------|----------|
| `vendorOrderId` | OTA 订单号（必填） |
| 产品名 / 外部产品编号 | 用于 `list_products` |
| `travelStartDate` | 出行/出发日期 `yyyy-MM-dd`（必填） |
| `travelEndDate` | 返程日期（有则填） |
| `adultCount` / `childCount` | 成人/儿童人数 |
| `adultPrice` / `childPrice` / `amount` | 单价与应付金额（金额校验失败时先问用户） |
| `contactName` / `contactTel` | 联系人 |
| `remark` | 备注；可附带 OTA 产品名 |
| 游客名单（可选） | 姓名/证件等 → 创建成功后 `save_order_guests` |

规则：

- 日期统一 `yyyy-MM-dd`、时区按页面展示换算到业务日。
- 金额缺字段时：有总价则填 `amount`；单价不明可只填人数 + 金额并在备注说明。
- 不要把整页 HTML 原样塞进 `remark`。

### 6. 匹配产品 → 去重 → 创建

对列表中每一笔：

1. **匹配产品**  
   - `list_products`：`keyword` / `lineName` = OTA 产品名或外部产品编号。  
   - 恰好 1 条 → 用其 `lineId` / `productId`。  
   - 0 条或多条 → **询问用户**选定 `productId`（可对本批相同 OTA 产品缓存选择）。

2. **去重**  
   ```json
   { "vendorOrderId": "<OTA订单号>", "page": 1, "size": 20 }
   ```
   `list_orders` 若已有记录 → **跳过**（记入 skipped）。

3. **创建草稿**  
   MCP `create_draft_order`，至少包含：
   - `productId`、`travelStartDate`、`vendorOrderId`、`confirm: true`
   - 以及已抽到的人数、联系人、金额、备注等  

   等价 OpenAPI：`POST /api/open/erp/v1/orders`（同一 PAT）。

4. **可选名单**  
   若抽到游客：`save_order_guests`（`confirm: true`）写入刚返回的 `orderId`。

### 7. 汇报

向用户输出表格或清单：

| OTA 订单号 | 结果 | Meitu orderId / 说明 |
|------------|------|----------------------|
| … | created / skipped / failed | … |

统计：`created` / `skipped` / `failed` 数量。

## Compliance

- 文案与文档只使用「OTA」，不点名具体平台品牌。
- 仅同步租户有权操作的后台数据；遵守对方网站条款与 robots。
- 凭证与 PAT 不入库、不写进 Skill。

## More

- 字段与工具细则：[reference.md](reference.md)
- 目录：https://meitu.io/skills/index.json
- Zip：https://meitu.io/skills/meitu-agent-skills.zip
