From 2c0177d2bfc2ed89b2fdffc7ccb84dc685cdf524 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期二, 18 三月 2025 10:09:04 +0800
Subject: [PATCH] fix: 财务统计逻辑

---
 app/src/main/res/layout/activity_phone_login.xml                 |    2 
 app/src/main/java/com/example/firstapp/entity/Rule.kt            |   82 ++++++-
 app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt   |   56 ++++-
 app/src/main/res/values/themes.xml                               |    4 
 app/src/main/res/layout/item_finance_package_home.xml            |   47 ++++
 app/src/main/java/com/example/firstapp/adapter/FinanceAdapter.kt |  175 +++++++++++++++
 app/src/main/res/layout/fragment_home.xml                        |   58 -----
 app/src/main/res/values/colors.xml                               |    1 
 app/src/main/java/com/example/firstapp/ui/home/HomeViewModel.kt  |   60 +++--
 app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt   |   37 ++
 app/src/main/java/com/example/firstapp/model/FinanceGroup.kt     |   13 +
 app/src/main/res/layout/item_finance_group.xml                   |   54 ++++
 app/src/main/res/layout/item_finance.xml                         |   59 +++++
 13 files changed, 528 insertions(+), 120 deletions(-)

diff --git a/app/src/main/java/com/example/firstapp/adapter/FinanceAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/FinanceAdapter.kt
new file mode 100644
index 0000000..b0e39a4
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/adapter/FinanceAdapter.kt
@@ -0,0 +1,175 @@
+package com.example.firstapp.adapter
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.ListAdapter
+import androidx.recyclerview.widget.RecyclerView
+import com.example.firstapp.R
+import com.example.firstapp.databinding.ItemFinanceBinding
+import com.example.firstapp.databinding.ItemFinanceGroupBinding
+import com.example.firstapp.databinding.ItemFinancePackageHomeBinding
+import com.example.firstapp.model.FinanceGroup
+import com.example.firstapp.model.FinancePackage
+
+class FinanceAdapter :
+    ListAdapter<FinanceGroup, FinanceAdapter.ViewHolder>(FinanceGroupDiffCallback()) {
+
+    private var onPackageClickListener: (FinanceGroup, FinancePackage) -> Unit = { _, _ -> }
+
+    fun setOnPackageClickListener(listener: (FinanceGroup, FinancePackage) -> Unit) {
+        onPackageClickListener = listener
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val binding = ItemFinanceGroupBinding.inflate(
+            LayoutInflater.from(parent.context), parent, false
+        )
+        return ViewHolder(binding)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val group = getItem(position)
+        holder.bind(group)
+        holder.setOnPackageClickListener(onPackageClickListener)
+    }
+
+
+    inner class ViewHolder(private val binding: ItemFinanceGroupBinding) :
+        RecyclerView.ViewHolder(binding.root) {
+        private val packagesAdapter = FinancePackageHomeAdapter { pack ->
+            currentGroup?.let { group ->
+                onPackageClickListener(group, pack)
+            }
+        }
+        private var currentGroup: FinanceGroup? = null
+
+        init {
+            binding.rvPackages.apply {
+                layoutManager = LinearLayoutManager(context)
+                adapter = packagesAdapter
+            }
+        }
+
+        fun bind(group: FinanceGroup) {
+            currentGroup = group
+            binding.tvStationName.text = group.stationName
+            binding.tvPackageCount.text = "共${group.packages.size}笔账单"
+            packagesAdapter.submitList(group.packages)
+        }
+
+        fun setOnPackageClickListener(listener: (FinanceGroup, FinancePackage) -> Unit) {
+            // 这个方法可以移除,因为我们在构造 ExpressPackageHomeAdapter 时已经处理了点击事件
+            // 或者保留这个方法但不做任何操作
+        }
+    }
+}
+
+// 首页使用的包裹适配器 - 简化版本
+class FinancePackageHomeAdapter(private val onPackageClick: (FinancePackage) -> Unit) :
+    ListAdapter<FinancePackage, FinancePackageHomeAdapter.ViewHolder>(FinancePackageDiffCallback()) {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val binding = ItemFinancePackageHomeBinding.inflate(
+            LayoutInflater.from(parent.context), parent, false
+        )
+        return ViewHolder(binding)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val pack = getItem(position)
+        holder.bind(pack)
+    }
+
+    inner class ViewHolder(private val binding: ItemFinancePackageHomeBinding) :
+        RecyclerView.ViewHolder(binding.root) {
+
+        init {
+            binding.root.setOnClickListener {
+                val pack = getItem(adapterPosition)
+                onPackageClick(pack)
+            }
+        }
+
+        fun bind(pack: FinancePackage) {
+            binding.tvCompany.text = pack.company
+            binding.tvCreateTime.text = pack.createTime
+            binding.tvTrackingNumber.text = pack.trackingNumber
+        }
+    }
+}
+
+// 取件页面使用的包裹适配器
+class FinancePackageAdapter(private val onPackagePickup: (FinancePackage) -> Unit = { _ -> }) :
+    ListAdapter<FinancePackage, FinancePackageAdapter.ViewHolder>(FinancePackageDiffCallback()) {
+
+    private var onPackageClickListener: (FinancePackage) -> Unit = {}
+    private var stationName: String = ""
+
+    fun setStationInfo(station: String) {
+        stationName = station
+    }
+
+    fun setOnPackageClickListener(listener: (FinancePackage) -> Unit) {
+        onPackageClickListener = listener
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val binding = ItemFinanceBinding.inflate(
+            LayoutInflater.from(parent.context), parent, false
+        )
+        return ViewHolder(binding)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val pack = getItem(position)
+        holder.bind(pack)
+    }
+
+    inner class ViewHolder(private val binding: ItemFinanceBinding) :
+        RecyclerView.ViewHolder(binding.root) {
+
+        init {
+            binding.ivPackageStatus.setOnClickListener {
+                val pack = getItem(adapterPosition)
+                onPackagePickup(pack)
+            }
+
+            binding.root.setOnClickListener(null)
+        }
+
+        fun bind(pack: FinancePackage) {
+            binding.tvPackageId.text = pack.id.toString()
+            binding.tvCompany.text = pack.company
+            binding.tvCreateTime.text = pack.createTime
+            binding.tvTrackingNumber.text = pack.trackingNumber
+            binding.ivPackageStatus.setImageResource(
+//                if (pack.isPickedUp) R.drawable.circle_checked
+//                else R.drawable.circle
+                R.drawable.circle
+            )
+        }
+    }
+}
+
+
+private class FinanceGroupDiffCallback : DiffUtil.ItemCallback<FinanceGroup>() {
+    override fun areItemsTheSame(oldItem: FinanceGroup, newItem: FinanceGroup): Boolean {
+        return oldItem.stationName == newItem.stationName
+    }
+
+    override fun areContentsTheSame(oldItem: FinanceGroup, newItem: FinanceGroup): Boolean {
+        return oldItem == newItem
+    }
+}
+
+private class FinancePackageDiffCallback : DiffUtil.ItemCallback<FinancePackage>() {
+    override fun areItemsTheSame(oldItem: FinancePackage, newItem: FinancePackage): Boolean {
+        return oldItem.trackingNumber == newItem.trackingNumber
+    }
+
+    override fun areContentsTheSame(oldItem: FinancePackage, newItem: FinancePackage): Boolean {
+        return oldItem == newItem
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/entity/Rule.kt b/app/src/main/java/com/example/firstapp/entity/Rule.kt
index 3bb161e..c24c869 100644
--- a/app/src/main/java/com/example/firstapp/entity/Rule.kt
+++ b/app/src/main/java/com/example/firstapp/entity/Rule.kt
@@ -1,17 +1,77 @@
 package com.example.firstapp.entity
 
-data class Rule(var type: String,var content: String ,var reg: String) {
+import java.time.LocalDateTime
 
-    // 在 Rule 类中定义提取方法
-    fun extractCodeFromMessage(message: String): String? {
-        // 如果 message 包含 content
-        if (message.contains(content)) {
-            // 使用 reg 作为正则表达式进行匹配
-            val regex = reg.toRegex()
-            val matchResult = regex.find(message)
-            return matchResult?.value  // 如果找到匹配的内容,则返回
-        }
-        return null  // 如果不匹配,返回 null
+class Rule(
+    val type: String,
+    val content: String,
+    val pattern: String
+) {
+    // 添加伴生对象存储多个正则表达式模式
+    companion object {
+        private val BANK_PATTERNS = mapOf(
+            "招商银行" to listOf(
+                // 第一种格式:账单¥xxx,还款日MM月dd日
+                "账单[¥¥](\\d+\\.?\\d*).*还款日(\\d{2})月(\\d{2})日",
+                // 第二种格式:账单金额xxx,还款日MM月dd日
+                "账单金额[::](\\d+\\.?\\d*).*还款日[::](\\d{2})月(\\d{2})日",
+                // 可以继续添加其他格式...
+            ),
+            "中国银行" to listOf(
+                "账单金额[::](\\d+\\.?\\d*).*还款日[::](\\d{1,2})日",
+                // 可以添加其他格式...
+            ),
+            // 其他银行的模式...
+        )
     }
 
+    fun extractCodeFromMessage(message: String): String? {
+        if (type == "财务") {
+            // 获取该银行的所有正则表达式模式
+            val patterns = BANK_PATTERNS[content] ?: listOf(pattern)
+
+            // 尝试每一个正则表达式
+            for (pat in patterns) {
+                val regex = pat.toRegex()
+                val matchResult = regex.find(message)
+
+                matchResult?.let {
+                    if (it.groupValues.size > 1) {
+                        return it.groupValues[1].replace("[¥¥]".toRegex(), "")
+                    }
+                }
+            }
+            return null
+        } else {
+            // 非财务类型的处理保持不变
+            val regex = pattern.toRegex()
+            val matchResult = regex.find(message)
+            return matchResult?.value
+        }
+    }
+
+    fun extractDueDate(message: String): String? {
+        if (type != "财务") return null
+
+        val patterns = BANK_PATTERNS[content] ?: listOf(pattern)
+
+        for (pat in patterns) {
+            val regex = pat.toRegex()
+            val matchResult = regex.find(message)
+
+            matchResult?.let {
+                when {
+                    content == "招商银行" && it.groupValues.size > 3 -> {
+                        return "${it.groupValues[2]}月${it.groupValues[3]}日"
+                    }
+                    it.groupValues.size > 2 -> {
+                        return it.groupValues[2] + "日"
+                    }
+
+                    else -> {}
+                }
+            }
+        }
+        return null
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/model/FinanceGroup.kt b/app/src/main/java/com/example/firstapp/model/FinanceGroup.kt
new file mode 100644
index 0000000..0fba095
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/model/FinanceGroup.kt
@@ -0,0 +1,13 @@
+package com.example.firstapp.model
+
+data class FinanceGroup(
+    val stationName: String,
+    val packages: List<FinancePackage>
+)
+
+data class FinancePackage(
+    var id: Long,
+    val company: String,
+    val trackingNumber: String,
+    val createTime: String
+) 
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt b/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt
index 711ad6b..685b248 100644
--- a/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt
+++ b/app/src/main/java/com/example/firstapp/receiver/SmsReceiver.kt
@@ -44,17 +44,19 @@
                     messages[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
                     messageBody.append(messages[i]?.messageBody)
                 }
-
                 // 输出短信内容到控制台
-                Log.d("SmsReceiver", "Received SMS: ${messageBody.toString()}")
                 val msg = Msg(0, "1111", "111111", messageBody.toString(),1, "111", 1, 1)
                 val msgId = Core.msg.insert(msg)
-                Log.d("SmsReceiver", "Received SMS msgId: ${msgId}")
-
                 // 这里我要写个数组,并创建个对象存放一些内容,如这个对象的属性有匹配内容,正则表达式,并循环遍历
                 val ruleList = mutableListOf(
                     Rule("快递","京东","\\d{6}"),
-                    Rule("快递","菜鸟驿站","\\d{1,2}-\\d{1,2}-\\d{4}")
+                    Rule("快递","菜鸟驿站","\\d{1,2}-\\d{1,2}-\\d{4}"),
+                    // 银行规则使用默认正则,实际匹配时会使用 BANK_PATTERNS 中的模式
+                    Rule("财务", "中国银行", "账单金额[::](\\d+\\.?\\d*).*还款日[::](\\d{1,2})日"),
+                    Rule("财务", "工商银行", "账单金额[::](\\d+\\.?\\d*).*还款日[::](\\d{1,2})日"),
+                    Rule("财务", "建设银行", "账单金额[::](\\d+\\.?\\d*).*还款日[::](\\d{1,2})日"),
+                    Rule("财务", "信用卡", "账单[¥¥](\\d+\\.?\\d*).*还款日(\\d{2})月(\\d{2})日"),
+                    Rule("财务", "花呗", "本月花呗账单(\\d+\\.?\\d*)元.*还款日[期是::](\\d{1,2})[日号]")
                 )
 
                 CoroutineScope(Dispatchers.IO).launch {
@@ -74,19 +76,49 @@
                     Log.d("RuleList", ruleList.toString())
 
                     for (rule in ruleList) {
-                        val code = rule.extractCodeFromMessage(messageBody.toString())
-                        if (code!==null) {
-                            // 转换为 Date 对象
+                        val code = if (rule.type == "财务") {
+                            // 对信用卡账单使用特殊的提取逻辑
+                            val regex = rule.pattern.toRegex()
+                            val matchResult = regex.find(messageBody.toString())
+                            matchResult?.let {
+                                val amount = it.groupValues[1]  // 账单金额
+                                amount
+                            }
+                        } else {
+                            rule.extractCodeFromMessage(messageBody.toString())
+                        }
+
+                        if (code !== null) {
                             val currentTime = LocalDateTime.now()
-                            // 将 LocalDateTime 转换为 Date
                             val date = Date.from(currentTime.atZone(ZoneId.systemDefault()).toInstant())
-                            // 如果需要格式化显示
                             val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
                             val createtime = sdf.format(date)
+
+                            // 对于信用卡账单,使用还款日作为time字段
+                            val time = if (rule.type == "财务") {
+                                rule.extractDueDate(messageBody.toString()) ?: createtime
+                            } else {
+                                createtime
+                            }
+
                             val existingCode = Core.code.queryByTypeAndCodeAndDate(rule.content, code, createtime)
                             if (existingCode == null) {
-                                val code = Code(0, rule.type, 1, rule.content, 1, 1, msgId, code, createtime, "中通",0,"","")
-                                Core.code.insert(code)
+                                val codeEntity = Code(
+                                    0,
+                                    rule.type,
+                                    1,
+                                    rule.content,
+                                    1,
+                                    1,
+                                    msgId,
+                                    code,
+                                    createtime,
+                                    rule.content,  // 银行名称作为name
+                                    0,
+                                    time,  // 还款日期
+                                    ""
+                                )
+                                Core.code.insert(codeEntity)
                                 Log.d("SMS_DEBUG", "新短信已保存到数据库")
 
                                 // 发送广播通知数据已更新
diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
index b272afa..ac27547 100644
--- a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
@@ -17,6 +17,7 @@
 import com.example.firstapp.R
 import com.example.firstapp.activity.PickupActivity
 import com.example.firstapp.adapter.ExpressAdapter
+import com.example.firstapp.adapter.FinanceAdapter
 import com.example.firstapp.core.Core
 import com.example.firstapp.databinding.FragmentHomeBinding
 
@@ -30,7 +31,7 @@
 
     private lateinit var homeViewModel: HomeViewModel
     private lateinit var expressAdapter: ExpressAdapter
-    //    private lateinit var financeAdapter: FinanceAdapter
+    private lateinit var financeAdapter: FinanceAdapter
 //    private lateinit var memorialAdapter: MemorialAdapter
     private lateinit var dataUpdateReceiver: BroadcastReceiver
 
@@ -88,12 +89,25 @@
             }
         }
 
-//        // 财务列表
-//        binding.financeRecycler.apply {
-//            layoutManager = LinearLayoutManager(context)
-//            financeAdapter = FinanceAdapter()
-//            adapter = financeAdapter
-//        }
+        // 财务列表
+        binding.financeRecycler.apply {
+            layoutManager = LinearLayoutManager(context)
+            financeAdapter = FinanceAdapter()
+            adapter = financeAdapter
+
+            // 设置初始状态 - 添加这行
+            binding.financeContent.visibility = View.GONE
+
+            // 设置点击监听
+            financeAdapter.setOnPackageClickListener { group, pack ->
+                // 跳转到取件页面
+                val intent = Intent(requireContext(), PickupActivity::class.java).apply {
+                    putExtra("station_name", group.stationName)
+                    putExtra("company", pack.company)
+                }
+                startActivity(intent)
+            }
+        }
 //
 //        // 纪念日列表
 //        binding.memorialRecycler.apply {
@@ -132,6 +146,9 @@
                 tabExpress.textSize = 14f
                 tabFinance.textSize = 16f
                 others.textSize = 14f
+
+                // 在切换到财务标签时加载数据 - 添加这行
+                homeViewModel.loadFinanceData()
             }
 
             // 其他标签点击事件
@@ -156,9 +173,9 @@
             expressAdapter.submitList(items)
         }
 
-//        homeViewModel.financeItems.observe(viewLifecycleOwner) { items ->
-//            financeAdapter.submitList(items)
-//        }
+        homeViewModel.financeItems.observe(viewLifecycleOwner) { items ->
+            financeAdapter.submitList(items)
+        }
 //
 //        homeViewModel.memorialItems.observe(viewLifecycleOwner) { items ->
 //            memorialAdapter.submitList(items)
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 9c065a5..c8c6c17 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
@@ -8,44 +8,29 @@
 import com.example.firstapp.database.entity.Code
 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 kotlinx.coroutines.launch
 
 class HomeViewModel : ViewModel() {
 
-//    private val _text = MutableLiveData<String>().apply {
-//        value = "短信主页面"
-//    }
-//    val text: LiveData<String> = _text
-//
-//    private val _codeList = MutableLiveData<List<Code>>()
-//
-//    val codeList: LiveData<List<Code>> get() = _codeList
-
     private val _expressItems = MutableLiveData<List<ExpressGroup>>()
+    private val _financeItems = MutableLiveData<List<FinanceGroup>>()
     val expressItems: LiveData<List<ExpressGroup>> = _expressItems
+    val financeItems: LiveData<List<FinanceGroup>> = _financeItems
 
     init {
-        // 初始化时加载数据
-      //  loadData()
+        // 初始化时加载包裹列表数据
         loadExpressData()
+        // 初始化时不加载财务列表数据 0317
+        //  loadFinanceData()
     }
-
-    // 加载数据的方法
-//    fun loadData() {
-//        // 获取数据,并更新 LiveData
-//        _codeList.value = Core.code.getAllDesc() // 假设这是获取最新的 data 的方法
-//    }
-//
-//    // 如果需要手动更新数据,可以调用这个方法
-//    fun updateData() {
-//        _codeList.value = Core.code.getAllDesc() // 重新获取并更新数据
-//    }
 
     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 ->
@@ -57,13 +42,36 @@
                     )
                 }
                 ExpressGroup(
-                    stationName = station.nickname,
-                    packages = packages
+                    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.name, //快递公司
+                        trackingNumber = code.code, // 取件码
+                        createTime = code.createtime  //快递时间
+                    )
+                }
+                FinanceGroup(
+                    stationName = station.nickname, packages = packages
+                )
+            }
+
+            _financeItems.postValue(groups)
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_phone_login.xml b/app/src/main/res/layout/activity_phone_login.xml
index f306574..757b041 100644
--- a/app/src/main/res/layout/activity_phone_login.xml
+++ b/app/src/main/res/layout/activity_phone_login.xml
@@ -67,7 +67,7 @@
                 android:layout_weight="1"
                 android:background="@null"
                 android:hint="请输入验证码"
-                android:text="123456"
+                android:text="888888"
                 android:inputType="number"
                 android:maxLength="6"
                 android:textSize="16sp"
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 5df2603..f5c2f09 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -106,64 +106,6 @@
                     android:layout_height="wrap_content"
                     android:padding="8dp"/>
 
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:orientation="vertical"
-                    android:padding="16dp">
-
-                    <!-- 花呗还款 -->
-                    <TextView
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="花呗"
-                        android:textSize="16sp"
-                        android:textStyle="bold"
-                        android:layout_marginBottom="8dp"/>
-
-                    <TextView
-                        android:id="@+id/huabeiAmount"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="230,721 元"
-                        android:textSize="24sp"
-                        android:textColor="#FF5722"
-                        android:layout_marginBottom="4dp"/>
-
-                    <TextView
-                        android:id="@+id/huabeiDueDate"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="提醒您2025.01.14 还款"
-                        android:textSize="14sp"
-                        android:layout_marginBottom="16dp"/>
-
-                    <!-- 信用卡还款 -->
-                    <TextView
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="中国银行信用卡"
-                        android:textSize="16sp"
-                        android:textStyle="bold"
-                        android:layout_marginBottom="8dp"/>
-
-                    <TextView
-                        android:id="@+id/creditCardAmount"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="310,621 元"
-                        android:textSize="24sp"
-                        android:textColor="#FF5722"
-                        android:layout_marginBottom="4dp"/>
-
-                    <TextView
-                        android:id="@+id/creditCardDueDate"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:text="提醒您2025.02.10 还款"
-                        android:textSize="14sp"/>
-
-                </LinearLayout>
             </androidx.cardview.widget.CardView>
 
         </FrameLayout>
diff --git a/app/src/main/res/layout/item_finance.xml b/app/src/main/res/layout/item_finance.xml
new file mode 100644
index 0000000..6c4e6cb
--- /dev/null
+++ b/app/src/main/res/layout/item_finance.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:padding="12dp"
+    android:gravity="center_vertical">
+
+    <ImageView
+        android:id="@+id/iv_package_status"
+        android:layout_width="12dp"
+        android:layout_height="12dp"
+        android:src="@drawable/circle"/>
+
+    <TextView
+        android:id="@+id/tv_package_id"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:visibility="gone"/>
+
+    <ImageView
+        android:id="@+id/iv_company_logo"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_marginEnd="6dp"/>
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_company"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
+            android:textColor="#333333"
+            android:textStyle="bold"/>
+
+        <TextView
+            android:id="@+id/tv_create_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
+            android:textColor="#666666"
+            android:layout_marginTop="4dp"/>
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_tracking_number"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="25sp"
+        android:textColor="#333333"
+        android:layout_marginStart="12dp"
+        android:textStyle="bold"/>
+
+</LinearLayout> 
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_finance_group.xml b/app/src/main/res/layout/item_finance_group.xml
new file mode 100644
index 0000000..4a13e84
--- /dev/null
+++ b/app/src/main/res/layout/item_finance_group.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginHorizontal="12dp"
+    android:layout_marginVertical="6dp"
+    app:cardCornerRadius="8dp"
+    app:cardElevation="2dp">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:padding="16dp">
+
+        <!-- 驿站名称和包裹数量 -->
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:layout_marginBottom="12dp">
+
+            <ImageView
+                android:id="@+id/iv_station_icon"
+                android:layout_width="20dp"
+                android:layout_height="20dp"
+                android:layout_gravity="center_vertical"
+                android:src="@drawable/location"/>
+
+            <TextView
+                android:id="@+id/tv_station_name"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:layout_marginStart="8dp"
+                android:textSize="16sp"
+                android:textColor="#333333"/>
+
+            <TextView
+                android:id="@+id/tv_package_count"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textSize="14sp"
+                android:textColor="#666666"/>
+        </LinearLayout>
+
+        <!-- 包裹列表 -->
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/rv_packages"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+</androidx.cardview.widget.CardView>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_finance_package_home.xml b/app/src/main/res/layout/item_finance_package_home.xml
new file mode 100644
index 0000000..a172550
--- /dev/null
+++ b/app/src/main/res/layout/item_finance_package_home.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal"
+    android:padding="12dp"
+    android:gravity="center_vertical">
+
+    <ImageView
+        android:id="@+id/iv_company_logo"
+        android:layout_width="20dp"
+        android:layout_height="20dp"
+        android:layout_marginEnd="6dp"/>
+
+    <LinearLayout
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_company"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
+            android:textColor="#333333"
+            android:textStyle="bold"/>
+
+        <TextView
+            android:id="@+id/tv_create_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
+            android:textColor="#666666"
+            android:layout_marginTop="4dp"/>
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/tv_tracking_number"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textSize="25sp"
+        android:textColor="#333333"
+        android:layout_marginStart="12dp"
+        android:textStyle="bold"/>
+
+</LinearLayout> 
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8581b0b..0c67673 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -15,4 +15,5 @@
     <color name="gray">#757575</color>
     <color name="light_blue_50">#E1F5FE</color>
     <color name="tab_selected">#FF039BE5</color>
+    <color name="light_blue_new">#02A7F0</color>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index e65a1fe..83c6e3c 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -3,8 +3,8 @@
     <!--    <style name="Theme.FirstApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">-->
     <style name="Theme.FirstApp" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
         <!-- Primary brand color. -->
-        <item name="colorPrimary">@color/purple_500</item>
-        <item name="colorPrimaryVariant">@color/purple_700</item>
+        <item name="colorPrimary">@color/light_blue_new</item>
+        <item name="colorPrimaryVariant">@color/light_blue_new</item>
         <item name="colorOnPrimary">@color/white</item>
         <!-- Secondary brand color. -->
         <item name="colorSecondary">@color/teal_200</item>

--
Gitblit v1.9.3