# 获取员工未绑定录音信息

## 接口信息

- **路径**：POST `/api/beauty/v1/audio/infos`
- **说明**：根据员工手机号获取录音信息（**最关键的接口**）

## 请求参数

### Body参数（JSON）

| 参数 | 必选 | 类型 | 默认值 | 描述 |
|------|------|------|--------|------|
| estateId | 是 | integer | - | 项目ID |
| consultantPhone | 否 | string | - | 员工手机号（三方员工id 必传其一） |
| externalUserId | 否 | string | - | 三方员工id（员工手机号 必传其一） |
| audioStartDate | 否 | string | - | 录音时间（例：2025-05-06） |

### 请求示例

```json
{
  "estateId": 516799468310364162,
  "consultantPhone": "13800138000",
  "audioStartDate": "2024-10-01"
}
```

## 响应结果

### Body结构

| 参数 | 类型 | 说明 |
|------|------|------|
| records | list | 录音文件列表 |
| └─ id | bigint | 录音ID |
| └─ externalUserId | string | 三方员工ID |
| └─ consultantPhone | string | 员工手机号 |
| └─ consultantName | varchar | 销售人员姓名 |
| └─ fileUrl | varchar | 录音地址，7天有效 |
| └─ startTime | datetime | 录音开始时间(yyyy-MM-dd HH:mm:ss) |
| └─ endTime | datetime | 录音结束时间(yyyy-MM-dd HH:mm:ss) |
| └─ duration | bigint | 文件时长(ms) |
| └─ fileSize | bigint | 文件大小(bt) |

### 响应示例

```json
{
  "code": "0",
  "msg": "success",
  "data": {
    "records": [
      {
        "id": 123456,
        "externalUserId": "EMP001",
        "consultantPhone": "13800138000",
        "consultantName": "张三",
        "fileUrl": "https://example.com/audio/123456.mp3",
        "startTime": "2025-01-15 10:30:00",
        "endTime": "2025-01-15 10:35:00",
        "duration": 300000,
        "fileSize": 2048000
      },
      {
        "id": 123457,
        "externalUserId": "EMP001",
        "consultantPhone": "13800138000",
        "consultantName": "张三",
        "fileUrl": "https://example.com/audio/123457.mp3",
        "startTime": "2025-01-15 14:00:00",
        "endTime": "2025-01-15 14:10:00",
        "duration": 600000,
        "fileSize": 4096000
      }
    ]
  }
}
```

## 业务逻辑

1. 通过员工手机号直接查询该员工的录音
2. 可选：通过时间范围筛选特定日期的录音
3. 返回录音列表，包含录音ID用于后续获取ASR文本
4. 录音URL有效期为7天，过期需重新获取

## 使用场景

**这是获取员工对话记录的核心接口**

1. **按手机号查询员工录音** - 最常用的场景
2. **时间范围筛选** - 获取指定日期的录音
3. **获取最近N条对话** - 配合时间排序实现
4. **员工能力评估** - 获取录音后调用ASR分析，传递给Dify工作流

## 完整业务流程

### 获取员工最近N条对话记录

```python
# 1. 调用此接口获取员工录音列表
audios = get_employee_audios(
    consultant_phone="13800138000",
    audio_start_date="2024-10-01"
)

# 2. 按时间倒序排序
audios.sort(key=lambda x: x['startTime'], reverse=True)

# 3. 取前N条
recent_audios = audios[:10]

# 4. 对每条录音获取ASR文本
for audio in recent_audios:
    asr_result = get_audio_asr_result(audio['id'])
    # 组合成完整对话记录
    conversation = {
        'audio_id': audio['id'],
        'consultant_phone': audio['consultantPhone'],
        'consultant_name': audio['consultantName'],
        'start_time': audio['startTime'],
        'duration': audio['duration'],
        'conversation': asr_result.get('result', [])
    }
```

### 传递给Dify工作流

```python
# 5. 转换为Dify陪练工作流格式
dialogue_history = []
for msg in conversation['conversation']:
    dialogue_history.append({
        'speaker': 'user' if msg['role'] == 'consultant' else 'ai',
        'content': msg['text'],
        'timestamp': calculate_timestamp(
            conversation['start_time'], 
            msg['begin_time']
        )
    })

# 6. 调用Dify陪练分析工作流
analysis_result = await dify_service.analyze_practice_session(
    dialogue_history=dialogue_history
)
```

## 错误码

| code | msg | 说明 |
|------|-----|------|
| 0 | success | 成功 |
| 400 | 顾问手机号和三方员工ID不能同时为空 | 必须传入手机号或员工ID |
| 1002 | 未授权 | access_token无效或过期 |

## 关键优势

### vs 其他方案

| 方案 | 步骤 | 效率 |
|-----|------|------|
| **此接口** | 1步：手机号→录音列表 | ✅ 最优 |
| 通过来访单ID | 3步：业务系统→来访单ID→录音 | ❌ 需要外部数据 |
| 通过客户ID | 3步：客户ID→来访单→录音 | ❌ 需要额外维护 |

### 为什么是最佳方案

1. **✅ 直接查询**：一个接口直接获取员工录音，无需中间步骤
2. **✅ 手机号匹配**：天然支持手机号匹配，符合业务需求
3. **✅ 时间筛选**：支持按日期筛选，获取最近对话
4. **✅ 完整信息**：返回录音ID、员工信息、时间信息

## 注意事项

1. **手机号和员工ID必传其一**：不能两者都为空
2. **录音URL有效期7天**：过期需重新调用获取新URL
3. **时间范围建议**：不建议查询超过30天的数据
4. **未绑定录音**：此接口获取"未绑定来访单的录音"，即员工的所有录音记录

## 实施建议

### 立即行动

1. **获取真实员工手机号**：从贵阳曼尼斐绮门店获取1-2个真实员工手机号
2. **验证接口调用**：使用真实手机号测试接口，确认能获取录音列表
3. **检查ASR数据**：确认录音是否有对应的ASR分析结果

### 代码实现

在`YanjiService`中实现：

```python
async def get_employee_audios_by_phone(
    self,
    consultant_phone: str,
    start_date: str = None,
    limit: int = 10
) -> List[Dict]:
    """
    根据员工手机号获取录音信息
    
    Args:
        consultant_phone: 员工手机号
        start_date: 起始日期（可选，格式：2024-10-01）
        limit: 返回数量限制
    
    Returns:
        录音信息列表，按时间倒序
    """
    payload = {
        "estateId": self.estate_id,
        "consultantPhone": consultant_phone
    }
    
    if start_date:
        payload["audioStartDate"] = start_date
    
    data = await self._request(
        method="POST",
        path="/api/beauty/v1/audio/infos",
        json_data=payload
    )
    
    if data is None:
        return []
    
    records = data.get("records", [])
    
    # 按时间倒序排序
    records.sort(key=lambda x: x.get('startTime', ''), reverse=True)
    
    # 限制返回数量
    return records[:limit]
```

---

**文档版本**：v1.0  
**最后更新**：2025-10-15



