package com.moral.api.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.*; import com.moral.api.mapper.DeviceMapper; import com.moral.api.mapper.HistoryMonthlyMapper; import com.moral.api.mapper.MonitorPointMapper; import com.moral.api.mapper.SensorMapper; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.service.DeviceService; import com.moral.api.service.HistoryDailyService; import com.moral.api.service.HistoryHourlyService; import com.moral.api.service.HistoryMonthlyService; import com.moral.api.service.MonitorPointService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.OrganizationService; import com.moral.api.utils.MyLatLng; import com.moral.api.utils.mapUtils; import com.moral.constant.Constants; import com.moral.util.DateUtils; import com.moral.util.RegionCodeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.unit.DataUnit; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author moral * @since 2021-07-01 */ @Service public class MonitorPointServiceImpl extends ServiceImpl implements MonitorPointService { @Autowired MonitorPointMapper monitorPointMapper; @Autowired OrganizationService organizationService; @Autowired DeviceService deviceService; @Autowired DeviceMapper deviceMapper; @Autowired SensorMapper sensorMapper; @Autowired HistoryHourlyService historyHourlyService; @Autowired HistoryDailyService historyDailyService; @Autowired HistoryMonthlyService historyMonthlyService; @Autowired HistoryMonthlyMapper historyMonthlyMapper; @Override public List queryByOrgIdAndRegionCode(MonitorPointQueryForm form) { //取参 Integer organizationId = form.getOrganizationId(); Integer regionCode = form.getRegionCode(); String region = null; if (regionCode != null && organizationId!=24) { region = RegionCodeUtils.regionCodeConvertToName(regionCode); } // if (regionCode != null) { // region = RegionCodeUtils.regionCodeConvertToName(regionCode); // } //查询子组织 List childrenOrganization = organizationService.getChildrenOrganizationsById(organizationId); List organizationIds = new ArrayList<>(); for (Organization organization : childrenOrganization) { organizationIds.add(organization.getId()); } organizationIds.add(organizationId); //查询站点 QueryWrapper queryMonitorPointsWrapper = new QueryWrapper<>(); //如果region不为空,就查询当前组织,所选城市下所有站点及设备信息 //如果region为空,则查询当前组织下所有的站点和设备 if (region != null){ queryMonitorPointsWrapper.eq(region, regionCode); } queryMonitorPointsWrapper.in("organization_id", organizationIds); queryMonitorPointsWrapper.eq("is_delete", Constants.NOT_DELETE); List monitorPoints = monitorPointMapper.selectList(queryMonitorPointsWrapper); //查询站点对应的设备 for (MonitorPoint monitorPoint : monitorPoints) { List devices = deviceService.getDevicesByMonitorPointId(monitorPoint.getId()); monitorPoint.setDevices(devices); } return monitorPoints; } @Override public List queryAllMonitorPoints(Integer organizationId) { //查询子组织 List childrenOrganization = organizationService.getChildrenOrganizationsById(organizationId); List organizationIds = new ArrayList<>(); for (Organization organization : childrenOrganization) { organizationIds.add(organization.getId()); } organizationIds.add(organizationId); //查询站点 QueryWrapper queryMonitorPointsWrapper = new QueryWrapper<>(); queryMonitorPointsWrapper.select("id","name"); queryMonitorPointsWrapper.in("organization_id",organizationIds); queryMonitorPointsWrapper.eq("is_delete", Constants.NOT_DELETE); List monitorPoints = monitorPointMapper.selectList(queryMonitorPointsWrapper); return monitorPoints; } @Override public List> getHourlyDataByMonitorPoint(Map map) { int monitorPointId = Integer.parseInt(map.get("monitorPointId").toString()); QueryWrapper monitorPointQueryWrapper = new QueryWrapper<>(); monitorPointQueryWrapper.eq("is_delete",Constants.NOT_DELETE); monitorPointQueryWrapper.eq("id",monitorPointId); MonitorPoint monitorPoint = monitorPointMapper.selectOne(monitorPointQueryWrapper); QueryWrapper deviceQueryWrapper = new QueryWrapper<>(); deviceQueryWrapper.eq("is_delete",Constants.NOT_DELETE); deviceQueryWrapper.eq("monitor_point_id",monitorPointId); List devices = deviceMapper.selectList(deviceQueryWrapper); if (devices.size()<=0){ return null; } String[] sensors = map.remove("sensors").toString().split(","); List sensorsList = Arrays.asList(sensors); String startTime = map.get("startTime").toString(); String endTime = map.get("endTime").toString(); Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_HH_EN); Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_HH_EN); List> resultList = new ArrayList<>(); for (Device device:devices) { List hourlies = historyHourlyService.getValueByMacAndTime(device.getMac(), DateUtils.getDate(map.get("startTime").toString(), DateUtils.yyyy_MM_dd_HH_EN), DateUtils.getDate(map.get("endTime").toString(), DateUtils.yyyy_MM_dd_HH_EN)); for (String sensor:sensorsList) { Map timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json timeValueMap.put("监测站点",monitorPoint.getName()); timeValueMap.put("name",device.getName()); QueryWrapper sensorQueryWrapper = new QueryWrapper<>(); sensorQueryWrapper.eq("is_delete",Constants.NOT_DELETE); sensorQueryWrapper.eq("code",sensor); Sensor sensorEntity = sensorMapper.selectOne(sensorQueryWrapper); timeValueMap.put("sensor",sensorEntity.getName()); for (HistoryHourly historyHourly : hourlies) { Date time = historyHourly.getTime(); String dateStr = DateUtils.dateToDateString(time, "yyyy-MM-dd HH"); String value = historyHourly.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); if (jsonObject.containsKey(sensor)){ timeValueMap.put(dateStr, jsonObject.get(sensor).toString()); } } //补上无数据时间 Date middleDate = startDate; while (DateUtils.compareDateStr(DateUtils.dateToDateString(endDate,DateUtils.yyyy_MM_dd_HH_EN),DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN),DateUtils.yyyy_MM_dd_HH_EN)<=0){ if (timeValueMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN)) == null) timeValueMap.put(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN), null); middleDate = DateUtils.addHours(middleDate,1); } resultList.add(timeValueMap); } } return resultList; } /** * 监测站点数据导出 * * @param params * @return */ @Override public List> getHourlyDataDataV3(Map params) { List macs = (List) params.remove("macs"); List times = (List) params.remove("times"); String type = params.get("type").toString(); String startTime = times.get(0); String endTime = times.get(1); // String[] macs = params.remove("macs").toString().split(","); // List macsList = Arrays.asList(macs); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("is_delete",Constants.NOT_DELETE); queryWrapper.in("mac", macs); List devices = deviceMapper.selectList(queryWrapper); if (devices.size()<=0){ return null; } String[] sensors = params.remove("sensors").toString().split(","); List sensorsList = Arrays.asList(sensors); List> resultList = new ArrayList<>(); // List sensorsList = (List) params.remove("sensors"); // String startTime = params.get("startTime").toString(); // String endTime = params.get("endTime").toString(); if (type.equals("hours")){ Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_HH_EN); Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_HH_EN); for (Device device:devices) { List hourlies = historyHourlyService.getValueByMacAndTime(device.getMac(), DateUtils.getDate(startTime, DateUtils.yyyy_MM_dd_HH_EN), DateUtils.getDate(endTime, DateUtils.yyyy_MM_dd_HH_EN)); for (String sensor:sensorsList) { Map timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json QueryWrapper monitorPointQueryWrapper = new QueryWrapper<>(); monitorPointQueryWrapper.eq("is_delete",Constants.NOT_DELETE); monitorPointQueryWrapper.eq("id",device.getMonitorPointId()); MonitorPoint monitorPoint = monitorPointMapper.selectOne(monitorPointQueryWrapper); timeValueMap.put("监测站点",monitorPoint.getName()); timeValueMap.put("name",device.getName()); QueryWrapper sensorQueryWrapper = new QueryWrapper<>(); sensorQueryWrapper.eq("is_delete",Constants.NOT_DELETE); sensorQueryWrapper.eq("code",sensor); Sensor sensorEntity = sensorMapper.selectOne(sensorQueryWrapper); timeValueMap.put("sensor",sensorEntity.getName()); for (HistoryHourly historyHourly : hourlies) { Date time = historyHourly.getTime(); String dateStr = DateUtils.dateToDateString(time, "yyyy-MM-dd HH"); String value = historyHourly.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); if (jsonObject.containsKey(sensor)){ timeValueMap.put(dateStr, jsonObject.get(sensor).toString()); } } //补上无数据时间 Date middleDate = startDate; while (DateUtils.compareDateStr(DateUtils.dateToDateString(endDate,DateUtils.yyyy_MM_dd_HH_EN),DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN),DateUtils.yyyy_MM_dd_HH_EN)<=0){ if (timeValueMap.get(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN)) == null) timeValueMap.put(DateUtils.dateToDateString(middleDate,DateUtils.yyyy_MM_dd_HH_EN), null); middleDate = DateUtils.addHours(middleDate,1); } resultList.add(timeValueMap); } } } else if("day".equals(type)){ Date startDate = DateUtils.getDate(startTime,DateUtils.yyyy_MM_dd_HH_EN); Date endDate = DateUtils.getDate(endTime,DateUtils.yyyy_MM_dd_HH_EN); for (Device device:devices) { List historyDailyByMacAndTimeSlot = historyDailyService.getHistoryDailyByMacAndTimeSlot(device.getMac(), startDate, endDate); for (String sensor:sensorsList) { Map timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json QueryWrapper monitorPointQueryWrapper = new QueryWrapper<>(); monitorPointQueryWrapper.eq("is_delete",Constants.NOT_DELETE); monitorPointQueryWrapper.eq("id",device.getMonitorPointId()); MonitorPoint monitorPoint = monitorPointMapper.selectOne(monitorPointQueryWrapper); timeValueMap.put("监测站点",monitorPoint.getName()); timeValueMap.put("name",device.getName()); QueryWrapper sensorQueryWrapper = new QueryWrapper<>(); sensorQueryWrapper.eq("is_delete",Constants.NOT_DELETE); sensorQueryWrapper.eq("code",sensor); Sensor sensorEntity = sensorMapper.selectOne(sensorQueryWrapper); timeValueMap.put("sensor",sensorEntity.getName()); ArrayList doubleArrayList = new ArrayList<>(); for (HistoryDaily historyDaily : historyDailyByMacAndTimeSlot) { Date time = historyDaily.getTime(); String dateStr = DateUtils.dateToDateString(time, "yyyy-MM-dd"); String value = historyDaily.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); doubleArrayList.add(Double.parseDouble(jsonObject.get(sensor).toString())); if (jsonObject.containsKey(sensor)){ timeValueMap.put(dateStr, jsonObject.get(sensor).toString()); } } Double ListAvg = doubleArrayList.stream().collect(Collectors.averagingDouble(Double::doubleValue)); double rsAvg = new BigDecimal(ListAvg).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); timeValueMap.put("累计值",rsAvg); resultList.add(timeValueMap); } } }else { for (Device device:devices) { QueryWrapper HistoryMonthlyWrapper = new QueryWrapper<>(); HistoryMonthlyWrapper.eq("mac",device.getMac()); HistoryMonthlyWrapper.between("time",startTime,endTime); List historyMonthlyList = historyMonthlyMapper.selectList(HistoryMonthlyWrapper); for (String sensor:sensorsList) { Map timeValueMap = new LinkedHashMap<>();//key为time,value为数据的json QueryWrapper monitorPointQueryWrapper = new QueryWrapper<>(); monitorPointQueryWrapper.eq("is_delete",Constants.NOT_DELETE); monitorPointQueryWrapper.eq("id",device.getMonitorPointId()); MonitorPoint monitorPoint = monitorPointMapper.selectOne(monitorPointQueryWrapper); timeValueMap.put("监测站点",monitorPoint.getName()); timeValueMap.put("name",device.getName()); QueryWrapper sensorQueryWrapper = new QueryWrapper<>(); sensorQueryWrapper.eq("is_delete",Constants.NOT_DELETE); sensorQueryWrapper.eq("code",sensor); Sensor sensorEntity = sensorMapper.selectOne(sensorQueryWrapper); timeValueMap.put("sensor",sensorEntity.getName()); for (HistoryMonthly historyMonthly : historyMonthlyList) { Date time = historyMonthly.getTime(); String dateStr = DateUtils.dateToDateString(time, "yyyy-MM"); String value = historyMonthly.getValue(); JSONObject jsonObject = JSONObject.parseObject(value); if (jsonObject.containsKey(sensor)){ timeValueMap.put(dateStr, jsonObject.get(sensor).toString()); } } resultList.add(timeValueMap); } } } return resultList; } }