From 27bbd0435881e408f267c99e6a253d2e17873bcc Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期五, 11 四月 2025 17:44:11 +0800
Subject: [PATCH] 1.2
---
app/src/main/java/com/example/firstapp/activity/SettingActivity.kt | 85 +++++-
app/src/main/java/com/example/firstapp/database/response/AccountCloseResponse.kt | 7
app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt | 15 +
app/src/main/java/com/example/firstapp/database/repository/KeywordRepository.kt | 5
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt | 87 +++++-
app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt | 59 ++++
app/src/main/res/layout/layout_week_stats.xml | 39 ++
app/src/main/java/com/example/firstapp/adapter/PackageAdapter.kt | 6
app/src/main/java/com/example/firstapp/database/dao/KeywordDao.kt | 4
app/src/main/res/layout/fragment_dashboard0411.xml | 262 ++++++++++++++++++
app/src/main/java/com/example/firstapp/database/service/ApiService.kt | 3
app/src/main/java/com/example/firstapp/model/DailyStat2.kt | 17 +
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt | 7
app/src/main/java/com/example/firstapp/model/DailyStat.kt | 1
app/src/main/res/layout/activity_setting.xml | 17 +
app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt | 2
app/src/main/res/drawable/border_button.xml | 12
app/src/main/res/layout/fragment_dashboard.xml | 92 +++++-
app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt | 4
app/src/main/res/layout/item_package_dashboard.xml | 8
app/src/main/res/layout/account_close_dialog_custom.xml | 87 ++++++
21 files changed, 761 insertions(+), 58 deletions(-)
diff --git a/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt
index 017f581..371c4d8 100644
--- a/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt
+++ b/app/src/main/java/com/example/firstapp/activity/SettingActivity.kt
@@ -4,22 +4,19 @@
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.content.Intent
-import android.os.Build
import android.os.Bundle
-import android.os.Handler
-import android.os.Looper
-import android.view.Gravity
+import android.view.LayoutInflater
import android.view.MenuItem
-import android.view.MotionEvent
-import android.view.View
-import android.view.WindowInsets
-import android.widget.LinearLayout
-import android.widget.TextView
-import androidx.appcompat.widget.Toolbar
+import android.widget.Button
import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
import com.example.firstapp.databinding.ActivitySettingBinding
import com.example.firstapp.R
+import com.example.firstapp.core.Core
+import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.ui.home.HomeViewModel
+import com.example.firstapp.utils.Log
+import kotlinx.coroutines.launch
/**
* An example full-screen activity that shows and hides the system UI (i.e.
@@ -66,6 +63,70 @@
//
// })
+
+ // 退出登录
+ logout()
+
+ // 账号注销
+ accountClose()
+
+
+
+ }
+
+ private fun accountClose(){
+
+
+ binding.accountClose.setOnClickListener {
+
+ val dialogView = LayoutInflater.from(this).inflate(R.layout.account_close_dialog_custom, null)
+
+ val dialog = AlertDialog.Builder(this)
+ .setView(dialogView)
+ .create()
+
+ dialog.window?.setBackgroundDrawableResource(R.drawable.dialog_background)
+
+ val btnConfirm = dialogView.findViewById<Button>(R.id.btnConfirm)
+ btnConfirm.setOnClickListener {
+ dialog.dismiss()
+ }
+
+ val btnCancel = dialogView.findViewById<Button>(R.id.btnCancel)
+ btnCancel.setOnClickListener {
+ // 关闭账户
+ lifecycleScope.launch {
+ try {
+ // 清除本地的数据库
+ RetrofitClient.apiService.closeAccount()
+
+ Core.code.deleteAll()
+ Core.msg.deleteAll()
+ Core.keyword.deleteAll()
+ Core.reminder.deleteAll()
+
+ dialog.dismiss()
+ // 跳转到 LoginActivity 并清除之前的任务栈
+ var intent = Intent(this@SettingActivity, LoginActivity::class.java)
+ intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
+ startActivity(intent)
+ // 关闭当前页面
+ finish()
+
+ } catch (ex: Exception) {
+ Log.e("关闭账户", ex.message ?: "关闭账户报错")
+ }
+
+ }
+ }
+
+ dialog.show()
+
+ }
+ }
+
+ private fun logout(){
+
binding.settingExit.setOnClickListener {
// 弹出确认退出的对话框
val alertDialog = AlertDialog.Builder(this)
@@ -79,7 +140,6 @@
val intent = Intent(this, LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)
-
// 关闭当前页面
finish()
}
@@ -92,9 +152,6 @@
// 显示对话框
alertDialog.show()
}
-
-
-
}
// 点击返回按钮时调用
diff --git a/app/src/main/java/com/example/firstapp/adapter/PackageAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/PackageAdapter.kt
index dc3df25..b85bc45 100644
--- a/app/src/main/java/com/example/firstapp/adapter/PackageAdapter.kt
+++ b/app/src/main/java/com/example/firstapp/adapter/PackageAdapter.kt
@@ -44,6 +44,10 @@
private val textPickTime: TextView = view.findViewById(R.id.text_pick_time)
fun bind(code: Code) {
+
+ textTime.textSize=10f
+ textPickTime.textSize=10f
+
// imgCourier.setImageResource(code.category)
textCourierName.text = code.oneLevel
textTrackingNumber.text = code.code
@@ -53,7 +57,7 @@
try {
val date: Date? = parser.parse(code.createTime) // 解析字符串
date?.let {
- textTime.text = "到货:"+formatter.format(it) // 格式化并赋值
+ textTime.text = "到货:"+formatter.format(it) // 格式化并赋值
} ?: run {
// 处理解析失败(date 为 null 的情况)
textTime.text = "Invalid Date"
diff --git a/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt b/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
index 7572a45..d8b0118 100644
--- a/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
+++ b/app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt
@@ -29,6 +29,9 @@
@Query("DELETE FROM Code where id=:id")
fun delete(id: Long)
+ @Query("DELETE FROM Code")
+ fun deleteAll(): Completable
+
@Query("SELECT * FROM Code WHERE id = :id LIMIT 1")
fun getCodeById(id: Long): Code?
@@ -75,10 +78,18 @@
@Query("""
SELECT * FROM code
WHERE substr(createTime, 1, 10) =
- date(:date/1000, 'unixepoch', 'localtime')
+ date(:date/1000, 'unixepoch', 'localtime')
ORDER BY createTime DESC
""")
fun getPackagesByDay(date: Long): Flow<List<Code>>
+
+ @Query("""
+ SELECT * FROM code
+ WHERE substr(createTime, 1, 10) =
+ date(:date/1000, 'unixepoch', 'localtime') and pickup = 1
+ ORDER BY createTime DESC
+ """)
+ fun getPackagesByDayUnread(date: Long): Flow<List<Code>>
@Query("""
SELECT oneLevel as courierName, COUNT(*) as count
@@ -283,4 +294,50 @@
ORDER BY createTime DESC
""")
fun getPackagesByTypeAndStation(type: String, stationName: String): List<Code>
+
+
+ @Query("""
+ SELECT COUNT(1)
+ FROM code
+ WHERE date(createTime) BETWEEN date(:startDateCur) AND date(:endDateCur)
+ """)
+ fun getCurrentWeekStats2(startDateCur: String, endDateCur: String): Flow<Long>
+
+// @Query("""
+// WITH RECURSIVE dates(date_value) AS (
+// SELECT date('now', 'weekday 1', '-7 days')
+// UNION ALL
+// SELECT date(date_value, '+1 day')
+// FROM dates
+// WHERE date_value < date('now', 'weekday 1', '-7 days', '+6 days')
+// )
+// SELECT
+// strftime('%d', date_value) AS date,
+// COUNT(c.id) AS count,
+// '' as weekStart
+// FROM dates d
+// LEFT JOIN code c ON date(c.createTime) = d.date_value
+// GROUP BY d.date_value
+// ORDER BY d.date_value ASC
+//
+// """)
+
+ @Query("""
+ WITH RECURSIVE dates(date_value) AS (
+ SELECT date(:startDateCur)
+ UNION ALL
+ SELECT date(date_value, '+1 day')
+ FROM dates
+ WHERE date_value < date(:endDateCur)
+ )
+ SELECT
+ strftime('%d', date_value) AS date,
+ COUNT(c.id) AS count,
+ '' AS weekStart
+ FROM dates d
+ LEFT JOIN code c ON date(c.createTime) = d.date_value
+ GROUP BY d.date_value
+ ORDER BY d.date_value ASC
+""")
+ fun getWeeklyStatsChart(startDateCur: String, endDateCur: String): Flow<List<DailyStat>>
}
diff --git a/app/src/main/java/com/example/firstapp/database/dao/KeywordDao.kt b/app/src/main/java/com/example/firstapp/database/dao/KeywordDao.kt
index 81a54e1..f128430 100644
--- a/app/src/main/java/com/example/firstapp/database/dao/KeywordDao.kt
+++ b/app/src/main/java/com/example/firstapp/database/dao/KeywordDao.kt
@@ -7,6 +7,7 @@
import androidx.room.Update
import com.example.firstapp.database.entity.KeywordConfig
import com.example.firstapp.database.entity.KeywordEntity
+import io.reactivex.Completable
//@Dao
//interface KeywordDao {
@@ -34,4 +35,7 @@
@Query("SELECT * FROM keywords")
fun getAllKeywords(): List<KeywordEntity>
+
+ @Query("DELETE FROM keywords")
+ fun deleteAll(): Completable
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt b/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt
index bf6ca23..8179240 100644
--- a/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt
+++ b/app/src/main/java/com/example/firstapp/database/dao/ReminderDao.kt
@@ -23,4 +23,4 @@
@Query("DELETE FROM reminders")
suspend fun deleteAllReminders()
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt b/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt
index ad83877..19aecf0 100644
--- a/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt
+++ b/app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt
@@ -3,6 +3,7 @@
import androidx.annotation.WorkerThread
import com.example.firstapp.database.dao.CodeDao
import com.example.firstapp.database.entity.Code
+import com.example.firstapp.model.DailyStat
import com.example.firstapp.model.StationGroup
import kotlinx.coroutines.flow.Flow
@@ -14,6 +15,9 @@
@WorkerThread
fun delete(id: Long) = codeDao.delete(id)
+
+ @WorkerThread
+ fun deleteAll() = codeDao.deleteAll()
fun getAll() = codeDao.getAllCodes()
@@ -36,6 +40,14 @@
fun getPackages(date: Long, dateType: String): Flow<List<Code>> {
return when (dateType) {
"DAY" -> codeDao.getPackagesByDay(date)
+ "WEEK" -> codeDao.getPackagesByWeek(date)
+ else -> codeDao.getPackagesByDay(date)
+ }
+ }
+
+ fun getPackagesUnread(date: Long, dateType: String): Flow<List<Code>> {
+ return when (dateType) {
+ "DAY" -> codeDao.getPackagesByDayUnread(date)
"WEEK" -> codeDao.getPackagesByWeek(date)
else -> codeDao.getPackagesByDay(date)
}
@@ -87,4 +99,7 @@
return codeDao.getPackagesByTypeAndStation(type, stationName)
}
+ fun getCurrentWeekStats2(startDateCur: String, endDateCur: String) = codeDao.getCurrentWeekStats2(startDateCur,endDateCur)
+ fun getWeeklyStatsChart(startDateCur: String, endDateCur: String): Flow<List<DailyStat>> = codeDao.getWeeklyStatsChart(startDateCur,endDateCur)
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/repository/KeywordRepository.kt b/app/src/main/java/com/example/firstapp/database/repository/KeywordRepository.kt
index 26c45cb..9da32b4 100644
--- a/app/src/main/java/com/example/firstapp/database/repository/KeywordRepository.kt
+++ b/app/src/main/java/com/example/firstapp/database/repository/KeywordRepository.kt
@@ -1,5 +1,6 @@
package com.example.firstapp.database.repository
+import androidx.annotation.WorkerThread
import com.example.firstapp.database.dao.KeywordDao
import com.example.firstapp.database.entity.KeywordConfig
import com.example.firstapp.database.entity.KeywordEntity
@@ -39,5 +40,9 @@
keywordDao.insertAll(keywordEntities)
}
+ @WorkerThread
+ fun deleteAll() = keywordDao.deleteAll()
+
+
}
diff --git a/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt b/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt
index 861e344..e6d8747 100644
--- a/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt
+++ b/app/src/main/java/com/example/firstapp/database/repository/ReminderRepository.kt
@@ -8,7 +8,7 @@
class ReminderRepository(context: Context) {
- private val reminderDao: ReminderDao = AppDatabase.getInstance(context).reminderDao()
+ private val reminderDao: ReminderDao = AppDatabase.getInstance(context).reminderDao()
fun getAllReminders(): Flow<List<Reminder>> = reminderDao.getAllReminders()
suspend fun insertReminder(reminder: Reminder) {
@@ -30,4 +30,4 @@
suspend fun deleteAllReminders() {
reminderDao.deleteAllReminders()
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/response/AccountCloseResponse.kt b/app/src/main/java/com/example/firstapp/database/response/AccountCloseResponse.kt
new file mode 100644
index 0000000..6c1e029
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/database/response/AccountCloseResponse.kt
@@ -0,0 +1,7 @@
+package com.example.firstapp.database.response
+
+data class AccountCloseResponse(
+ val code: Int,
+ val msg: String,
+ val data: Boolean
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
index 4201f27..41c83c2 100644
--- a/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
+++ b/app/src/main/java/com/example/firstapp/database/service/ApiService.kt
@@ -6,6 +6,7 @@
import com.example.firstapp.database.request.ProductOrdersRequest
import com.example.firstapp.database.request.SmsLoginRequest
import com.example.firstapp.database.request.SmsSendRequest
+import com.example.firstapp.database.response.AccountCloseResponse
import com.example.firstapp.database.response.AlipayOrderInfoResponse
import com.example.firstapp.database.response.ContentResponse
import com.example.firstapp.database.response.DictResponse
@@ -68,6 +69,8 @@
@Part avatar: MultipartBody.Part?
): ApiResponse<Unit>
+ @POST("api/account/close")
+ suspend fun closeAccount(): AccountCloseResponse
fun getUserCategories(currentUserId: String): List<CategoryConfig>
diff --git a/app/src/main/java/com/example/firstapp/model/DailyStat.kt b/app/src/main/java/com/example/firstapp/model/DailyStat.kt
index 54462ad..1ff696f 100644
--- a/app/src/main/java/com/example/firstapp/model/DailyStat.kt
+++ b/app/src/main/java/com/example/firstapp/model/DailyStat.kt
@@ -2,6 +2,7 @@
import androidx.room.DatabaseView
import androidx.room.ColumnInfo
+import androidx.room.Ignore
@DatabaseView(
"""
diff --git a/app/src/main/java/com/example/firstapp/model/DailyStat2.kt b/app/src/main/java/com/example/firstapp/model/DailyStat2.kt
new file mode 100644
index 0000000..393945f
--- /dev/null
+++ b/app/src/main/java/com/example/firstapp/model/DailyStat2.kt
@@ -0,0 +1,17 @@
+package com.example.firstapp.model
+
+import androidx.room.ColumnInfo
+import androidx.room.DatabaseView
+
+@DatabaseView(
+ """
+ SELECT substr(createTime, 1, 10) as date,
+ COUNT(*) as count
+ FROM code
+ GROUP BY substr(createTime, 1, 10)
+ """
+)
+data class DailyStat2(
+ val date: String,
+ val count: Int
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt b/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt
index 21cb233..f8808f2 100644
--- a/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt
+++ b/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt
@@ -21,17 +21,13 @@
import java.util.*
import java.text.SimpleDateFormat
import android.graphics.Color
-import android.widget.Button
import android.widget.GridLayout
import android.widget.Toast
-import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
-import com.bumptech.glide.Glide
import com.example.firstapp.database.response.UserInfo
import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.model.DailyStat
import com.example.firstapp.utils.PreferencesManager
-import com.github.mikephil.charting.components.YAxis
import kotlinx.coroutines.launch
class DashboardFragment : Fragment() {
@@ -45,6 +41,9 @@
private lateinit var pieChart: PieChart
private lateinit var heatmapView: View
private var currentUserInfo: UserInfo? = null // 确保使用你的实际数据类
+
+ private var startDateCur:String = ""
+ private var endDateCur:String = ""
enum class DateType {
@@ -113,6 +112,10 @@
}
private fun setupTabLayout() {
+ val weekStatsView = binding.layoutWeekStats.root
+ val bar_title:TextView = weekStatsView.findViewById(R.id.bar_title)
+ val pie_title:TextView = weekStatsView.findViewById(R.id.pie_title)
+
binding.tabDateRange.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab?) {
currentDateType = when(tab?.position) {
@@ -122,6 +125,40 @@
3 -> DateType.YEAR
else -> DateType.DAY
}
+
+ when (currentDateType) {
+ DateType.DAY -> {
+ binding.cardPackageStatsTitleText.text = "本日收到包裹总数"
+ binding.layoutYearStatsTitleText.text = "包裹取件码记录"
+
+ binding.cardPackageStatsTitleText.visibility = View.VISIBLE
+ binding.layoutYearStatsTitleText.visibility = View.VISIBLE
+ }
+ DateType.WEEK -> {
+ binding.cardPackageStatsTitleText.text = "本周收到包裹总数"
+ bar_title.text = "本周收到包裹数分布 ->"
+ pie_title.text = "本周包裹物流公司分布 ->"
+ binding.cardPackageStatsTitleText.visibility = View.VISIBLE
+ binding.layoutYearStatsTitleText.visibility = View.GONE
+
+ }
+ DateType.MONTH -> {
+ binding.cardPackageStatsTitleText.text = "本月收到包裹总数"
+ bar_title.text = "本月收到包裹数分布 ->"
+ pie_title.text = "本月包裹物流公司分布 ->"
+ binding.cardPackageStatsTitleText.visibility = View.VISIBLE
+ binding.layoutYearStatsTitleText.visibility = View.GONE
+ }
+ DateType.YEAR -> {
+ bar_title.text = "本年收到包裹数分布 ->"
+ pie_title.text = "本年包裹物流公司分布 ->"
+ binding.cardPackageStatsTitleText.visibility = View.GONE
+ binding.layoutYearStatsTitleText.visibility = View.GONE
+ }
+ }
+
+
+
updateDateDisplay()
updateCharts()
loadPackages()
@@ -160,10 +197,13 @@
val calendar = currentDate.clone() as Calendar
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
val startDate = SimpleDateFormat("MM月dd日", Locale.getDefault()).format(calendar.time)
-
+ startDateCur=SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
calendar.add(Calendar.DAY_OF_WEEK, 6)
val endDate = SimpleDateFormat("MM月dd日", Locale.getDefault()).format(calendar.time)
-
+ endDateCur=SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+
"$startDate-$endDate"
}
DateType.MONTH -> "yyyy年MM月"
@@ -178,10 +218,15 @@
}
}
private fun setupView(view: View) {
+
val weekStatsView = binding.layoutWeekStats.root
barChart = weekStatsView.findViewById(R.id.chart_daily_packages)
pieChart = weekStatsView.findViewById(R.id.chart_courier_distribution)
heatmapView = weekStatsView.findViewById(R.id.heatmap_yearly)
+
+ barChart.setViewPortOffsets(100f, 100f, 100f, 200f)
+
+// barChart.invalidate()
// 初始化时隐藏统计视图
weekStatsView.visibility = View.GONE
@@ -190,6 +235,7 @@
setupPieChart()
setupHeatmap()
updateCharts()
+
}
private fun setupBarChart() {
barChart.apply {
@@ -240,7 +286,8 @@
private fun updateBarChartData() {
val statsFlow = when (currentDateType) {
DateType.WEEK -> {
- viewModel.getWeeklyStats(currentDate.timeInMillis, 6)
+// viewModel.getWeeklyStats(currentDate.timeInMillis, 6)
+ viewModel.getWeeklyStatsChart(startDateCur,endDateCur)
}
DateType.MONTH -> {
viewModel.getYearMonthlyStats(currentDate.timeInMillis)
@@ -416,14 +463,26 @@
when (currentDateType) {
DateType.DAY -> {
binding.textPackageCount.text = "${packages.size}个"
+
+ // 获取本周统计
+ viewModel.getPackagesUnread(currentDate.timeInMillis,
+ currentDateType.name)
+ .observe(viewLifecycleOwner) { unpackages->
+ // 只读取未取件的包裹
+ packageAdapter.updatePackages(unpackages)
+ }
+
}
DateType.WEEK -> {
// 获取本周统计
- viewModel.getCurrentWeekStats(currentDate.timeInMillis)
- .observe(viewLifecycleOwner) { stats ->
- val weekTotal = stats.sumOf { it.count }
- binding.textPackageCount.text = "${weekTotal}个"
- }
+ viewModel.getCurrentWeekStats2(startDateCur,endDateCur).observe(viewLifecycleOwner) { stats ->
+ binding.textPackageCount.text = "${stats}个"
+ }
+// viewModel.getCurrentWeekStats(currentDate.timeInMillis)
+// .observe(viewLifecycleOwner) { stats ->
+// val weekTotal = stats.sumOf { it.count }
+// binding.textPackageCount.text = "${weekTotal}个"
+// }
}
DateType.MONTH -> {
// 获取本月统计
@@ -442,8 +501,8 @@
}
}
}
- packageAdapter.updatePackages(packages)
- packageAdapter.updatePackages(packages)
+
+// packageAdapter.updatePackages(packages)
// binding.textPackageCount.text = "${packages.size}个"
}
}
diff --git a/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt b/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt
index 1a0a2cb..5969ea5 100644
--- a/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt
+++ b/app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt
@@ -4,7 +4,6 @@
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
-import androidx.room.RewriteQueriesToDropUnusedColumns
import com.example.firstapp.AppDatabase
import com.example.firstapp.database.entity.Code
import com.example.firstapp.database.repository.CodeRepository
@@ -21,6 +20,9 @@
fun getPackages(date: Long, dateType: String) =
repository.getPackages(date, dateType).asLiveData()
+
+ fun getPackagesUnread(date: Long, dateType: String) =
+ repository.getPackagesUnread(date, dateType).asLiveData()
fun getCourierStats(date: Long, dateType: String) =
repository.getCourierStats(date, dateType).asLiveData()
@@ -47,4 +49,7 @@
fun getCurrentYearStats(date: Long) =
repository.getCurrentYearStats(date).asLiveData()
+
+ fun getCurrentWeekStats2(startDateCur: String, endDateCur: String) = repository.getCurrentWeekStats2(startDateCur,endDateCur).asLiveData()
+ fun getWeeklyStatsChart(startDateCur: String, endDateCur: String) = repository.getWeeklyStatsChart(startDateCur, endDateCur).asLiveData()
}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/border_button.xml b/app/src/main/res/drawable/border_button.xml
new file mode 100644
index 0000000..7a4669e
--- /dev/null
+++ b/app/src/main/res/drawable/border_button.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <!-- 边框颜色和宽度 -->
+ <stroke
+ android:color="#000000" android:width="2dp" /> <!-- 边框宽度 -->
+
+ <!-- 背景颜色 -->
+ <solid android:color="@android:color/transparent" /> <!-- 设置透明背景 -->
+
+ <!-- 圆角半径 -->
+ <corners android:radius="200dp" /> <!-- 设置圆角半径,调整数值来控制圆角的大小 -->
+</shape>
diff --git a/app/src/main/res/layout/account_close_dialog_custom.xml b/app/src/main/res/layout/account_close_dialog_custom.xml
new file mode 100644
index 0000000..8a0607a
--- /dev/null
+++ b/app/src/main/res/layout/account_close_dialog_custom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:background="@drawable/dialog_background"
+ android:padding="20dp"
+ android:gravity="center"
+
+ >
+
+ <!-- 标题 -->
+ <TextView
+ android:id="@+id/dialogTitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="确定注销账号吗?"
+ android:textSize="20sp"
+ android:textColor="#000000"
+ android:gravity="center"
+ android:paddingBottom="10dp" />
+
+ <View
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="#E2E2E2"
+ android:layout_marginTop="5dp"
+ android:layout_marginHorizontal="0dp" />
+
+
+
+ <!-- 内容 -->
+ <TextView
+ android:id="@+id/dialogMessage"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="注销账号后,此账号的所有数据将被清空且不可恢复!"
+ android:textSize="16sp"
+ android:textColor="#000000"
+ android:gravity="left"
+ android:layout_marginTop="5dp"
+ android:paddingBottom="20dp"
+
+ />
+
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center"
+ android:padding="16dp"
+ >
+
+ <!-- 同意按钮 -->
+ <Button
+ android:id="@+id/btnConfirm"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="我在想想"
+ android:textColor="@android:color/white"
+ android:backgroundTint="#000000"
+ android:gravity="center" />
+
+
+ <!-- 不同意按钮 -->
+ <Button
+ android:id="@+id/btnCancel"
+ android:layout_width="0dp"
+ android:layout_height="40dp"
+ android:layout_weight="1"
+ android:text="确定注销"
+ android:textColor="#999999"
+ android:background="@drawable/border_button"
+ android:gravity="center"
+ android:elevation="0dp"
+ android:drawableLeft="@null"
+
+ /> <!-- 确保没有图标 -->
+ </LinearLayout>
+
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
index a0ccc5f..2029cc5 100644
--- a/app/src/main/res/layout/activity_setting.xml
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -34,6 +34,23 @@
</androidx.appcompat.widget.Toolbar>
+ <LinearLayout
+ android:id="@+id/account_close"
+ android:layout_width="match_parent"
+ android:layout_height="50dp"
+ android:gravity="center"
+ android:orientation="vertical"
+ android:background="#F9F9F9"
+ android:layout_marginTop="1dp"
+ >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="5dp"
+ android:text="账号注销"
+ android:textColor="#000000" />
+ </LinearLayout>
<LinearLayout
android:id="@+id/setting_exit"
diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml
index 21efdba..243ba37 100644
--- a/app/src/main/res/layout/fragment_dashboard.xml
+++ b/app/src/main/res/layout/fragment_dashboard.xml
@@ -68,6 +68,22 @@
</LinearLayout>
<!-- 包裹统计卡片 -->
+ <LinearLayout
+ android:id="@+id/card_package_stats_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toBottomOf="@id/layout_date_picker"
+ >
+ <TextView
+ android:id="@+id/card_package_stats_title_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="本日收到包裹总数 ->"
+ android:layout_marginLeft="16dp"
+ >
+
+ </TextView>
+ </LinearLayout>
<androidx.cardview.widget.CardView
android:id="@+id/card_package_stats"
android:layout_width="match_parent"
@@ -75,7 +91,7 @@
android:layout_margin="16dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp"
- app:layout_constraintTop_toBottomOf="@id/layout_date_picker">
+ app:layout_constraintTop_toBottomOf="@id/card_package_stats_title">
<LinearLayout
android:layout_width="match_parent"
@@ -119,6 +135,7 @@
</LinearLayout>
</androidx.cardview.widget.CardView>
+
<!-- 年度统计布局 -->
<include
android:id="@+id/layout_year_stats"
@@ -136,27 +153,68 @@
app:layout_constraintTop_toBottomOf="@id/layout_year_stats"
app:layout_constraintBottom_toBottomOf="parent">
- <ViewFlipper
- android:id="@+id/view_flipper_stats"
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <!-- 日视图 -->
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/recycler_packages"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:clipToPadding="false"
- android:paddingBottom="16dp" />
+ android:layout_height="wrap_content">
+ <ViewFlipper
+ android:id="@+id/view_flipper_stats"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
- <!-- 周视图 -->
- <include
- android:id="@+id/layout_week_stats"
- layout="@layout/layout_week_stats"
+ <!-- 日视图 -->
+ <LinearLayout
+ android:id="@+id/recycler_packages_11"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ >
+ <LinearLayout
+ android:id="@+id/layout_year_stats_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toBottomOf="@id/card_package_stats"
+ >
+ <TextView
+ android:id="@+id/layout_year_stats_title_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="包裹取件码记录 ->"
+ android:layout_margin="16dp"
+ >
+
+ </TextView>
+ </LinearLayout>
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/recycler_packages"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clipToPadding="false"
+ android:paddingBottom="16dp" />
+
+ </LinearLayout>
+
+
+
+ <!-- 周视图 -->
+ <include
+ android:id="@+id/layout_week_stats"
+ layout="@layout/layout_week_stats"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ </ViewFlipper>
+ </LinearLayout>
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="80dp" />
- </ViewFlipper>
+</LinearLayout>
+
</androidx.core.widget.NestedScrollView>
<!-- 🔹 遮罩层 -->
diff --git a/app/src/main/res/layout/fragment_dashboard0411.xml b/app/src/main/res/layout/fragment_dashboard0411.xml
new file mode 100644
index 0000000..e60aca7
--- /dev/null
+++ b/app/src/main/res/layout/fragment_dashboard0411.xml
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".ui.dashboard.DashboardFragment">
+
+ <!-- 时间范围选择器 -->
+ <com.google.android.material.tabs.TabLayout
+ android:id="@+id/tab_date_range"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toTopOf="parent">
+
+ <com.google.android.material.tabs.TabItem
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="天" />
+
+ <com.google.android.material.tabs.TabItem
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="周" />
+
+ <com.google.android.material.tabs.TabItem
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="月" />
+
+ <com.google.android.material.tabs.TabItem
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="年" />
+ </com.google.android.material.tabs.TabLayout>
+
+ <!-- 日期选择器 -->
+ <LinearLayout
+ android:id="@+id/layout_date_picker"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="16dp"
+ app:layout_constraintTop_toBottomOf="@id/tab_date_range">
+
+ <ImageButton
+ android:id="@+id/btn_previous_date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackground"
+ android:src="@android:drawable/ic_media_previous" />
+
+ <TextView
+ android:id="@+id/text_current_date"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:textSize="16sp"
+ tools:text="2025年1月14日" />
+
+ <ImageButton
+ android:id="@+id/btn_next_date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:background="?attr/selectableItemBackground"
+ android:src="@android:drawable/ic_media_next" />
+ </LinearLayout>
+
+ <!-- 包裹统计卡片 -->
+ <LinearLayout
+ android:id="@+id/card_package_stats_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toBottomOf="@id/layout_date_picker"
+ >
+ <TextView
+ android:id="@+id/card_package_stats_title_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="本日收到包裹总数 ->"
+ android:layout_marginLeft="16dp"
+ >
+
+ </TextView>
+ </LinearLayout>
+ <androidx.cardview.widget.CardView
+ android:id="@+id/card_package_stats"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ app:cardCornerRadius="8dp"
+ app:cardElevation="4dp"
+ app:layout_constraintTop_toBottomOf="@id/card_package_stats_title">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="16dp"
+ android:weightSum="3">
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="center">
+
+ <ImageView
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:src="@drawable/resource_package" />
+ </LinearLayout>
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1" />
+
+ <LinearLayout
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="center">
+
+ <TextView
+ android:id="@+id/text_package_count"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="24sp"
+ android:textStyle="bold"
+ tools:text="4个" />
+ </LinearLayout>
+
+ </LinearLayout>
+ </androidx.cardview.widget.CardView>
+
+ <LinearLayout
+ android:id="@+id/layout_year_stats_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ app:layout_constraintTop_toBottomOf="@id/card_package_stats"
+ >
+ <TextView
+ android:id="@+id/layout_year_stats_title_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="包裹取件码记录 ->"
+ android:layout_margin="16dp"
+ >
+
+ </TextView>
+ </LinearLayout>
+ <!-- 年度统计布局 -->
+ <include
+ android:id="@+id/layout_year_stats"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ app:layout_constraintTop_toBottomOf="@id/layout_year_stats_title"
+ layout="@layout/layout_year_stats" />
+
+ <!-- 包裹列表和统计图表 -->
+ <androidx.core.widget.NestedScrollView
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:fillViewport="true"
+ app:layout_constraintTop_toBottomOf="@id/layout_year_stats"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+ <ViewFlipper
+ android:id="@+id/view_flipper_stats"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <!-- 日视图 -->
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/recycler_packages"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clipToPadding="false"
+ android:paddingBottom="16dp" />
+ </LinearLayout>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="80dp">
+
+ </LinearLayout>
+ </LinearLayout>
+
+ <!-- 周视图 -->
+ <include
+ android:id="@+id/layout_week_stats"
+ layout="@layout/layout_week_stats"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+
+
+ </ViewFlipper>
+
+ </androidx.core.widget.NestedScrollView>
+
+ <!-- 🔹 遮罩层 -->
+ <View
+ android:id="@+id/view_overlay"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@mipmap/overlay2"
+ android:elevation="10dp"
+ android:visibility="gone"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent" />
+
+ <!-- 🔹 遮罩层上的按钮 -->
+ <!-- 🔹 遮罩层上的内容容器(LinearLayout) -->
+ <LinearLayout
+ android:id="@+id/overlay_content"
+ android:layout_width="300dp"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:orientation="horizontal"
+ android:padding="10dp"
+ android:background="@drawable/overlay_black_background"
+ android:elevation="20dp"
+ android:translationZ="20dp"
+ android:visibility="gone"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent">
+
+
+ <ImageView
+ android:id="@+id/overlay_content_vip_image"
+ android:layout_width="40dp"
+ android:layout_height="40dp"
+ android:layout_marginLeft="10dp"
+ android:layout_marginRight="10dp"
+ android:scaleType="centerCrop"
+ android:src="@mipmap/vip_crown"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <!-- 🔹 示例内容:标题 -->
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="免费查看统计数据"
+ android:textSize="18sp"
+ android:textColor="#EEBC93" />
+
+ </LinearLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_package_dashboard.xml b/app/src/main/res/layout/item_package_dashboard.xml
index fbb34f9..f297510 100644
--- a/app/src/main/res/layout/item_package_dashboard.xml
+++ b/app/src/main/res/layout/item_package_dashboard.xml
@@ -31,7 +31,7 @@
<TextView
android:id="@+id/text_courier_name"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="25dp"
android:textSize="16sp"
android:textStyle="bold"
tools:text="某快递" />
@@ -42,7 +42,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:textColor="@android:color/darker_gray"
- android:textSize="12sp"
+ android:textSize="8sp"
tools:text="2025-01-14 10:30" />
</LinearLayout>
@@ -54,7 +54,7 @@
<TextView
android:id="@+id/text_tracking_number"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="25dp"
android:textColor="@android:color/darker_gray"
android:layout_gravity="end"
tools:text="14-6-7023" />
@@ -66,7 +66,7 @@
android:layout_marginTop="4dp"
android:textColor="@android:color/darker_gray"
android:layout_gravity="end"
- android:textSize="12sp"
+ android:textSize="8sp"
tools:text="2025-01-15 11:30" />
</LinearLayout>
diff --git a/app/src/main/res/layout/layout_week_stats.xml b/app/src/main/res/layout/layout_week_stats.xml
index 41d6b61..b7c0bcf 100644
--- a/app/src/main/res/layout/layout_week_stats.xml
+++ b/app/src/main/res/layout/layout_week_stats.xml
@@ -4,19 +4,37 @@
android:layout_height="wrap_content"
android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+ <TextView
+ android:id="@+id/bar_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="本周包裹物流公司分布 ->"
+ android:layout_margin="16dp"
+ >
+
+ </TextView>
+ </LinearLayout>
<!-- 柱状图容器,内边距16dp -->
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="280dp"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
- android:layout_marginBottom="16dp">
+ android:layout_marginBottom="16dp"
+ android:padding="100dp"
+ >
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/chart_daily_packages"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="16dp" />
+ android:layout_height="wrap_content"
+ android:padding="50dp"
+
+ />
</androidx.cardview.widget.CardView>
<!-- 热力图容器 -->
@@ -41,6 +59,21 @@
</HorizontalScrollView>
</androidx.cardview.widget.CardView>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ >
+ <TextView
+ android:id="@+id/pie_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="本周包裹物流公司分布 ->"
+ android:layout_margin="16dp"
+ >
+ </TextView>
+ </LinearLayout>
+
<!-- 饼图容器 -->
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
--
Gitblit v1.9.3