# 商户管理API接口文档

## 概述

商户管理模块提供了完整的商户信息管理功能，包括商户的增删改查、统计信息等操作。所有接口均遵循RESTful API设计规范。

## 基础信息

- **基础URL**: `/api/v1/merchants`
- **认证方式**: Bearer Token（部分接口需要管理员权限）
- **数据格式**: JSON
- **字符编码**: UTF-8

## 数据模型

### 商户信息 (Merchant)

```json
{
  "id": 1,
  "name": "示例商户",
  "type": "company",
  "contact_person": "张三",
  "contact_phone": "13800138000",
  "email": "merchant@example.com",
  "address": "北京市朝阳区示例街道123号",
  "description": "这是一个示例商户",
  "status": "active",
  "created_at": "2024-01-01T00:00:00.000Z",
  "updated_at": "2024-01-01T00:00:00.000Z"
}
```

### 字段说明

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| id | integer | - | 商户ID（系统自动生成） |
| name | string | ✓ | 商户名称 |
| type | string | ✓ | 商户类型：`individual`（个人）、`company`（企业） |
| contact_person | string | ✓ | 联系人姓名 |
| contact_phone | string | ✓ | 联系电话 |
| email | string | - | 邮箱地址 |
| address | string | - | 地址 |
| description | string | - | 商户描述 |
| status | string | - | 状态：`active`（活跃）、`inactive`（非活跃）、`banned`（禁用） |
| created_at | datetime | - | 创建时间 |
| updated_at | datetime | - | 更新时间 |

## 接口列表

### 1. 获取商户列表

**接口地址**: `GET /api/v1/merchants`

**接口描述**: 获取商户列表，支持分页、搜索和筛选

**请求参数**:

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| page | integer | - | 1 | 页码（最小值：1） |
| limit | integer | - | 20 | 每页数量（范围：1-100） |
| keyword | string | - | - | 搜索关键词（匹配商户名称、联系人、电话） |
| status | string | - | - | 状态筛选：`active`、`inactive`、`banned` |
| type | string | - | - | 类型筛选：`individual`、`company` |

**请求示例**:
```http
GET /api/v1/merchants?page=1&limit=20&keyword=示例&status=active&type=company
```

**响应示例**:
```json
{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "示例商户",
      "type": "company",
      "contact_person": "张三",
      "contact_phone": "13800138000",
      "email": "merchant@example.com",
      "address": "北京市朝阳区示例街道123号",
      "description": "这是一个示例商户",
      "status": "active",
      "created_at": "2024-01-01T00:00:00.000Z",
      "updated_at": "2024-01-01T00:00:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 1,
    "totalPages": 1
  }
}
```

**错误响应**:
```json
{
  "success": false,
  "message": "请求参数错误",
  "errors": [
    {
      "field": "page",
      "message": "页码必须是正整数"
    }
  ]
}
```

### 2. 获取商户详情

**接口地址**: `GET /api/v1/merchants/{merchantId}`

**接口描述**: 根据商户ID获取商户详细信息

**路径参数**:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| merchantId | integer | ✓ | 商户ID |

**请求示例**:
```http
GET /api/v1/merchants/1
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "id": 1,
    "name": "示例商户",
    "type": "company",
    "contact_person": "张三",
    "contact_phone": "13800138000",
    "email": "merchant@example.com",
    "address": "北京市朝阳区示例街道123号",
    "description": "这是一个示例商户",
    "status": "active",
    "created_at": "2024-01-01T00:00:00.000Z",
    "updated_at": "2024-01-01T00:00:00.000Z",
    "animal_count": 15,
    "order_count": 128
  }
}
```

**错误响应**:
```json
{
  "success": false,
  "message": "商户不存在"
}
```

### 3. 创建商户

**接口地址**: `POST /api/v1/merchants`

**接口描述**: 创建新商户（需要管理员权限）

**认证要求**: Bearer Token + 管理员权限

**请求体**:
```json
{
  "name": "新商户",
  "type": "company",
  "contact_person": "李四",
  "contact_phone": "13900139000",
  "email": "newmerchant@example.com",
  "address": "上海市浦东新区示例路456号",
  "description": "这是一个新商户"
}
```

**请求参数**:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | ✓ | 商户名称 |
| type | string | ✓ | 商户类型：`individual`、`company` |
| contact_person | string | ✓ | 联系人姓名 |
| contact_phone | string | ✓ | 联系电话 |
| email | string | - | 邮箱地址（需符合邮箱格式） |
| address | string | - | 地址 |
| description | string | - | 商户描述 |

**响应示例**:
```json
{
  "success": true,
  "data": {
    "id": 2,
    "name": "新商户",
    "type": "company",
    "contact_person": "李四",
    "contact_phone": "13900139000",
    "email": "newmerchant@example.com",
    "address": "上海市浦东新区示例路456号",
    "description": "这是一个新商户",
    "status": "active",
    "created_at": "2024-01-01T12:00:00.000Z",
    "updated_at": "2024-01-01T12:00:00.000Z"
  },
  "message": "商户创建成功"
}
```

