From 2e1edcb7518f20dec30dbd6e1686e9e6b558ec15 Mon Sep 17 00:00:00 2001
From: tj <1378534974@qq.com>
Date: 星期三, 16 四月 2025 17:05:12 +0800
Subject: [PATCH] 43	首页登录->首页登录  1.首页弹窗协议同意后,不能默认自动勾选,还需要用户手动勾选  2.退出登录后,再次登录需要手动勾选与用户协议(目前是默认勾选了) 44	首页登录->邀请码  邀请码默认填入“邀请码(选填) 47	数据统计->饼状图数据分类统计问题  1、只统计快递 无需统计还款其他分类  2、图形上下间隔过大" 48	数据统计	天、周、月、年  1.数据统计只统计快递类的,其他分类不需要统计展示,例如取件码记录  2.包括周、月、年的统计环状图,只需要统计快递分类的

---
 app/src/main/res/layout/activity_phone_login.xml                             |    2 
 keystore/sms-manager3.jks                                                    |    0 
 app/src/main/java/com/example/firstapp/database/repository/CodeRepository.kt |    5 
 app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt     |  192 +++++++++++++++++++++++++++++++++++++
 keystore/sms-manager2.jks                                                    |    0 
 app/src/main/res/layout/activity_login.xml                                   |    2 
 app/src/main/java/com/example/firstapp/database/dao/CodeDao.kt               |   18 ++-
 app/src/main/res/layout/layout_week_stats.xml                                |   11 +-
 app/src/main/java/com/example/firstapp/ui/dashboard/DashboardViewModel.kt    |    5 
 app/build.gradle                                                             |    6 
 10 files changed, 219 insertions(+), 22 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 6b3c81a..52f51f1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,8 +15,8 @@
     compileSdk 34
 
     defaultConfig {
-        applicationId "com.cloudroam.smsManager"
-//        applicationId "com.example.firstapp"
+//        applicationId "com.cloudroam.smsManager"
+        applicationId "com.example.firstapp"
 //        applicationId "net.sourceforge.simcpux"
         minSdk 24
         targetSdk 34
@@ -28,7 +28,7 @@
 
     signingConfigs {
         release {
-            storeFile file('../keystore/sms-manager2.jks')
+            storeFile file('../keystore/sms-manager3.jks')
             storePassword 'Cloudroam!@#123'
             keyAlias 'sm'
             keyPassword 'Cloudroam!@#123'
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 d8b0118..c3b0d52 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
@@ -86,16 +86,16 @@
     @Query("""
         SELECT * FROM code 
         WHERE substr(createTime, 1, 10) = 
-              date(:date/1000, 'unixepoch', 'localtime') and pickup = 1
+              date(:date/1000, 'unixepoch', 'localtime') and pickup = 1 and category='快递'
         ORDER BY createTime DESC
     """)
-    fun getPackagesByDayUnread(date: Long): Flow<List<Code>>
+    fun getPackagesByDayReaded(date: Long): Flow<List<Code>>
 
     @Query("""
         SELECT oneLevel as courierName, COUNT(*) as count 
         FROM code 
         WHERE strftime('%Y-%W', substr(createTime, 1, 10)) = 
-              strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))
+              strftime('%Y-%W', datetime(:date/1000, 'unixepoch', 'localtime'))  and category='快递'
         GROUP BY oneLevel
         ORDER BY count DESC
     """)
@@ -135,7 +135,7 @@
         SELECT oneLevel as courierName, COUNT(*) as count 
         FROM code 
         WHERE strftime('%Y-%m', substr(createTime, 1, 10)) = 
-              strftime('%Y-%m', datetime(:date/1000, 'unixepoch', 'localtime'))
+              strftime('%Y-%m', datetime(:date/1000, 'unixepoch', 'localtime')) and category='快递'
         GROUP BY oneLevel
         ORDER BY count DESC
     """)
@@ -145,7 +145,7 @@
         SELECT oneLevel as courierName, COUNT(*) as count 
         FROM code 
         WHERE strftime('%Y', substr(createTime, 1, 10)) = 
-              strftime('%Y', datetime(:date/1000, 'unixepoch', 'localtime'))
+              strftime('%Y', datetime(:date/1000, 'unixepoch', 'localtime')) and category='快递'
         GROUP BY oneLevel
         ORDER BY count DESC
     """)
@@ -340,4 +340,12 @@
     ORDER BY d.date_value ASC
 """)
     fun getWeeklyStatsChart(startDateCur: String, endDateCur: String): Flow<List<DailyStat>>
+
+
+    @Query("""
+        SELECT COUNT(1)
+        FROM code
+        WHERE date(createTime) BETWEEN date(:startDateCur) AND date(:endDateCur) and category =:type
+    """)
+    fun getDateStatsByType(startDateCur: String, endDateCur: String,type: String): Flow<Long>
 }
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 19aecf0..19b6579 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
@@ -45,9 +45,9 @@
         }
     }
 
-    fun getPackagesUnread(date: Long, dateType: String): Flow<List<Code>> {
+    fun getPackagesReaded(date: Long, dateType: String): Flow<List<Code>> {
         return when (dateType) {
-            "DAY" -> codeDao.getPackagesByDayUnread(date)
+            "DAY" -> codeDao.getPackagesByDayReaded(date)
             "WEEK" -> codeDao.getPackagesByWeek(date)
             else -> codeDao.getPackagesByDay(date)
         }
@@ -101,5 +101,6 @@
 
     fun getCurrentWeekStats2(startDateCur: String, endDateCur: String) = codeDao.getCurrentWeekStats2(startDateCur,endDateCur)
     fun getWeeklyStatsChart(startDateCur: String, endDateCur: String): Flow<List<DailyStat>> = codeDao.getWeeklyStatsChart(startDateCur,endDateCur)
+    fun getDateStatsByType(startDateCur: String, endDateCur: String, type: String) = codeDao.getDateStatsByType(startDateCur,endDateCur,type)
 
 }
\ 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 e552794..0c5316d 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
@@ -122,6 +122,8 @@
 
         binding.tabDateRange.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
             override fun onTabSelected(tab: TabLayout.Tab?) {
+                currentDate = Calendar.getInstance()
+
                 currentDateType = when(tab?.position) {
                     0 -> DateType.DAY
                     1 -> DateType.WEEK
@@ -194,6 +196,81 @@
     }
 
     private fun updateDateDisplay() {
+        val dateFormat = when (currentDateType) {
+            DateType.DAY -> {
+                // 获取当天的起始和结束时间
+                val calendar = currentDate.clone() as Calendar
+                // 设置为当天的 00:00:00
+                calendar.set(Calendar.HOUR_OF_DAY, 0)
+                calendar.set(Calendar.MINUTE, 0)
+                calendar.set(Calendar.SECOND, 0)
+                calendar.set(Calendar.MILLISECOND, 0)
+                startDateCur = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+                // 设置为当天的 23:59:59
+                calendar.set(Calendar.HOUR_OF_DAY, 23)
+                calendar.set(Calendar.MINUTE, 59)
+                calendar.set(Calendar.SECOND, 59)
+                calendar.set(Calendar.MILLISECOND, 999)
+                endDateCur = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+                // 返回当天的日期格式
+                SimpleDateFormat("yyyy年MM月dd日", Locale.getDefault()).format(currentDate.time)
+            }
+            DateType.WEEK -> {
+                // 获取本周的起始和结束日期
+                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 -> {
+                // 获取本月的起始和结束日期
+                val calendar = currentDate.clone() as Calendar
+                calendar.set(Calendar.DAY_OF_MONTH, 1)
+                startDateCur = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+                calendar.add(Calendar.MONTH, 1)
+                calendar.set(Calendar.DAY_OF_MONTH, 0)
+                endDateCur = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+                "yyyy年MM月"
+            }
+            DateType.YEAR -> {
+                // 获取当前年的起始和结束日期
+                val calendar = currentDate.clone() as Calendar
+
+                // 设置为当前年份的 1 月 1 日
+                calendar.set(Calendar.MONTH, Calendar.JANUARY)
+                calendar.set(Calendar.DAY_OF_MONTH, 1)
+                startDateCur = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+                // 设置为当前年份的 12 月 31 日
+                calendar.set(Calendar.MONTH, Calendar.DECEMBER)
+                calendar.set(Calendar.DAY_OF_MONTH, 31)
+                endDateCur = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(calendar.time)
+
+
+                "yyyy年"
+            }
+        }
+
+        // 更新界面显示
+        if (currentDateType == DateType.WEEK) {
+            binding.textCurrentDate.text = dateFormat
+        } else {
+            binding.textCurrentDate.text = SimpleDateFormat(dateFormat, Locale.getDefault())
+                .format(currentDate.time)
+        }
+    }
+
+    private fun updateDateDisplay_bak() {
         val dateFormat = when (currentDateType) {
             DateType.DAY -> "yyyy年MM月dd日"
             DateType.WEEK -> {
@@ -520,7 +597,116 @@
         return arrayOf("周一", "周二", "周三", "周四", "周五", "周六", "周日")
     }
 
-    private fun loadPackages() {
+    private fun loadPackages(){
+
+
+
+//            根据日、周、月、年 获取统计数字
+        when (currentDateType) {
+            DateType.DAY -> {
+
+                viewModel.getCurrentDayStatsByType(startDateCur,endDateCur,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.textPackageCount.text = "${stats}个"
+                }
+
+                // 获取取件记录
+                viewModel.getPackagesReaded(currentDate.timeInMillis,
+                    currentDateType.name)
+                    .observe(viewLifecycleOwner) { unpackages->
+                        // 只读取未取件的包裹
+                        packageAdapter.updatePackages(unpackages)
+                    }
+
+
+            }
+            DateType.WEEK -> {
+
+                viewModel.getCurrentDayStatsByType(startDateCur,endDateCur,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.textPackageCount.text = "${stats}个"
+                }
+            }
+            DateType.MONTH -> {
+
+                viewModel.getCurrentDayStatsByType(startDateCur,endDateCur,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.textPackageCount.text = "${stats}个"
+                }
+            }
+            DateType.YEAR -> {
+
+                viewModel.getCurrentDayStatsByType(startDateCur,endDateCur,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.layoutYearStats.textTotalPackages.text = "${stats}个"
+                }
+            }
+        }
+    }
+
+    private fun loadPackages_bak2(){
+
+        val formatter = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault())
+
+//            根据日、周、月、年 获取统计数字
+        when (currentDateType) {
+            DateType.DAY -> {
+                val today = Calendar.getInstance()
+                val tmpCurDateStart = formatter.format(currentDate.time)
+                val tmpCurDateEnd = formatter.format(currentDate.time)
+                viewModel.getCurrentDayStatsByType(tmpCurDateStart,tmpCurDateEnd,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.textPackageCount.text = "${stats}个"
+                }
+
+                // 获取本周统计
+                viewModel.getPackagesReaded(currentDate.timeInMillis,
+                    currentDateType.name)
+                    .observe(viewLifecycleOwner) { unpackages->
+                        // 只读取未取件的包裹
+                        packageAdapter.updatePackages(unpackages)
+                    }
+
+
+            }
+            DateType.WEEK -> {
+                val today = Calendar.getInstance()
+
+                // 获取本周的周一(第一天)
+                today.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
+                val firstDayOfWeek = formatter.format(today.time)
+                // 获取本周的周日(最后一天)
+                today.add(Calendar.DATE, 6)  // 加6天
+                val lastDayOfWeek = formatter.format(today.time)
+                viewModel.getCurrentDayStatsByType(firstDayOfWeek,lastDayOfWeek,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.textPackageCount.text = "${stats}个"
+                }
+            }
+            DateType.MONTH -> {
+                val today = Calendar.getInstance()
+                today.set(Calendar.DAY_OF_MONTH, 1)  // 设置为本月第一天
+                val firstDayOfMonth = formatter.format(today.time)
+
+                today.add(Calendar.MONTH, 1)  // 移动到下个月
+                today.set(Calendar.DAY_OF_MONTH, 0)  // 设置为下个月的最后一天
+                val lastDayOfMonth = formatter.format(today.time)
+                viewModel.getCurrentDayStatsByType(firstDayOfMonth,lastDayOfMonth,"快递") .observe(viewLifecycleOwner) { stats ->
+                    binding.textPackageCount.text = "${stats}个"
+                }
+            }
+            DateType.YEAR -> {
+                val today = Calendar.getInstance()
+                today.set(Calendar.MONTH, Calendar.JANUARY)  // 设置为第一月
+                today.set(Calendar.DAY_OF_MONTH, 1)  // 设置为第一天
+                val firstDayOfYear = formatter.format(today.time)
+
+                today.add(Calendar.YEAR, 1)  // 移动到下一年
+                today.set(Calendar.MONTH, Calendar.DECEMBER)  // 设置为最后一月
+                today.set(Calendar.DAY_OF_MONTH, 31)  // 设置为最后一天
+                val lastDayOfYear = formatter.format(today.time)
+                viewModel.getCurrentDayStatsByType(firstDayOfYear,lastDayOfYear,"快递") .observe(viewLifecycleOwner) { stats ->
+//                    binding.textPackageCount.text = "${stats}个"
+                    binding.layoutYearStats.textTotalPackages.text = "${stats}个"
+                }
+            }
+        }
+    }
+    private fun loadPackages_bak() {
         viewModel.getPackages(
             currentDate.timeInMillis,
             currentDateType.name
@@ -530,7 +716,7 @@
                     binding.textPackageCount.text = "${packages.size}个"
 
                     // 获取本周统计
-                    viewModel.getPackagesUnread(currentDate.timeInMillis,
+                    viewModel.getPackagesReaded(currentDate.timeInMillis,
                         currentDateType.name)
                         .observe(viewLifecycleOwner) { unpackages->
                             // 只读取未取件的包裹
@@ -708,7 +894,7 @@
             if (stats.isEmpty()) return@observe
             
             // 更新年度包裹总数
-            binding.layoutYearStats.textTotalPackages.text = "${stats.sumOf { it.count }}个"
+//            binding.layoutYearStats.textTotalPackages.text = "${stats.sumOf { it.count }}个"
             
             // 更新平均每天包裹数
             val avgDaily = stats.sumOf { it.count }.toFloat() / 365
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 5969ea5..192b2ed 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
@@ -21,8 +21,8 @@
     fun getPackages(date: Long, dateType: String) =
         repository.getPackages(date, dateType).asLiveData()
 
-    fun getPackagesUnread(date: Long, dateType: String) =
-        repository.getPackagesUnread(date, dateType).asLiveData()
+    fun getPackagesReaded(date: Long, dateType: String) =
+        repository.getPackagesReaded(date, dateType).asLiveData()
 
     fun getCourierStats(date: Long, dateType: String) = 
         repository.getCourierStats(date, dateType).asLiveData()
@@ -52,4 +52,5 @@
 
     fun getCurrentWeekStats2(startDateCur: String, endDateCur: String) = repository.getCurrentWeekStats2(startDateCur,endDateCur).asLiveData()
     fun getWeeklyStatsChart(startDateCur: String, endDateCur: String) =  repository.getWeeklyStatsChart(startDateCur, endDateCur).asLiveData()
+    fun getCurrentDayStatsByType(startDateCur: String, endDateCur: String,type: String) =repository.getDateStatsByType(startDateCur, endDateCur,type).asLiveData()
 }
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 7628148..aea672e 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -54,7 +54,7 @@
             android:id="@+id/cbAgreement"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:checked="true" />
+            android:checked="false" />
 
         <TextView
             android:layout_width="wrap_content"
diff --git a/app/src/main/res/layout/activity_phone_login.xml b/app/src/main/res/layout/activity_phone_login.xml
index 3144a69..c0adc81 100644
--- a/app/src/main/res/layout/activity_phone_login.xml
+++ b/app/src/main/res/layout/activity_phone_login.xml
@@ -96,7 +96,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:background="@null"
-                android:hint="邀请码"
+                android:hint="邀请码(选填)"
                 android:inputType="textVisiblePassword"
                 android:maxLength="11"
                 android:textSize="16sp"
diff --git a/app/src/main/res/layout/layout_week_stats.xml b/app/src/main/res/layout/layout_week_stats.xml
index 9b8a80f..2499968 100644
--- a/app/src/main/res/layout/layout_week_stats.xml
+++ b/app/src/main/res/layout/layout_week_stats.xml
@@ -78,15 +78,16 @@
     <androidx.cardview.widget.CardView
         android:id="@+id/chart_courier_card_view"
         android:layout_width="match_parent"
-        android:layout_height="400dp"
-        android:layout_marginHorizontal="16dp"
-        android:layout_marginBottom="16dp">
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="0dp"
+        android:layout_marginBottom="0dp">
 
         <com.github.mikephil.charting.charts.PieChart
             android:id="@+id/chart_courier_distribution"
             android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:padding="16dp" />
+            android:layout_height="wrap_content"
+            android:minHeight="300dp"
+            android:padding="0dp" />
     </androidx.cardview.widget.CardView>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/keystore/sms-manager2.jks b/keystore/sms-manager2.jks
new file mode 100644
index 0000000..4980435
--- /dev/null
+++ b/keystore/sms-manager2.jks
Binary files differ
diff --git a/keystore/sms-manager3.jks b/keystore/sms-manager3.jks
new file mode 100644
index 0000000..19d0c0e
--- /dev/null
+++ b/keystore/sms-manager3.jks
Binary files differ

--
Gitblit v1.9.3