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>