screen-common/src/main/java/com/moral/constant/Constants.java
@@ -207,7 +207,7 @@ /* * 特殊设备数据批次 * */ public static final String SENSOR_CODE_SPECIAL_BATCH = "a00000"; public static final String SENSOR_CODE_SPECIAL_BATCH = "PORRST"; /* * 字典表走航车设备类型 screen-manage/src/main/java/com/moral/api/entity/HistorySecondCruiser.java
New file @@ -0,0 +1,56 @@ package com.moral.api.entity; import com.baomidou.mybatisplus.extension.activerecord.Model; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 走航车秒数据表 * </p> * * @author moral * @since 2021-09-02 */ @Data @EqualsAndHashCode(callSuper = false) public class HistorySecondCruiser extends Model<HistorySecondCruiser> { private static final long serialVersionUID = 1L; /** * 设备mac */ private String mac; /** * 数据时间 */ private Date time; /** * 数据 */ private String value; /** * 此数据所属组织id */ private Integer organizationId; /** * 数据批次 */ private Date batch; @Override protected Serializable pkVal() { return null; } } screen-manage/src/main/java/com/moral/api/entity/HistorySecondUav.java
New file @@ -0,0 +1,56 @@ package com.moral.api.entity; import com.baomidou.mybatisplus.extension.activerecord.Model; import java.time.LocalDateTime; import java.io.Serializable; import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; /** * <p> * 无人机秒数据表 * </p> * * @author moral * @since 2021-09-02 */ @Data @EqualsAndHashCode(callSuper = false) public class HistorySecondUav extends Model<HistorySecondUav> { private static final long serialVersionUID = 1L; /** * 设备mac */ private String mac; /** * 数据时间 */ private Date time; /** * 数据 */ private String value; /** * 此数据所属组织id */ private Integer organizationId; /** * 数据批次 */ private Date batch; @Override protected Serializable pkVal() { return null; } } screen-manage/src/main/java/com/moral/api/kafka/consumer/DeviceConsumer.java
@@ -1,5 +1,6 @@ package com.moral.api.kafka.consumer; import com.moral.api.service.*; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.beans.factory.annotation.Autowired; @@ -14,10 +15,6 @@ import java.util.Map; import com.alibaba.fastjson.JSON; import com.moral.api.service.DeviceService; import com.moral.api.service.HistoryHourlyService; import com.moral.api.service.HistoryMinutelyService; import com.moral.api.service.HistorySecondSpecialService; import com.moral.constant.KafkaConstants; import com.moral.constant.RedisConstants; @@ -43,8 +40,14 @@ @Autowired private HistorySecondSpecialService historySecondSpecialService; @Autowired private HistorySecondCruiserService historySecondCruiserService; @Autowired private HistorySecondUavService historySecondUavService; //分钟数据 @KafkaListener(topics = KafkaConstants.TOPIC_MINUTE, containerFactory = "insertListenerContainerFactory") //@KafkaListener(topics = KafkaConstants.TOPIC_MINUTE, containerFactory = "insertListenerContainerFactory") public void listenMinute(ConsumerRecord<String, String> record, Acknowledgment ack) { String msg = record.value(); try { @@ -83,7 +86,7 @@ } //小时数据 @KafkaListener(topics = KafkaConstants.TOPIC_HOUR, containerFactory = "insertListenerContainerFactory") //@KafkaListener(topics = KafkaConstants.TOPIC_HOUR, containerFactory = "insertListenerContainerFactory") public void listenHour(ConsumerRecord<String, String> record, Acknowledgment ack) { String msg = record.value(); try { @@ -122,7 +125,7 @@ } //秒数据,修改设备状态,缓存最新秒数据 @KafkaListener(topics = KafkaConstants.TOPIC_SECOND, containerFactory = "stateListenerContainerFactory") //@KafkaListener(topics = KafkaConstants.TOPIC_SECOND, containerFactory = "stateListenerContainerFactory") public void listenSecond(ConsumerRecord<String, String> record) { String msg = record.value(); try { @@ -150,9 +153,35 @@ } } //特殊设备秒数据 //无人机秒数据 @KafkaListener(topics = KafkaConstants.UAV_TOPIC_SECOND, groupId = KafkaConstants.GROUP_INSERT, containerFactory = "insertListenerContainerFactory") public void listenSecondSpecial(ConsumerRecord<String, String> record, Acknowledgment ack) { String msg = record.value(); System.out.println(msg); try { Map<String, Object> data = JSON.parseObject(msg, Map.class); Object mac = data.get("mac"); Object time = data.get("DataTime"); if (ObjectUtils.isEmpty(time) || ObjectUtils.isEmpty(mac)) { log.warn("some properties is null, param{}", msg); ack.acknowledge(); return; } //数据过滤 data.remove("time"); data.remove("entryTime"); historySecondUavService.insertHistorySecond(data); ack.acknowledge(); } catch (Exception e) { log.error("param{}" + msg); } } //走航车秒数据 @KafkaListener(topics = KafkaConstants.CRUISER_TOPIC_SECOND, groupId = KafkaConstants.GROUP_INSERT, containerFactory = "insertListenerContainerFactory") public void listenSecondCruiser(ConsumerRecord<String, String> record, Acknowledgment ack) { String msg = record.value(); try { Map<String, Object> data = JSON.parseObject(msg, Map.class); @@ -168,7 +197,7 @@ data.remove("time"); data.remove("entryTime"); historySecondSpecialService.insertHistorySecond(data); historySecondCruiserService.insertHistorySecond(data); ack.acknowledge(); } catch (Exception e) { log.error("param{}" + msg); screen-manage/src/main/java/com/moral/api/mapper/HistorySecondCruiserMapper.java
New file @@ -0,0 +1,16 @@ package com.moral.api.mapper; import com.moral.api.entity.HistorySecondCruiser; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 走航车秒数据表 Mapper 接口 * </p> * * @author moral * @since 2021-09-02 */ public interface HistorySecondCruiserMapper extends BaseMapper<HistorySecondCruiser> { } screen-manage/src/main/java/com/moral/api/mapper/HistorySecondUavMapper.java
New file @@ -0,0 +1,16 @@ package com.moral.api.mapper; import com.moral.api.entity.HistorySecondUav; import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * <p> * 无人机秒数据表 Mapper 接口 * </p> * * @author moral * @since 2021-09-02 */ public interface HistorySecondUavMapper extends BaseMapper<HistorySecondUav> { } screen-manage/src/main/java/com/moral/api/service/HistorySecondCruiserService.java
New file @@ -0,0 +1,21 @@ package com.moral.api.service; import com.moral.api.entity.HistorySecondCruiser; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Map; /** * <p> * 走航车秒数据表 服务类 * </p> * * @author moral * @since 2021-09-02 */ public interface HistorySecondCruiserService extends IService<HistorySecondCruiser> { //秒数据insert void insertHistorySecond(Map<String, Object> data); } screen-manage/src/main/java/com/moral/api/service/HistorySecondUavService.java
New file @@ -0,0 +1,21 @@ package com.moral.api.service; import com.moral.api.entity.HistorySecondUav; import com.baomidou.mybatisplus.extension.service.IService; import java.util.Map; /** * <p> * 无人机秒数据表 服务类 * </p> * * @author moral * @since 2021-09-02 */ public interface HistorySecondUavService extends IService<HistorySecondUav> { //秒数据insert void insertHistorySecond(Map<String, Object> data); } screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondCruiserServiceImpl.java
New file @@ -0,0 +1,80 @@ package com.moral.api.service.impl; import com.alibaba.fastjson.JSONObject; import com.moral.api.entity.HistorySecondCruiser; import com.moral.api.entity.Sensor; import com.moral.api.entity.SpecialDevice; import com.moral.api.mapper.HistorySecondCruiserMapper; import com.moral.api.service.DeviceService; import com.moral.api.service.HistorySecondCruiserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> * 走航车秒数据表 服务实现类 * </p> * * @author moral * @since 2021-09-02 */ @Service public class HistorySecondCruiserServiceImpl extends ServiceImpl<HistorySecondCruiserMapper, HistorySecondCruiser> implements HistorySecondCruiserService { @Autowired private HistorySecondCruiserMapper historySecondCruiserMapper; @Autowired private DeviceService deviceService; @Autowired private RedisTemplate redisTemplate; @Override public void insertHistorySecond(Map<String, Object> data) { Date batchTime = DateUtils.getDate((String) data.remove(Constants.SENSOR_CODE_SPECIAL_BATCH), DateUtils.yyyyMMddHHmmss_EN); Date time = DateUtils.getDate((String) data.get("DataTime"), DateUtils.yyyyMMddHHmmss_EN); String mac = data.get("mac").toString(); //根据mac从redis中获取因子 SpecialDevice specialDevice = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, mac); List<Sensor> sensors = specialDevice.getVersion().getSensors(); //过滤因子 data = data.entrySet().stream() .filter(m -> { boolean flag = false; String key = m.getKey(); if (!"mac".equals(key) && !"DataTime".equals(key)) { for (Sensor sensor : sensors) { if (sensor.getCode().equals(key)) { flag = true; break; } } return flag; } return true; }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); //数据校准 data = deviceService.adjustSpecialDeviceData(data); HistorySecondCruiser historySecondCruiser = new HistorySecondCruiser(); historySecondCruiser.setMac(mac); historySecondCruiser.setTime(time); historySecondCruiser.setValue(JSONObject.toJSONString(data)); historySecondCruiser.setOrganizationId(specialDevice.getOrganizationId()); historySecondCruiser.setBatch(batchTime); historySecondCruiserMapper.insert(historySecondCruiser); } } screen-manage/src/main/java/com/moral/api/service/impl/HistorySecondUavServiceImpl.java
New file @@ -0,0 +1,80 @@ package com.moral.api.service.impl; import com.alibaba.fastjson.JSONObject; import com.moral.api.entity.HistorySecondUav; import com.moral.api.entity.Sensor; import com.moral.api.entity.SpecialDevice; import com.moral.api.mapper.HistorySecondUavMapper; import com.moral.api.service.DeviceService; import com.moral.api.service.HistorySecondUavService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.moral.constant.Constants; import com.moral.constant.RedisConstants; import com.moral.util.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> * 无人机秒数据表 服务实现类 * </p> * * @author moral * @since 2021-09-02 */ @Service public class HistorySecondUavServiceImpl extends ServiceImpl<HistorySecondUavMapper, HistorySecondUav> implements HistorySecondUavService { @Autowired private HistorySecondUavMapper historySecondUavMapper; @Autowired private DeviceService deviceService; @Autowired private RedisTemplate redisTemplate; @Override public void insertHistorySecond(Map<String, Object> data) { Date batchTime = DateUtils.getDate((String) data.remove(Constants.SENSOR_CODE_SPECIAL_BATCH), DateUtils.yyyyMMddHHmmss_EN); Date time = DateUtils.getDate((String) data.get("DataTime"), DateUtils.yyyyMMddHHmmss_EN); String mac = data.get("mac").toString(); //根据mac从redis中获取因子 SpecialDevice specialDevice = (SpecialDevice) redisTemplate.opsForHash().get(RedisConstants.SPECIAL_DEVICE_INFO, mac); List<Sensor> sensors = specialDevice.getVersion().getSensors(); //过滤因子 data = data.entrySet().stream() .filter(m -> { boolean flag = false; String key = m.getKey(); if (!"mac".equals(key) && !"DataTime".equals(key)) { for (Sensor sensor : sensors) { if (sensor.getCode().equals(key)) { flag = true; break; } } return flag; } return true; }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); //数据校准 data = deviceService.adjustSpecialDeviceData(data); HistorySecondUav historySecondUav = new HistorySecondUav(); historySecondUav.setMac(mac); historySecondUav.setTime(time); historySecondUav.setValue(JSONObject.toJSONString(data)); historySecondUav.setOrganizationId(specialDevice.getOrganizationId()); historySecondUav.setBatch(batchTime); historySecondUavMapper.insert(historySecondUav); } } screen-manage/src/main/resources/mapper/HistorySecondCruiserMapper.xml
New file @@ -0,0 +1,14 @@ <?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.HistorySecondCruiserMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.HistorySecondCruiser"> <result column="mac" property="mac" /> <result column="time" property="time" /> <result column="value" property="value" /> <result column="organization_id" property="organizationId" /> <result column="batch" property="batch" /> </resultMap> </mapper> screen-manage/src/main/resources/mapper/HistorySecondUavMapper.xml
New file @@ -0,0 +1,14 @@ <?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.HistorySecondUavMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.moral.api.entity.HistorySecondUav"> <result column="mac" property="mac" /> <result column="time" property="time" /> <result column="value" property="value" /> <result column="organization_id" property="organizationId" /> <result column="batch" property="batch" /> </resultMap> </mapper>