| | |
| | | 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 _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 _categories = MutableLiveData<List<CategoryConfig>>() |
| | | val categories: LiveData<List<CategoryConfig>> = _categories |
| | | |
| | | private val _visibleCategories = MutableLiveData<List<CategoryConfig>>() |
| | | val visibleCategories: LiveData<List<CategoryConfig>> = _visibleCategories |
| | | |
| | | private lateinit var secureStorage: SecureStorage |
| | | private lateinit var currentUserId: String |
| | | |
| | | init { |
| | | // 初始化时加载包裹列表数据 |
| | |
| | | // loadFinanceData() |
| | | } |
| | | |
| | | fun loadExpressData() { |
| | | fun initialize(context: Context, userId: String) { |
| | | secureStorage = SecureStorage(context) |
| | | currentUserId = userId |
| | | loadCategories() |
| | | // 初始化时更新可见分类 |
| | | _categories.value?.let { updateVisibleCategories(it) } |
| | | } |
| | | |
| | | private fun loadDataByType(type: String) { |
| | | viewModelScope.launch { |
| | | // 1. 获取所有驿站类型的提醒设置 |
| | | val stations = Core.reminder.getByType("快递") |
| | | |
| | | // 2. 按驿站分组获取包裹信息 |
| | | val groups = stations.map { station -> |
| | | val packages = Core.code.getByKeyword(station.nickname).map { code -> |
| | | ExpressPackage( |
| | | id = code.id, //ID |
| | | company = code.secondLevel, //快递公司 |
| | | trackingNumber = code.code, // 取件码 |
| | | createTime = code.createTime //快递时间 |
| | | ) |
| | | 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) |
| | | } |
| | | } |
| | | } |
| | | ExpressGroup( |
| | | stationName = station.nickname, packages = packages |
| | | ) |
| | | } catch (e: Exception) { |
| | | Log.e("HomeViewModel", "Failed to load $type data: ${e.message}") |
| | | } |
| | | |
| | | _expressItems.postValue(groups) |
| | | } |
| | | } |
| | | |
| | | fun loadExpressData() { |
| | | loadDataByType("快递") |
| | | } |
| | | |
| | | fun loadFinanceData() { |
| | | loadDataByType("还款") |
| | | } |
| | | |
| | | fun loadIncomeData() { |
| | | loadDataByType("收入") |
| | | } |
| | | |
| | | fun loadFlightData() { |
| | | loadDataByType("航班") |
| | | } |
| | | |
| | | fun loadTrainData() { |
| | | loadDataByType("火车票") |
| | | } |
| | | |
| | | private fun loadCategories() { |
| | | viewModelScope.launch { |
| | | // 1. 获取所有驿站类型的提醒设置 |
| | | val stations = Core.reminder.getByType("还款") |
| | | |
| | | // 2. 按驿站分组获取包裹信息 |
| | | val groups = stations.map { station -> |
| | | val packages = Core.code.getByKeyword(station.nickname).map { code -> |
| | | FinancePackage( |
| | | id = code.id, //ID |
| | | company = code.secondLevel, //快递公司 |
| | | trackingNumber = code.code, // 取件码 |
| | | createTime = code.createTime //快递时间 |
| | | ) |
| | | } |
| | | FinanceGroup( |
| | | stationName = station.nickname, packages = packages |
| | | 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) |
| | | ) |
| | | |
| | | _financeItems.postValue(groups) |
| | | 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() |
| | | } |
| | | |
| | | } |