cloudroam
10 天以前 04b138d3836e03c9adbcbd367fd71d92905c5206
app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt
@@ -50,8 +50,9 @@
    val unreadReminderCount: LiveData<Int> = _unreadReminderCount
    private lateinit var secureStorage: SecureStorage
    private lateinit var currentUserId: String
    private var currentUserId: String = ""
    private lateinit var reminderRecordRepository: ReminderRecordRepository
    private var categoriesLoaded = false
    init {
        // 初始化时加载包裹列表数据
@@ -64,7 +65,13 @@
        secureStorage = SecureStorage(context)
        currentUserId = userId
        reminderRecordRepository = ReminderRecordRepository(context)
        loadCategories()
        // 只在首次加载或者用户修改分类后加载分类数据
        if (!categoriesLoaded) {
            loadCategories()
            categoriesLoaded = true
        }
        // 初始化时更新可见分类
        _categories.value?.let { updateVisibleCategories(it) }
        // 加载未读提醒数量
@@ -188,9 +195,6 @@
    private fun loadCategories() {
        viewModelScope.launch {
            try {
                // 先尝试从本地获取配置
                val localCategories = secureStorage.getCategories(currentUserId)
                // 默认完整分类列表
                val fullCategories = listOf(
                    CategoryConfig(1, "快递", 0, true),
@@ -206,30 +210,73 @@
                    CategoryConfig(2, "还款", 1, true)
                )
                if (localCategories.isNotEmpty()) {
                    // 如果本地有配置,直接使用本地配置
                    _categories.value = localCategories
                } else {
                    try {
                        // 尝试从服务器获取用户信息判断是否是会员
                        val savedPhone = PreferencesManager.getPhone()
                        val response = RetrofitClient.apiService.getUserInfo(savedPhone ?: "")
                        val isMember = response.code == "0" && response.data?.isMember == true
                try {
                    // 获取会员状态
                    val savedPhone = PreferencesManager.getPhone()
                    val userResponse = RetrofitClient.apiService.getUserInfo(savedPhone ?: "")
                    val isMember = userResponse.code == "0" && userResponse.data?.isMember == true
                    // 从用户信息中获取正确的userId
                    if (userResponse.code == "0" && userResponse.data != null) {
                        currentUserId = userResponse.data?.id.toString()
                    }
                        // 根据会员状态设置默认分类
                        val defaultCategories = if (isMember) fullCategories else basicCategories
                        _categories.value = defaultCategories
                        secureStorage.saveCategories(currentUserId, defaultCategories)
                        // 同步到服务器
                    // 首先检查本地是否有缓存的分类配置
                    val localCategories = secureStorage.getCategories(currentUserId)
                    if (localCategories.isNotEmpty()) {
                        // 使用本地缓存的配置
                        _categories.value = localCategories
                    } else {
                        // 本地无缓存,尝试从服务器获取
                        try {
                            syncCategoriesToServer(defaultCategories)
                            val serverCategories = RetrofitClient.apiService.getUserCategories(currentUserId)
                            if (serverCategories.isNotEmpty()) {
                                // 服务器有配置,使用服务器配置
                                // 如果不是会员,需要过滤掉会员专属分类
                                val filteredCategories = if (isMember) {
                                    serverCategories
                                } else {
                                    serverCategories.filter { it.name == "快递" || it.name == "还款" }
                                }
                                _categories.value = filteredCategories
                                // 同时更新本地缓存
                                secureStorage.saveCategories(currentUserId, filteredCategories)
                                // 同步回服务器(如果有变化)
                                if (filteredCategories.size != serverCategories.size) {
                                    syncCategoriesToServer(filteredCategories)
                                }
                            } else {
                                // 服务器返回空,根据会员状态设置默认分类
                                val defaultCategories = if (isMember) fullCategories else basicCategories
                                _categories.value = defaultCategories
                                // 更新本地缓存
                                secureStorage.saveCategories(currentUserId, defaultCategories)
                                // 同步到服务器
                                syncCategoriesToServer(defaultCategories)
                            }
                        } catch (e: Exception) {
                            Log.e("HomeViewModel", "Failed to sync categories: ${e.message}")
                            // 服务器获取失败,使用默认分类
                            Log.e("HomeViewModel", "Failed to get categories from server: ${e.message}")
                            val defaultCategories = if (isMember) fullCategories else basicCategories
                            _categories.value = defaultCategories
                            secureStorage.saveCategories(currentUserId, defaultCategories)
                        }
                    } catch (e: Exception) {
                        // 如果获取用户信息失败,使用基础分类
                    }
                } catch (e: Exception) {
                    // 网络连接失败,尝试从本地获取配置
                    Log.e("HomeViewModel", "Failed to get user info: ${e.message}")
                    val localCategories = secureStorage.getCategories(currentUserId)
                    if (localCategories.isNotEmpty()) {
                        // 使用本地缓存的配置
                        _categories.value = localCategories
                    } else {
                        // 本地也没有配置,使用基础分类
                        _categories.value = basicCategories
                        // 更新本地缓存
                        secureStorage.saveCategories(currentUserId, basicCategories)
                    }
                }
@@ -239,20 +286,26 @@
                
            } catch (e: Exception) {
                Log.e("HomeViewModel", "Failed to load categories: ${e.message}")
                // 出现异常时,使用基础分类
                val basicCategories = listOf(
                    CategoryConfig(1, "快递", 0, true),
                    CategoryConfig(2, "还款", 1, true)
                )
                _categories.value = basicCategories
                // 更新可见分类
                updateVisibleCategories(basicCategories)
            }
        }
    }
    private fun syncCategoriesToServer(categories: List<CategoryConfig>) {
        viewModelScope.launch {
            try {
                RetrofitClient.apiService.saveUserCategories(
                    CategoryConfigSync(currentUserId, categories)
                )
            } catch (e: Exception) {
                // 同步失败,可以稍后重试或者显示提示
                Log.e("CategorySync", "Failed to sync categories: ${e.message}")
            }
    private suspend fun syncCategoriesToServer(categories: List<CategoryConfig>) {
        try {
            RetrofitClient.apiService.saveUserCategories(
                CategoryConfigSync(currentUserId, categories)
            )
        } catch (e: Exception) {
            // 同步失败,可以稍后重试或者显示提示
            Log.e("CategorySync", "Failed to sync categories: ${e.message}")
        }
    }
@@ -261,9 +314,17 @@
        // 保存到本地存储
        secureStorage.saveCategories(currentUserId, categories)
        // 同步到服务器
        syncCategoriesToServer(categories)
        viewModelScope.launch {
            try {
                syncCategoriesToServer(categories)
            } catch (e: Exception) {
                Log.e("HomeViewModel", "Failed to sync categories: ${e.message}")
            }
        }
        // 更新可见分类
        updateVisibleCategories(categories)
        // 标记分类已被修改
        categoriesLoaded = true
    }
    private fun updateVisibleCategories(categories: List<CategoryConfig>) {
@@ -287,10 +348,17 @@
        }
    }
    // 添加方法以强制刷新分类
    fun refreshCategories() {
        categoriesLoaded = false
        loadCategories()
    }
    // 登出时不再清除本地数据
    fun logout() {
        // 只清除内存中的数据
        _categories.value = emptyList()
        categoriesLoaded = false
    }
}