| | |
| | | import java.text.SimpleDateFormat |
| | | import android.graphics.Color |
| | | import android.widget.GridLayout |
| | | import android.widget.Toast |
| | | 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() { |
| | | |
| | |
| | | private lateinit var barChart: BarChart |
| | | private lateinit var pieChart: PieChart |
| | | private lateinit var heatmapView: View |
| | | private var currentUserInfo: UserInfo? = null // 确保使用你的实际数据类 |
| | | |
| | | private var startDateCur:String = "" |
| | | private var endDateCur:String = "" |
| | | |
| | | |
| | | enum class DateType { |
| | | DAY, WEEK, MONTH, YEAR |
| | | } |
| | |
| | | return binding.root |
| | | } |
| | | |
| | | override fun onResume() { |
| | | super.onResume() |
| | | // 重新加载用户信息 |
| | | loadUserInfo() |
| | | } |
| | | |
| | | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
| | | super.onViewCreated(view, savedInstanceState) |
| | | |
| | |
| | | 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 { |
| | |
| | | } |
| | | |
| | | private fun setupTabLayout() { |
| | | val weekStatsView = binding.layoutWeekStats.root |
| | | val bar_title:TextView = weekStatsView.findViewById(R.id.bar_title) |
| | | val pie_title:TextView = weekStatsView.findViewById(R.id.pie_title) |
| | | |
| | | binding.tabDateRange.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { |
| | | override fun onTabSelected(tab: TabLayout.Tab?) { |
| | | currentDateType = when(tab?.position) { |
| | |
| | | 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() |
| | |
| | | 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月" |
| | |
| | | } |
| | | } |
| | | private fun setupView(view: View) { |
| | | |
| | | val weekStatsView = binding.layoutWeekStats.root |
| | | barChart = weekStatsView.findViewById(R.id.chart_daily_packages) |
| | | 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 |
| | |
| | | setupPieChart() |
| | | setupHeatmap() |
| | | updateCharts() |
| | | |
| | | } |
| | | private fun setupBarChart() { |
| | | barChart.apply { |
| | |
| | | setDrawGridLines(false) |
| | | granularity = 1f |
| | | labelRotationAngle = 0f |
| | | textSize = 12f |
| | | textSize = 10f //标签字体 |
| | | setExtraLeftOffset(5f) // 减少左侧留白 |
| | | setExtraBottomOffset(15f) |
| | | } |
| | | |
| | |
| | | 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) |
| | |
| | | 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 -> { |
| | | // 获取本月统计 |
| | |
| | | } |
| | | } |
| | | } |
| | | packageAdapter.updatePackages(packages) |
| | | packageAdapter.updatePackages(packages) |
| | | |
| | | // packageAdapter.updatePackages(packages) |
| | | // binding.textPackageCount.text = "${packages.size}个" |
| | | } |
| | | } |
| | |
| | | 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() |
| | |
| | | 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() |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |