diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_water_expanded.xml b/app/src/main/res/layout/activity_water_expanded.xml new file mode 100644 index 0000000..7a2dce8 --- /dev/null +++ b/app/src/main/res/layout/activity_water_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_water_expanded.xml b/app/src/main/res/layout/activity_water_expanded.xml new file mode 100644 index 0000000..7a2dce8 --- /dev/null +++ b/app/src/main/res/layout/activity_water_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_date.xml b/app/src/main/res/layout/dialog_select_date.xml index 6505690..0fc81c5 100644 --- a/app/src/main/res/layout/dialog_select_date.xml +++ b/app/src/main/res/layout/dialog_select_date.xml @@ -33,7 +33,8 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_30"> + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_30"> diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_water_expanded.xml b/app/src/main/res/layout/activity_water_expanded.xml new file mode 100644 index 0000000..7a2dce8 --- /dev/null +++ b/app/src/main/res/layout/activity_water_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_date.xml b/app/src/main/res/layout/dialog_select_date.xml index 6505690..0fc81c5 100644 --- a/app/src/main/res/layout/dialog_select_date.xml +++ b/app/src/main/res/layout/dialog_select_date.xml @@ -33,7 +33,8 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_30"> + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_30"> + android:background="@drawable/ic_left_white" + android:visibility="gone" /> diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_water_expanded.xml b/app/src/main/res/layout/activity_water_expanded.xml new file mode 100644 index 0000000..7a2dce8 --- /dev/null +++ b/app/src/main/res/layout/activity_water_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_date.xml b/app/src/main/res/layout/dialog_select_date.xml index 6505690..0fc81c5 100644 --- a/app/src/main/res/layout/dialog_select_date.xml +++ b/app/src/main/res/layout/dialog_select_date.xml @@ -33,7 +33,8 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_30"> + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_30"> + android:background="@drawable/ic_left_white" + android:visibility="gone" /> #00A000 #FF0000 #FF6600 - #FF8078 - #80BBFF #96E9B5 - #916BFF - #C0000000 - - #FEB5A2 - #CDA5FF - #C3EB87 - #FFE1AB + + #37D4AE + #CCFF66 + #FF6600 + #FFCCCC + #FFFF99 + #CCCCFF + #9933FF + #CCFF66 + #66CCCC \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_water_expanded.xml b/app/src/main/res/layout/activity_water_expanded.xml new file mode 100644 index 0000000..7a2dce8 --- /dev/null +++ b/app/src/main/res/layout/activity_water_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_date.xml b/app/src/main/res/layout/dialog_select_date.xml index 6505690..0fc81c5 100644 --- a/app/src/main/res/layout/dialog_select_date.xml +++ b/app/src/main/res/layout/dialog_select_date.xml @@ -33,7 +33,8 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_30"> + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_30"> + android:background="@drawable/ic_left_white" + android:visibility="gone" /> #00A000 #FF0000 #FF6600 - #FF8078 - #80BBFF #96E9B5 - #916BFF - #C0000000 - - #FEB5A2 - #CDA5FF - #C3EB87 - #FFE1AB + + #37D4AE + #CCFF66 + #FF6600 + #FFCCCC + #FFFF99 + #CCCCFF + #9933FF + #CCFF66 + #66CCCC \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0287df6..1ffc7dc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -28,6 +28,9 @@ 46dp + + 230dp + 48px diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d215e77..0c249a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@ diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt new file mode 100644 index 0000000..cb85a39 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/BarChart.kt @@ -0,0 +1,39 @@ +package com.casic.qd.smartwell.extensions + +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.formatter.ValueFormatter + +fun BarChart.init(barLabels: MutableList) { + this.animateY(1200, Easing.EaseInOutQuad) + this.setDrawGridBackground(false) + this.setDrawBorders(false) + this.setScaleEnabled(false) + //去掉描述 + this.description.isEnabled = false + val xAxis: XAxis = this.xAxis + xAxis.textColor = R.color.mainTextColor.convertColor() + xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 + xAxis.labelCount = barLabels.size // 设置x轴上的标签个数 + xAxis.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return barLabels[value.toInt()] + } + } + xAxis.setDrawAxisLine(true) //是否绘制轴线 + xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 + xAxis.position = XAxis.XAxisPosition.BOTTOM + xAxis.labelRotationAngle = -45f //X轴标签斜45度 + this.extraBottomOffset = 5f //解决X轴显示不完全问题 + //设置样式 + val rightAxis: YAxis = this.axisRight + //设置图表右边的y轴禁用 + rightAxis.isEnabled = false + val leftAxis: YAxis = this.axisLeft + leftAxis.axisMinimum = 0f + //不显示图例 + this.legend.isEnabled = false +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt index 5025b55..13e8a73 100644 --- a/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/LineChart.kt @@ -36,4 +36,6 @@ legend.orientation = Legend.LegendOrientation.HORIZONTAL legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + //图例是否自动换行 + legend.isWordWrapEnabled = true } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt new file mode 100644 index 0000000..a88e096 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/extensions/PieChart.kt @@ -0,0 +1,33 @@ +package com.casic.qd.smartwell.extensions + +import android.graphics.Color +import com.casic.qd.smartwell.R +import com.github.mikephil.charting.animation.Easing +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Legend + +fun PieChart.init() { + this.setUsePercentValues(false) //百分比数字显示 + this.description.isEnabled = false + this.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] + this.setBackgroundColor(Color.WHITE) //设置图表背景色 + this.rotationAngle = 0f + this.isRotationEnabled = false + this.isHighlightPerTapEnabled = true + this.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 + this.setDrawEntryLabels(false) //不显示分类标签 + this.isDrawHoleEnabled = false //圆环显示 + this.setDrawCenterText(false) //圆环中心文字 + this.centerText = "分区用水占比图" + this.setEntryLabelColor(R.color.mainThemeColor.convertColor()) //图表文本字体颜色 + this.setEntryLabelTextSize(12f) + //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 + this.setExtraOffsets(7.5f, 2.5f, 7.5f, 2.5f) + //设置图例位置 + val legend = this.legend + legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.orientation = Legend.LegendOrientation.HORIZONTAL + //图例是否自动换行 + legend.isWordWrapEnabled = true +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt new file mode 100644 index 0000000..97fef28 --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/model/WaterSecondAreaModel.kt @@ -0,0 +1,14 @@ +package com.casic.qd.smartwell.model + +class WaterSecondAreaModel { + var code = 0 + var data: List? = null + var message: String? = null + var isSuccess = false + + class DataBean { + var areaId: String? = null + var areaName: String? = null + var count: String? = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt index 366a106..f6a0cc0 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/ChartViewHelper.kt @@ -1,20 +1,14 @@ package com.casic.qd.smartwell.utils -import android.graphics.Color import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseApplication import com.casic.qd.smartwell.extensions.convertColor import com.casic.qd.smartwell.extensions.init import com.casic.qd.smartwell.model.LineChartEntryModel import com.casic.qd.smartwell.widgets.DetailsMarkerView -import com.github.mikephil.charting.animation.Easing import com.github.mikephil.charting.charts.BarChart -import com.github.mikephil.charting.charts.HorizontalBarChart import com.github.mikephil.charting.charts.LineChart import com.github.mikephil.charting.charts.PieChart -import com.github.mikephil.charting.components.Legend -import com.github.mikephil.charting.components.XAxis -import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.* import com.github.mikephil.charting.formatter.ValueFormatter import com.github.mikephil.charting.interfaces.datasets.IBarDataSet @@ -30,8 +24,11 @@ */ object ChartViewHelper { private const val kTag = "ChartViewHelper" - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") + /** + * 折线图 + * */ fun setLineChartData( chart: LineChart, xAxisDate: MutableList, @@ -85,6 +82,65 @@ chart.invalidate() } + /** + * 柱状图 + * */ + fun setBarChartData(chart: BarChart, xAxisLabel: MutableList, entries: List) { + //每次加载数据都初始化饼图 + chart.init(xAxisLabel) + val barDataSets: MutableList = ArrayList() + //绑定数据 + val dataSet = BarDataSet(entries, "") + dataSet.color = R.color.color_1.convertColor() + dataSet.valueFormatter = object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + } + } + barDataSets.add(dataSet) + val barData = BarData(barDataSets) + barData.barWidth = 0.5f + chart.data = barData + chart.invalidate() + } + + /** + * 饼图 + * */ + fun setPieChartData(chart: PieChart, entries: List) { + //每次加载数据都初始化饼图 + chart.init() + //绑定数据 + val dataSet = PieDataSet(entries, "") + dataSet.sliceSpace = 1.5f //设置饼状块之间的间隙 + dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 + //设置饼图块颜色 + val colors: MutableList = ArrayList() + for (i in entries.indices) { + colors.add(Constant.COLORS[i].convertColor()) + } + dataSet.colors = colors + //设置标签显示在饼图块外面 + dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + dataSet.valueLineColor = R.color.mainThemeColor.convertColor() + dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 + dataSet.valueLinePart2Length = 0.65f //标签指示线后半截长度 + val data = PieData(dataSet) + data.setValueFormatter(object : ValueFormatter() { + override fun getFormattedValue(value: Float): String { + return decimalFormat.format(value.toDouble()) + "t" + } + }) + data.setValueTextSize(12f) + data.setValueTextColor(R.color.mainThemeColor.convertColor()) //数据值颜色 + chart.data = data + chart.highlightValues(null) + chart.invalidate() + } + + /*******************************************************************************************/ + fun setLineChartData( chart: LineChart, valveEntries: List?, @@ -116,21 +172,21 @@ val pipelineDataSet = LineDataSet(pipelineEntries, "管线") pipelineDataSet.color = - R.color.pieColor5.convertColor() //线条颜色 - pipelineDataSet.setCircleColor(R.color.pieColor5.convertColor()) //圆点颜色 + R.color.color_5.convertColor() //线条颜色 + pipelineDataSet.setCircleColor(R.color.color_5.convertColor()) //圆点颜色 pipelineDataSet.setDrawFilled(true) pipelineDataSet.fillColor = - R.color.pieColor5.convertColor() + R.color.color_5.convertColor() pipelineDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(pipelineDataSet) val deviceDataSet = LineDataSet(deviceEntries, "噪声仪") deviceDataSet.color = - R.color.barChartColor.convertColor() //线条颜色 - deviceDataSet.setCircleColor(R.color.barChartColor.convertColor()) //圆点颜色 + R.color.color_7.convertColor() //线条颜色 + deviceDataSet.setCircleColor(R.color.color_7.convertColor()) //圆点颜色 deviceDataSet.setDrawFilled(true) deviceDataSet.fillColor = - R.color.barChartColor.convertColor() + R.color.color_7.convertColor() deviceDataSet.mode = LineDataSet.Mode.CUBIC_BEZIER lineDataSets.add(deviceDataSet) @@ -139,173 +195,4 @@ chart.data = lineData chart.invalidate() } - - fun initBarChart(chart: BarChart) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //图例 - val legend = chart.legend - legend.orientation = Legend.LegendOrientation.HORIZONTAL - legend.verticalAlignment = - Legend.LegendVerticalAlignment.BOTTOM - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.CENTER - - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = Constant.BAR_LABEL_NAME.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return Constant.BAR_LABEL_NAME[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: BarChart, last: List, current: List) { - val barDataSets: MutableList = ArrayList() - //绑定数据 - val lastDataSet = BarDataSet(last, "上月") - lastDataSet.color = R.color.barChartColor.convertColor() - lastDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(lastDataSet) - - val currentDataSet = BarDataSet(current, "本月") - currentDataSet.color = R.color.onLineColor.convertColor() - currentDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - barDataSets.add(currentDataSet) - - val barData = BarData(barDataSets) - barData.barWidth = 0.3f - - chart.data = barData - chart.invalidate() - } - - fun initBarChart(chart: HorizontalBarChart, labelName: Array) { - chart.setDrawGridBackground(false) - chart.setDrawBorders(false) - chart.setScaleEnabled(false) - //去掉描述 - chart.description.isEnabled = false - //去掉图例 - chart.legend.isEnabled = false - val xAxis: XAxis = chart.xAxis - xAxis.textColor = R.color.mainTextColor.convertColor() - xAxis.textSize = 12f - xAxis.setDrawLabels(true) //绘制标签 指x轴上的对应数值 - xAxis.labelCount = labelName.size // 设置x轴上的标签个数 - xAxis.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return labelName[value.toInt()] - } - } - xAxis.setDrawAxisLine(true) //是否绘制轴线 - xAxis.setDrawGridLines(false) //设置x轴上每个点对应的线 - xAxis.position = XAxis.XAxisPosition.BOTTOM - chart.extraBottomOffset = 5f //解决X轴显示不完全问题 - //设置样式 - val rightAxis: YAxis = chart.axisRight - //设置图表右边的y轴禁用 - rightAxis.isEnabled = false - val leftAxis: YAxis = chart.axisLeft - leftAxis.axisMinimum = 0f - } - - fun setBarChartData(chart: HorizontalBarChart, entries: List?) { - //绑定数据 - val barDataSet = BarDataSet(entries, "") - barDataSet.color = R.color.barChartColor.convertColor() - barDataSet.valueFormatter = object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) - } - } - val barData = BarData(barDataSet) - barData.barWidth = 0.5f - chart.data = barData - chart.invalidate() - } - - fun initPieChart(chart: PieChart) { - chart.setUsePercentValues(false) //百分比数字显示 - chart.description.isEnabled = false - chart.dragDecelerationFrictionCoef = 0.95f //图表转动阻力摩擦系数[0,1] - chart.setBackgroundColor(Color.WHITE) //设置图表背景色 - chart.rotationAngle = 0f - chart.isRotationEnabled = true - chart.isHighlightPerTapEnabled = true - chart.animateY(1200, Easing.EaseInOutQuad) // 设置图表展示动画效果 - chart.setDrawEntryLabels(false) //不显示分类标签 - chart.isDrawHoleEnabled = true //圆环显示 - chart.setDrawCenterText(true) //圆环中心颜色 - chart.centerText = "分区水表统计" - chart.setEntryLabelColor(Color.BLUE) //图表文本字体颜色 - chart.setEntryLabelTextSize(12f) - //设置图表上下左右的偏移,类似于外边距,可以控制饼图大小 - chart.setExtraOffsets(13f, 13f, 13f, 13f) - //设置图例位置 - val legend = chart.legend - legend.verticalAlignment = - Legend.LegendVerticalAlignment.CENTER - legend.horizontalAlignment = - Legend.LegendHorizontalAlignment.LEFT - legend.orientation = Legend.LegendOrientation.VERTICAL - legend.formSize = 12f - legend.formToTextSpace = 8f - legend.textSize = 12f - } - - fun setPieChartData(chart: PieChart, entries: List) { - val dataSet = PieDataSet(entries, "") - dataSet.sliceSpace = 3f //设置饼状块之间的间隙 - dataSet.selectionShift = 5f //设置饼状块被选中时突出的距离 - //设置饼图块颜色 - val colors: MutableList = ArrayList() - for (i in entries.indices) { - colors.add( - Constant.COLORS[i].convertColor() - ) - } - dataSet.colors = colors - //设置标签显示在饼图块外面 - dataSet.xValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE - dataSet.valueLineColor = Color.BLUE - dataSet.valueLinePart1Length = 0.55f //标签指示线前半截长度 - dataSet.valueLinePart2Length = 0.55f //标签指示线后半截长度 - val data = PieData(dataSet) - data.setValueFormatter(object : ValueFormatter() { - override fun getFormattedValue(value: Float): String { - return decimalFormat.format(value.toDouble()) + "m³" - } - }) - data.setValueTextSize(12f) - data.setValueTextColor(Color.BLUE) //数据值颜色 - chart.data = data - chart.highlightValues(null) - chart.invalidate() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt index ecb931e..51b77eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/Constant.kt @@ -13,7 +13,6 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 20 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L - const val ONE_WEEK = 7 val HOME_ICONS = arrayOf( R.drawable.ic_home_map, R.drawable.ic_home_record, R.drawable.ic_home_statistics, @@ -22,17 +21,12 @@ //预置颜色 val COLORS = arrayOf( - R.color.pieColor3, R.color.onLineColor, R.color.pieColor1, - R.color.barChartColor, R.color.punishColor, R.color.colorAccent, - R.color.persuadeColor, R.color.pieColor2, R.color.pieColor5, - R.color.weChatGreen + R.color.color_1, R.color.color_2, R.color.color_3, + R.color.color_4, R.color.color_5, R.color.color_6, + R.color.color_7, R.color.color_8, R.color.color_9 ) val YEARS = arrayOf(2018, 2019, 2020, 2021, 2022) - val BAR_LABEL_NAME = arrayOf( - "10mm", "20mm", "30mm", - "40mm", "50mm", "60mm" - ) const val INTENT_PARAM = "intentParam" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt index 016b204..ec597e6 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitService.kt @@ -120,7 +120,7 @@ ): String /** - * 获取7日内用水量 + * 获取近日用水量 */ @GET("/waterStatistic/countByDay") suspend fun waterCountByDay( @@ -129,4 +129,15 @@ @Query("startTime") startTime: String, @Query("endTime") endTime: String ): String + + /** + * 获取分区用水占比 + */ + @GET("/waterStatistic/countBySecondArea") + suspend fun waterCountBySecondArea( + @Header("token") token: String, + @Query("areaId") areaId: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt index 43e0bf4..6425a24 100644 --- a/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/qd/smartwell/utils/retrofit/RetrofitServiceManager.kt @@ -127,9 +127,16 @@ } /** - * 获取近7日内用水量 + * 获取近日用水量 */ suspend fun waterCountByDay(areaId: String, startTime: String, endTime: String): String { return api.waterCountByDay(AuthenticationHelper.token!!, areaId, startTime, endTime) } + + /** + * 获取分区用水占比 + */ + suspend fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String): String { + return api.waterCountBySecondArea(AuthenticationHelper.token!!, areaId, startTime, endTime) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt deleted file mode 100644 index 4e3e0aa..0000000 --- a/app/src/main/java/com/casic/qd/smartwell/view/ExpandedActivity.kt +++ /dev/null @@ -1,150 +0,0 @@ -package com.casic.qd.smartwell.view - -import android.content.Context -import android.view.View -import android.widget.AdapterView -import androidx.lifecycle.ViewModelProvider -import com.casic.qd.smartwell.R -import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.* -import com.casic.qd.smartwell.model.LineChartEntryModel -import com.casic.qd.smartwell.utils.ChartViewHelper -import com.casic.qd.smartwell.utils.Constant -import com.casic.qd.smartwell.vm.WaterStatisticsViewModel -import com.casic.qd.smartwell.widgets.DateSelectDialog -import com.github.mikephil.charting.data.Entry -import kotlinx.android.synthetic.main.activity_expanded.* -import kotlinx.android.synthetic.main.activity_main.waterLineChart -import java.util.* -import kotlin.collections.ArrayList - - -class ExpandedActivity : BaseActivity() { - - private val kTag = "ExpandedActivity" - private val context: Context = this@ExpandedActivity - private lateinit var waterViewModel: WaterStatisticsViewModel - - override fun initLayoutView(): Int = R.layout.activity_expanded - - override fun setupTopBarLayout() { - - } - - override fun initData() { - waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) - } - - override fun initEvent() { - //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, - position: Int, id: Long - ) { - val time = System.currentTimeMillis() - val calendar = Calendar.getInstance() - val year: Int = calendar.get(Calendar.YEAR) - when (position) { - 0 -> { - //本年度 - waterViewModel.waterCountByDay( - Constant.AREA_ID, "$year-01-01", time.timestampToDate() - ) - } - 1 -> { - //本季度 - val startDate = when (time.getQuarterOfYear()) { - 1 -> "$year-01-01" - 2 -> "$year-04-01" - 3 -> "$year-07-01" - 4 -> "$year-10-01" - else -> "" - } - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, time.timestampToDate() - ) - } - 2 -> { - //近30日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, - time.timestampToLastMonthDate(), time.timestampToDate() - ) - } - 3 -> { - //近7日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() - ) - } - 4 -> { - //今日 - waterViewModel.waterCountByDay( - Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() - ) - } - 5 -> { - DateSelectDialog.Builder() - .setContext(context) - .setFragmentManager(supportFragmentManager) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : - DateSelectDialog.OnDialogButtonClickListener { - override fun onConfirmClick(startDate: String, endDate: String) { - waterViewModel.waterCountByDay( - Constant.AREA_ID, startDate, endDate - ) - } - - override fun onCancelClick() { - //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) - } - }).build().show() - } - } - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - waterViewModel.areaDataModel.observe(this, { - if (it.code == 200) { - val xAxisDate: MutableList = ArrayList() - val entryModels: MutableList = ArrayList() - - val dataModel = it.data!! - dataModel.forEach { dateModel -> - val split = dateModel.date.toString().split("-") - xAxisDate.add("${split[1]}/${split[2]}") - } - //确定有几条折线 - val lines = dataModel[0].data?.size!! - for (i in 0 until lines) { - //每个entries都是一条折线 - val entries: ArrayList = ArrayList() - val entryModel = LineChartEntryModel() - dataModel.forEachIndexed { j, dataBean -> - entryModel.lineColor = Constant.COLORS[i].convertColor() - - val areaData = dataBean.data!![i] - entries.add( - Entry( - j.toFloat(), areaData.count!!.toFloat(), areaData.areaName - ) - ) - } - entryModel.entryList = entries - entryModels.add(entryModel) - } - ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) - } - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt index b8bd623..ae9df20 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MainActivity.kt @@ -32,7 +32,6 @@ class MainActivity : BaseActivity() { - private val kTag = "MainActivity" private val context: Context = this@MainActivity private var clickTime: Long = 0 private lateinit var waterViewModel: WaterStatisticsViewModel @@ -129,7 +128,7 @@ val endDate = time.timestampToDate() //一周折线图数据 waterViewModel.waterCountByDay(Constant.AREA_ID, startDate, endDate) - waterViewModel.areaDataModel.observe(this, { + waterViewModel.dayDataModel.observe(this, { if (it.code == 200) { val dataModel = it.data!! dataModel.forEach { dateModel -> @@ -160,7 +159,7 @@ }) expandView.setOnClickListener { - navigatePageTo(ExpandedActivity::class.java) + navigatePageTo(WaterExpandedActivity::class.java) } } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt index 1dea700..74fc2c4 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/MapActivity.kt @@ -21,7 +21,6 @@ override fun initLayoutView(): Int = R.layout.activity_map override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "地图展示" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt index bb66c3f..954cf2d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchAlarmActivity.kt @@ -1,6 +1,5 @@ package com.casic.qd.smartwell.view -import android.view.View import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity @@ -30,7 +29,6 @@ override fun setupTopBarLayout() { titleView.text = "告警查询" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt index 7f63c0a..a459183 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchRecordActivity.kt @@ -16,7 +16,6 @@ override fun initLayoutView(): Int = R.layout.activity_search_record override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "记录查询" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt index 6e0816e..988b53d 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/SearchResultActivity.kt @@ -7,7 +7,6 @@ import android.os.Handler import android.os.Looper import android.os.Message -import android.view.View import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.casic.qd.smartwell.R @@ -30,6 +29,7 @@ import java.lang.ref.WeakReference class SearchResultActivity : BaseActivity() { + private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var searchAlarmViewModel: SearchAlarmViewModel private lateinit var cancelAlarmViewModel: CancelAlarmViewModel @@ -44,7 +44,6 @@ override fun setupTopBarLayout() { titleView.text = "查询结果" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt index f6bdfa3..9258311 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/StatisticsActivity.kt @@ -1,10 +1,16 @@ package com.casic.qd.smartwell.view +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider import com.casic.qd.smartwell.R import com.casic.qd.smartwell.base.BaseActivity -import com.casic.qd.smartwell.extensions.init +import com.casic.qd.smartwell.extensions.* import com.casic.qd.smartwell.utils.ChartViewHelper import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog import com.github.mikephil.charting.data.BarEntry import com.github.mikephil.charting.data.Entry import com.github.mikephil.charting.data.PieEntry @@ -15,35 +21,131 @@ /** * @author a203 * @description 汇总统计界面 - * @package com.casic.qd.smartwell.view * @date 2022/2/17 14:34 * @email 290677893@qq.com */ class StatisticsActivity : BaseActivity() { - private val valveEntries: ArrayList = ArrayList() - private val meterEntries: ArrayList = ArrayList() - private val pipelineEntries: ArrayList = ArrayList() - private val deviceEntries: ArrayList = ArrayList() - private val pieEntries: ArrayList = ArrayList() - private val lastMonthEntries: ArrayList = ArrayList() - private val currentMonthEntries: ArrayList = ArrayList() + private val context: Context = this@StatisticsActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + private val valveEntries: MutableList = ArrayList() + private val meterEntries: MutableList = ArrayList() + private val pipelineEntries: MutableList = ArrayList() + private val deviceEntries: MutableList = ArrayList() override fun initLayoutView(): Int = R.layout.activity_statistics override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "汇总统计" } override fun initData() { - //初始化饼图 - ChartViewHelper.initPieChart(totalPieChart) - //TODO 这是模拟数据 - for (i in 0..4) { - pieEntries.add(PieEntry(Random().nextInt(100).toFloat(), "片区$i")) + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountBySecondArea( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } } - ChartViewHelper.setPieChartData(totalPieChart, pieEntries) + + waterViewModel.areaDataModel.observe(this, { + if (it.code == 200) { + val xAxisLabel: MutableList = ArrayList() + //柱状图 + val barEntries: MutableList = ArrayList() + //饼图 + val pieEntries: MutableList = ArrayList() + it.data?.forEachIndexed { index, dataBean -> + xAxisLabel.add(dataBean.areaName.toString()) + val dataValue = if (dataBean.count.toString().isBlank()) { + 0f + } else { + dataBean.count!!.toFloat() + } + //柱状图 + barEntries.add(BarEntry(index.toFloat(), dataValue)) + //饼图 + pieEntries.add(PieEntry(dataValue, dataBean.areaName)) + } + ChartViewHelper.setBarChartData(waterBarChart, xAxisLabel, barEntries) + ChartViewHelper.setPieChartData(waterPieChart, pieEntries) + } + }) //初始化折线图 totalLineChart.init() @@ -81,18 +183,5 @@ pipelineEntries, deviceEntries ) - - //初始化柱状图 - ChartViewHelper.initBarChart(totalBarChart) - //TODO 这是模拟数据 - for (i in 0..5) { - lastMonthEntries.add(BarEntry((i - 0.15).toFloat(), Random().nextInt(150).toFloat())) - currentMonthEntries.add(BarEntry((i + 0.15).toFloat(), Random().nextInt(150).toFloat())) - } - ChartViewHelper.setBarChartData(totalBarChart, lastMonthEntries, currentMonthEntries) - } - - override fun initEvent() { - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt new file mode 100644 index 0000000..20f0d3c --- /dev/null +++ b/app/src/main/java/com/casic/qd/smartwell/view/WaterExpandedActivity.kt @@ -0,0 +1,148 @@ +package com.casic.qd.smartwell.view + +import android.content.Context +import android.view.View +import android.widget.AdapterView +import androidx.lifecycle.ViewModelProvider +import com.casic.qd.smartwell.R +import com.casic.qd.smartwell.base.BaseActivity +import com.casic.qd.smartwell.extensions.* +import com.casic.qd.smartwell.model.LineChartEntryModel +import com.casic.qd.smartwell.utils.ChartViewHelper +import com.casic.qd.smartwell.utils.Constant +import com.casic.qd.smartwell.vm.WaterStatisticsViewModel +import com.casic.qd.smartwell.widgets.DateSelectDialog +import com.github.mikephil.charting.data.Entry +import kotlinx.android.synthetic.main.activity_water_expanded.* +import java.util.* +import kotlin.collections.ArrayList + + +class WaterExpandedActivity : BaseActivity() { + + private val context: Context = this@WaterExpandedActivity + private lateinit var waterViewModel: WaterStatisticsViewModel + + override fun initLayoutView(): Int = R.layout.activity_water_expanded + + override fun setupTopBarLayout() { + + } + + override fun initData() { + waterViewModel = ViewModelProvider(this).get(WaterStatisticsViewModel::class.java) + } + + override fun initEvent() { + //默认选择近7天的数据 + periodSpinner.setSelection(3) + periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, view: View?, + position: Int, id: Long + ) { + val time = System.currentTimeMillis() + val calendar = Calendar.getInstance() + val year: Int = calendar.get(Calendar.YEAR) + when (position) { + 0 -> { + //本年度 + waterViewModel.waterCountByDay( + Constant.AREA_ID, "$year-01-01", time.timestampToDate() + ) + } + 1 -> { + //本季度 + val startDate = when (time.getQuarterOfYear()) { + 1 -> "$year-01-01" + 2 -> "$year-04-01" + 3 -> "$year-07-01" + 4 -> "$year-10-01" + else -> "" + } + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, time.timestampToDate() + ) + } + 2 -> { + //近30日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, + time.timestampToLastMonthDate(), time.timestampToDate() + ) + } + 3 -> { + //近7日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToLastWeekDate(), time.timestampToDate() + ) + } + 4 -> { + //今日 + waterViewModel.waterCountByDay( + Constant.AREA_ID, time.timestampToDate(), time.timestampToDate() + ) + } + 5 -> { + DateSelectDialog.Builder() + .setContext(context) + .setFragmentManager(supportFragmentManager) + .setTitle("选择日期") + .setNegativeButton("取消") + .setPositiveButton("选好了") + .setOnDialogButtonClickListener(object : + DateSelectDialog.OnDialogButtonClickListener { + override fun onConfirmClick(startDate: String, endDate: String) { + waterViewModel.waterCountByDay( + Constant.AREA_ID, startDate, endDate + ) + } + + override fun onCancelClick() { + //选择取消就默认加载近7天的数据 + periodSpinner.setSelection(3) + } + }).build().show() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + + } + } + + waterViewModel.dayDataModel.observe(this, { + if (it.code == 200) { + val xAxisDate: MutableList = ArrayList() + val entryModels: MutableList = ArrayList() + + val dataModel = it.data!! + dataModel.forEach { dateModel -> + val split = dateModel.date.toString().split("-") + xAxisDate.add("${split[1]}/${split[2]}") + } + //确定有几条折线 + val lines = dataModel[0].data?.size!! + for (i in 0 until lines) { + //每个entries都是一条折线 + val entries: ArrayList = ArrayList() + val entryModel = LineChartEntryModel() + dataModel.forEachIndexed { j, dataBean -> + entryModel.lineColor = Constant.COLORS[i].convertColor() + + val areaData = dataBean.data!![i] + entries.add( + Entry( + j.toFloat(), areaData.count!!.toFloat(), areaData.areaName + ) + ) + } + entryModel.entryList = entries + entryModels.add(entryModel) + } + ChartViewHelper.setLineChartData(waterLineChart, xAxisDate, entryModels) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt index d9dbe77..1bc004a 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WebsiteActivity.kt @@ -14,7 +14,6 @@ override fun initLayoutView(): Int = R.layout.activity_web override fun setupTopBarLayout() { - leftBackView.setOnClickListener { finish() } titleView.text = "海洋石油工程有限公司" } diff --git a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt index f1cbb83..7a651be 100644 --- a/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt +++ b/app/src/main/java/com/casic/qd/smartwell/view/WellDetailActivity.kt @@ -22,7 +22,6 @@ override fun setupTopBarLayout() { titleView.text = "井详情" - leftBackView.visibility = View.GONE } override fun initData() { diff --git a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt index 621b755..8e40ee1 100644 --- a/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt +++ b/app/src/main/java/com/casic/qd/smartwell/vm/WaterStatisticsViewModel.kt @@ -7,6 +7,7 @@ import com.casic.qd.smartwell.extensions.separateResponseCode import com.casic.qd.smartwell.extensions.show import com.casic.qd.smartwell.extensions.toErrorMessage +import com.casic.qd.smartwell.model.WaterSecondAreaModel import com.casic.qd.smartwell.model.WaterSevenDayModel import com.casic.qd.smartwell.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -18,8 +19,12 @@ private val kTag = "WaterStatisticsViewModel" private val gson = Gson() val resultModel = MutableLiveData>() - val areaDataModel = MutableLiveData() + val dayDataModel = MutableLiveData() + val areaDataModel = MutableLiveData() + /** + * 用水统计 + */ fun waterStatistics() = launch({ val response = RetrofitServiceManager.waterStatistics() val responseCode = response.separateResponseCode() @@ -41,11 +46,14 @@ "服务器异常".show() }) + /** + * 获取近日用水量 + */ fun waterCountByDay(areaId: String, startTime: String, endTime: String) = launch({ val response = RetrofitServiceManager.waterCountByDay(areaId, startTime, endTime) val responseCode = response.separateResponseCode() if (responseCode == 200) { - areaDataModel.value = gson.fromJson( + dayDataModel.value = gson.fromJson( response, object : TypeToken() {}.type ) } else { @@ -55,4 +63,22 @@ Log.e(kTag, it.toString(), it) "服务器异常".show() }) + + /** + * 获取分区用水占比 + */ + fun waterCountBySecondArea(areaId: String, startTime: String, endTime: String) = launch({ + val response = RetrofitServiceManager.waterCountBySecondArea(areaId, startTime, endTime) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + areaDataModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.toErrorMessage().show() + } + }, { + Log.e(kTag, it.toString(), it) + "服务器异常".show() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt index 7d1c1cf..ec403eb 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DateSelectDialog.kt @@ -69,7 +69,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.75f) + this.initDialogLayoutParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.8f) setContentView(R.layout.dialog_select_date) setCancelable(false) setCanceledOnTouchOutside(false) diff --git a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt index ebf3810..c6f92df 100644 --- a/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt +++ b/app/src/main/java/com/casic/qd/smartwell/widgets/DetailsMarkerView.kt @@ -12,7 +12,7 @@ class DetailsMarkerView(context: Context?) : MarkerView(context, R.layout.popu_marker) { - private val decimalFormat = DecimalFormat("##0.00") + private val decimalFormat = DecimalFormat("##0.0") private val dayView: TextView = findViewById(R.id.dayView) private val factoryView: TextView = findViewById(R.id.factoryView) private val dataView: TextView = findViewById(R.id.dataView) diff --git a/app/src/main/res/drawable/ic_home_map.xml b/app/src/main/res/drawable/ic_home_map.xml index 2b0ae22..909a74e 100644 --- a/app/src/main/res/drawable/ic_home_map.xml +++ b/app/src/main/res/drawable/ic_home_map.xml @@ -5,5 +5,5 @@ android:viewportHeight="1024"> + android:fillColor="@color/mainThemeColor" /> diff --git a/app/src/main/res/drawable/ic_home_record.xml b/app/src/main/res/drawable/ic_home_record.xml index 7a1ee6c..c6b341a 100644 --- a/app/src/main/res/drawable/ic_home_record.xml +++ b/app/src/main/res/drawable/ic_home_record.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/drawable/ic_home_statistics.xml b/app/src/main/res/drawable/ic_home_statistics.xml index a8a1ba8..9cd0fea 100644 --- a/app/src/main/res/drawable/ic_home_statistics.xml +++ b/app/src/main/res/drawable/ic_home_statistics.xml @@ -4,12 +4,12 @@ android:viewportWidth="1024" android:viewportHeight="1024"> diff --git a/app/src/main/res/layout/activity_expanded.xml b/app/src/main/res/layout/activity_expanded.xml deleted file mode 100644 index 7a2dce8..0000000 --- a/app/src/main/res/layout/activity_expanded.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 2beac41..f29886d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,5 @@ + android:textSize="@dimen/textFontSize" /> - + + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_statistics.xml b/app/src/main/res/layout/activity_statistics.xml index a20813b..80d3069 100644 --- a/app/src/main/res/layout/activity_statistics.xml +++ b/app/src/main/res/layout/activity_statistics.xml @@ -1,6 +1,5 @@ @@ -15,45 +14,73 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="@dimen/dp_10"> + android:paddingHorizontal="@dimen/dp_10"> - + android:paddingVertical="@dimen/dp_10"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:text="分区用水统计以及占比" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/textFontSize" /> + + + + + + + - + + + + + + android:paddingVertical="@dimen/dp_10"> + + + + + + + - - - - - + android:layout_height="@dimen/AndroidChartHeight" /> diff --git a/app/src/main/res/layout/activity_water_expanded.xml b/app/src/main/res/layout/activity_water_expanded.xml new file mode 100644 index 0000000..7a2dce8 --- /dev/null +++ b/app/src/main/res/layout/activity_water_expanded.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_select_date.xml b/app/src/main/res/layout/dialog_select_date.xml index 6505690..0fc81c5 100644 --- a/app/src/main/res/layout/dialog_select_date.xml +++ b/app/src/main/res/layout/dialog_select_date.xml @@ -33,7 +33,8 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" - android:padding="@dimen/dp_30"> + android:paddingHorizontal="@dimen/dp_20" + android:paddingVertical="@dimen/dp_30"> + android:background="@drawable/ic_left_white" + android:visibility="gone" /> #00A000 #FF0000 #FF6600 - #FF8078 - #80BBFF #96E9B5 - #916BFF - #C0000000 - - #FEB5A2 - #CDA5FF - #C3EB87 - #FFE1AB + + #37D4AE + #CCFF66 + #FF6600 + #FFCCCC + #FFFF99 + #CCCCFF + #9933FF + #CCFF66 + #66CCCC \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0287df6..1ffc7dc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -28,6 +28,9 @@ 46dp + + 230dp + 48px diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 91ecec2..ef45656 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -121,4 +121,12 @@ @color/hintTextColor @dimen/textFontSize + +