# POST /api/v1/order/report — 上报归因订单

> 所属:Order 组（前缀 `/api/v1/order`） | 鉴权:Bearer | [← 返回 API 索引](../README.md)

比价后 5 分钟内点链接下单、支付金额与比价价相差 ≤1 元时，客户端上报归因订单。落 `savings_record`（`source='compare'`），客户端幂等键防重。

## 入参

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `client_event_id` | string | ✅（≤64） | 客户端幂等键（UUID） |
| `platform` | string | ✅（≤32） | 平台展示名（如 `美团`） |
| `platform_package` | string \| null | ❌ | 平台包名 |
| `pay_channel` | string | ✅（≤16） | 支付渠道（`wechat` / `alipay`） |
| `compared_price_cents` | int | ✅（≥0） | 我们给出的比价价（分） |
| `paid_amount_cents` | int | ✅（≥0） | 实际支付金额（分） |
| `device_id` | string \| null | ❌ | 设备 ID |
| `shop_name` | string \| null | ❌ | 门店名（如 `肯德基宅急送（天北路店）`） |
| `dishes` | list[string] | ❌ | 菜品名列表 |
| `original_price_cents` | int \| null | ❌ | 源平台原价（分），省额 = 原价 − 实付 |
| `source_platform_name` | string \| null | ❌ | 源平台展示名（如 `美团`） |
| `source_deeplink` | string \| null | ❌ | 源平台重进链接（预留，本期只存不展示） |

Mock 入参:
```json
{
  "client_event_id": "550e8400-e29b-41d4-a716-446655440000",
  "platform": "美团",
  "platform_package": "com.sankuai.meituan",
  "pay_channel": "wechat",
  "compared_price_cents": 2850,
  "paid_amount_cents": 2800,
  "device_id": "android_abc123def456",
  "shop_name": "肯德基宅急送（天北路店）",
  "dishes": ["香辣鸡腿堡套餐", "可口可乐（中）"],
  "original_price_cents": 4200,
  "source_platform_name": "美团",
  "source_deeplink": null
}
```

## 出参

响应 `200`:`OrderReportOut`

| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | int | 省钱记录 ID |
| `platform` | string | 平台 |
| `pay_channel` | string | 支付渠道 |
| `compared_price_cents` | int | 比价价（分） |
| `paid_amount_cents` | int | 实付金额（分） |
| `duplicated` | bool | 是否为重复上报（幂等命中） |

Mock 出参:
```json
{
  "id": 1234,
  "platform": "美团",
  "pay_channel": "wechat",
  "compared_price_cents": 2850,
  "paid_amount_cents": 2800,
  "duplicated": false
}
```

## 错误码
- `401` 未鉴权 / token 失效
- `422` 必填字段缺失或类型不符

## 说明
- 记账唯一真相表是 `savings_record`（`source='compare'`）
- `client_event_id` 幂等防重（网络重试不重复记）
- 省额 = `original_price_cents − paid_amount_cents`（若原价可用）
