cjl
19 hours ago 256aa4c5431733e5d166f583f03724cf69ddfaa4
fix:添加雷达数据
6 files added
3 files modified
311 ■■■■■ changed files
screen-common/src/main/java/com/moral/constant/KafkaConstants.java 5 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/entity/HistorySecondRadar.java 66 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java 25 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/mapper/HistorySecondRadarMapper.java 16 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java 1 ●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/HistorySecondRadarService.java 18 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondRadarServiceImpl.java 92 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/java/com/moral/api/util/Method.java 72 ●●●●● patch | view | raw | blame | history
screen-manage/src/main/resources/mapper/HistorySecondRadarMapper.xml 16 ●●●●● patch | view | raw | blame | history
screen-common/src/main/java/com/moral/constant/KafkaConstants.java
@@ -37,6 +37,11 @@
    * */
    public static final String CRUISER_TOPIC_HOUR = "cruiser_hour_data";
    /*
     * 雷达数据主题
     * */
    public static final String RADAR_SECOND= "radar_data";
    /**
     * 存入数据库的消费组
     */
screen-manage/src/main/java/com/moral/api/entity/HistorySecondRadar.java
New file
@@ -0,0 +1,66 @@
package com.moral.api.entity;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author moral
 * @since 2026-05-14
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class HistorySecondRadar extends Model<HistorySecondRadar> {
    private static final long serialVersionUID = 1L;
    /**
     * 时间 Date
     */
    private LocalDateTime time;
    private LocalDateTime radarTime;
    /**
     * 数据
     */
    private String radarData;
    /**
     * pm2.5最高值
     */
    private String pm25;
    /**
     * pm2.5最高高度
     */
    private String highPm25;
    /**
     * pm10最高
     */
    private String pm10;
    /**
     * pm10高度
     */
    private String highPm10;
    /**
     * 边界层
     */
    private String boundaryLayer;
    @Override
    protected Serializable pkVal() {
        return null;
    }
}
screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java
@@ -1,7 +1,9 @@
package com.moral.api.kafka.consumer;
import com.alibaba.fastjson.JSON;
import com.moral.api.entity.HistorySecondRadar;
import com.moral.api.service.*;
import com.moral.api.util.Method;
import com.moral.constant.KafkaConstants;
import com.moral.constant.RedisConstants;
import lombok.extern.slf4j.Slf4j;
@@ -41,6 +43,8 @@
    @Autowired
    private HistorySecondUavService historySecondUavService;
    @Autowired
    private HistorySecondRadarService historySecondRadarService;
    //分钟数据
    @KafkaListener(topics = KafkaConstants.TOPIC_MINUTE, containerFactory = "insertListenerContainerFactory")
@@ -223,4 +227,25 @@
            log.error("param{}" + e);
        }
    }
    @KafkaListener(topics = KafkaConstants.RADAR_SECOND, containerFactory = "insertListenerContainerFactory")
    public void listenSecondRadar(ConsumerRecord<String, String> record, Acknowledgment ack) {
        String msg = record.value();
        try {
            msg = msg.replaceAll(",", ";");
            Map<String, Object> data = Method.getDataStore(msg);
            Object mac = data.get("QN");
            Object time = data.get("DataTime");
            if (ObjectUtils.isEmpty(time) || ObjectUtils.isEmpty(mac)) {
                log.warn("some properties is null, param{}", msg);
                ack.acknowledge();
                return;
            }
            int i = 0;
            historySecondRadarService.insertHistorySecond(data);
            ack.acknowledge();
        } catch (Exception e) {
            log.error("param{}" + e);
        }
    }
}
screen-manage/src/main/java/com/moral/api/mapper/HistorySecondRadarMapper.java
New file
@@ -0,0 +1,16 @@
package com.moral.api.mapper;
import com.moral.api.entity.HistorySecondRadar;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author moral
 * @since 2026-05-14
 */
public interface HistorySecondRadarMapper extends BaseMapper<HistorySecondRadar> {
}
screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java
@@ -29,4 +29,5 @@
    Map<String,Object> getCruiserCompare(Map<String, Object> params);
}
screen-manage/src/main/java/com/moral/api/service/HistorySecondRadarService.java
New file
@@ -0,0 +1,18 @@
package com.moral.api.service;
import com.moral.api.entity.HistorySecondRadar;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
/**
 * <p>
 *  服务类
 * </p>
 *
 * @author moral
 * @since 2026-05-14
 */
public interface HistorySecondRadarService extends IService<HistorySecondRadar> {
    void insertHistorySecond(Map<String, Object> data);
}
screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondRadarServiceImpl.java
New file
@@ -0,0 +1,92 @@
package com.moral.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.moral.api.entity.HistorySecondRadar;
import com.moral.api.mapper.HistorySecondRadarMapper;
import com.moral.api.service.HistorySecondRadarService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;
/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author moral
 * @since 2026-05-14
 */
