package com.dingzhuo.energy.data.monitoring.trend.realtime.controller; import cn.hutool.core.date.DateUtil; import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement; import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService; import com.dingzhuo.energy.common.utils.StringUtils; import com.dingzhuo.energy.common.utils.poi.ExcelUtil; import com.dingzhuo.energy.data.model.domain.EnergyIndex; import com.dingzhuo.energy.data.model.domain.dto.EnergyIndexMonitorDTO; import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor; import com.dingzhuo.energy.data.model.service.IEnergyIndexService; import com.dingzhuo.energy.data.model.service.IModelNodeService; import com.dingzhuo.energy.data.model.service.IStateTypeService; import com.dingzhuo.energy.data.monitoring.device.domain.EquipmentMeasuringPointParameters; import com.dingzhuo.energy.data.monitoring.device.domain.vo.EquipmentPointParametersExcel; import com.dingzhuo.energy.data.monitoring.device.domain.vo.EquipmentPointParametersVO; import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService; import com.dingzhuo.energy.data.monitoring.trend.realtime.domain.CollectHistory; import com.dingzhuo.energy.data.monitoring.trend.svg.service.ISvgTrendService; import com.dingzhuo.energy.dataservice.domain.RetrievalModes; import com.dingzhuo.energy.dataservice.domain.TagValue; import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService; import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log; import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType; import com.dingzhuo.energy.framework.web.controller.BaseController; import com.dingzhuo.energy.framework.web.domain.AjaxResult; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * 设备启停实时监测Controller * * @author sys * @date 2020-03-30 */ @RestController @RequestMapping("/dataMonitoring/realTimeTrend") @Api(value = "实时检测", tags = {"实时监测"}) public class RealTimeTrend extends BaseController { @Autowired private ISvgTrendService iSvgTrendService; @Autowired private IStateTypeService iStateTypeService; @Autowired private final IModelNodeService modelNodeService; @Autowired private final IEnergyIndexService energyIndexService; @Autowired private IMeterImplementService meterImplementService; @Autowired private IDeviceStatusLiveService deviceStatusLiveService; @Autowired private RealtimeDatabaseService realtimeDatabaseService; @Autowired public RealTimeTrend( IModelNodeService modelNodeService, IEnergyIndexService energyIndexService) { this.modelNodeService = modelNodeService; this.energyIndexService = energyIndexService; } @Log(title = "获取模型节点关联采集指标", businessType = BusinessType.UPDATE) @GetMapping("/energyIndex/list") @ApiOperation(value = "获取模型节点关联采集指标") public AjaxResult getSettingIndex(@Validated EnergyIndexMonitorDTO dto) { try { List resultList = new ArrayList<>(); // 模型id String nodeId = dto.getNodeId(); // 查询传入的nodeId List nodeInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(nodeId); // 如果是空存在两种情况,1:id有问题,2:最底层 if (CollectionUtils.isEmpty(nodeInforList)) { List inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(nodeId); if (CollectionUtils.isNotEmpty(inforList)) { nodeInforList.addAll(inforList); } } if (CollectionUtils.isEmpty(nodeInforList)) { return AjaxResult.success(resultList); } // 找出所有点位id信息 List indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); // 排序 List infoList = energyIndexService.getEnergyIndexByIds(indexIds).stream() .sorted(Comparator.comparing(EnergyIndex::getCode)).collect(Collectors.toList()); // 获取所有表id List codeList = new ArrayList<>(); List meterIdList = new ArrayList<>(); infoList.forEach(li -> { codeList.add(li.getCode()); meterIdList.add(li.getMeterId()); }); // 当前时间 String timeString = DateUtil.formatDateTime(DateUtil.date()); Map> meterImplementMap = meterImplementService.listMeterImplementByIds(meterIdList).stream() .collect(Collectors.groupingBy(MeterImplement::getId)); List valList = realtimeDatabaseService.retrieve(codeList); for (EnergyIndex energyIndex : infoList) { // 获取点位名称 String modelNodeName = ""; List meterImplementList = meterImplementMap.get(energyIndex.getMeterId()); if (CollectionUtils.isNotEmpty(meterImplementList)) { MeterImplement infor = meterImplementList.get(0); modelNodeName = infor.getInstallactionLocation() + "_" + infor.getMeterName(); } String indexName = modelNodeName + "_" + energyIndex.getName(); EquipmentPointParametersVO item = new EquipmentPointParametersVO(); item.setCode(energyIndex.getCode()); item.setIndexName(indexName); item.setIndexUnit(energyIndex.getUnitId()); item.setTimeString(timeString); String value = "--"; if (CollectionUtils.isNotEmpty(valList)) { double sum = valList.stream().filter(x -> item.getCode().equals(x.getTagCode())).mapToDouble(TagValue::getValue).sum(); if ("SWWSDJ_SD".equals(energyIndex.getCode()) || "SWWSDJ_WD".equals(energyIndex.getCode())) { sum = sum * 0.1; } value = String.valueOf(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP)); } item.setValue(value); resultList.add(item); } return AjaxResult.success(resultList); } catch (Exception ex) { logger.error("获取关联采集指标出错!", ex); return AjaxResult.error("获取关联指标出错!"); } } // @Log(title = "获取折线图数据", businessType = BusinessType.UPDATE) @GetMapping("/energyIndex/lineList/{codes}/{minute}/{count}") @ApiOperation(value = "获取折线图数据") public AjaxResult getSettingIndexLine(@PathVariable String[] codes, @PathVariable Integer minute, @PathVariable Integer count) { try { List codesList = new ArrayList<>(Arrays.asList(codes)); Date endDate = DateUtil.date(); long time = minute * 60 * 1000;//分钟 Date startDate = new Date(endDate.getTime() - time); List> resultList = new ArrayList<>(); for (int i = 0; i < codesList.size(); i++) { List valList = realtimeDatabaseService.retrieve(codesList.get(i), startDate, endDate, RetrievalModes.Full, count); for (TagValue tagVal : valList) { if (tagVal.getValue() != null) { double value = BigDecimal.valueOf(tagVal.getValue()).setScale(2, RoundingMode.HALF_UP).doubleValue(); if ("SWWSDJ_SD".equals(tagVal.getTagCode()) || "SWWSDJ_WD".equals(tagVal.getTagCode())) { value = value * 0.1; } tagVal.setValue(BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP).doubleValue()); } tagVal.setDataTime(tagVal.getDataTime()); tagVal.setShowDataTime("yyyy-MM-dd HH:mm:ss"); } resultList.add(valList); } return AjaxResult.success(resultList); } catch (Exception ex) { ex.printStackTrace(); return AjaxResult.error("获取关联指标出错!"); } } @Log(title = "获取模型节点关联采集指标", businessType = BusinessType.UPDATE) @GetMapping("/svgTrendView/energyIndex/list") @ApiOperation(value = "获取模型节点关联采集指标") public AjaxResult getSvgTrendViewSettingIndex(EnergyIndex energyIndex) { try { List infoList = iSvgTrendService.selectSvgList(energyIndex); List codeList = infoList.stream().map(EnergyIndex::getCode).collect(Collectors.toList()); List valList = realtimeDatabaseService.retrieve(codeList); List resultList = new ArrayList(); if (valList != null && valList.size() > 0) { for (int i = 0; i < infoList.size(); i++) { EquipmentMeasuringPointParameters item = new EquipmentMeasuringPointParameters(); item.setCode(infoList.get(i).getCode()); item.setIndexName(infoList.get(i).getName()); item.setIndexUnit(infoList.get(i).getUnitId()); item.setMeteName(infoList.get(i).getMeterName()); valList.forEach(x -> { if (x.getTagCode().equals(item.getCode())) { item.setValue(new BigDecimal(x.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); } }); item.setyValue("y0"); resultList.add(item); } } return AjaxResult.success(resultList); } catch (Exception ex) { logger.error("获取关联采集指标出错!", ex); return AjaxResult.error("获取关联指标出错!"); } } @Log(title = "获取指定采集点位的小时实时数据", businessType = BusinessType.UPDATE) @GetMapping("/svgTrendView/energyIndex/history/{code}/{dataTime}") @ApiOperation(value = "获取指定采集点位的小时实时数据") public AjaxResult getIndexHistoryValueList(@PathVariable("code") String code, @PathVariable("dataTime") String dataTime) { try { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date sdate = null; Date edate = null; try { if (StringUtils.isEmpty(dataTime)) { dataTime = formatter.format(new Date()); } if (dataTime.length() < 18) { dataTime = dataTime + ":00:00"; } sdate = formatter.parse(dataTime); edate = formatter.parse(dataTime); //这里要加一小时 edate = DateUtils.addHours(edate, 1); } catch (ParseException e) { e.printStackTrace(); } List codes = new ArrayList<>(); codes.add(code); List infoList = energyIndexService.getEnergyIndexByCodes(codes); EnergyIndex ei = infoList.get(0); if (CollectionUtils.isEmpty(infoList)) { ei = new EnergyIndex(); } List tagValuelist = realtimeDatabaseService.retrieve(code, sdate, edate, RetrievalModes.Full, 0); List resultList = new ArrayList(); for (TagValue tagVal : tagValuelist) { tagVal.setShowDataTime("yyyy-MM-dd HH:mm:ss"); CollectHistory hh = new CollectHistory(); hh.setTagCode(tagVal.getTagCode()); hh.setDataTime(tagVal.getShowDataTime()); BigDecimal b = new BigDecimal(tagVal.getValue()); hh.setValue(b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); hh.setUnitId(ei.getUnitId()); resultList.add(hh); } return AjaxResult.success(resultList); } catch (Exception ex) { logger.error("获取采集点历史小时错误!", ex); return AjaxResult.error("获取采集点历史小时错误!"); } } @Log(title = "导出实时监测Excel信息", businessType = BusinessType.UPDATE) @GetMapping("/export") @ApiOperation(value = "导出实时监测Excel信息") public AjaxResult export(@Validated EnergyIndexMonitorDTO dto) { try { List excelList = new ArrayList<>(); // 模型id String nodeId = dto.getNodeId(); // 查询传入的nodeId List nodeInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(nodeId); // 如果是空存在两种情况,1:id有问题,2:最底层 if (CollectionUtils.isEmpty(nodeInforList)) { List inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(nodeId); if (CollectionUtils.isNotEmpty(inforList)) { nodeInforList.addAll(inforList); } } if (CollectionUtils.isEmpty(nodeInforList)) { return AjaxResult.success("暂无数据"); } // 找出所有点位id信息 List indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList()); List infoList = energyIndexService.getEnergyIndexByIds(indexIds); // 获取所有表id List codeList = new ArrayList<>(); List meterIdList = new ArrayList<>(); infoList.forEach(li -> { codeList.add(li.getCode()); meterIdList.add(li.getMeterId()); }); // 当前时间 String timeString = DateUtil.formatDateTime(DateUtil.date()); Map> meterImplementMap = meterImplementService.listMeterImplementByIds(meterIdList) .stream().collect(Collectors.groupingBy(MeterImplement::getId)); List valList = realtimeDatabaseService.retrieve(codeList); for (EnergyIndex energyIndex : infoList) { // 获取点位名称 String modelNodeName = ""; List meterImplementList = meterImplementMap.get(energyIndex.getMeterId()); if (CollectionUtils.isNotEmpty(meterImplementList)) { MeterImplement infor = meterImplementList.get(0); modelNodeName = infor.getInstallactionLocation() + "_" + infor.getMeterName(); } String indexName = modelNodeName + "_" + energyIndex.getName(); EquipmentPointParametersExcel item = new EquipmentPointParametersExcel(); item.setIndexName(indexName); item.setIndexUnit(energyIndex.getUnitId()); item.setTimeString(timeString); String value = "--"; if (CollectionUtils.isNotEmpty(valList)) { double sum = valList.stream().filter(x -> energyIndex.getCode().equals(x.getTagCode())).mapToDouble(TagValue::getValue).sum(); value = String.valueOf(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP)); } item.setValue(value); excelList.add(item); } ExcelUtil util = new ExcelUtil<>(EquipmentPointParametersExcel.class); return util.exportExcel(excelList, "实时监测"); } catch (Exception ex) { logger.error("导出数据出错!", ex); return AjaxResult.error("导出数据出错!"); } } }