package com.zhitan.realtimedata.service.impl; import cn.hutool.core.date.DateUtil; import com.zhitan.basicdata.domain.MeterImplement; import com.zhitan.basicdata.services.IMeterImplementService; import com.zhitan.common.core.domain.entity.SysDictData; import com.zhitan.model.domain.EnergyIndex; import com.zhitan.model.service.IEnergyIndexService; import com.zhitan.model.service.IModelNodeService; import com.zhitan.realtimedata.domain.TagValue; import com.zhitan.realtimedata.domain.dto.EnergyIndexMonitorDTO; import com.zhitan.realtimedata.domain.vo.*; import com.zhitan.realtimedata.service.RealtimeDatabaseService; import com.zhitan.realtimedata.service.RealtimeTrendService; import com.zhitan.system.service.ISysDictDataService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @Description * @Author zhoubg * @date 2024-10-15 **/ @Service public class RealtimeTrendServiceImpl implements RealtimeTrendService { @Autowired private IModelNodeService modelNodeService; @Autowired private IEnergyIndexService energyIndexService; @Autowired private IMeterImplementService meterImplementService; @Autowired private RealtimeDatabaseService realtimeDatabaseService; @Autowired private ISysDictDataService dictDataService; @Autowired private IEnergyIndexService iEnergyIndexService; @Override public List list(EnergyIndexMonitorDTO dto) { List realTimeList = new ArrayList<>(); if (StringUtils.isEmpty(dto.getNodeId())) { return realTimeList; } // 根据模型id查询计量器具信息 String nodeId = dto.getNodeId(); List meterImplementList = modelNodeService.getSettingDeviceIndex(nodeId,dto.getEnergyType()); if (CollectionUtils.isEmpty(meterImplementList)) { return realTimeList; } List meterIds = meterImplementList.stream().map(MeterImplement::getId).collect(Collectors.toList()); if(CollectionUtils.isEmpty(meterIds)){ throw new RuntimeException("请先添加计量器具!"); } List energyIndexList = energyIndexService.listIndexByMeterIds(nodeId,meterIds); // 查询实时数据 List meterCodes = meterImplementList.stream().map(MeterImplement::getCode).collect(Collectors.toList()); List tagValueList = realtimeDatabaseService.retrieve(meterCodes); Map> meterIndexMap = energyIndexList.stream().collect(Collectors.groupingBy( EnergyIndex::getMeterId)); // 查询器具类型 Map typeMap = dictDataService.selectDictDataByType("sys_device_type") .stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel)); typeMap.forEach((key, value) -> { RealTimeDataVO vo = new RealTimeDataVO(); vo.setEnergyTypeName(value); List sensorModelList = new ArrayList<>(); meterImplementList.stream().filter(li -> key.equals(li.getMeterType())).forEach(meter -> { SensorParamModel sensorModel = new SensorParamModel(); sensorModel.setDeviceName(meter.getMeterName()); sensorModel.setEnergyTypeName(value); sensorModel.setWireDiameter(meter.getWireDiameter()); sensorModel.setMaxAllowablePower(meter.getMaxAllowablePower()); List indexModelList = new ArrayList<>(); List indexList = meterIndexMap.get(meter.getId()); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(indexList)) { List indexCodeList = indexList.stream().map(EnergyIndex::getCode).collect(Collectors.toList()); Map tagValueMap = tagValueList.stream().filter(li -> indexCodeList.contains(li.getTagCode())) .collect(Collectors.toMap(TagValue::getTagCode,o->o.getValue() + "@" + DateUtil.format(o.getDataTime(),"yyyy-MM-dd HH:mm:ss" ))); for (EnergyIndex energyIndex : indexList) { RealTimeIndexModel model = new RealTimeIndexModel(); String code = energyIndex.getCode(); model.setIndexCode(code); model.setName(energyIndex.getName()); model.setUnit(energyIndex.getUnitId()); String tagValue = tagValueMap.get(code); if (StringUtils.isNotEmpty(tagValue)) { final String[] split = tagValue.split("@"); model.setDataTime(split[1]); model.setValue( new BigDecimal(split[0]).setScale(2,RoundingMode.HALF_UP)); } indexModelList.add(model); } } sensorModel.setEnergyIndexArray(indexModelList); sensorModelList.add(sensorModel); }); vo.setDeviceArray(sensorModelList); realTimeList.add(vo); }); return realTimeList; } @Override public List chartByDay(String tagCode, String dataTime) { List realTimeList = new ArrayList<>(); Date begin = DateUtil.parseDateTime(dataTime); Date finish = DateUtil.offsetDay(begin, 1); long millis = finish.getTime() - begin.getTime(); int pointCount = Integer.parseInt(String.valueOf(millis / (1000 * 60 * 15))); List tagValueList = realtimeDatabaseService.retrieve(tagCode,begin,finish,pointCount); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tagValueList)) { for (TagValue tagValue : tagValueList) { RealTimeHistoryDataVO historyData = new RealTimeHistoryDataVO(); historyData.setName(DateUtil.formatDateTime(tagValue.getDataTime())); historyData.setValue(BigDecimal.valueOf(tagValue.getValue()).setScale(2, RoundingMode.HALF_UP)); realTimeList.add(historyData); } } return realTimeList; } @Override public List export(ExportrealtimeTrendVO exportrealtimeTrendVO) { String tagCode = exportrealtimeTrendVO.getTagCode(); List excelList = new ArrayList<>(); Date begin = DateUtil.parseDateTime(exportrealtimeTrendVO.getDataTime()); Date finish = DateUtil.offsetDay(begin, 1); long millis = finish.getTime() - begin.getTime(); int pointCount = Integer.parseInt(String.valueOf(millis / (1000 * 60 * 15))); List tagValueList = realtimeDatabaseService.retrieve(tagCode,begin,finish,pointCount); // 获取单位 EnergyIndex energyIndex = iEnergyIndexService.getiEnergyIndexByCode(tagCode); tagValueList.forEach(li ->{ EquipmentPointParametersExcel item = new EquipmentPointParametersExcel(); item.setIndexName(li.getTagCode()); item.setIndexUnit(energyIndex.getUnitId()); item.setTimeString(DateUtil.formatDateTime(li.getDataTime())); item.setValue(li.getValue().toString()); excelList.add(item); }); return excelList; } }