# 外卖SaaS系统 - API接口设计

## 1. API设计规范

### 1.1 RESTful规范
- 使用标准HTTP方法：GET、POST、PUT、DELETE、PATCH
- URL使用名词复数形式，如：`/api/orders`
- 使用HTTP状态码表示请求结果
- 版本控制：`/api/v1/orders`

### 1.2 请求规范
- **Content-Type**：`application/json`
- **认证方式**：Bearer Token (JWT)
- **租户识别**：通过Header `X-Tenant-Id` 或从Token中解析

### 1.3 响应规范
```json
{
  "success": true,
  "code": 200,
  "message": "操作成功",
  "data": {},
  "timestamp": "2024-01-01T12:00:00Z"
}
```

### 1.4 错误响应
```json
{
  "success": false,
  "code": 400,
  "message": "参数错误",
  "errors": [
    {
      "field": "phone",
      "message": "手机号格式不正确"
    }
  ],
  "timestamp": "2024-01-01T12:00:00Z"
}
```

### 1.5 HTTP状态码
- **200 OK**：请求成功
- **201 Created**：创建成功
- **204 No Content**：删除成功
- **400 Bad Request**：参数错误
- **401 Unauthorized**：未认证
- **403 Forbidden**：无权限
- **404 Not Found**：资源不存在
- **409 Conflict**：资源冲突
- **422 Unprocessable Entity**：业务逻辑错误
- **500 Internal Server Error**：服务器错误

### 1.6 分页规范
```json
// 请求参数
{
  "pageIndex": 1,
  "pageSize": 20,
  "sortBy": "createdAt",
  "sortOrder": "desc"
}

// 响应格式
{
  "success": true,
  "data": {
    "items": [],
    "totalCount": 100,
    "pageIndex": 1,
    "pageSize": 20,
    "totalPages": 5
  }
}
```

## 2. 认证授权接口

### 2.1 用户登录
```http
POST /api/v1/auth/login
Content-Type: application/json

{
  "phone": "13800138000",
  "password": "password123",
  "loginType": "customer" // customer, merchant, system
}

Response:
{
  "success": true,
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiIs...",
    "refreshToken": "eyJhbGciOiJIUzI1NiIs...",
    "expiresIn": 7200,
    "tokenType": "Bearer",
    "userInfo": {
      "id": "uuid",
      "phone": "13800138000",
      "nickname": "张三",
      "avatar": "https://..."
    }
  }
}
```

### 2.2 刷新Token
```http
POST /api/v1/auth/refresh
Content-Type: application/json

{
  "refreshToken": "eyJhbGciOiJIUzI1NiIs..."
}

Response:
{
  "success": true,
  "data": {
    "accessToken": "eyJhbGciOiJIUzI1NiIs...",
    "expiresIn": 7200
  }
}
```

### 2.3 用户注册
```http
POST /api/v1/auth/register
Content-Type: application/json

{
  "phone": "13800138000",
  "password": "password123",
  "verificationCode": "123456",
  "nickname": "张三"
}
```

### 2.4 发送验证码
```http
POST /api/v1/auth/send-code
Content-Type: application/json

{
  "phone": "13800138000",
  "type": "register" // register, login, reset_password
}
```

## 3. 商家管理接口

### 3.1 获取商家列表
```http
GET /api/v1/merchants?pageIndex=1&pageSize=20&keyword=&status=1
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "uuid",
        "name": "美味餐厅",
        "logo": "https://...",
        "rating": 4.5,
        "totalSales": 1000,
        "status": 1,
        "createdAt": "2024-01-01T12:00:00Z"
      }
    ],
    "totalCount": 50,
    "pageIndex": 1,
    "pageSize": 20
  }
}
```

### 3.2 获取商家详情
```http
GET /api/v1/merchants/{id}
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "美味餐厅",
    "logo": "https://...",
    "description": "专注美食20年",
    "contactPhone": "400-123-4567",
    "rating": 4.5,
    "totalSales": 1000,
    "status": 1,
    "stores": [
      {
        "id": "uuid",
        "name": "总店",
        "address": "北京市朝阳区...",
        "phone": "010-12345678"
      }
    ]
  }
}
```

### 3.3 创建商家
```http
POST /api/v1/merchants
Authorization: Bearer {token}
Content-Type: application/json

{
  "name": "美味餐厅",
  "logo": "https://...",
  "description": "专注美食20年",
  "contactPhone": "400-123-4567",
  "contactPerson": "张三",
  "businessLicense": "91110000..."
}
```

