From b8aa11a7b447fb8048115bdd156c2aa9e3b16a07 Mon Sep 17 00:00:00 2001 From: tj <1378534974@qq.com> Date: 星期二, 15 四月 2025 16:40:08 +0800 Subject: [PATCH] 1.3 --- app/src/main/java/com/example/firstapp/ui/dashboard/DashboardFragment.kt | 320 +++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 274 insertions(+), 46 deletions(-) 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 794ece9..e552794 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 @@ -22,7 +22,14 @@ import java.text.SimpleDateFormat import android.graphics.Color import android.widget.GridLayout +import android.widget.Toast +import androidx.cardview.widget.CardView +import androidx.lifecycle.lifecycleScope +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 kotlinx.coroutines.launch class DashboardFragment : Fragment() { @@ -33,7 +40,16 @@ private var currentDateType = DateType.DAY private lateinit var barChart: BarChart private lateinit var pieChart: PieChart + private lateinit var chartCourierDistriBution:CardView private lateinit var heatmapView: View + private var currentUserInfo: UserInfo? = null // 确保使用你的实际数据类 + + private var startDateCur:String = "" + private var endDateCur:String = "" + private lateinit var bar_title:TextView + private lateinit var pie_title:TextView + + enum class DateType { DAY, WEEK, MONTH, YEAR } @@ -48,6 +64,12 @@ return binding.root } + override fun onResume() { + super.onResume() + // 重新加载用户信息 + loadUserInfo() + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -60,7 +82,31 @@ setupView(view) updateDateDisplay() loadPackages() + + // 遮罩层 + loadUserInfo() + + // 遮罩层点击时间 + binding.overlayContent.setOnClickListener { + // 跳转到vipActivity + val intent = android.content.Intent(requireContext(), com.example.firstapp.activity.VipActivity::class.java) + startActivity(intent) + } } + + private fun showOverlay() { + binding.viewOverlay.visibility = View.VISIBLE + binding.overlayContent.visibility = View.VISIBLE + + } + + private fun hiddleOverlay() { + binding.viewOverlay.visibility = View.GONE + binding.overlayContent.visibility = View.GONE + + + } + private fun setupRecyclerView() { binding.recyclerPackages.apply { @@ -70,6 +116,10 @@ } private fun setupTabLayout() { + val weekStatsView = binding.layoutWeekStats.root + bar_title = weekStatsView.findViewById(R.id.bar_title) + pie_title = weekStatsView.findViewById(R.id.pie_title) + binding.tabDateRange.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { currentDateType = when(tab?.position) { @@ -79,6 +129,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() @@ -117,10 +201,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月" @@ -135,10 +222,16 @@ } } private fun setupView(view: View) { + val weekStatsView = binding.layoutWeekStats.root barChart = weekStatsView.findViewById(R.id.chart_daily_packages) + chartCourierDistriBution=weekStatsView.findViewById(R.id.chart_courier_card_view) 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 @@ -147,6 +240,7 @@ setupPieChart() setupHeatmap() updateCharts() + } private fun setupBarChart() { barChart.apply { @@ -163,7 +257,8 @@ setDrawGridLines(false) granularity = 1f labelRotationAngle = 0f - textSize = 12f + textSize = 10f //标签字体 + setExtraLeftOffset(5f) // 减少左侧留白 setExtraBottomOffset(15f) } @@ -189,12 +284,15 @@ setExtraOffsets(10f, 10f, 10f, 20f) } + + updateBarChartData() } 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) @@ -338,24 +436,84 @@ 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.purple_200), - resources.getColor(R.color.teal_700) - ) - dataSet.valueTextSize = 14f // 增大数值文字大小 + if (entries.isNotEmpty()) { + val dataSet = PieDataSet(entries, "快递公司分布") + dataSet.colors = listOf( + resources.getColor(R.color.light_blue_600_1), + resources.getColor(R.color.sunflower), + resources.getColor(R.color.light_blue), + resources.getColor(R.color.vermillion), + resources.getColor(R.color.fish_belly_white), + resources.getColor(R.color.light_green), + resources.getColor(R.color.crimson), + resources.getColor(R.color.sky_blue), + resources.getColor(R.color.gold), + resources.getColor(R.color.light_purple), + resources.getColor(R.color.yellow), + resources.getColor(R.color.canary_yellow), + resources.getColor(R.color.red_purple), + resources.getColor(R.color.light_cyan), + resources.getColor(R.color.orange), + resources.getColor(R.color.magenta), + resources.getColor(R.color.light_purple_2), + resources.getColor(R.color.bright_yellow), + resources.getColor(R.color.emerald_green), + resources.getColor(R.color.turmeric), + resources.getColor(R.color.red_gold), + resources.getColor(R.color.off_white), + resources.getColor(R.color.tangerine), + resources.getColor(R.color.aqua_blue), + resources.getColor(R.color.frost), + resources.getColor(R.color.wisteria), + resources.getColor(R.color.cyan) + ) + dataSet.valueTextSize = 14f // 增大数值文字大小 - val pieData = PieData(dataSet) - pieData.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return value.toInt().toString() - } - }) + val pieData = PieData(dataSet) + pieData.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return value.toInt().toString() + } + }) - pieChart.data = pieData - pieChart.invalidate() + pieChart.data = pieData + pieChart.invalidate() + + pieChart.visibility = View.VISIBLE // 例如:隐藏 PieChart + + pie_title.visibility = View.VISIBLE + + chartCourierDistriBution.visibility =View.VISIBLE + + } else { + // 如果 entries 为空,可以选择隐藏图表或设置一个默认显示 + pieChart.visibility = View.GONE // 例如:隐藏 PieChart + + pie_title.visibility = View.GONE + + chartCourierDistriBution.visibility =View.GONE + + } + + +// val dataSet = PieDataSet(entries, "快递公司分布") +// dataSet.colors = listOf( +// resources.getColor(R.color.purple_500), +// resources.getColor(R.color.teal_200), +// resources.getColor(R.color.purple_200), +// resources.getColor(R.color.teal_700) +// ) +// dataSet.valueTextSize = 14f // 增大数值文字大小 +// +// val pieData = PieData(dataSet) +// pieData.setValueFormatter(object : ValueFormatter() { +// override fun getFormattedValue(value: Float): String { +// return value.toInt().toString() +// } +// }) +// +// pieChart.data = pieData +// pieChart.invalidate() } } private fun getDayLabels(): Array<String> { @@ -370,14 +528,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 -> { // 获取本月统计 @@ -396,8 +566,8 @@ } } } - packageAdapter.updatePackages(packages) - packageAdapter.updatePackages(packages) + +// packageAdapter.updatePackages(packages) // binding.textPackageCount.text = "${packages.size}个" } } @@ -423,24 +593,44 @@ // 更新UI binding.layoutWeekStats.heatmapYearly.apply { - // 清除现有的子视图 removeAllViews() - // 创建网格布局 val gridLayout = GridLayout(context).apply { - rowCount = 7 - columnCount = 52 + rowCount = 8 // 增加一行用于显示月份 + columnCount = 53 // 增加一列用于显示星期标签 } - // 添加日期标签 - val dayLabels = arrayOf("周日", "周一", "周二", "周三", "周四", "周五", "周六") - for (i in 0..6) { + // 添加月份标签 + val months = arrayOf("1月", "2月", "3月", "4月", "5月", "6月", + "7月", "8月", "9月", "10月", "11月", "12月") + months.forEachIndexed { index, month -> val label = TextView(context).apply { - text = dayLabels[i] + text = month textSize = 10f - setPadding(0, 0, 8, 0) + setPadding(0, 0, 8, 4) + // 计算每个月份标签的位置 + val weekPosition = (index * 4.3).toInt() + val params = GridLayout.LayoutParams() + params.columnSpec = GridLayout.spec(weekPosition + 1) + params.rowSpec = GridLayout.spec(0) + layoutParams = params } gridLayout.addView(label) + } + + // 添加星期标签 + val dayLabels = arrayOf("周一", "周二", "周三", "周四", "周五", "周六", "周日") + dayLabels.forEachIndexed { index, label -> + val textView = TextView(context).apply { + text = label + textSize = 10f + setPadding(4, 0, 8, 0) + val params = GridLayout.LayoutParams() + params.columnSpec = GridLayout.spec(0) + params.rowSpec = GridLayout.spec(index + 1) + layoutParams = params + } + gridLayout.addView(textView) } // 添加热力图单元格 @@ -448,12 +638,15 @@ for (week in 0..51) { val count = heatmapMatrix[day][week] val cell = View(context).apply { - layoutParams = ViewGroup.LayoutParams( - resources.getDimensionPixelSize(R.dimen.heatmap_cell_size), - resources.getDimensionPixelSize(R.dimen.heatmap_cell_size) - ) + val params = GridLayout.LayoutParams().apply { + width = resources.getDimensionPixelSize(R.dimen.heatmap_cell_size) + height = resources.getDimensionPixelSize(R.dimen.heatmap_cell_size) + columnSpec = GridLayout.spec(week + 1) + rowSpec = GridLayout.spec(day + 1) + setMargins(1, 1, 1, 1) + } + layoutParams = params setBackgroundColor(getHeatmapColor(count)) - setPadding(1, 1, 1, 1) } gridLayout.addView(cell) } @@ -465,12 +658,11 @@ } private fun getHeatmapColor(count: Int): Int { - // 根据数量返回不同深浅的颜色 return when { count == 0 -> Color.parseColor("#EBEDF0") - count <= 2 -> Color.parseColor("#9BE9A8") - count <= 4 -> Color.parseColor("#40C463") - count <= 6 -> Color.parseColor("#30A14E") + count == 1 -> Color.parseColor("#9BE9A8") + count == 2 -> Color.parseColor("#40C463") + count <= 4 -> Color.parseColor("#30A14E") else -> Color.parseColor("#216E39") } } @@ -482,6 +674,7 @@ binding.recyclerPackages.visibility = View.VISIBLE binding.layoutWeekStats.root.visibility = View.GONE binding.layoutYearStats.root.visibility = View.GONE + binding.cardPackageStats.visibility = View.VISIBLE } DateType.WEEK, DateType.MONTH -> { // 周和月视图显示柱状图和饼图,隐藏包裹列表 @@ -489,7 +682,9 @@ binding.layoutWeekStats.root.visibility = View.VISIBLE binding.layoutYearStats.root.visibility = View.GONE binding.layoutWeekStats.chartDailyPackages.visibility = View.VISIBLE + (binding.layoutWeekStats.chartDailyPackages.parent as? View)?.visibility = View.VISIBLE binding.layoutWeekStats.heatmapYearly.visibility = View.GONE + binding.cardPackageStats.visibility = View.VISIBLE updateBarChartData() updatePieChartData() } @@ -498,10 +693,12 @@ binding.recyclerPackages.visibility = View.GONE binding.layoutWeekStats.root.visibility = View.VISIBLE binding.layoutYearStats.root.visibility = View.VISIBLE - binding.layoutWeekStats.chartDailyPackages.visibility = View.GONE + (binding.layoutWeekStats.chartDailyPackages.parent as? View)?.visibility = View.GONE binding.layoutWeekStats.heatmapYearly.visibility = View.VISIBLE + binding.cardPackageStats.visibility = View.GONE updateHeatmapData() updatePieChartData() + updateYearlyStats() } } } @@ -523,4 +720,35 @@ super.onDestroyView() _binding = null } + private fun loadUserInfo() { + + lifecycleScope.launch { + try { + // 从本地获取保存的手机号 + val savedPhone = PreferencesManager.getPhone() + if (savedPhone.isNullOrEmpty()) { + Toast.makeText(context, "用户未登录", Toast.LENGTH_SHORT).show() + return@launch + } + + val response = RetrofitClient.apiService.getUserInfo(savedPhone) + if (response.code == "0" && response.data != null) { + // 保存用户信息 + currentUserInfo = response.data + val userInfo = response.data + if(userInfo.isMember){ + hiddleOverlay() + }else{ + // 显示遮罩层 + showOverlay() + } + + } + } catch (e: Exception) { + e.printStackTrace() + Toast.makeText(context, "获取用户信息失败", Toast.LENGTH_SHORT).show() + } + } + + } } \ No newline at end of file -- Gitblit v1.9.3