# 商户管理模块 - 使用指南

## 概述

商户管理模块提供了完整的商户（Shop）和商户账号（ShopAccount）管理功能，支持商户的创建、更新、删除、查询，以及商户账号的全生命周期管理。

## 核心功能

### 1. 商户管理
- **创建商户**：创建新商户的同时自动创建一个初始坐席账号
- **查询商户**：支持分页查询、模糊搜索、状态筛选
- **更新商户**：更新商户基本信息（名称、编码、等级、状态等）
- **删除商户**：软删除商户，同时批量禁用所有关联的商户账号

### 2. 商户账号管理
- **创建账号**：为商户创建新的坐席账号
- **查询账号**：支持分页查询、按商户筛选、状态筛选
- **更新账号**：更新账号用户名（手机号和密码不可通过此接口修改）
- **重置密码**：管理员为账号重置密码（无需原密码）
- **启用/禁用账号**：控制账号的启用状态

## 业务规则

### 商户规则
1. **商户编码唯一性**：商户编码（ShopCode）必须全局唯一
2. **商户等级**：等级范围为 1-7，表示商户层级结构
3. **商户状态**：
   - `1` - 正常
   - `2` - 禁用
4. **关联删除**：删除商户时，所有关联的商户账号将被批量禁用（不删除）

### 商户账号规则
1. **账号类型**：所有商户账号的用户类型固定为 `3`（坐席/Agent）
2. **初始账号**：创建商户时必须提供初始账号的用户名、手机号和密码
3. **密码安全**：密码采用 bcrypt 加密存储
4. **账号状态**：
   - `1` - 正常
   - `2` - 禁用
5. **字段限制**：
   - 更新账号时，手机号和密码不可修改（需通过专用接口）
   - 密码重置由管理员操作，无需提供原密码

### 数据权限
- 所有查询操作会根据当前登录用户的数据权限自动过滤结果
- 使用 GORM 回调机制自动处理数据权限逻辑

## API 端点

### 商户管理 API

#### 1. 查询商户列表
```http
GET /api/admin/shops
```

**查询参数**：
- `page` (int, 可选): 页码，默认 1
- `size` (int, 可选): 每页数量，默认 20，最大 100
- `name` (string, 可选): 商户名称模糊搜索
- `shop_code` (string, 可选): 商户编码精确搜索
- `status` (int, 可选): 状态筛选（1=正常，2=禁用）
- `level` (int, 可选): 等级筛选

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "items": [
      {
        "id": 1,
        "name": "测试商户",
        "shop_code": "SHOP001",
        "level": 1,
        "status": 1,
        "created_at": "2024-01-01T10:00:00Z",
        "updated_at": "2024-01-01T10:00:00Z"
      }
    ],
    "total": 1,
    "page": 1,
    "size": 20
  },
  "timestamp": 1704096000
}
```

#### 2. 创建商户
```http
POST /api/admin/shops
```

**请求体**：
```json
{
  "name": "测试商户",
  "shop_code": "SHOP001",
  "level": 1,
  "status": 1,
  "init_username": "admin",
  "init_phone": "13800138000",
  "init_password": "password123"
}
```

**字段说明**：
- `name` (string, 必填): 商户名称
- `shop_code` (string, 必填): 商户编码，全局唯一
- `level` (int, 必填): 商户等级，范围 1-7
- `status` (int, 必填): 状态（1=正常，2=禁用）
- `init_username` (string, 必填): 初始账号用户名
- `init_phone` (string, 必填): 初始账号手机号
- `init_password` (string, 必填): 初始账号密码

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "id": 1,
    "name": "测试商户",
    "shop_code": "SHOP001",
    "level": 1,
    "status": 1,
    "created_at": "2024-01-01T10:00:00Z",
    "updated_at": "2024-01-01T10:00:00Z"
  },
  "timestamp": 1704096000
}
```

#### 3. 更新商户
```http
PUT /api/admin/shops/:id
```

**路径参数**：
- `id` (uint): 商户ID

**请求体**：
```json
{
  "name": "更新后的商户名称",
  "shop_code": "SHOP001",
  "level": 2,
  "status": 1
}
```

**响应示例**：同创建商户

#### 4. 删除商户
```http
DELETE /api/admin/shops/:id
```

**路径参数**：
- `id` (uint): 商户ID

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": null,
  "timestamp": 1704096000
}
```

**注意**：删除商户时，所有关联的商户账号将被自动禁用。

---

### 商户账号管理 API

#### 1. 查询商户账号列表
```http
GET /api/admin/shop-accounts
```

**查询参数**：
- `page` (int, 可选): 页码，默认 1
- `size` (int, 可选): 每页数量，默认 20，最大 100
- `shop_id` (uint, 可选): 商户ID筛选
- `status` (int, 可选): 状态筛选（1=正常，2=禁用）
- `username` (string, 可选): 用户名模糊搜索
- `phone` (string, 可选): 手机号模糊搜索

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "items": [
      {
        "id": 1,
        "username": "admin",
        "phone": "13800138000",
        "user_type": 3,
        "status": 1,
        "shop_id": 1,
        "shop_name": "测试商户",
        "created_at": "2024-01-01T10:00:00Z",
        "updated_at": "2024-01-01T10:00:00Z"
      }
    ],
    "total": 1,
    "page": 1,
    "size": 20
  },
  "timestamp": 1704096000
}
```

