From 04b138d3836e03c9adbcbd367fd71d92905c5206 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 17 四月 2025 13:17:45 +0800
Subject: [PATCH] add: 重复登录处理

---
 app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt |  138 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 103 insertions(+), 35 deletions(-)

diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt
index 45b5b0a..b367f26 100644
--- a/app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt
+++ b/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
     }
 
 }
\ No newline at end of file

--
Gitblit v1.9.3