| | |
| | | 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 { |
| | | // 初始化时加载包裹列表数据 |
| | |
| | | secureStorage = SecureStorage(context) |
| | | currentUserId = userId |
| | | reminderRecordRepository = ReminderRecordRepository(context) |
| | | loadCategories() |
| | | |
| | | // 只在首次加载或者用户修改分类后加载分类数据 |
| | | if (!categoriesLoaded) { |
| | | loadCategories() |
| | | categoriesLoaded = true |
| | | } |
| | | |
| | | // 初始化时更新可见分类 |
| | | _categories.value?.let { updateVisibleCategories(it) } |
| | | // 加载未读提醒数量 |
| | |
| | | private fun loadCategories() { |
| | | viewModelScope.launch { |
| | | try { |
| | | // 先尝试从本地获取配置 |
| | | val localCategories = secureStorage.getCategories(currentUserId) |
| | | |
| | | // 默认完整分类列表 |
| | | val fullCategories = listOf( |
| | | CategoryConfig(1, "快递", 0, true), |
| | |
| | | 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) |
| | | } |
| | | } |
| | |
| | | |
| | | } 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}") |
| | | } |
| | | } |
| | | |
| | |
| | | // 保存到本地存储 |
| | | 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>) { |
| | |
| | | } |
| | | } |
| | | |
| | | // 添加方法以强制刷新分类 |
| | | fun refreshCategories() { |
| | | categoriesLoaded = false |
| | | loadCategories() |
| | | } |
| | | |
| | | // 登出时不再清除本地数据 |
| | | fun logout() { |
| | | // 只清除内存中的数据 |
| | | _categories.value = emptyList() |
| | | categoriesLoaded = false |
| | | } |
| | | |
| | | } |