### 3.4 更新商家信息
```http
PUT /api/v1/merchants/{id}
Authorization: Bearer {token}
Content-Type: application/json

{
  "name": "美味餐厅",
  "logo": "https://...",
  "description": "专注美食20年"
}
```

### 3.5 删除商家
```http
DELETE /api/v1/merchants/{id}
Authorization: Bearer {token}
```

## 4. 菜品管理接口

### 4.1 获取菜品列表
```http
GET /api/v1/dishes?merchantId={merchantId}&categoryId={categoryId}&keyword=&status=1&pageIndex=1&pageSize=20
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "uuid",
        "name": "宫保鸡丁",
        "description": "经典川菜",
        "image": "https://...",
        "price": 38.00,
        "originalPrice": 48.00,
        "salesCount": 500,
        "rating": 4.8,
        "status": 1,
        "tags": ["热销", "招牌菜"]
      }
    ],
    "totalCount": 100
  }
}
```

### 4.2 获取菜品详情
```http
GET /api/v1/dishes/{id}
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "id": "uuid",
    "name": "宫保鸡丁",
    "description": "经典川菜，选用优质鸡肉...",
    "image": "https://...",
    "price": 38.00,
    "originalPrice": 48.00,
    "unit": "份",
    "stock": 100,
    "salesCount": 500,
    "rating": 4.8,
    "status": 1,
    "tags": ["热销", "招牌菜"],
    "specs": [
      {
        "id": "uuid",
        "name": "大份",
        "price": 48.00,
        "stock": 50
      },
      {
        "id": "uuid",
        "name": "小份",
        "price": 28.00,
        "stock": 50
      }
    ]
  }
}
```

### 4.3 创建菜品
```http
POST /api/v1/dishes
Authorization: Bearer {token}
Content-Type: application/json

{
  "merchantId": "uuid",
  "categoryId": "uuid",
  "name": "宫保鸡丁",
  "description": "经典川菜",
  "image": "https://...",
  "price": 38.00,
  "originalPrice": 48.00,
  "unit": "份",
  "stock": 100,
  "tags": ["热销", "招牌菜"],
  "specs": [
    {
      "name": "大份",
      "price": 48.00,
      "stock": 50
    }
  ]
}
```

### 4.4 更新菜品
```http
PUT /api/v1/dishes/{id}
Authorization: Bearer {token}
Content-Type: application/json

{
  "name": "宫保鸡丁",
  "price": 38.00,
  "stock": 100,
  "status": 1
}
```

### 4.5 批量上下架
```http
PATCH /api/v1/dishes/batch-status
Authorization: Bearer {token}
Content-Type: application/json

{
  "dishIds": ["uuid1", "uuid2"],
  "status": 1 // 1:上架 2:下架
}
```

## 5. 订单管理接口

### 5.1 创建订单
```http
POST /api/v1/orders
Authorization: Bearer {token}
Content-Type: application/json

{
  "merchantId": "uuid",
  "storeId": "uuid",
  "items": [
    {
      "dishId": "uuid",
      "specId": "uuid",
      "quantity": 2,
      "price": 38.00
    }
  ],
  "deliveryAddress": {
    "contactName": "张三",
    "contactPhone": "13800138000",
    "address": "北京市朝阳区...",
    "latitude": 39.9042,
    "longitude": 116.4074
  },
  "remark": "少辣",
  "couponId": "uuid"
}

Response:
{
  "success": true,
  "data": {
    "orderId": "uuid",
    "orderNo": "202401010001",
    "totalAmount": 76.00,
    "deliveryFee": 5.00,
    "discountAmount": 10.00,
    "actualAmount": 71.00,
    "paymentInfo": {
      "paymentNo": "PAY202401010001",
      "qrCode": "https://..." // 支付二维码
    }
  }
}
```

### 5.2 获取订单列表
```http
GET /api/v1/orders?status=&startDate=&endDate=&pageIndex=1&pageSize=20
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "uuid",
        "orderNo": "202401010001",
        "merchantName": "美味餐厅",
        "totalAmount": 76.00,
        "actualAmount": 71.00,
        "status": 2,
        "statusText": "待接单",
        "createdAt": "2024-01-01T12:00:00Z",
        "items": [
          {
            "dishName": "宫保鸡丁",
            "specName": "大份",
            "quantity": 2,
            "price": 38.00
          }
        ]
      }
    ],
    "totalCount": 50
  }
}
```

