# 优惠券模块 — 移动端接口文档

> **模块**：business-coupon（入口在 business-mobile-gateway）  
> **前缀**：`${jeesharp.web.mobilePath}`（默认 `/mobile`）  
> **更新日期**：2026-06-05

---

## 一、接口规范

### 1.1 请求头（登录接口）

```
Content-Type: application/json;charset=UTF-8
access_token: {token}
X-Platform: MINI | APP | H5
X-Device-Id: {deviceId}
```

### 1.2 响应格式

```json
{
  "code": 200,
  "msg": "操作成功",
  "data": { },
  "requestId": "uuid-xxx"
}
```

---

## 二、会员优惠券（核心）`member/coupon`

**Controller**：`CouponMobileController`  
**基础路径**：`/mobile/member/coupon`

### 2.1 可领取优惠券列表

- **URL**：`POST /available`
- **认证**：需要登录

```json
{
  "pageNo": 1,
  "pageSize": 10,
  "couponName": "",
  "couponType": 1
}
```

**响应 data**：

| 字段 | 说明 |
|------|------|
| list | 可领模板列表 |
| totalCount | 总数 |
| pageNo / pageSize | 分页 |

**list 项**：`templateId`、`couponName`、`couponType`、`discountValue`、`validStartDate`、`validEndDate`、`remainCount`、`isReceived` 等。

### 2.2 领取优惠券

- **URL**：`POST /receive`

```json
{ "templateId": "模板ID" }
```

### 2.3 我的优惠券

- **URL**：`POST /my` 或 `POST /myList`

```json
{
  "pageNo": 1,
  "pageSize": 10,
  "status": 0
}
```

`status`：0未用 1已用 2过期 3冻结 4作废。

### 2.4 优惠券详情

- **URL**：`GET /detail?couponId={会员券ID}`

### 2.5 卡面详情（与领券中心 UI 一致）

- **URL**：`GET /walletDetail?memberCouponId={id}`

### 2.6 订单可用优惠券（试算列表）⭐

- **URL**：`POST /usable`
- **说明**：结算页展示可用/不可用券及预估抵扣

**当前请求体**：

```json
{
  "orderAmount": 299.00
}
```

**当前响应 data**：

```json
{
  "usableCoupons": [
    {
      "memberCouponId": "…",
      "couponName": "…",
      "minConsumeAmount": 100,
      "estimatedDiscount": 20.00
    }
  ],
  "unusableCoupons": [
    {
      "memberCouponId": "…",
      "couponName": "…",
      "reason": "未满最低消费100元"
    }
  ]
}
```

**规划扩展**（见 [doc/优惠券架构设计.md](./doc/优惠券架构设计.md)）：

```json
{
  "sceneCode": "MALL",
  "platform": "MINI",
  "orderAmount": 299.00,
  "scopeItemIds": ["spuId1", "spuId2"]
}
```

### 2.7 积分兑换

- **URL**：`POST /exchange`

```json
{ "templateId": "模板ID" }
```

---

## 三、优惠券模板（规范路径）`coupon/couponTemplate`

**Controller**：`CouponTemplateMobileController`  
**基础路径**：`/mobile/coupon/couponTemplate`

| 方法 | URL | 说明 |
|------|-----|------|
| POST | `/list` | 进行中模板分页 |
| GET | `/info?id=` | 模板详情 |

---

## 四、领券中心（免登录浏览）`coupon`

**Controller**：`CouponCatalogMobileController`  
**路径**：`/mobile/coupon`（白名单，前端须 `skipAuth: true`）

| 方法 | URL | 说明 |
|------|-----|------|
| GET | `/templates` | 可浏览模板列表 |
| GET | `/template/{id}` | 模板详情 |

---

## 五、业务线结账对接说明

移动端 **不直接调用** 冻结/核销接口；由业务订单接口在服务端编排：

| 阶段 | 负责方 | 券模块方法（服务端） |
|------|--------|----------------------|
| 结算页拉券 | 各业务结算 API 或统一转发 | `usableForOrder` → 目标 `listForCheckout` |
| 下单试算 | 商城/酒店下单 API | `resolveMallCouponDiscount` → 目标 `resolveDiscount` |
| 下单冻结 | 创建订单事务内 | `freezeForMallOrder` → 目标 `freezeForOrder` |
| 支付成功 | 支付回调 | `confirmMallOrderCouponPaid` → 目标 `confirmOrderPaid` |

C 端只需：结算页调 **可用券列表** + 提交订单时传 `memberCouponId`（字段名以各业务订单 DTO 为准）。

---

## 六、状态码

| code | 说明 |
|------|------|
| 200 | 成功 |
| 201 | 需要登录 |
| 203 | 参数错误 |
| 202 | 服务器错误 |

券业务常见错误：`优惠券不存在`、`未满最低消费`、`优惠券不可用`、`优惠券抵扣金额已变化，请重新选择`。

---

## 七、已知限制（与架构文档对齐）

1. `/usable` 未按 `sceneCode`、商品 ID 过滤，多场景上线前须升级接口。
2. `/my`、`/detail` 部分字段（如 `useScope`）仍为占位，待返回真实场景与范围文案。
3. 仅 **商城订单** 服务端完整走冻结/核销；酒店/美食结算须按架构文档接入。

---

## 八、更新日志

| 版本 | 日期 | 说明 |
|------|------|------|
| 1.0 | 2026-05-07 | 领券、我的券、usable 试算 |
| 1.1 | 2026-06-05 | 补充架构对接说明与接口演进规划 |