#### 2. 创建商户账号
```http
POST /api/admin/shop-accounts
```

**请求体**：
```json
{
  "shop_id": 1,
  "username": "agent01",
  "phone": "13800138001",
  "password": "password123"
}
```

**字段说明**：
- `shop_id` (uint, 必填): 商户ID
- `username` (string, 必填): 用户名
- `phone` (string, 必填): 手机号
- `password` (string, 必填): 密码

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": {
    "id": 2,
    "username": "agent01",
    "phone": "13800138001",
    "user_type": 3,
    "status": 1,
    "shop_id": 1,
    "shop_name": "测试商户",
    "created_at": "2024-01-01T10:05:00Z",
    "updated_at": "2024-01-01T10:05:00Z"
  },
  "timestamp": 1704096300
}
```

#### 3. 更新商户账号
```http
PUT /api/admin/shop-accounts/:id
```

**路径参数**：
- `id` (uint): 账号ID

**请求体**：
```json
{
  "username": "new_username"
}
```

**注意**：此接口只能更新用户名，手机号和密码不可通过此接口修改。

**响应示例**：同创建商户账号

#### 4. 重置账号密码
```http
PUT /api/admin/shop-accounts/:id/password
```

**路径参数**：
- `id` (uint): 账号ID

**请求体**：
```json
{
  "new_password": "newpassword123"
}
```

**字段说明**：
- `new_password` (string, 必填): 新密码

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": null,
  "timestamp": 1704096600
}
```

**注意**：此操作为管理员重置密码，无需提供原密码。

#### 5. 启用/禁用账号
```http
PUT /api/admin/shop-accounts/:id/status
```

**路径参数**：
- `id` (uint): 账号ID

**请求体**：
```json
{
  "status": 2
}
```

**字段说明**：
- `status` (int, 必填): 状态（1=正常，2=禁用）

**响应示例**：
```json
{
  "code": 0,
  "msg": "success",
  "data": null,
  "timestamp": 1704096900
}
```

## 错误码

| 错误码 | 说明 |
|--------|------|
| `40001` | 商户不存在 |
| `40002` | 商户编码已存在 |
| `40003` | 商户状态无效 |
| `40004` | 商户等级无效 |
| `50001` | 账号不存在 |
| `50002` | 账号已存在 |
| `50003` | 账号状态无效 |

## 使用场景示例

### 场景1：创建新商户并设置初始账号
```bash
curl -X POST http://localhost:3000/api/admin/shops \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "name": "示例商户",
    "shop_code": "DEMO001",
    "level": 1,
    "status": 1,
    "init_username": "admin",
    "init_phone": "13800138000",
    "init_password": "admin123"
  }'
```

### 场景2：为商户添加新的坐席账号
```bash
curl -X POST http://localhost:3000/api/admin/shop-accounts \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "shop_id": 1,
    "username": "agent01",
    "phone": "13800138001",
    "password": "agent123"
  }'
```

### 场景3：管理员重置账号密码
```bash
curl -X PUT http://localhost:3000/api/admin/shop-accounts/2/password \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{
    "new_password": "newpassword123"
  }'
```

### 场景4：删除商户（自动禁用关联账号）
```bash
curl -X DELETE http://localhost:3000/api/admin/shops/1 \
  -H "Authorization: Bearer YOUR_TOKEN"
```

## 注意事项

1. **认证要求**：所有接口需要在请求头中携带有效的认证 Token
2. **数据权限**：查询结果会根据当前用户的数据权限自动过滤
3. **密码安全**：
   - 密码在存储前会自动使用 bcrypt 加密
   - 建议密码长度至少 8 位，包含字母和数字
4. **关联关系**：
   - 删除商户不会删除关联账号，只会禁用
   - 禁用商户不会影响已存在账号的状态
5. **并发控制**：更新操作会检查记录是否存在，避免并发冲突
6. **日志记录**：所有操作会记录到访问日志（access.log）

## 技术实现细节

- **框架**：Fiber v2.x (HTTP)
- **ORM**：GORM v1.25.x
- **密码加密**：bcrypt
- **数据权限**：GORM 回调自动处理
- **错误处理**：统一错误码系统（pkg/errors）
- **响应格式**：统一响应格式（pkg/response）
- **分层架构**：Handler → Service → Store → Model

## 相关文档

- [API 文档](./API文档.md) - 详细的 API 接口文档
- [项目开发规范](../../AGENTS.md) - 项目整体开发规范
- [错误码定义](../../pkg/errors/codes.go) - 完整错误码列表