### 5.3 获取订单详情
```http
GET /api/v1/orders/{id}
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "id": "uuid",
    "orderNo": "202401010001",
    "merchant": {
      "id": "uuid",
      "name": "美味餐厅",
      "phone": "400-123-4567"
    },
    "items": [
      {
        "dishName": "宫保鸡丁",
        "dishImage": "https://...",
        "specName": "大份",
        "quantity": 2,
        "price": 38.00,
        "amount": 76.00
      }
    ],
    "deliveryAddress": {
      "contactName": "张三",
      "contactPhone": "13800138000",
      "address": "北京市朝阳区..."
    },
    "dishAmount": 76.00,
    "deliveryFee": 5.00,
    "packageFee": 2.00,
    "discountAmount": 10.00,
    "totalAmount": 83.00,
    "actualAmount": 73.00,
    "status": 2,
    "statusText": "待接单",
    "paymentStatus": 1,
    "paymentMethod": "wechat",
    "estimatedDeliveryTime": "2024-01-01T13:00:00Z",
    "createdAt": "2024-01-01T12:00:00Z",
    "paidAt": "2024-01-01T12:05:00Z",
    "remark": "少辣",
    "timeline": [
      {
        "status": "created",
        "statusText": "订单创建",
        "time": "2024-01-01T12:00:00Z"
      },
      {
        "status": "paid",
        "statusText": "支付成功",
        "time": "2024-01-01T12:05:00Z"
      }
    ]
  }
}
```

### 5.4 商家接单
```http
POST /api/v1/orders/{id}/accept
Authorization: Bearer {token}
Content-Type: application/json

{
  "estimatedTime": 30 // 预计制作时长（分钟）
}
```

### 5.5 开始制作
```http
POST /api/v1/orders/{id}/cooking
Authorization: Bearer {token}
```

### 5.6 订单完成
```http
POST /api/v1/orders/{id}/complete
Authorization: Bearer {token}
```

### 5.7 取消订单
```http
POST /api/v1/orders/{id}/cancel
Authorization: Bearer {token}
Content-Type: application/json

{
  "reason": "用户取消",
  "cancelBy": "customer" // customer, merchant, system
}
```

## 6. 支付接口

### 6.1 创建支付
```http
POST /api/v1/payments
Authorization: Bearer {token}
Content-Type: application/json

{
  "orderId": "uuid",
  "paymentMethod": "wechat", // wechat, alipay, balance
  "amount": 71.00
}

Response:
{
  "success": true,
  "data": {
    "paymentNo": "PAY202401010001",
    "qrCode": "https://...", // 支付二维码
    "deepLink": "weixin://..." // 唤起支付的深度链接
  }
}
```

### 6.2 查询支付状态
```http
GET /api/v1/payments/{paymentNo}
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "paymentNo": "PAY202401010001",
    "status": 2, // 0:待支付 1:支付中 2:成功 3:失败
    "amount": 71.00,
    "paidAt": "2024-01-01T12:05:00Z"
  }
}
```

### 6.3 支付回调（第三方调用）
```http
POST /api/v1/payments/callback/wechat
Content-Type: application/json

{
  "out_trade_no": "PAY202401010001",
  "transaction_id": "4200001234567890",
  "total_fee": 7100,
  "result_code": "SUCCESS"
}
```

### 6.4 申请退款
```http
POST /api/v1/refunds
Authorization: Bearer {token}
Content-Type: application/json

{
  "orderId": "uuid",
  "amount": 71.00,
  "reason": "不想要了"
}
```

## 7. 配送管理接口

### 7.1 获取配送任务列表
```http
GET /api/v1/delivery-tasks?status=&driverId=&pageIndex=1&pageSize=20
Authorization: Bearer {token}
```

### 7.2 分配配送员
```http
POST /api/v1/delivery-tasks/{id}/assign
Authorization: Bearer {token}
Content-Type: application/json

{
  "driverId": "uuid"
}
```

### 7.3 配送员接单
```http
POST /api/v1/delivery-tasks/{id}/accept
Authorization: Bearer {token}
```

### 7.4 确认取餐
```http
POST /api/v1/delivery-tasks/{id}/pickup
Authorization: Bearer {token}
```

### 7.5 确认送达
```http
POST /api/v1/delivery-tasks/{id}/deliver
Authorization: Bearer {token}
Content-Type: application/json

{
  "deliveryCode": "123456" // 取餐码
}
```

### 7.6 更新配送员位置
```http
POST /api/v1/delivery-drivers/location
Authorization: Bearer {token}
Content-Type: application/json

{
  "latitude": 39.9042,
  "longitude": 116.4074
}
```

## 8. 营销管理接口

### 8.1 获取优惠券列表
```http
GET /api/v1/coupons?merchantId=&status=1&pageIndex=1&pageSize=20
Authorization: Bearer {token}
```

