cloudroam
2025-04-15 85d11d6cd12abdd1e1f5f7516a7fb53a4826633f
app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt
@@ -17,7 +17,10 @@
import com.example.firstapp.model.IncomeGroup
import com.example.firstapp.model.IncomePackage
import com.example.firstapp.util.SecureStorage
import com.example.firstapp.utils.PreferencesManager
import kotlinx.coroutines.launch
import com.example.firstapp.database.repository.ReminderRecordRepository
import com.example.firstapp.database.entity.ReminderRecord
class HomeViewModel : ViewModel() {
@@ -36,12 +39,15 @@
    private val _categories = MutableLiveData<List<CategoryConfig>>()
    val categories: LiveData<List<CategoryConfig>> = _categories
    // 添加可见分类的 LiveData
    private val _visibleCategories = MutableLiveData<List<String>>()
    val visibleCategories: LiveData<List<String>> = _visibleCategories
    private val _visibleCategories = MutableLiveData<List<CategoryConfig>>()
    val visibleCategories: LiveData<List<CategoryConfig>> = _visibleCategories
    private val _unreadReminderCount = MutableLiveData<Int>()
    val unreadReminderCount: LiveData<Int> = _unreadReminderCount
    private lateinit var secureStorage: SecureStorage
    private lateinit var currentUserId: String
    private lateinit var reminderRecordRepository: ReminderRecordRepository
    init {
        // 初始化时加载包裹列表数据
@@ -53,9 +59,12 @@
    fun initialize(context: Context, userId: String) {
        secureStorage = SecureStorage(context)
        currentUserId = userId
        reminderRecordRepository = ReminderRecordRepository(context)
        loadCategories()
        // 初始化时更新可见分类
        _categories.value?.let { updateVisibleCategories(it) }
        // 加载未读提醒数量
        checkUnreadReminders()
    }
    private fun loadDataByType(type: String) {
@@ -144,45 +153,60 @@
        loadDataByType("火车票")
    }
    fun loadCategories() {
    private fun loadCategories() {
        viewModelScope.launch {
            try {
                // 先尝试从服务器获取配置
                val serverCategories = RetrofitClient.apiService.getUserCategories(currentUserId)
                if (serverCategories.isNotEmpty()) {
                    _categories.value = serverCategories
                    secureStorage.saveCategories(currentUserId, serverCategories)
                // 先尝试从本地获取配置
                val localCategories = secureStorage.getCategories(currentUserId)
                // 默认完整分类列表
                val fullCategories = listOf(
                    CategoryConfig(1, "快递", 0, true),
                    CategoryConfig(2, "还款", 1, true),
                    CategoryConfig(3, "收入", 2, true),
                    CategoryConfig(4, "航班", 3, true),
                    CategoryConfig(5, "火车票", 4, true)
                )
                // 基础分类(非会员可见)
                val basicCategories = listOf(
                    CategoryConfig(1, "快递", 0, true),
                    CategoryConfig(2, "还款", 1, true)
                )
                if (localCategories.isNotEmpty()) {
                    // 如果本地有配置,直接使用本地配置
                    _categories.value = localCategories
                } else {
                    // 如果服务器没有配置,尝试获取本地配置
                    val localCategories = secureStorage.getCategories(currentUserId)
                    if (localCategories.isEmpty()) {
                        // 如果本地也没有配置,使用默认配置
                        val defaultCategories = listOf(
                            CategoryConfig(1, "快递", 0),
                            CategoryConfig(2, "还款", 1),
                            CategoryConfig(3, "收入", 2),
                            CategoryConfig(4, "航班", 3),
                            CategoryConfig(5, "火车票", 4)
                        )
                    try {
                        // 尝试从服务器获取用户信息判断是否是会员
                        val savedPhone = PreferencesManager.getPhone()
                        val response = RetrofitClient.apiService.getUserInfo(savedPhone ?: "")
                        val isMember = response.code == "0" && response.data?.isMember == true
                        // 根据会员状态设置默认分类
                        val defaultCategories = if (isMember) fullCategories else basicCategories
                        _categories.value = defaultCategories
                        syncCategoriesToServer(defaultCategories)
                    } else {
                        _categories.value = localCategories
                        syncCategoriesToServer(localCategories)
                        secureStorage.saveCategories(currentUserId, defaultCategories)
                        // 同步到服务器
                        try {
                            syncCategoriesToServer(defaultCategories)
                        } catch (e: Exception) {
                            Log.e("HomeViewModel", "Failed to sync categories: ${e.message}")
                        }
                    } catch (e: Exception) {
                        // 如果获取用户信息失败,使用基础分类
                        _categories.value = basicCategories
                        secureStorage.saveCategories(currentUserId, basicCategories)
                    }
                }
                // 更新可见分类
                _categories.value?.let { updateVisibleCategories(it) }
            } catch (e: Exception) {
                // 如果网络请求失败,使用本地数据
                val localCategories = secureStorage.getCategories(currentUserId)
                _categories.value = localCategories.ifEmpty {
                    listOf(
                        CategoryConfig(1, "快递", 0),
                        CategoryConfig(2, "还款", 1),
                        CategoryConfig(3, "收入", 2),
                        CategoryConfig(4, "航班", 3),
                        CategoryConfig(5, "火车票", 4)
                    )
                }
                Log.e("HomeViewModel", "Failed to load categories: ${e.message}")
            }
        }
    }
@@ -201,16 +225,13 @@
    }
    fun saveCategories(categories: List<CategoryConfig>) {
        viewModelScope.launch {
            // 保存到本地
            secureStorage.saveCategories(currentUserId, categories)
            // 同步到服务器
            syncCategoriesToServer(categories)
            _categories.value = categories
            // 更新可见分类
            updateVisibleCategories(categories)
        }
        _categories.value = categories
        // 保存到本地存储
        secureStorage.saveCategories(currentUserId, categories)
        // 同步到服务器
        syncCategoriesToServer(categories)
        // 更新可见分类
        updateVisibleCategories(categories)
    }
    private fun updateVisibleCategories(categories: List<CategoryConfig>) {
@@ -219,7 +240,19 @@
            .sortedBy { it.order }
            .map { it.name }
        
        _visibleCategories.value = visibleNames
        _visibleCategories.value = categories.filter { it.isEnabled }
    }
    // 添加检查未读提醒数量的方法
    fun checkUnreadReminders() {
        viewModelScope.launch {
            try {
                val unreadCount = reminderRecordRepository.getUnreadCount(ReminderRecord.STATUS_UNREAD)
                _unreadReminderCount.postValue(unreadCount)
            } catch (e: Exception) {
                Log.e("HomeViewModel", "Failed to get unread reminder count: ${e.message}")
            }
        }
    }
    // 登出时不再清除本地数据