@Service
public class HistorySecondRadarServiceImpl extends ServiceImpl<HistorySecondRadarMapper, HistorySecondRadar> implements HistorySecondRadarService {
    private final DateTimeFormatter INPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
    private final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    @Override
    public void insertHistorySecond(Map<String, Object> data) {
        Map<String, Object> dataResult = new HashMap<>();
        HistorySecondRadar historySecondRadar = new HistorySecondRadar();
        String time = data.get("time").toString();
        String radarTime = data.get("DataTime").toString();
        Map<String,Double> a34004 = highMap(data.get("a34004-Avg").toString());
        historySecondRadar.setPm25(String.valueOf(a34004.get("value")));
        historySecondRadar.setHighPm25(String.valueOf(a34004.get("high")));
        Map<String,Double> a34002 = highMap(data.get("a34002-Avg").toString());
        historySecondRadar.setPm10(String.valueOf(a34002.get("value")));
        historySecondRadar.setHighPm10(String.valueOf(a34002.get("high")));
        Map<String,Double> a01561 = highMap(data.get("a01561-Avg").toString());
        historySecondRadar.setBoundaryLayer(String.valueOf(a01561.get("value")));
        LocalDateTime dateTime = LocalDateTime.parse(time, INPUT_FORMATTER);
        historySecondRadar.setTime(dateTime);
        dataResult.put("a34004-Avg",data.get("a34004-Avg"));
        dataResult.put("a34002-Avg",data.get("a34002-Avg"));
        dataResult.put("a01561-Avg",data.get("a01561-Avg"));
        dataResult.put("QN",data.get("QN"));
        dataResult.put("CN",data.get("CN"));
        dataResult.put("MN",data.get("MN"));
        dataResult.put("DataTime",data.get("DataTime"));
        dataResult.put("time",data.get("time"));
        historySecondRadar.setRadarData(JSON.toJSONString(dataResult));
        historySecondRadar.setRadarTime(LocalDateTime.parse(radarTime, INPUT_FORMATTER));
        this.save(historySecondRadar);
    }
    private Map<String,Double> highMap(String data){
        data = data.replace(",", "");
        Map<String,Double> map = new HashMap<>();
        double[] values = Arrays.stream(data.split("\\*"))
                .mapToDouble(Double::parseDouble)
                .toArray();
        int maxIndex = IntStream.range(0, values.length)
                .boxed()
                .max((i, j) -> Double.compare(values[i], values[j]))
                .orElse(-1);
        if (maxIndex != -1) {
            double maxValue = values[maxIndex];
            map.put("value",maxValue);
            // 3. 计算距离 (假设第1个值对应7.5米,即 (index+1)*7.5)
            double distance = (maxIndex + 1) * 7.5;
            map.put("high",distance);
        }else {
            map.put("value",0d);
            map.put("high",0d);
        }
        return map;
    }
    public static void main(String[] args) {
        String inputStr = "20260513110500";
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        LocalDateTime dateTime = LocalDateTime.parse(inputStr, inputFormatter);
        System.out.println(dateTime);
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    }
}
screen-manage/src/main/java/com/moral/api/util/Method.java
New file
@@ -0,0 +1,72 @@
package com.moral.api.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Method {
    public static Map<String, Object> getDataStore(String data) {
        data = data.replaceFirst("&&",";");
        Map<String, Object> dataStore = new HashMap<>();
        String[] commands = data.split(";");
        List<String> commandList = Arrays.asList(commands);
        commandList.forEach(command -> {
            String[] cmds = command.split("=");
            String key = cmds[0];
            String value = cmds.length > 1 ? cmds[1] : "";
            dataStore.put(key, value);
        });
        return dataStore;
    }
    public static Map<String, Object> getCpDataStore(String cp) {
        String[] dataItems = cp.split(";"); // [array]
        Map<String, Object> dataStore = new HashMap<>();
        List<String> dataItemList = Arrays.asList(dataItems);
        dataItemList.forEach(dataItem -> {
            String[] itemArr= dataItem.split(";");
            List<String> itemList = Arrays.asList(itemArr);
            itemList.forEach(item -> {
                String[] item1Arr = item.split(",");
                List<String> item1List = Arrays.asList(item1Arr);
                item1List.forEach(itemChild -> {
                    String[] items = itemChild.split("=");
                    String item1 = items[0];
                    String item2 = items[1];
                    if(item1.endsWith("-Rtd")) {
                        String key = item1.replace("-Rtd", "");
                        dataStore.put(key, item2);
                    }else{
                        String k = item1;
                        dataStore.put(k, item2);
                    }
                });
            });
        });
        return dataStore;
    }
    public static long getTimeStamp(String time, String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (!"".equals(format)) {
            simpleDateFormat = new SimpleDateFormat(format);
        }
        long timeStemp = 0;
        try {
            Date date = simpleDateFormat.parse(time);
            timeStemp = date.getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return timeStemp;
    }
}
screen-manage/src/main/resources/mapper/HistorySecondRadarMapper.xml
New file
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.moral.api.mapper.HistorySecondRadarMapper">
        <!-- 通用查询映射结果 -->
        <resultMap id="BaseResultMap" type="com.moral.api.entity.HistorySecondRadar">
                    <result column="time" property="time" />
                    <result column="radar_data" property="radarData" />
                    <result column="pm25" property="pm25" />
                    <result column="high_pm25" property="highPm25" />
                    <result column="pm10" property="pm10" />
                    <result column="high_pm10" property="highPm10" />
                    <result column="boundary_layer" property="boundaryLayer" />
        </resultMap>
</mapper>