设备详情-设备运行率-完成

master
wenfei 1 month ago
parent 56a9edeb94
commit d68c8f7ce3

@ -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";

@ -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<DeviceRunRateItem> data;
public List<DeviceRunRateItem> getData() {
return data;
}
public void setData(List<DeviceRunRateItem> 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;
}
}
}

@ -270,14 +270,14 @@ class DeviceManagerListActivity : BaseActivityOaToolbarViewBinding<ActivityDevic
}
if(binding.rb1.isChecked){
for (item in deviceManagerList) {
if(item.online){
if(item.online!=null&&item.online){
deviceManagerListFilter.add(item)
}
}
}
if(binding.rb2.isChecked){
for (item in deviceManagerList) {
if(!item.online){
if(item.online!=null&&!item.online){
deviceManagerListFilter.add(item)
}
}

@ -5,6 +5,7 @@ import com.rehome.zhdcoa.adapter.FragmentAdapter
import com.rehome.zhdcoa.base.BaseActivityOaToolbarViewBinding
import com.rehome.zhdcoa.databinding.ActivityDeviceMonitoringDetailBinding
import com.rehome.zhdcoa.ui.fragment.DeviceMonitoringDetailFragment
import com.rehome.zhdcoa.ui.fragment.DeviceMonitoringPhotoFragment
import com.rehome.zhdcoa.ui.fragment.DeviceMonitoringStatisticsFragment
/**
@ -41,11 +42,14 @@ class DeviceMonitoringDetailActivity : BaseActivityOaToolbarViewBinding<Activity
val titles: MutableList<String> = 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
)

@ -68,13 +68,16 @@ public class DeviceMonitoringDetailFragment extends BaseViewBindingFragment<Frag
protected void initView() {
// binding.itemSj.tvBjz.setText();
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);
binding.itemTemperature.tvType.setTextSize(16);
binding.itemXSpeed.tvType.setText("X轴速度 (mm/s)");
binding.itemYSpeed.tvType.setText("Y轴速度 (mm/s)");

@ -0,0 +1,40 @@
package com.rehome.zhdcoa.ui.fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.rehome.zhdcoa.base.BaseViewBindingFragment;
import com.rehome.zhdcoa.databinding.FragmentDeviceMonitoringPhotoBinding;
import com.rehome.zhdcoa.databinding.FragmentDeviceMonitoringStatisticsBinding;
public class DeviceMonitoringPhotoFragment extends BaseViewBindingFragment<FragmentDeviceMonitoringPhotoBinding> {
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() {
}
}

@ -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<FragmentDeviceMonitoringStatisticsBinding> {
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<DeviceRunRateBean.DeviceRunRateItem> deviceRunRateList = new ArrayList<>();
private double maxRate=100;
private ArrayList<String> 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<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
NohttpUtils.getInstance().add(requireActivity(),0, request, new HttpListener<String>() {
@Override
public void onSucceed(int what, com.yolanda.nohttp.rest.Response<String> 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<String> response) {
}
});
}
//温度折线图
private void renderRate(){
xLabelListDataRate.clear();
List<Entry> 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<Entry> datas) {
// 清除所有数据
binding.lineChartRunRate.clear();
binding.lineChartRunRate.invalidate(); // 重绘视图
String deviceNameLine = "设备运行率(%)";
List<ILineDataSet> 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);
}
}

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.fragment.DeviceMonitoringPhotoFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#242e2f"
android:orientation="vertical">
<include
android:id="@+id/item_qy"
layout="@layout/item_device_detail_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="5dp" />
<include
android:id="@+id/item_sbmc"
layout="@layout/item_device_detail_row"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="5dp" />
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="UselessParent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
</LinearLayout>

@ -1,53 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.fragment.DeviceMonitoringStatisticsFragment">
<RelativeLayout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:background="#242e2f"
android:orientation="vertical">
<LinearLayout
android:id="@+id/bottomBtn"
<include
android:id="@+id/item_qy"
layout="@layout/item_device_detail_row"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:background="#138CF2"
android:visibility="gone"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分类课程"
android:textColor="#ffffff" />
</LinearLayout>
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="5dp" />
<ListView
android:id="@+id/lv"
<include
android:id="@+id/item_sbmc"
layout="@layout/item_device_detail_row"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bottomBtn"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:divider="@null"
android:dividerHeight="5dp" />
</RelativeLayout>
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="5dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/lv_member_nodata"
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone">
android:layout_height="wrap_content"
tools:ignore="UselessParent">
<TextView
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂无数据" />
</LinearLayout>
</FrameLayout>
android:orientation="vertical">
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/lineChartRunRate"
android:layout_width="match_parent"
android:layout_height="400dp"
android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:layout_marginTop="5dp"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
Loading…
Cancel
Save