### 4. 更新商户信息

**接口地址**: `PUT /api/v1/merchants/{merchantId}`

**接口描述**: 更新商户信息（需要管理员权限）

**认证要求**: Bearer Token + 管理员权限

**路径参数**:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| merchantId | integer | ✓ | 商户ID |

**请求体**:
```json
{
  "name": "更新后的商户名称",
  "contact_person": "王五",
  "contact_phone": "13700137000",
  "status": "inactive"
}
```

**请求参数**:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | - | 商户名称 |
| type | string | - | 商户类型：`individual`、`company` |
| contact_person | string | - | 联系人姓名 |
| contact_phone | string | - | 联系电话 |
| email | string | - | 邮箱地址 |
| address | string | - | 地址 |
| description | string | - | 商户描述 |
| status | string | - | 状态：`active`、`inactive`、`banned` |

**响应示例**:
```json
{
  "success": true,
  "data": {
    "id": 1,
    "name": "更新后的商户名称",
    "type": "company",
    "contact_person": "王五",
    "contact_phone": "13700137000",
    "email": "merchant@example.com",
    "address": "北京市朝阳区示例街道123号",
    "description": "这是一个示例商户",
    "status": "inactive",
    "created_at": "2024-01-01T00:00:00.000Z",
    "updated_at": "2024-01-01T15:30:00.000Z"
  },
  "message": "商户信息更新成功"
}
```

### 5. 删除商户

**接口地址**: `DELETE /api/v1/merchants/{merchantId}`

**接口描述**: 删除商户（需要管理员权限）

**认证要求**: Bearer Token + 管理员权限

**路径参数**:

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| merchantId | integer | ✓ | 商户ID |

**请求示例**:
```http
DELETE /api/v1/merchants/1
```

**响应示例**:
```json
{
  "success": true,
  "message": "商户删除成功"
}
```

### 6. 获取商户统计信息

**接口地址**: `GET /api/v1/merchants/statistics`

**接口描述**: 获取商户统计信息（需要管理员权限）

**认证要求**: Bearer Token + 管理员权限

**请求示例**:
```http
GET /api/v1/merchants/statistics
```

**响应示例**:
```json
{
  "success": true,
  "data": {
    "total": 150,
    "active": 120,
    "inactive": 25,
    "banned": 5,
    "individual": 80,
    "company": 70
  }
}
```

## 错误码说明

| HTTP状态码 | 错误码 | 说明 |
|------------|--------|------|
| 400 | BAD_REQUEST | 请求参数错误 |
| 401 | UNAUTHORIZED | 未授权，需要登录 |
| 403 | FORBIDDEN | 权限不足，需要管理员权限 |
| 404 | NOT_FOUND | 商户不存在 |
| 409 | CONFLICT | 商户信息冲突（如名称重复） |
| 500 | INTERNAL_ERROR | 服务器内部错误 |

## 通用错误响应格式

```json
{
  "success": false,
  "message": "错误描述",
  "code": "ERROR_CODE",
  "timestamp": "2024-01-01T12:00:00.000Z",
  "errors": [
    {
      "field": "字段名",
      "message": "字段错误描述"
    }
  ]
}
```

## 使用示例

### JavaScript (Axios)

```javascript
// 获取商户列表
const getMerchants = async (params = {}) => {
  try {
    const response = await axios.get('/api/v1/merchants', { params });
    return response.data;
  } catch (error) {
    console.error('获取商户列表失败:', error.response.data);
    throw error;
  }
};

// 创建商户
const createMerchant = async (merchantData) => {
  try {
    const response = await axios.post('/api/v1/merchants', merchantData, {
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      }
    });
    return response.data;
  } catch (error) {
    console.error('创建商户失败:', error.response.data);
    throw error;
  }
};
```

### cURL

```bash
# 获取商户列表
curl -X GET "http://localhost:3200/api/v1/merchants?page=1&limit=20" \
  -H "Content-Type: application/json"

# 创建商户
curl -X POST "http://localhost:3200/api/v1/merchants" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "name": "测试商户",
    "type": "company",
    "contact_person": "测试联系人",
    "contact_phone": "13800138000"
  }'
```

## 注意事项

1. **权限控制**: 创建、更新、删除商户以及获取统计信息需要管理员权限
2. **数据验证**: 所有输入数据都会进行严格验证，确保数据完整性
3. **分页限制**: 列表接口每页最多返回100条记录
4. **搜索功能**: 关键词搜索支持模糊匹配商户名称、联系人和电话
5. **状态管理**: 商户状态变更会影响相关业务功能的可用性
6. **数据关联**: 删除商户前请确保没有关联的动物或订单数据

## 更新日志

- **v1.0.0** (2024-01-01): 初始版本，包含基础的商户管理功能