From 897ffe5e29ab022d75ad948ecf894e0a3ed3b2f5 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期二, 04 三月 2025 18:01:41 +0800
Subject: [PATCH] fix: 1
---
app/src/main/java/com/example/firstapp/model/DailyStat.kt | 4
app/src/main/java/com/example/firstapp/model/CourierStat.kt | 5
app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt | 2
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt | 102 ++++++++++++++++++++++---
app/src/main/res/layout/fragment_dashboard.xml | 52 +++++++-----
app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt | 34 ++++----
app/src/main/res/layout/layout_week_stats.xml | 38 +--------
app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt | 2
8 files changed, 147 insertions(+), 92 deletions(-)
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 343140a..00e535f 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
@@ -73,29 +73,31 @@
fun getPackagesByDay(date: Long): Flow<List<Code>>
@Query("""
- SELECT * FROM code
- WHERE strftime('%Y-%W', substr(createtime, 1, 10)) =
- strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))
- ORDER BY createtime DESC
- """)
- fun getPackagesByWeek(date: Long): Flow<List<Code>>
-
- @Query("""
- SELECT category as courierName, COUNT(*) as count
+ SELECT type as courierName, COUNT(*) as count
FROM code
WHERE strftime('%Y-%W', substr(createtime, 1, 10)) =
strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))
- GROUP BY category
+ GROUP BY type
+ ORDER BY count DESC
""")
fun getCourierStatsByWeek(date: Long): Flow<List<CourierStat>>
@Query("""
- SELECT substr(createtime, 1, 10) as date,
- COUNT(*) as count
+ SELECT strftime('%W', createtime) as date,
+ COUNT(*) as count,
+ MIN(createtime) as week_start
FROM code
- WHERE strftime('%Y-%W', substr(createtime, 1, 10)) =
- strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))
- GROUP BY substr(createtime, 1, 10)
+ WHERE strftime('%Y', createtime) = strftime('%Y', 'now')
+ GROUP BY strftime('%W', createtime)
+ ORDER BY week_start ASC
""")
- fun getDailyStatsByWeek(date: Long): Flow<List<DailyStat>>
+ fun getDailyStatsByWeek(): Flow<List<DailyStat>>
+
+ @Query("""
+ SELECT * FROM code
+ WHERE substr(createtime, 1, 10) =
+ date(:date/1000, 'unixepoch', 'localtime')
+ ORDER BY createtime DESC
+ """)
+ fun getPackagesByWeek(date: Long): Flow<List<Code>>
}
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 f187d22..7c14c1e 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
@@ -43,7 +43,7 @@
fun getCourierStats(date: Long) = codeDao.getCourierStatsByWeek(date)
- fun getDailyStats(date: Long) = codeDao.getDailyStatsByWeek(date)
+ fun getDailyStats() = codeDao.getDailyStatsByWeek()
@WorkerThread
diff --git a/app/src/main/java/com/example/firstapp/model/CourierStat.kt b/app/src/main/java/com/example/firstapp/model/CourierStat.kt
index fe385fe..7cb6c0a 100644
--- a/app/src/main/java/com/example/firstapp/model/CourierStat.kt
+++ b/app/src/main/java/com/example/firstapp/model/CourierStat.kt
@@ -4,10 +4,9 @@
@DatabaseView(
"""
- SELECT category as courierName, COUNT(*) as count
+ SELECT type as courierName, COUNT(*) as count
FROM Code
- WHERE substr(createtime, 1, 10) = date('now')
- GROUP BY category
+ GROUP BY type
"""
)
data class CourierStat(
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 f916d6f..0f2d8d8 100644
--- a/app/src/main/java/com/example/firstapp/model/DailyStat.kt
+++ b/app/src/main/java/com/example/firstapp/model/DailyStat.kt
@@ -7,11 +7,11 @@
SELECT substr(createtime, 1, 10) as date,
COUNT(*) as count
FROM code
- WHERE substr(createtime, 1, 10) = date('now')
GROUP BY substr(createtime, 1, 10)
"""
)
data class DailyStat(
val date: String,
- val count: Int
+ val count: Int,
+ val week_start: String? = null
)
\ 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 f0e308a..f32868e 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
@@ -20,8 +20,10 @@
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.data.*
import com.github.mikephil.charting.formatter.IndexAxisValueFormatter
+import com.github.mikephil.charting.formatter.ValueFormatter
import java.util.*
import java.text.SimpleDateFormat
+import android.util.Log
class DashboardFragment : Fragment() {
@@ -132,53 +134,115 @@
setupPieChart()
}
private fun setupBarChart() {
- // 配置柱状图
barChart.apply {
description.isEnabled = false
setDrawGridBackground(false)
legend.isEnabled = false
+
+ // 增大图表高度
+ minimumHeight = (resources.displayMetrics.density * 300).toInt()
// X轴设置
xAxis.apply {
position = XAxis.XAxisPosition.BOTTOM
setDrawGridLines(false)
- valueFormatter = IndexAxisValueFormatter(getDayLabels())
+ granularity = 1f
+ labelRotationAngle = -45f
+ textSize = 10f
}
// Y轴设置
axisLeft.apply {
setDrawGridLines(true)
axisMinimum = 0f
+ granularity = 1f
+ valueFormatter = object : ValueFormatter() {
+ override fun getFormattedValue(value: Float): String {
+ return value.toInt().toString()
+ }
+ }
}
axisRight.isEnabled = false
+
+ // 设置图表交互
+ setTouchEnabled(true)
+ isDragEnabled = true
+ setScaleEnabled(true)
}
updateBarChartData()
}
private fun updateBarChartData() {
- viewModel.getDailyStats(currentDate.timeInMillis).observe(viewLifecycleOwner) { stats ->
+ viewModel.getDailyStats().observe(viewLifecycleOwner) { stats ->
+ // 添加调试日志
+ Log.d("DashboardFragment", "Stats size: ${stats.size}")
+ stats.forEach { stat ->
+ Log.d("DashboardFragment", "Week: ${stat.date}, Count: ${stat.count}, Start: ${stat.week_start}")
+ }
+
+ if (stats.isEmpty()) {
+ Log.d("DashboardFragment", "No data found")
+ return@observe
+ }
+
val entries = stats.mapIndexed { index, stat ->
BarEntry(index.toFloat(), stat.count.toFloat())
}
val dataSet = BarDataSet(entries, "包裹数量")
dataSet.color = resources.getColor(R.color.purple_500)
+ dataSet.valueTextSize = 12f
- barChart.data = BarData(dataSet)
+ val barData = BarData(dataSet)
+ barChart.data = barData
+
+ // 设置X轴标签
+ barChart.xAxis.apply {
+ valueFormatter = object : ValueFormatter() {
+ override fun getFormattedValue(value: Float): String {
+ val position = value.toInt()
+ if (position >= 0 && position < stats.size) {
+ val weekNum = stats[position].date.toIntOrNull() ?: 0
+ // 获取月份信息
+ val monthDay = stats[position].week_start?.let {
+ SimpleDateFormat("MM-dd", Locale.getDefault()).format(
+ SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).parse(it)
+ )
+ } ?: ""
+ return "${monthDay}\n第${weekNum}周"
+ }
+ return ""
+ }
+ }
+ labelCount = stats.size
+ }
+
+ barChart.notifyDataSetChanged()
barChart.invalidate()
}
}
private fun setupPieChart() {
- // 配置饼图
pieChart.apply {
description.isEnabled = false
- setUsePercentValues(true)
+ setUsePercentValues(false) // 改为显示实际数量
setDrawEntryLabels(false)
-
- legend.isEnabled = true
- legend.verticalAlignment = Legend.LegendVerticalAlignment.CENTER
- legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT
- legend.orientation = Legend.LegendOrientation.VERTICAL
+
+ // 增大饼图尺寸
+ setExtraOffsets(20f, 10f, 80f, 10f)
+ minimumHeight = (resources.displayMetrics.density * 400).toInt() // 设置最小高度
+
+ // 配置图例
+ legend.apply {
+ isEnabled = true
+ verticalAlignment = Legend.LegendVerticalAlignment.CENTER
+ horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT
+ orientation = Legend.LegendOrientation.VERTICAL
+ setDrawInside(false)
+ xEntrySpace = 7f
+ yEntrySpace = 0f
+ yOffset = 0f
+ textSize = 12f // 增大图例文字大小
+ }
}
updatePieChartData()
@@ -186,16 +250,26 @@
private fun updatePieChartData() {
viewModel.getCourierStats(currentDate.timeInMillis).observe(viewLifecycleOwner) { stats ->
val entries = stats.map { stat ->
- PieEntry(stat.count.toFloat(), stat.courierName)
+ PieEntry(stat.count.toFloat(), "${stat.courierName}(${stat.count})")
}
val dataSet = PieDataSet(entries, "快递公司分布")
dataSet.colors = listOf(
resources.getColor(R.color.purple_500),
- resources.getColor(R.color.teal_200)
+ resources.getColor(R.color.teal_200),
+ resources.getColor(R.color.purple_200),
+ resources.getColor(R.color.teal_700)
)
+ dataSet.valueTextSize = 14f // 增大数值文字大小
- pieChart.data = PieData(dataSet)
+ val pieData = PieData(dataSet)
+ pieData.setValueFormatter(object : ValueFormatter() {
+ override fun getFormattedValue(value: Float): String {
+ return value.toInt().toString()
+ }
+ })
+
+ pieChart.data = pieData
pieChart.invalidate()
}
}
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 c2c0fc9..4c3032e 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
@@ -23,7 +23,7 @@
fun getCourierStats(date: Long) = repository.getCourierStats(date).asLiveData()
- fun getDailyStats(date: Long) = repository.getDailyStats(date).asLiveData()
+ fun getDailyStats() = repository.getDailyStats().asLiveData()
fun insert(code: Code) = viewModelScope.launch {
repository.insert(code)
diff --git a/app/src/main/res/layout/fragment_dashboard.xml b/app/src/main/res/layout/fragment_dashboard.xml
index 8e543a4..ddd092e 100644
--- a/app/src/main/res/layout/fragment_dashboard.xml
+++ b/app/src/main/res/layout/fragment_dashboard.xml
@@ -81,49 +81,57 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
- android:padding="16dp">
+ android:padding="16dp"
+ android:gravity="center_vertical">
<ImageView
- android:layout_width="0dp"
+ android:layout_width="48dp"
android:layout_height="48dp"
- android:layout_weight="1"
android:src="@drawable/resource_package" />
<TextView
android:id="@+id/text_package_count"
- android:layout_width="0dp"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
android:layout_marginStart="16dp"
- android:layout_weight="1"
android:textSize="24sp"
android:textStyle="bold"
tools:text="4个" />
+
</LinearLayout>
</androidx.cardview.widget.CardView>
<!-- 包裹列表 -->
- <ViewFlipper
- android:id="@+id/view_flipper_stats"
+ <androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:layout_constraintTop_toBottomOf="@id/card_package_stats">
+ android:layout_height="0dp"
+ android:fillViewport="true"
+ android:clipToPadding="false"
+ app:layout_constraintTop_toBottomOf="@id/card_package_stats"
+ app:layout_constraintBottom_toBottomOf="parent"
+ android:layout_marginBottom="56dp">
- <!-- 日视图 -->
- <androidx.recyclerview.widget.RecyclerView
- android:id="@+id/recycler_packages"
+ <ViewFlipper
+ android:id="@+id/view_flipper_stats"
android:layout_width="match_parent"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content">
- <!-- 周视图 -->
- <include
- android:id="@+id/layout_week_stats"
- layout="@layout/layout_week_stats"
- 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" />
- <!-- 月视图和年视图可以根据需要添加 -->
+ <!-- 周视图 -->
+ <include
+ android:id="@+id/layout_week_stats"
+ layout="@layout/layout_week_stats"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
- </ViewFlipper>
+ </ViewFlipper>
+ </androidx.core.widget.NestedScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_week_stats.xml b/app/src/main/res/layout/layout_week_stats.xml
index 0a2d857..6e1c3e8 100644
--- a/app/src/main/res/layout/layout_week_stats.xml
+++ b/app/src/main/res/layout/layout_week_stats.xml
@@ -4,53 +4,25 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <!-- 包裹总数统计卡片 -->
- <androidx.cardview.widget.CardView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_margin="16dp">
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:padding="16dp">
-
- <ImageView
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:src="@drawable/resource_package" />
-
- <TextView
- android:id="@+id/text_total_packages"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:layout_marginStart="16dp"
- android:textSize="24sp"
- android:textStyle="bold"
- android:text="4个" />
- </LinearLayout>
- </androidx.cardview.widget.CardView>
-
<!-- 每日包裹数量柱状图 -->
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
- android:layout_height="200dp"
+ android:layout_height="280dp"
android:layout_marginHorizontal="16dp"
+ android:layout_marginTop="8dp"
android:layout_marginBottom="16dp">
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/chart_daily_packages"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:padding="8dp" />
+ android:padding="16dp" />
</androidx.cardview.widget.CardView>
<!-- 快递公司占比饼图 -->
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
- android:layout_height="200dp"
+ android:layout_height="280dp"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp">
@@ -58,6 +30,6 @@
android:id="@+id/chart_courier_distribution"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:padding="8dp" />
+ android:padding="16dp" />
</androidx.cardview.widget.CardView>
</LinearLayout>
\ No newline at end of file
--
Gitblit v1.9.3