From b8aa11a7b447fb8048115bdd156c2aa9e3b16a07 Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期二, 15 四月 2025 16:40:08 +0800
Subject: [PATCH] 1.3
---
app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt | 319 ++++++++++++++++++++++++++++-------------------------
1 files changed, 169 insertions(+), 150 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 d8c92f2..0601ec9 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
@@ -14,32 +14,40 @@
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
+import com.example.firstapp.database.repository.ReminderRecordRepository
+import com.example.firstapp.database.entity.ReminderRecord
class HomeViewModel : ViewModel() {
private val _expressItems = MutableLiveData<List<ExpressGroup>>()
private val _financeItems = MutableLiveData<List<FinanceGroup>>()
- private val _incomeItems = 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<FinanceGroup>> = _incomeItems
+ 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
- // 添加可见分类的 LiveData
- private val _visibleCategories = MutableLiveData<List<String>>()
- val visibleCategories: LiveData<List<String>> = _visibleCategories
+ private val _visibleCategories = MutableLiveData<List<CategoryConfig>>()
+ val visibleCategories: LiveData<List<CategoryConfig>> = _visibleCategories
+
+ private val _unreadReminderCount = MutableLiveData<Int>()
+ val unreadReminderCount: LiveData<Int> = _unreadReminderCount
private lateinit var secureStorage: SecureStorage
private lateinit var currentUserId: String
+ private lateinit var reminderRecordRepository: ReminderRecordRepository
init {
// 初始化时加载包裹列表数据
@@ -51,152 +59,154 @@
fun initialize(context: Context, userId: String) {
secureStorage = SecureStorage(context)
currentUserId = userId
+ reminderRecordRepository = ReminderRecordRepository(context)
loadCategories()
// 初始化时更新可见分类
_categories.value?.let { updateVisibleCategories(it) }
+ // 加载未读提醒数量
+ checkUnreadReminders()
}
- fun loadExpressData() {
- 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 //快递时间
- )
- }
- ExpressGroup(
- stationName = station.nickname, packages = packages
- )
- }
-
- _expressItems.postValue(groups)
- }
- }
-
- fun loadFinanceData() {
- 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
- )
- }
-
- _financeItems.postValue(groups)
- }
- }
-
- 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() {
+ private fun loadDataByType(type: String) {
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)
+ // 获取该类型下的所有站点分组
+ 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)
- _categories.value = localCategories.ifEmpty {
- listOf(
- CategoryConfig(1, "快递", 0),
- CategoryConfig(2, "还款", 1),
- CategoryConfig(3, "收入", 2),
- CategoryConfig(4, "航班", 3),
- CategoryConfig(5, "火车票", 4)
- )
+
+ // 默认完整分类列表
+ 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}")
}
}
}
@@ -215,16 +225,13 @@
}
fun saveCategories(categories: List<CategoryConfig>) {
- viewModelScope.launch {
- // 保存到本地
- secureStorage.saveCategories(currentUserId, categories)
- // 同步到服务器
- syncCategoriesToServer(categories)
- _categories.value = categories
-
- // 更新可见分类
- updateVisibleCategories(categories)
- }
+ _categories.value = categories
+ // 保存到本地存储
+ secureStorage.saveCategories(currentUserId, categories)
+ // 同步到服务器
+ syncCategoriesToServer(categories)
+ // 更新可见分类
+ updateVisibleCategories(categories)
}
private fun updateVisibleCategories(categories: List<CategoryConfig>) {
@@ -233,7 +240,19 @@
.sortedBy { it.order }
.map { it.name }
- _visibleCategories.value = visibleNames
+ _visibleCategories.value = categories.filter { it.isEnabled }
+ }
+
+ // 添加检查未读提醒数量的方法
+ fun checkUnreadReminders() {
+ viewModelScope.launch {
+ try {
+ val unreadCount = reminderRecordRepository.getUnreadCount(ReminderRecord.STATUS_UNREAD)
+ _unreadReminderCount.postValue(unreadCount)
+ } catch (e: Exception) {
+ Log.e("HomeViewModel", "Failed to get unread reminder count: ${e.message}")
+ }
+ }
}
// 登出时不再清除本地数据
--
Gitblit v1.9.3