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