From a7820e2f1ee06a7b43b4d351cced3343d7e1a5e2 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期一, 31 三月 2025 08:55:52 +0800
Subject: [PATCH] fix 登录限制

---
 app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 169 insertions(+), 1 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 7b5c3fb..d8c92f2 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
@@ -1,29 +1,59 @@
 package com.example.firstapp.ui.home
 
+import android.content.Context
+import android.util.Log
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.example.firstapp.core.Core
-import com.example.firstapp.database.entity.Code
+import com.example.firstapp.database.service.RetrofitClient
+import com.example.firstapp.model.CategoryConfig
+import com.example.firstapp.model.CategoryConfigSync
 import com.example.firstapp.model.ExpressGroup
 import com.example.firstapp.model.ExpressPackage
 import com.example.firstapp.model.FinanceGroup
 import com.example.firstapp.model.FinancePackage
+import com.example.firstapp.util.SecureStorage
 import kotlinx.coroutines.launch
 
 class HomeViewModel : ViewModel() {
 
     private val _expressItems = MutableLiveData<List<ExpressGroup>>()
     private val _financeItems = MutableLiveData<List<FinanceGroup>>()
+    private val _incomeItems = MutableLiveData<List<FinanceGroup>>()
+    private val _flightItems = MutableLiveData<List<FinanceGroup>>()
+    private val _trainItems = MutableLiveData<List<FinanceGroup>>()
+    
     val expressItems: LiveData<List<ExpressGroup>> = _expressItems
     val financeItems: LiveData<List<FinanceGroup>> = _financeItems
+    val incomeItems: LiveData<List<FinanceGroup>> = _incomeItems
+    val flightItems: LiveData<List<FinanceGroup>> = _flightItems
+    val trainItems: LiveData<List<FinanceGroup>> = _trainItems
+
+    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 lateinit var secureStorage: SecureStorage
+    private lateinit var currentUserId: String
 
     init {
         // 初始化时加载包裹列表数据
         loadExpressData()
         // 初始化时不加载财务列表数据 0317
         //  loadFinanceData()
+    }
+
+    fun initialize(context: Context, userId: String) {
+        secureStorage = SecureStorage(context)
+        currentUserId = userId
+        loadCategories()
+        // 初始化时更新可见分类
+        _categories.value?.let { updateVisibleCategories(it) }
     }
 
     fun loadExpressData() {
@@ -74,4 +104,142 @@
         }
     }
 
+    fun loadIncomeData() {
+        viewModelScope.launch {
+            val stations = Core.reminder.getByType("收入")
+            val groups = stations.map { station ->
+                val packages = Core.code.getByKeyword(station.nickname).map { code ->
+                    FinancePackage(
+                        id = code.id,
+                        company = code.secondLevel,
+                        trackingNumber = code.code,
+                        createTime = code.createTime
+                    )
+                }
+                FinanceGroup(stationName = station.nickname, packages = packages)
+            }
+            _incomeItems.postValue(groups)
+        }
+    }
+
+    fun loadFlightData() {
+        viewModelScope.launch {
+            val stations = Core.reminder.getByType("航班")
+            val groups = stations.map { station ->
+                val packages = Core.code.getByKeyword(station.nickname).map { code ->
+                    FinancePackage(
+                        id = code.id,
+                        company = code.secondLevel,
+                        trackingNumber = code.code,
+                        createTime = code.createTime
+                    )
+                }
+                FinanceGroup(stationName = station.nickname, packages = packages)
+            }
+            _flightItems.postValue(groups)
+        }
+    }
+
+    fun loadTrainData() {
+        viewModelScope.launch {
+            val stations = Core.reminder.getByType("火车票")
+            val groups = stations.map { station ->
+                val packages = Core.code.getByKeyword(station.nickname).map { code ->
+                    FinancePackage(
+                        id = code.id,
+                        company = code.secondLevel,
+                        trackingNumber = code.code,
+                        createTime = code.createTime
+                    )
+                }
+                FinanceGroup(stationName = station.nickname, packages = packages)
+            }
+            _trainItems.postValue(groups)
+        }
+    }
+
+    fun loadCategories() {
+        viewModelScope.launch {
+            try {
+                // 先尝试从服务器获取配置
+                val serverCategories = RetrofitClient.apiService.getUserCategories(currentUserId)
+                if (serverCategories.isNotEmpty()) {
+                    _categories.value = serverCategories
+                    secureStorage.saveCategories(currentUserId, serverCategories)
+                } 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)
+                        )
+                        _categories.value = defaultCategories
+                        syncCategoriesToServer(defaultCategories)
+                    } else {
+                        _categories.value = localCategories
+                        syncCategoriesToServer(localCategories)
+                    }
+                }
+            } 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)
+                    )
+                }
+            }
+        }
+    }
+
+    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}")
+            }
+        }
+    }
+
+    fun saveCategories(categories: List<CategoryConfig>) {
+        viewModelScope.launch {
+            // 保存到本地
+            secureStorage.saveCategories(currentUserId, categories)
+            // 同步到服务器
+            syncCategoriesToServer(categories)
+            _categories.value = categories
+            
+            // 更新可见分类
+            updateVisibleCategories(categories)
+        }
+    }
+
+    private fun updateVisibleCategories(categories: List<CategoryConfig>) {
+        val visibleNames = categories
+            .filter { it.isEnabled }
+            .sortedBy { it.order }
+            .map { it.name }
+        
+        _visibleCategories.value = visibleNames
+    }
+
+    // 登出时不再清除本地数据
+    fun logout() {
+        // 只清除内存中的数据
+        _categories.value = emptyList()
+    }
+
 }
\ No newline at end of file

--
Gitblit v1.9.3