# 腾讯云 IM SDK 到 OpenIM 迁移指南

## 迁移状态

### ✅ 已完成的工作

1. **依赖项迁移**
   - 从 `build.gradle.kts` 中移除了腾讯云 IM SDK 依赖 (`libs.imsdk.plus`)
   - 从 `gradle/libs.versions.toml` 中移除了相关版本定义
   - 保留了 OpenIM SDK 依赖 (`io.openim:android-sdk`, `io.openim:core-sdk`)

2. **核心组件迁移**
   - ✅ `TrtcHelper.kt` - 完全迁移到 OpenIM API
   - ✅ `Chat.kt` 实体类 - 更新为 OpenIM 消息模型
   - ✅ `AgentChatListViewModel.kt` - 部分迁移到 OpenIM API
   - ✅ `OpenIMManager.kt` - 完整的 OpenIM 管理器
   - ✅ `OpenIMService.kt` - OpenIM 后台服务
   - ✅ `AppState.kt` - 已使用 OpenIM 进行初始化和登录

3. **兼容层创建**
   - 创建了 `TencentIMCompat.kt` 兼容层，避免编译错误
   - 所有使用腾讯云 IM 的文件都已添加兼容层导入

4. **配置清理**
   - AndroidManifest.xml 已经是干净的，无需额外清理

### 🔄 需要进一步完成的工作

#### 1. 完整的 ViewModel 迁移
以下文件仍在使用兼容层，需要完全迁移到 OpenIM：

- `ChatViewModel.kt` - 聊天功能核心
- `ChatAiViewModel.kt` - AI 聊天功能
- `GroupChatViewModel.kt` - 群聊功能
- `FriendChatListViewModel.kt` - 好友聊天列表
- `GroupChatListViewModel.kt` - 群聊列表
- `MessageListViewModel.kt` - 消息列表
- `MineAgentViewModel.kt` - 我的智能体
- `CreateGroupChatViewModel.kt` - 创建群聊

#### 2. UI 组件迁移
以下 Screen 文件需要更新以使用新的数据模型：

- `ChatScreen.kt`
- `ChatAiScreen.kt`
- `GroupChatScreen.kt`

#### 3. 消息类型映射
需要完善 OpenIM 消息类型到应用内部类型的映射：

```kotlin
// OpenIM 消息类型
101 -> TEXT
102 -> IMAGE  
103 -> AUDIO
104 -> VIDEO
105 -> FILE
```

## OpenIM 集成状态

### ✅ 已集成的功能

1. **SDK 初始化** - `OpenIMManager.initSDK()`
2. **用户登录** - `AppState.loginToOpenIM()`
3. **连接监听** - 连接状态、踢下线、token 过期
4. **消息监听** - 新消息、消息撤回、已读回执等
5. **会话管理** - 会话变化、未读数统计
6. **用户信息管理** - 用户资料更新
7. **好友关系管理** - 好友申请、添加、删除等
8. **群组管理** - 群信息变更、成员管理等

### 🔧 需要实现的功能

1. **消息发送**
   ```kotlin
   // 需要实现
   OpenIMClient.getInstance().messageManager.sendMessage(...)
   ```

2. **历史消息获取**
   ```kotlin
   // 需要实现
   OpenIMClient.getInstance().messageManager.getAdvancedHistoryMessageList(...)
   ```

3. **会话列表获取**
   ```kotlin
   // 已在 AgentChatListViewModel 中部分实现
   OpenIMClient.getInstance().conversationManager.getAllConversationList(...)
   ```

4. **图片消息处理**
   - 需要适配 OpenIM 的 `PictureElem` 结构
   - 更新图片显示逻辑

## 迁移步骤建议

### 第一阶段：核心聊天功能
1. 完成 `ChatViewModel.kt` 的完整迁移
2. 实现消息发送和接收
3. 实现历史消息加载
4. 测试基本聊天功能

### 第二阶段：会话管理
1. 完成各种 ChatListViewModel 的迁移
2. 实现会话列表的正确显示
3. 实现未读消息统计

### 第三阶段：高级功能
1. 群聊功能迁移
2. 文件、图片等多媒体消息
3. 消息状态和已读回执

### 第四阶段：清理和优化
1. 删除兼容层 `TencentIMCompat.kt`
2. 清理所有临时代码
3. 性能优化和测试

## 关键 API 对比

### 消息发送
```kotlin
// 腾讯云 IM
V2TIMManager.getMessageManager().sendMessage(message, receiver, null, ...)

// OpenIM
OpenIMClient.getInstance().messageManager.sendMessage(message, receiver, ...)
```

### 获取会话列表
```kotlin
// 腾讯云 IM
V2TIMManager.getConversationManager().getConversationList(...)

// OpenIM
OpenIMClient.getInstance().conversationManager.getAllConversationList(...)
```

### 消息监听
```kotlin
// 腾讯云 IM
V2TIMManager.getMessageManager().addAdvancedMsgListener(listener)

// OpenIM
OpenIMClient.getInstance().messageManager.setAdvancedMsgListener(listener)
```

## 注意事项

1. **数据结构差异**：OpenIM 和腾讯云 IM 的数据结构有所不同，需要仔细映射
2. **回调机制**：OpenIM 使用不同的回调接口
3. **消息 ID**：OpenIM 使用 `clientMsgID`，腾讯云使用 `msgID`
4. **时间戳**：注意时间戳的单位和格式差异
5. **用户 ID**：确保用户 ID 在两个系统中的一致性

## 测试建议

1. **单元测试**：为每个迁移的组件编写测试
2. **集成测试**：测试完整的聊天流程
3. **兼容性测试**：确保与现有数据的兼容性
4. **性能测试**：对比迁移前后的性能表现

## 删除兼容层的时机

当以下条件都满足时，可以安全删除 `TencentIMCompat.kt`：

1. 所有 ViewModel 都已完全迁移到 OpenIM
2. 所有功能都已测试通过
3. 没有编译错误
4. 应用运行正常

删除步骤：
1. 删除 `app/src/main/java/com/aiosman/ravenow/compat/TencentIMCompat.kt`
2. 从所有文件中移除 `import com.aiosman.ravenow.compat.*`
3. 清理所有相关的临时注释
