|
package com.moral.api.exception.consumer;
|
|
import com.alibaba.fastjson.JSON;
|
import com.moral.api.entity.Device;
|
import com.moral.api.entity.Sensor;
|
import com.moral.api.entity.UnitConversion;
|
import com.moral.api.utils.AdjustDataUtils;
|
import com.moral.api.utils.UnitConvertUtils;
|
import com.moral.api.websocket.SingleDeviceServer;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.kafka.clients.consumer.Consumer;
|
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
import org.apache.kafka.common.TopicPartition;
|
import org.springframework.kafka.annotation.KafkaListener;
|
import org.springframework.kafka.listener.ConsumerSeekAware;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.ObjectUtils;
|
|
import java.math.BigDecimal;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
|
|
/**
|
* @ClassName SecondsDataConsumer1
|
* @Description TODO
|
* @Author 陈凯裕
|
* @Date 2021/6/15 14:49
|
* @Version TODO
|
**/
|
|
|
|
|
//@Component
|
@Slf4j
|
public class SecondDataConsumer implements ConsumerSeekAware {
|
|
@KafkaListener(containerFactory = "secondDataListenerFactory", topics = "second_data")
|
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);
|
CopyOnWriteArraySet<SingleDeviceServer> sockets = SingleDeviceServer.sockets;
|
for (SingleDeviceServer socket : sockets) {
|
//判断消息是否数据该socket
|
String messageMac = (String) message.get("mac");
|
String mac = socket.getMac();
|
if (!mac.equalsIgnoreCase(messageMac))
|
continue;
|
//取出基本信息
|
Device device = socket.getDeviceAlarmInfo();
|
Map<String, Object> adjustFormula = socket.getAdjustFormula();
|
Map<String, Object> regionAqi = socket.getRegionAqi();
|
//补偿数据
|
if(adjustFormula!=null)
|
message = AdjustDataUtils.adjust(message,adjustFormula,regionAqi);
|
//创建最终消息对象
|
Map<String, Object> resultMessgae = new HashMap<>();
|
//拼接单位
|
List<Sensor> sensors = device.getVersion().getSensors();//获取型号所有因子信息
|
for (Sensor sensor : sensors) {
|
String code = sensor.getCode();
|
String showUnit = sensor.getShowUnit();
|
String showUnitKey = sensor.getShowUnitKey();
|
String unitKey = sensor.getUnitKey();
|
String unit = sensor.getUnit();
|
Object value = message.get(code);
|
if(value==null)
|
continue;
|
Double sourceDataD = Double.valueOf(String.valueOf(value));
|
BigDecimal bg = new BigDecimal(sourceDataD);
|
bg = bg.setScale(2, BigDecimal.ROUND_FLOOR);
|
String sourceData = bg.toString();
|
//单位转换
|
if (!unitKey.equals(showUnitKey)) {//如果源单位和显示单位不同,则进行单位转换
|
String formula = sensor.getFormula();
|
//如果sensor中的公式为空则从缓存中获取公式
|
if (ObjectUtils.isEmpty(formula)) {
|
List<UnitConversion> unitConversions = socket.getUnitConversions();
|
for (UnitConversion unitConversion : unitConversions) {
|
if (unitConversion.getOriginalUnitKey().equals(unitKey) && unitConversion.getTargetUnitKey().equals(showUnitKey))
|
formula = unitConversion.getFormula();
|
}
|
}
|
//单位转换
|
String resultData = UnitConvertUtils.calculate(sourceData, formula);
|
if (resultData != null) {
|
resultData += showUnit;
|
} else {//如果转换出的数据为null,则代表缓存中也没有公式,依然使用源单位。
|
resultData = sourceData + unit;
|
}
|
resultMessgae.put(sensor.getCode(), resultData);
|
} else {
|
//拼接单位
|
if(!showUnit.equals("无单位"))
|
sourceData = sourceData + " " + showUnit;
|
resultMessgae.put(sensor.getCode(), sourceData);
|
}
|
}
|
socket.sendMessage(JSON.toJSONString(resultMessgae));
|
}
|
}
|
|
@Override
|
public void registerSeekCallback(ConsumerSeekCallback consumerSeekCallback) {
|
|
}
|
|
//consumer回调函数,设置从最新的offset开始消费
|
@Override
|
public void onPartitionsAssigned(Map<TopicPartition, Long> map, ConsumerSeekCallback consumerSeekCallback) {
|
map.forEach((t, o) -> consumerSeekCallback.seekToEnd(t.topic(), t.partition()));
|
}
|
|
@Override
|
public void onIdleContainer(Map<TopicPartition, Long> map, ConsumerSeekCallback consumerSeekCallback) {
|
|
}
|
|
}
|