|
|
|
|
@ -3,6 +3,7 @@ package com.mh.user.service.mqtt.service.impl;
|
|
|
|
|
import com.alibaba.fastjson2.JSONObject; |
|
|
|
|
import com.fasterxml.jackson.core.type.TypeReference; |
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper; |
|
|
|
|
import com.github.benmanes.caffeine.cache.Cache; |
|
|
|
|
import com.mh.common.utils.StringUtils; |
|
|
|
|
import com.mh.user.constants.ChannelName; |
|
|
|
|
import com.mh.user.constants.Constant; |
|
|
|
|
@ -18,10 +19,14 @@ import com.mh.user.service.GatewayManageService;
|
|
|
|
|
import com.mh.user.service.mqtt.service.IEventsService; |
|
|
|
|
import com.mh.user.strategy.DeviceStrategy; |
|
|
|
|
import com.mh.user.strategy.DeviceStrategyFactory; |
|
|
|
|
import com.mh.user.utils.CacheUtil; |
|
|
|
|
import com.mh.user.utils.DateUtil; |
|
|
|
|
import com.mh.user.utils.SpringBeanUtil; |
|
|
|
|
import io.netty.util.CharsetUtil; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
|
import org.springframework.beans.factory.annotation.Qualifier; |
|
|
|
|
import org.springframework.context.ApplicationContext; |
|
|
|
|
import org.springframework.integration.annotation.ServiceActivator; |
|
|
|
|
import org.springframework.messaging.MessageHeaders; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
@ -56,6 +61,9 @@ public class EventsServiceImpl implements IEventsService {
|
|
|
|
|
@Autowired |
|
|
|
|
private DeviceInstallService deviceInstallService; |
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
|
private Cache caffeineCache; |
|
|
|
|
|
|
|
|
|
@ServiceActivator(inputChannel = ChannelName.EVENTS_UPLOAD_INBOUND) |
|
|
|
|
@Override |
|
|
|
|
public void handleInboundUpload(byte[] receiver, MessageHeaders headers) { |
|
|
|
|
@ -107,35 +115,55 @@ public class EventsServiceImpl implements IEventsService {
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 修复类型转换问题
|
|
|
|
|
List<?> rawDataList = datas.getDatas(); |
|
|
|
|
List<SanShiFengDatas> rawDataList = datas.getDatas(); |
|
|
|
|
if (rawDataList == null || rawDataList.isEmpty()) { |
|
|
|
|
log.warn("数据列表为空,SN: {}", sn); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 先批量更新collectionParam
|
|
|
|
|
rawDataList.parallelStream().forEach(rawData -> { |
|
|
|
|
try { |
|
|
|
|
processDataUpdateCpmItem(rawData, sn, plcName, projectName, time, buildingId); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("处理单个数据项失败: {}", rawData, e); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
// 并行处理数据列表,主线程等待处理完
|
|
|
|
|
rawDataList.parallelStream().forEach(rawData -> { |
|
|
|
|
try { |
|
|
|
|
processDataItem(rawData, sn, plcName, projectName, time, buildingId); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("处理单个数据项失败: {}", rawData, e); |
|
|
|
|
// rawDataList进行批量更新,100条数据进行批量处理
|
|
|
|
|
int batchSize = 100; |
|
|
|
|
for (int i = 0; i < rawDataList.size(); i += batchSize) { |
|
|
|
|
int endIndex = Math.min(i + batchSize, rawDataList.size()); |
|
|
|
|
List<SanShiFengDatas> batch = rawDataList.subList(i, endIndex); |
|
|
|
|
collectionParamManageService.getBatchUpdateCollectionParams(batch, sn, plcName, projectName, time, buildingId); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// // 先批量更新collectionParam
|
|
|
|
|
// rawDataList.parallelStream().forEach(rawData -> {
|
|
|
|
|
// try {
|
|
|
|
|
// processDataUpdateCpmItem(rawData, sn, plcName, projectName, time, buildingId);
|
|
|
|
|
// } catch (Exception e) {
|
|
|
|
|
// log.error("处理单个数据项失败: {}", rawData, e);
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
// 通过判断当前time跟上一个time相差30s才存储进入队列
|
|
|
|
|
if (caffeineCache.getIfPresent(sn+"_time") != null) { |
|
|
|
|
String lastTime = (String)caffeineCache.getIfPresent(sn+"_time"); |
|
|
|
|
// yyyy-MM-dd HH:mm:ss格式转为秒的时间戳
|
|
|
|
|
long lastTimeStamp = DateUtil.getTimeStamp(lastTime); |
|
|
|
|
long currentTimeStamp = DateUtil.getTimeStamp(time); |
|
|
|
|
// 判断时间间隔
|
|
|
|
|
if (!StringUtils.isBlank(lastTime) && Math.abs(currentTimeStamp -lastTimeStamp) >= 60000) { |
|
|
|
|
// 并行处理数据列表,主线程不阻塞
|
|
|
|
|
rawDataList.parallelStream().forEach(rawData -> { |
|
|
|
|
try { |
|
|
|
|
processDataItem(rawData, sn, plcName, projectName, time, buildingId); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
log.error("处理单个数据项失败: {}", rawData, e); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
caffeineCache.put(sn+"_time", time); |
|
|
|
|
} |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
log.error("处理数据时发生错误: ", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void processDataUpdateCpmItem(Object rawData, String sn, String plcName, String projectName, String time, String buildingId) { |
|
|
|
|
private void processDataUpdateCpmItem(SanShiFengDatas data, String sn, String plcName, String projectName, String time, String buildingId) { |
|
|
|
|
// 安全地转换对象
|
|
|
|
|
SanShiFengDatas data = convertDataItem(rawData); |
|
|
|
|
// SanShiFengDatas data = convertDataItem(rawData);
|
|
|
|
|
if (data == null) { |
|
|
|
|
log.warn("数据转换失败,跳过处理"); |
|
|
|
|
return; |
|
|
|
|
@ -145,9 +173,9 @@ public class EventsServiceImpl implements IEventsService {
|
|
|
|
|
// 获取点位参数名称
|
|
|
|
|
String name = data.getName(); |
|
|
|
|
// 获取点位值
|
|
|
|
|
BigDecimal value = new BigDecimal(0); |
|
|
|
|
BigDecimal value; |
|
|
|
|
try { |
|
|
|
|
value = new BigDecimal(String.valueOf(data.getValue())); |
|
|
|
|
value = data.getValue(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
value = BigDecimal.ZERO; |
|
|
|
|
} |
|
|
|
|
@ -177,7 +205,20 @@ public class EventsServiceImpl implements IEventsService {
|
|
|
|
|
//collectionParamManageService.updateCPMByOtherName(name, value, time, buildingId);
|
|
|
|
|
// 查询device_install表,走之前的逻辑
|
|
|
|
|
CollectionParamsManageEntity collectionParamsManageEntity = collectionParamManageService.selectDeviceInstallByOtherName(name, buildingId); |
|
|
|
|
if (null != collectionParamsManageEntity && collectionParamsManageEntity.getDeviceInstallId() != null) { |
|
|
|
|
if (null != collectionParamsManageEntity |
|
|
|
|
&& collectionParamsManageEntity.getDeviceInstallId() != null |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 0 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 4 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 15 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 16 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 17 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 18 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 19 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 21 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 22 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 23 |
|
|
|
|
&& collectionParamsManageEntity.getParamTypeId() != 24 |
|
|
|
|
) { |
|
|
|
|
DeviceInstallEntity deviceInstallEntity = deviceInstallService.selectDeviceById(collectionParamsManageEntity.getDeviceInstallId()); |
|
|
|
|
if (deviceInstallEntity != null) { |
|
|
|
|
// 开始走策略判断
|
|
|
|
|
|