### 8.2 领取优惠券
```http
POST /api/v1/coupons/{id}/receive
Authorization: Bearer {token}
```

### 8.3 获取用户优惠券
```http
GET /api/v1/user-coupons?status=1&pageIndex=1&pageSize=20
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "uuid",
        "couponName": "满50减10",
        "discountValue": 10.00,
        "minOrderAmount": 50.00,
        "status": 1,
        "expiredAt": "2024-12-31T23:59:59Z"
      }
    ]
  }
}
```

### 8.4 获取可用优惠券
```http
GET /api/v1/user-coupons/available?merchantId={merchantId}&amount={amount}
Authorization: Bearer {token}
```

## 9. 评价管理接口

### 9.1 创建评价
```http
POST /api/v1/reviews
Authorization: Bearer {token}
Content-Type: application/json

{
  "orderId": "uuid",
  "rating": 5,
  "tasteRating": 5,
  "packageRating": 5,
  "deliveryRating": 5,
  "content": "非常好吃",
  "images": ["https://...", "https://..."],
  "isAnonymous": false
}
```

### 9.2 获取商家评价列表
```http
GET /api/v1/reviews?merchantId={merchantId}&rating=&pageIndex=1&pageSize=20

Response:
{
  "success": true,
  "data": {
    "items": [
      {
        "id": "uuid",
        "userName": "张三",
        "userAvatar": "https://...",
        "rating": 5,
        "content": "非常好吃",
        "images": ["https://..."],
        "createdAt": "2024-01-01T12:00:00Z",
        "replyContent": "感谢支持",
        "replyAt": "2024-01-01T13:00:00Z"
      }
    ],
    "totalCount": 100,
    "statistics": {
      "avgRating": 4.8,
      "totalReviews": 100,
      "rating5Count": 80,
      "rating4Count": 15,
      "rating3Count": 3,
      "rating2Count": 1,
      "rating1Count": 1
    }
  }
}
```

### 9.3 商家回复评价
```http
POST /api/v1/reviews/{id}/reply
Authorization: Bearer {token}
Content-Type: application/json

{
  "replyContent": "感谢您的支持"
}
```

## 10. 数据统计接口

### 10.1 商家数据概览
```http
GET /api/v1/statistics/merchant/overview?merchantId={merchantId}&startDate=&endDate=
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "totalOrders": 1000,
    "totalRevenue": 50000.00,
    "avgOrderAmount": 50.00,
    "completionRate": 0.95,
    "todayOrders": 50,
    "todayRevenue": 2500.00,
    "orderTrend": [
      {
        "date": "2024-01-01",
        "orders": 50,
        "revenue": 2500.00
      }
    ],
    "topDishes": [
      {
        "dishId": "uuid",
        "dishName": "宫保鸡丁",
        "salesCount": 200,
        "revenue": 7600.00
      }
    ]
  }
}
```

### 10.2 平台数据大盘
```http
GET /api/v1/statistics/platform/dashboard?startDate=&endDate=
Authorization: Bearer {token}

Response:
{
  "success": true,
  "data": {
    "totalMerchants": 100,
    "totalUsers": 10000,
    "totalOrders": 50000,
    "totalRevenue": 2500000.00,
    "activeMerchants": 80,
    "activeUsers": 5000,
    "todayOrders": 500,
    "todayRevenue": 25000.00
  }
}
```

## 11. 文件上传接口

### 11.1 上传图片
```http
POST /api/v1/files/upload
Authorization: Bearer {token}
Content-Type: multipart/form-data

file: <binary>
type: dish_image // dish_image, merchant_logo, user_avatar, review_image

Response:
{
  "success": true,
  "data": {
    "url": "https://cdn.example.com/images/xxx.jpg",
    "fileName": "xxx.jpg",
    "fileSize": 102400
  }
}
```

## 12. WebSocket实时通知

### 12.1 连接WebSocket
```javascript
// 连接地址
ws://api.example.com/ws?token={jwt_token}

// 订阅主题
{
  "action": "subscribe",
  "topics": ["order.new", "order.status", "delivery.location"]
}

// 接收消息
{
  "topic": "order.new",
  "data": {
    "orderId": "uuid",
    "orderNo": "202401010001",
    "merchantId": "uuid"
  },
  "timestamp": "2024-01-01T12:00:00Z"
}
```

### 12.2 消息主题
- `order.new`：新订单通知
- `order.status`：订单状态变更
- `delivery.location`：配送员位置更新
- `payment.success`：支付成功通知

