# 今日领券完成状态（completed-today 族）

> 所属:Coupon 组（前缀 `/api/v1/coupon`） | 鉴权:无（按 device_id 判断） | [← 返回 API 索引](../README.md)

---

## GET /completed-today — 今天是否已完成整轮领券

判断这台设备今天是否跑到 done 帧。已完成 → 首页「去领取」卡置灰。

### 入参（query）

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `device_id` | string | ✅ | 设备 ID（需与领券循环上报的一致） |

Mock 请求:
```
GET /api/v1/coupon/completed-today?device_id=android_abc123def456
```

### 出参

响应 `200`:`CouponCompletedTodayOut`

| 字段 | 类型 | 说明 |
|---|---|---|
| `completed` | bool | 今天是否已跑完整轮 |

Mock 出参:
```json
{"completed": true}
```

---

## POST /completed-today/reset — 重置今日已完成

删这台设备今天的 completion → `has_completed_today` 变 false，首页「去领取」卡恢复可点。开发设置用。

### 入参

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `device_id` | string | ✅ | 设备 ID |
| `package` | string | ❌ | App 包名（默认 ""） |
| `user_id` | int \| null | ❌ | 登录用户 ID |

Mock 入参:
```json
{
  "device_id": "android_abc123def456"
}
```

### 出参

```json
{"ok": true}
```

---

## 说明
- 判断维度 `device_id`（客户端两端都用 ANDROID_ID）
- 用户决策 A 方案：到 done 即算完成，不管单券成败
- MVP 不鉴权
