kaiyu
2022-03-10 9dcca27f3e28febdf4d79c2b6017d15bb104cff2
screen-api
增加五分钟弹窗数据接口
12 files modified
291 ■■■■ changed files
screen-api/src/main/java/com/moral/api/config/kafka/KafkaConsumerConfig.java 2 ●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/controller/HistoryFiveMinutelyController.java 19 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/entity/UnitConversion.java 2 ●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java 9 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/DeviceService.java 9 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/HistoryFiveMinutelyService.java 11 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/SensorService.java 2 ●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/UnitConversionService.java 2 ●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java 57 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/HistoryFiveMinutelyServiceImpl.java 108 ●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/SensorServiceImpl.java 27 ●●●●● patch | view | raw | blame | history
screen-api/src/main/java/com/moral/api/service/impl/UnitConversionServiceImpl.java 43 ●●●●● patch | view | raw | blame | history
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&&regionAqi!=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;
    }
}