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