From d68c8f7ce32c545a30b1c45a21b3034f68b8122e Mon Sep 17 00:00:00 2001 From: wenfei Date: Tue, 17 Mar 2026 17:51:11 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E8=AF=A6=E6=83=85-=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=BF=90=E8=A1=8C=E7=8E=87-=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/rehome/zhdcoa/Contans.java | 3 + .../rehome/zhdcoa/bean/DeviceRunRateBean.java | 44 ++++ .../ui/activity/DeviceManagerListActivity.kt | 4 +- .../DeviceMonitoringDetailActivity.kt | 6 +- .../DeviceMonitoringDetailFragment.java | 3 + .../DeviceMonitoringPhotoFragment.java | 40 +++ .../DeviceMonitoringStatisticsFragment.java | 239 ++++++++++++++++++ .../fragment_device_monitoring_photo.xml | 47 ++++ .../fragment_device_monitoring_statistics.xml | 76 +++--- 9 files changed, 421 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/com/rehome/zhdcoa/bean/DeviceRunRateBean.java create mode 100644 app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringPhotoFragment.java create mode 100644 app/src/main/res/layout/fragment_device_monitoring_photo.xml diff --git a/app/src/main/java/com/rehome/zhdcoa/Contans.java b/app/src/main/java/com/rehome/zhdcoa/Contans.java index 7456953..1a7b9f6 100644 --- a/app/src/main/java/com/rehome/zhdcoa/Contans.java +++ b/app/src/main/java/com/rehome/zhdcoa/Contans.java @@ -546,6 +546,9 @@ public class Contans { public final static String getDevicePhotoListUrl = "dserver/device/img"; public final static String getImgDeviceOnlineBaseUrl = "dserver/device/img/file/"; + //设备详情-统计-设备运行率 + public final static String getRateLineChartDataUrl = "dserver/device/operationRate/"; + //设备在线列表 public final static String DeviceOnlineStatusListUrl = "dserver/device/list"; diff --git a/app/src/main/java/com/rehome/zhdcoa/bean/DeviceRunRateBean.java b/app/src/main/java/com/rehome/zhdcoa/bean/DeviceRunRateBean.java new file mode 100644 index 0000000..16a8c87 --- /dev/null +++ b/app/src/main/java/com/rehome/zhdcoa/bean/DeviceRunRateBean.java @@ -0,0 +1,44 @@ +package com.rehome.zhdcoa.bean; + +import java.util.List; + +public class DeviceRunRateBean extends DeviceAlarmBaseBean { + /** + * { + * "date": "2026-02-26", + * "rate": 0.0 + * }, + */ + private List data; + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public static class DeviceRunRateItem { + // 时间 + private String date; + // 百分比 + private Double rate; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Double getRate() { + return rate; + } + + public void setRate(Double rate) { + this.rate = rate; + } + } +} diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceManagerListActivity.kt b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceManagerListActivity.kt index 0f8d2b1..eb4a7ed 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceManagerListActivity.kt +++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/DeviceManagerListActivity.kt @@ -270,14 +270,14 @@ class DeviceManagerListActivity : BaseActivityOaToolbarViewBinding = ArrayList() titles.add("设备详情") titles.add("设备统计") + titles.add("设备照片") for (i in titles.indices) { binding.tabs.addTab(binding.tabs.newTab().setText(titles[i])) } fragments.add(DeviceMonitoringDetailFragment(deviceCode,deviceName,areaFullName)) - fragments.add(DeviceMonitoringStatisticsFragment()) + fragments.add(DeviceMonitoringStatisticsFragment(deviceCode,deviceName,areaFullName)) + fragments.add(DeviceMonitoringPhotoFragment(deviceCode,deviceName,areaFullName)) + val mFragmentAdapter = FragmentAdapter( supportFragmentManager, fragments, titles ) diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringDetailFragment.java b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringDetailFragment.java index 728911d..f156fb4 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringDetailFragment.java +++ b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringDetailFragment.java @@ -68,13 +68,16 @@ public class DeviceMonitoringDetailFragment extends BaseViewBindingFragment { + private String deviceCode; + private String deviceName; + private String areaFullName; + + public DeviceMonitoringPhotoFragment(String deviceCode,String deviceName,String areaFullName){ + this.deviceCode=deviceCode; + this.deviceName=deviceName; + this.areaFullName=areaFullName; + } + + @Override + protected FragmentDeviceMonitoringPhotoBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return FragmentDeviceMonitoringPhotoBinding.inflate(inflater); + } + + @Override + protected void initView() { + + } + + @Override + protected void initData() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringStatisticsFragment.java b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringStatisticsFragment.java index 85e2738..8c6b352 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringStatisticsFragment.java +++ b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/DeviceMonitoringStatisticsFragment.java @@ -1,5 +1,10 @@ package com.rehome.zhdcoa.ui.fragment; +import static com.rehome.zhdcoa.utils.GsonUtils.GsonString; +import static com.rehome.zhdcoa.utils.GsonUtils.GsonToBean; + +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; import android.os.Bundle; import androidx.annotation.NonNull; @@ -10,17 +15,59 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.github.mikephil.charting.components.Description; +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.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.github.mikephil.charting.formatter.IndexAxisValueFormatter; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; +import com.rehome.zhdcoa.Contans; import com.rehome.zhdcoa.R; import com.rehome.zhdcoa.base.BaseViewBindingFragment; +import com.rehome.zhdcoa.bean.DeviceAlarmInfoLineChartBean; +import com.rehome.zhdcoa.bean.DeviceRunRateBean; import com.rehome.zhdcoa.databinding.FragmentDeviceMonitoringDetailBinding; import com.rehome.zhdcoa.databinding.FragmentDeviceMonitoringStatisticsBinding; +import com.rehome.zhdcoa.utils.HttpListener; +import com.rehome.zhdcoa.utils.NohttpUtils; +import com.yolanda.nohttp.NoHttp; +import com.yolanda.nohttp.RequestMethod; +import com.yolanda.nohttp.rest.Request; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; /** * 设备统计 */ public class DeviceMonitoringStatisticsFragment extends BaseViewBindingFragment { + private String deviceCode; + private String deviceName; + private String areaFullName; + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sdfDay = new SimpleDateFormat("MM-dd"); + //SimpleDateFormat sdfHourMinute = new SimpleDateFormat("HH:mm"); + private List deviceRunRateList = new ArrayList<>(); + + private double maxRate=100; + private ArrayList xLabelListDataRate = new ArrayList<>(); + public DeviceMonitoringStatisticsFragment(String deviceCode,String deviceName,String areaFullName){ + this.deviceCode=deviceCode; + this.deviceName=deviceName; + this.areaFullName=areaFullName; + } + @Override protected FragmentDeviceMonitoringStatisticsBinding getBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { return FragmentDeviceMonitoringStatisticsBinding.inflate(inflater); @@ -28,11 +75,203 @@ public class DeviceMonitoringStatisticsFragment extends BaseViewBindingFragment< @Override protected void initView() { + binding.itemQy.tvType.setText("区域"); + binding.itemQy.tvType.setTextSize(16); + binding.itemQy.tvValue.setText(areaFullName); + binding.itemQy.tvValue.setTextSize(14); + binding.itemQy.tvValue.setTextColor(Color.WHITE); + binding.itemSbmc.tvType.setText("设备名称"); + binding.itemSbmc.tvType.setTextSize(16); + binding.itemSbmc.tvValue.setText(deviceName); + binding.itemSbmc.tvValue.setTextSize(14); + binding.itemSbmc.tvValue.setTextColor(Color.WHITE); } @Override protected void initData() { + setDes(); + if(deviceCode!=null){ + showLog(deviceCode); + getRateLineChartData(); + } + } + + private void setDes() { + Description description = new Description(); + description.setText(""); + description.setTextSize(12); + description.setTextColor(Color.BLUE); + binding.lineChartRunRate.setDescription(description); + + //透明化图例 + Legend legend = binding.lineChartRunRate.getLegend(); + //legend.setForm(Legend.LegendForm.NONE); + legend.setTextColor(Color.BLACK); + legend.setTextSize(24); + + binding.lineChartRunRate.setNoDataText("无数据"); + binding.lineChartRunRate.setExtraTopOffset(20f); + binding.lineChartRunRate.setExtraBottomOffset(30f); + binding.lineChartRunRate.setExtraRightOffset(10f); + binding.lineChartRunRate.setExtraLeftOffset(10f); + + // 方法一:通过设置 X 轴偏移量间接控制 +// legend.setXEntrySpace(10f); // 条目之间的水平间距 +// legend.setYEntrySpace(10f); // 行之间的垂直间距 +// legend.setFormSize(10f); // 图例图标大小 +// // 启用自动换行 +// legend.setWordWrapEnabled(true); +// // 设置换行策略 +// legend.setDirection(Legend.LegendDirection.LEFT_TO_RIGHT); + + + //方法二:基本多行显示配置 + // 水平方向排列 + //legend.setOrientation(Legend.LegendOrientation.VERTICAL); + // 垂直方向排列 + legend.setOrientation(Legend.LegendOrientation.HORIZONTAL); + // 设置在底部居中 + legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP); + legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); + // 启用自动换行 + legend.setWordWrapEnabled(true); + legend.setFormSize(1f); // 图例图标大小 + } + + public void getRateLineChartData() { + + ////http://10.19.0.17:1700/dserver/device/operationRate/002c000e + String url = Contans.IP + Contans.getRateLineChartDataUrl+deviceCode; + Request request = NoHttp.createStringRequest(url, RequestMethod.GET); + + NohttpUtils.getInstance().add(requireActivity(),0, request, new HttpListener() { + + @Override + public void onSucceed(int what, com.yolanda.nohttp.rest.Response response) { + + String result = response.get(); + showLog(result); + + DeviceRunRateBean bean = GsonToBean(result, DeviceRunRateBean.class); + if(bean!=null && bean.getCode()==20000 && bean.isSuccess() && bean.getData()!=null && !bean.getData().isEmpty()){ + deviceRunRateList.clear(); + deviceRunRateList.addAll(bean.getData()); + //Collections.reverse(deviceRunRateList); + renderRate(); + }else{ + showLog("is emply"); + //setDes(); + } + } + + @Override + public void onFailed(int what, com.yolanda.nohttp.rest.Response response) { + + } + }); + } + //温度折线图 + private void renderRate(){ + xLabelListDataRate.clear(); + List entries1 = new ArrayList<>(); + for (int i = 0; i < deviceRunRateList.size(); i++) { + try { + DeviceRunRateBean.DeviceRunRateItem item = deviceRunRateList.get(i); + entries1.add(new Entry(i, Float.parseFloat(item.getRate().toString()))); + Date date = sdf.parse(item.getDate()); + if(date != null){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + xLabelListDataRate.add(sdfDay.format(calendar.getTime())); + } + if(i==deviceRunRateList.size()-1){ + showLog(GsonString(item)); + } + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + setDataRate(entries1); + } + private void setDataRate(List datas) { + // 清除所有数据 + binding.lineChartRunRate.clear(); + binding.lineChartRunRate.invalidate(); // 重绘视图 + + String deviceNameLine = "设备运行率(%)"; + List sets = new ArrayList<>(); + LineDataSet dataSet1 = new LineDataSet(datas, deviceNameLine); + dataSet1.setValueTextSize(12); + dataSet1.setValueTextColor(Color.parseColor("#FC863E")); + dataSet1.setMode(LineDataSet.Mode.CUBIC_BEZIER); + dataSet1.setLineWidth(2);//线宽 + dataSet1.setCircleRadius(4);//设置圆点半径(外圆大小) + dataSet1.setCircleHoleRadius(2);//设置空心圆点半径(内圆大小) + dataSet1.setDrawCircles(true); // 禁用圆点绘制 + dataSet1.setDrawCircleHole(true);// 设置圆点半径(外圆大小) + //dataSet1.enableDashedLine(5, 5, 0); + dataSet1.setCircleColor(Color.parseColor("#2AA39A")); + dataSet1.setColor(Color.parseColor("#2AA39A")); + + dataSet1.setDrawHighlightIndicators(false); + dataSet1.setDrawFilled(true); + dataSet1.setFillDrawable(new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{Color.argb(127, 235, 170, 106), Color.parseColor("#00FA5544")})); + dataSet1.setLineWidth(2); + dataSet1.setDrawValues(false); + + sets.add(dataSet1); + LineData lineData = new LineData(sets); + binding.lineChartRunRate.setData(lineData); + binding.lineChartRunRate.invalidate(); + XAxis xAxis = binding.lineChartRunRate.getXAxis(); + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); + xAxis.setAxisMinimum(0);//设置x轴最小 + xAxis.setTextSize(12); + //xAxis.setTextColor(Color.parseColor("#FC863E")); + xAxis.setEnabled(true);//是否显示x轴是否禁用 + xAxis.setDrawLabels(true); //设置x轴标签 即x轴上显示的数值 + xAxis.setDrawGridLines(true);//是否设置x轴上每个点对应的线 即 竖向的网格线 + xAxis.enableGridDashedLine(2, 2, 2); //竖线 虚线样式 lineLength控制虚线段的长度 spaceLength控制线之间的空间 + xAxis.setLabelRotationAngle(40f);//设置x轴标签的旋转角度 + String[] timearray = xLabelListDataRate.toArray(new String[xLabelListDataRate.size()]); + xAxis.setValueFormatter(new IndexAxisValueFormatter(timearray)); + YAxis yAxis = binding.lineChartRunRate.getAxisRight(); + yAxis.setEnabled(false); + + //设置左边Y轴的样式 + YAxis axisLeft = binding.lineChartRunRate.getAxisLeft(); + axisLeft.setTextSize(12); + + axisLeft.setAxisMinimum(0f); + axisLeft.setAxisMaximum((float) maxRate); + + //设置字体颜色 + //axisLeft.setTextColor(Color.parseColor("#FC863E")); +// float ratio = (float) xLabelListData.size() / (float) 10; +// if (ratio < 1) { +// ratio = 1.0f; +// } + //显示的时候是按照多大的比率缩放显示,1f表示不放大缩小 + //着重说明一下下面代码的用途 + /** + * 先将缩放比设置成0后,再去设置你想要的缩放比。 + * 若不这样做的话,在当前页面重新加载数据时,你所设置的缩放比会失效,并且出现你意向不到的显示问题。 + * 如果你的图表只在页面加载一次的话不需要这么做。 + */ +// binding.linechart.zoom(0f, 1f, 0, 0); +// binding.linechart.zoom(ratio, 1f, 0, 0); +// //设置为不可缩放 +// binding.linechart.setScaleEnabled(false); +// //设置为可左右滑动 +// binding.linechart.setDragEnabled(true); + // 假设chart是你的LineChart或BarChart对象 +// binding.linechart.postDelayed(() -> { +// // 获取最后一个可见的X值 +// float lastX = binding.linechart.getHighestVisibleX(); +// // 移动视图中心到这个X值 +// binding.linechart.moveViewToX(lastX); +// },1000); } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_monitoring_photo.xml b/app/src/main/res/layout/fragment_device_monitoring_photo.xml new file mode 100644 index 0000000..1b0a935 --- /dev/null +++ b/app/src/main/res/layout/fragment_device_monitoring_photo.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_device_monitoring_statistics.xml b/app/src/main/res/layout/fragment_device_monitoring_statistics.xml index f9a85eb..a515a8f 100644 --- a/app/src/main/res/layout/fragment_device_monitoring_statistics.xml +++ b/app/src/main/res/layout/fragment_device_monitoring_statistics.xml @@ -1,53 +1,53 @@ - - - - - - - + android:layout_height="wrap_content" + android:layout_marginTop="5dp" + android:layout_marginStart="10dp" + android:layout_marginEnd="10dp" + android:layout_marginBottom="5dp" /> - - - + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:layout_marginEnd="10dp" + android:layout_marginBottom="5dp" /> + - + android:layout_height="wrap_content" + tools:ignore="UselessParent"> - - - \ No newline at end of file + android:orientation="vertical"> + + + + + \ No newline at end of file