screen-api/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java
@@ -46,7 +46,7 @@ public ConsumerFactory<String, String> consumerFactory() { return new DefaultKafkaConsumerFactory<>(consumerConfigs()); } @Bean("secondDataListenerFactory") public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> secondDataListenerFactory(){ ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); screen-api/src/main/java/com/moral/api/controller/HistoryFiveMinutelyController.java
@@ -34,6 +34,13 @@ @Autowired HistoryFiveMinutelyService historyFiveMinutelyService; /** * @Description: 查询组织区域对应的设备以及对应因子的五分钟数据 * @Param: [form] * @return: com.moral.constant.ResultMessage * @Author: 陈凯裕 * @Date: 2022/3/10 */ @GetMapping("queryDeviceAndData") public ResultMessage queryDeviceAndData(QueryDeviceAndFiveMinuteDataForm form){ //判断是否缺少参数 @@ -49,6 +56,18 @@ return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo); } /** * @Description: 查询弹窗五分钟数据接口 * @Param: [mac] * @return: com.moral.constant.ResultMessage * @Author: 陈凯裕 * @Date: 2022/3/10 */ @GetMapping("queryPopDataByMac") public ResultMessage queryPopDataByMac(String mac){ return ResultMessage.ok(historyFiveMinutelyService.getPopDataByMac(mac)); } } screen-api/src/main/java/com/moral/api/entity/UnitConversion.java
@@ -33,7 +33,7 @@ /** * 原始单位键 */ private String originalUnitKey; private Integer originalUnitKey; /** * 目标单位键 screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
@@ -37,7 +37,6 @@ public void listen(ConsumerRecord<String, String> record, Consumer consumer) throws Exception { String messageStr = record.value(); Map<String, Object> message = (Map<String, Object>) JSON.parse(messageStr); //long serverStartTime = System.currentTimeMillis(); CopyOnWriteArraySet<SingleDeviceServer> sockets = SingleDeviceServer.sockets; for (SingleDeviceServer socket : sockets) { //判断消息是否数据该socket @@ -50,7 +49,7 @@ Map<String, Object> adjustFormula = socket.getAdjustFormula(); Map<String, Object> regionAqi = socket.getRegionAqi(); //补偿数据 if(adjustFormula!=null&®ionAqi!=null) if(adjustFormula!=null) message = AdjustDataUtils.adjust(message,adjustFormula,regionAqi); //创建最终消息对象 Map<String, Object> resultMessgae = new HashMap<>(); @@ -95,12 +94,6 @@ resultMessgae.put(sensor.getCode(), sourceData); } } //测试时间延迟使用的属性 //resultMessgae.put("DataTime", message.get("DataTime")); //resultMessgae.put("time", message.get("time")); //resultMessgae.put("time1", message.get("time1")); //resultMessgae.put("serverTime", System.currentTimeMillis()); //resultMessgae.put("serverStartTime", serverStartTime); socket.sendMessage(JSON.toJSONString(resultMessgae)); } } screen-api/src/main/java/com/moral/api/service/DeviceService.java
@@ -37,4 +37,13 @@ //获取当前组织,当前乡镇区域下设备mac集合 List getMacsByOrgIdAndRegionCode(Integer organizationId,Integer regionCode); /** * @Description: 根据mac号获取设备单位报警信息 * @Param: [mac] * @return: com.moral.api.entity.Device * @Author: 陈凯裕 * @Date: 2022/3/10 */ Device getDeviceUnitAlramInforByMac(String mac); } screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java
@@ -35,9 +35,18 @@ * @Author: 陈凯裕 * @Date: 2021/7/23 */ HistoryFiveMinutely queryLastDataByMac(String mac); Map<String, Object> queryLastDataByMac(String mac); //获取5分钟风场数据 List<Object> getAreaWindData(Map<String,Object> params); /** * @Description: 获取五分钟弹窗数据,六参+时间+tvoc * @Param: [mac] * @return: java.util.Map<java.lang.String,java.lang.Object> * @Author: 陈凯裕 * @Date: 2022/3/10 */ Map<String,Object> getPopDataByMac(String mac); } screen-api/src/main/java/com/moral/api/service/SensorService.java
@@ -12,5 +12,5 @@ * @since 2021-06-28 */ public interface SensorService extends IService<Sensor> { Sensor getSensorByCode(String code); } screen-api/src/main/java/com/moral/api/service/UnitConversionService.java
@@ -12,5 +12,5 @@ * @since 2021-07-12 */ public interface UnitConversionService extends IService<UnitConversion> { String getFormula(Integer srcUnitId,Integer posUnitId,String sensorCode); } screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -3,14 +3,21 @@ import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.Device; import com.moral.api.entity.OrganizationUnitAlarm; import com.moral.api.entity.Sensor; import com.moral.api.entity.Version; import com.moral.api.mapper.DeviceMapper; import com.moral.api.mapper.OrganizationUnitAlarmMapper; import com.moral.api.mapper.UnitConversionMapper; import com.moral.api.service.DeviceService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.service.SensorService; import com.moral.api.service.UnitConversionService; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.DateUtils; import org.apache.kafka.streams.state.internals.metrics.Sensors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @@ -41,6 +48,15 @@ @Autowired private RedisTemplate redisTemplate; @Autowired OrganizationUnitAlarmMapper organizationUnitAlarmMapper; @Autowired SensorService sensorService; @Autowired UnitConversionService unitConversionService; @Override public List<Device> getDevicesByMonitorPointId(Integer monitorPointId) { @@ -218,6 +234,46 @@ return deviceMapper.selectObjs(queryWrapper); } @Override public Device getDeviceUnitAlramInforByMac(String mac) { Device device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO,mac); if(device==null) return getDeviceUnitAlramInforByMacFromDb(mac); return device; } private Device getDeviceUnitAlramInforByMacFromDb(String mac){ QueryWrapper<Device> wrapper = new QueryWrapper<>(); wrapper.eq("mac",mac); wrapper.eq("is_delete",Constants.NOT_DELETE); Device device = deviceMapper.selectOne(wrapper); if(device==null) return null; QueryWrapper<OrganizationUnitAlarm> unitAlarmQueryWrapper = new QueryWrapper<>(); unitAlarmQueryWrapper.eq("organization_id",device.getOrganizationId()); unitAlarmQueryWrapper.eq("version_id",device.getDeviceVersionId()); unitAlarmQueryWrapper.eq("is_delete",Constants.NOT_DELETE); List<OrganizationUnitAlarm> organizationUnitAlarms = organizationUnitAlarmMapper.selectList(unitAlarmQueryWrapper); Version version = new Version(); version.setId(device.getDeviceVersionId()); List<Sensor> sensors = new ArrayList<>(); for (OrganizationUnitAlarm organizationUnitAlarm : organizationUnitAlarms) { Sensor sensor = sensorService.getSensorByCode(organizationUnitAlarm.getSensorCode()); sensor.setUnit(organizationUnitAlarm.getUnitKey()); sensor.setShowUnit(organizationUnitAlarm.getShowUnitKey()); sensor.setShowUnitKey(organizationUnitAlarm.getShowUnitKey()); sensor.setUnitKey(organizationUnitAlarm.getUnitKey()); sensor.setAlarmLevel(organizationUnitAlarm.getAlarmLevel()); String formula = unitConversionService.getFormula(Integer.valueOf(organizationUnitAlarm.getUnitKey()), Integer.valueOf(organizationUnitAlarm.getShowUnitKey()),sensor.getCode()); sensor.setFormula(formula); sensors.add(sensor); } version.setSensors(sensors); device.setVersion(version); redisTemplate.opsForHash().put(RedisConstants.DEVICE_INFO,mac,device); return device; } private Device getDeviceByMacFromDB(String mac) { QueryWrapper<Device> wrapper = new QueryWrapper<>(); wrapper.eq("mac", mac); @@ -226,4 +282,5 @@ } } screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java
@@ -7,18 +7,18 @@ import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.conditions.segments.NormalSegmentList; import com.moral.api.config.mybatis.MybatisPlusConfig; import com.moral.api.entity.Device; import com.moral.api.entity.HistoryFiveMinutely; import com.moral.api.entity.HistoryHourly; import com.moral.api.entity.MonitorPoint; import com.moral.api.entity.*; import com.moral.api.mapper.HistoryFiveMinutelyMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.api.pojo.dto.Wind.WindData; import com.moral.api.pojo.dto.historyFiveMinutely.DeviceAndFiveMinuteDataDTO; import com.moral.api.pojo.form.device.MonitorPointQueryForm; import com.moral.api.pojo.form.historyFiveMinutely.QueryDeviceAndFiveMinuteDataForm; import com.moral.api.service.DeviceService; import com.moral.api.service.HistoryFiveMinutelyService; import com.moral.api.service.MonitorPointService; import com.moral.api.utils.UnitConvertUtils; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.constant.SeparateTableType; import com.moral.util.DateUtils; @@ -48,6 +48,8 @@ RedisTemplate redisTemplate; @Autowired HistoryFiveMinutelyMapper historyFiveMinutelyMapper; @Autowired DeviceService deviceService; @Override public List<DeviceAndFiveMinuteDataDTO> queryDeviceAndFiveMinuteData(QueryDeviceAndFiveMinuteDataForm form) { @@ -60,24 +62,21 @@ List<Device> devices = new ArrayList<>(); for (MonitorPoint monitorPoint : monitorPoints) { List<Device> monitorPointDevices = monitorPoint.getDevices(); if (!ObjectUtils.isEmpty(monitorPointDevices)) devices.addAll(monitorPointDevices); if (!ObjectUtils.isEmpty(monitorPointDevices)) { //过滤掉线设备 for (Device device : monitorPointDevices) { if (!device.getState().equals(Constants.DEVICE_STATE_OFFLINE)) devices.add(device); } } } //查询所有设备对应的数据 List<DeviceAndFiveMinuteDataDTO> dtos = new ArrayList<>(); for (Device device : devices) { DeviceAndFiveMinuteDataDTO dto = new DeviceAndFiveMinuteDataDTO(); String mac = device.getMac(); //从缓存中获取 Map<String, Object> sensorValues = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DATA_FIVE_MINUTES, mac); //如果没有数据从数据库查询 if (ObjectUtils.isEmpty(sensorValues)) { HistoryFiveMinutely dbHistoryFiveMinutely = queryLastDataByMac(mac); if (ObjectUtils.isEmpty(dbHistoryFiveMinutely)) continue; else sensorValues = JSON.parseObject(dbHistoryFiveMinutely.getValue(),Map.class); } Map<String, Object> sensorValues = queryLastDataByMac(mac); String dbDataStr = JSON.toJSONString(sensorValues); sensorValues = JSON.parseObject(dbDataStr, HashMap.class); Map<String, Object> sensorValue = new HashMap<>(); @@ -93,7 +92,12 @@ } @Override public HistoryFiveMinutely queryLastDataByMac(String mac) { public Map<String, Object> queryLastDataByMac(String mac) { //从缓存中获取 Map<String, Object> sensorValues = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DATA_FIVE_MINUTES, mac); //如果没有数据从数据库查询 if (sensorValues != null) return sensorValues; QueryWrapper<HistoryFiveMinutely> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("mac", mac); queryWrapper.orderByDesc("time"); @@ -104,7 +108,10 @@ List<HistoryFiveMinutely> datas = multiTableQuery(queryWrapper, tableNames); if (ObjectUtils.isEmpty(datas)) return null; return datas.get(0); HistoryFiveMinutely historyFiveMinutely = datas.get(0); sensorValues = JSON.parseObject(historyFiveMinutely.getValue(), Map.class); sensorValues.put("dataTime", DateUtils.dateToDateString(historyFiveMinutely.getTime(), "yyyy-MM-dd HH:mm:ss")); return sensorValues; } @@ -117,6 +124,71 @@ return getWindData(windData); } //获取五分钟弹窗数据 @Override public Map<String, Object> getPopDataByMac(String mac) { Map<String, Object> datas = queryLastDataByMac(mac); //构建返回对象 Map<String, Object> result = new HashMap<>(); //创建返回因子code集合 List<String> sensorCodes = Arrays.asList("a34004", "a34002", "a21005", "a21004", "a21026", "a05024", "a99054"); //获取设备信息 Device device = deviceService.getDeviceUnitAlramInforByMac(mac); //转换数据单位和名称 for (Sensor sensor : device.getVersion().getSensors()) { if (!sensorCodes.contains(sensor.getCode())) continue; Object dataO = datas.get(sensor.getCode()); if (dataO != null) { String data = String.valueOf(dataO); //转换单位 if (!sensor.getShowUnitKey().equals(sensor.getUnitKey()) ) data = UnitConvertUtils.calculate(data, sensor.getFormula()); //拼接单位 data = data +" "+ sensor.getShowUnit(); result.put(sensor.getCode(), data); }else{ result.put(sensor.getCode(),"-"); } } //添加设备名称 result.put("name",device.getName()); //添加时间 result.put("dataTime",datas.get("dataTime")); //排序 return orderSixParam(result); } //对六参以及时间进行排序 private Map<String,Object> orderSixParam(Map<String,Object> data){ LinkedHashMap result = new LinkedHashMap(); Object PM2_5 = data.get("a34004"); Object PM10 = data.get("a34002"); Object SO2 = data.get("a21026"); Object NO2 = data.get("a21004"); Object CO = data.get("a21005"); Object O3 = data.get("a05024"); Object name = data.get("name"); Object time = data.get("dataTime"); if(name!=null) result.put("名称",name); if(PM2_5!=null) result.put("PM2.5",PM2_5); if(PM10!=null) result.put("PM10",PM10); if(SO2!=null) result.put("二氧化硫(SO₂)",SO2); if(NO2!=null) result.put("二氧化氮(NO₂)",NO2); if(CO!=null) result.put("一氧化碳(CO)",CO); if(O3!=null) result.put("臭氧(O₃)",O3); if(time!=null) result.put("时间",time); return result; } /** * 根据输入的地点坐标计算中心点 screen-api/src/main/java/com/moral/api/service/impl/SensorServiceImpl.java
@@ -1,9 +1,14 @@ package com.moral.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.Sensor; import com.moral.api.mapper.SensorMapper; import com.moral.api.service.SensorService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; /** @@ -17,4 +22,26 @@ @Service public class SensorServiceImpl extends ServiceImpl<SensorMapper, Sensor> implements SensorService { @Autowired SensorMapper sensorMapper; @Autowired RedisTemplate redisTemplate; @Override public Sensor getSensorByCode(String code) { Sensor sensor = (Sensor) redisTemplate.opsForHash().get(RedisConstants.SENSOR_KEY, code); if(sensor==null) sensor = getSensorByCodeFromDb(code); return sensor; } private Sensor getSensorByCodeFromDb(String code) { QueryWrapper<Sensor> wrapper = new QueryWrapper<>(); wrapper.eq("code",code); wrapper.eq("is_delete", Constants.NOT_DELETE); Sensor sensor = sensorMapper.selectOne(wrapper); redisTemplate.opsForHash().put(RedisConstants.SENSOR_KEY, code,sensor); return sensor; } } screen-api/src/main/java/com/moral/api/service/impl/UnitConversionServiceImpl.java
@@ -1,10 +1,19 @@ package com.moral.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.entity.UnitConversion; import com.moral.api.mapper.UnitConversionMapper; import com.moral.api.service.UnitConversionService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * <p> @@ -17,4 +26,38 @@ @Service public class UnitConversionServiceImpl extends ServiceImpl<UnitConversionMapper, UnitConversion> implements UnitConversionService { @Autowired RedisTemplate redisTemplate; @Autowired UnitConversionMapper unitConversionMapper; @Override public String getFormula(Integer srcUnitId, Integer posUnitId, String sensorCode) { List<UnitConversion> unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1); if (unitConversions == null) { QueryWrapper<UnitConversion> wrapper = new QueryWrapper(); wrapper.eq("is_delete", Constants.NOT_DELETE); unitConversions = unitConversionMapper.selectList(wrapper); } List<UnitConversion> sensorConversion = new ArrayList<>(); Iterator<UnitConversion> iterator = unitConversions.iterator(); while (iterator.hasNext()) { UnitConversion unitConversion = iterator.next(); if (unitConversion.getSensorCode() != null) { sensorConversion.add(unitConversion); iterator.remove(); } } for (UnitConversion unitConversion : sensorConversion) { if (unitConversion.getOriginalUnitKey().equals(srcUnitId) && unitConversion.getTargetUnitKey().equals(posUnitId) && unitConversion.getSensorCode().equals(sensorCode)) return unitConversion.getFormula(); } for (UnitConversion unitConversion : unitConversions) { if (unitConversion.getOriginalUnitKey().equals(srcUnitId) && unitConversion.getTargetUnitKey().equals(posUnitId)) return unitConversion.getFormula(); } return null; } }