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