From fe04012057d024770e0180543483d393281a542f Mon Sep 17 00:00:00 2001
From: zhujie <leon.zhu@cloudroam.com.cn>
Date: 星期四, 03 四月 2025 09:18:16 +0800
Subject: [PATCH] Merge branch 'master' of http://47.96.225.205:8888/r/FirstApp2

---
 app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt |  239 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 223 insertions(+), 16 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 630b6af..d40df61 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,36 +1,243 @@
 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.model.IncomeGroup
+import com.example.firstapp.model.IncomePackage
+import com.example.firstapp.util.SecureStorage
+import com.example.firstapp.utils.PreferencesManager
+import kotlinx.coroutines.launch
 
 class HomeViewModel : ViewModel() {
 
-    private val _text = MutableLiveData<String>().apply {
-        value = "短信主页面"
-    }
-    val text: LiveData<String> = _text
+    private val _expressItems = MutableLiveData<List<ExpressGroup>>()
+    private val _financeItems = MutableLiveData<List<FinanceGroup>>()
+    private val _incomeItems = MutableLiveData<List<IncomeGroup>>()
+    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<IncomeGroup>> = _incomeItems
+    val flightItems: LiveData<List<FinanceGroup>> = _flightItems
+    val trainItems: LiveData<List<FinanceGroup>> = _trainItems
 
-    private val _codeList = MutableLiveData<List<Code>>()
+    private val _categories = MutableLiveData<List<CategoryConfig>>()
+    val categories: LiveData<List<CategoryConfig>> = _categories
 
-    val codeList: LiveData<List<Code>> get() = _codeList
+    private val _visibleCategories = MutableLiveData<List<CategoryConfig>>()
+    val visibleCategories: LiveData<List<CategoryConfig>> = _visibleCategories
+
+    private lateinit var secureStorage: SecureStorage
+    private lateinit var currentUserId: String
 
     init {
-        // 初始化时加载数据
-        loadData()
+        // 初始化时加载包裹列表数据
+        loadExpressData()
+        // 初始化时不加载财务列表数据 0317
+        //  loadFinanceData()
     }
 
-    // 加载数据的方法
-    fun loadData() {
-        // 获取数据,并更新 LiveData
-        _codeList.value = Core.code.getAllDesc() // 假设这是获取最新的 data 的方法
+    fun initialize(context: Context, userId: String) {
+        secureStorage = SecureStorage(context)
+        currentUserId = userId
+        loadCategories()
+        // 初始化时更新可见分类
+        _categories.value?.let { updateVisibleCategories(it) }
     }
 
-    // 如果需要手动更新数据,可以调用这个方法
-    fun updateData() {
-        _codeList.value = Core.code.getAllDesc() // 重新获取并更新数据
+    private fun loadDataByType(type: String) {
+        viewModelScope.launch {
+            try {
+                // 获取该类型下的所有站点分组
+                val stations = Core.code.getStationsByType(type)
+                
+                when (type) {
+                    "快递" -> {
+                        // 处理快递类型
+                        val groups = stations.map { station ->
+                            val packages = Core.code.getPackagesByTypeAndStation(type, station.stationName).map { code ->
+                                ExpressPackage(
+                                    id = code.id,
+                                    company = code.secondLevel,
+                                    trackingNumber = code.code,
+                                    createTime = code.createTime
+                                )
+                            }
+                            ExpressGroup(stationName = station.stationName, packages = packages)
+                        }
+                        _expressItems.postValue(groups)
+                    }
+                    "收入" -> {
+                        // 特殊处理收入类型
+                        val groups = stations.map { station ->
+                            val packages = Core.code.getPackagesByTypeAndStation(type, station.stationName).map { code ->
+                                IncomePackage(
+                                    id = code.id,
+                                    company = code.secondLevel,  // 交易对方
+                                    trackingNumber = code.code,  // 金额
+                                    createTime = code.createTime,
+                                    balance = code.remarks.replace("余额", "") // 去掉"余额"前缀
+                                )
+                            }
+                            IncomeGroup(stationName = station.stationName, packages = packages)
+                        }
+                        _incomeItems.postValue(groups)
+                    }
+                    else -> {
+                        // 处理其他类型(还款、航班、火车票)
+                        val groups = stations.map { station ->
+                            val packages = Core.code.getPackagesByTypeAndStation(type, station.stationName).map { code ->
+                                FinancePackage(
+                                    id = code.id,
+                                    company = code.secondLevel,
+                                    trackingNumber = code.code,
+                                    createTime = code.createTime
+                                )
+                            }
+                            FinanceGroup(stationName = station.stationName, packages = packages)
+                        }
+                        
+                        // 根据类型更新对应的 LiveData
+                        when (type) {
+                            "还款" -> _financeItems.postValue(groups)
+                            "航班" -> _flightItems.postValue(groups)
+                            "火车票" -> _trainItems.postValue(groups)
+                        }
+                    }
+                }
+            } catch (e: Exception) {
+                Log.e("HomeViewModel", "Failed to load $type data: ${e.message}")
+            }
+        }
+    }
+
+    fun loadExpressData() {
+        loadDataByType("快递")
+    }
+
+    fun loadFinanceData() {
+        loadDataByType("还款")
+    }
+
+    fun loadIncomeData() {
+        loadDataByType("收入")
+    }
+
+    fun loadFlightData() {
+        loadDataByType("航班")
+    }
+
+    fun loadTrainData() {
+        loadDataByType("火车票")
+    }
+
+    private fun loadCategories() {
+        viewModelScope.launch {
+            try {
+                // 先尝试从本地获取配置
+                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 {
+                    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
+                        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) {
+                Log.e("HomeViewModel", "Failed to load categories: ${e.message}")
+            }
+        }
+    }
+
+    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>) {
+        _categories.value = categories
+        // 保存到本地存储
+        secureStorage.saveCategories(currentUserId, categories)
+        // 同步到服务器
+        syncCategoriesToServer(categories)
+        // 更新可见分类
+        updateVisibleCategories(categories)
+    }
+
+    private fun updateVisibleCategories(categories: List<CategoryConfig>) {
+        val visibleNames = categories
+            .filter { it.isEnabled }
+            .sortedBy { it.order }
+            .map { it.name }
+        
+        _visibleCategories.value = categories.filter { it.isEnabled }
+    }
+
+    // 登出时不再清除本地数据
+    fun logout() {
+        // 只清除内存中的数据
+        _categories.value = emptyList()
     }
 
 }
\ No newline at end of file

--
Gitblit v1.9.3