zouyu
2025-11-21 ca7685886ae8a4a4bb6717d48a1c48cf3934faf3
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -17,13 +17,12 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -113,7 +112,8 @@
    }
    @Override
    public void dcResistanceDataAnalysis(String jsonStr) {
    @Transactional(rollbackFor = Exception.class)
    public void dcResistanceDataAnalysis(String jsonStr,String deviceCode) {
        Map<String, Object> dataMap = JSONObject.parseObject(jsonStr, new TypeReference<Map<String, Object>>(){}.getType());
        if(CollectionUtil.isNotEmpty(dataMap) && Objects.nonNull(dataMap.get("data"))){
            List<DeviceMqttVO> dataList = JSONArray.parseObject(dataMap.get("data").toString(), new TypeReference<List<DeviceMqttVO>>(){}.getType());
@@ -131,20 +131,23 @@
                        .set(CollectBridge::getCollectValue,value)
                        .set(CollectBridge::getCollectTemperature,tempValue)
                        .set(CollectBridge::getLastCollectDate,LocalDateTime.now())
                        .eq(CollectBridge::getDeviceCode,deviceCode)
                        .eq(CollectBridge::getEntrustCode,entrustCode));
            }else{
                collectBridgeMapper.insert(new CollectBridge(entrustCode,value,tempValue,LocalDateTime.now(),LocalDateTime.now()));
                collectBridgeMapper.insert(new CollectBridge(entrustCode,deviceCode,value,tempValue,LocalDateTime.now(),LocalDateTime.now()));
            }
        }
    }
    @Override
    public void elongationDataAnalysis(String jsonStr) {
    public void elongationDataAnalysis(String jsonStr,String deviceCode) {
        Map<String, Object> dataMap = JSONObject.parseObject(jsonStr, new TypeReference<Map<String, Object>>(){}.getType());
        if(CollectionUtil.isNotEmpty(dataMap) && Objects.nonNull(dataMap.get("data"))){
            List<DeviceMqttVO> dataList = JSONArray.parseObject(dataMap.get("data").toString(), new TypeReference<List<DeviceMqttVO>>(){}.getType());
            // 伸长率:处理 NSTSSC.TSSC.SCL 数据
            processMultipleValueDataStream(dataList, ElongationMqttConstants.NSTSSC_TSSC_SCL,3,10.0);
            processMultipleValueDataStream(dataList, ElongationMqttConstants.NSTSSC_TSSC_SCL,3,10.0,deviceCode);
        }else{
            processMultipleValueDataStream(dataMap, ElongationMqttConstants.NSTSSC1_TSSC_SCL,3,10.0,deviceCode);
        }
    }
@@ -171,11 +174,11 @@
     * @param dataStream 数据流标识
     * @param maxSize 保存的最大个数
     * @param minVal 存储数据的最小值,低于该值则跳过;-1代表不限制
     * @param deviceCode 设备编号
     */
    private void processMultipleValueDataStream(List<DeviceMqttVO> dataList, String dataStream,int maxSize,Double minVal){
    private void processMultipleValueDataStream(List<DeviceMqttVO> dataList, String dataStream,int maxSize,Double minVal,String deviceCode){
        // 筛选出当前数据流对应的数据
//        Double value = Double.parseDouble(getValueByDataStream(dataList, dataStream));
        Double value = BigDecimal.valueOf(Math.random()*100).setScale(7, RoundingMode.HALF_EVEN).doubleValue();
        Double value = Double.parseDouble(getValueByDataStream(dataList, dataStream));
        //如果最小值不为空且不为-1,获取到的值小于最小值则跳过不做处理
        if(Objects.nonNull(minVal)&&minVal!=-1&&value<minVal){
            return;
@@ -189,7 +192,34 @@
                RedisUtil.delZSetRange(dataStream,0,0);
            }
        }
        RedisUtil.addZSet(dataStream,System.currentTimeMillis(),value);
        RedisUtil.addZSet(dataStream+"."+deviceCode,System.currentTimeMillis(),value);
    }
    /**
     * 处理需要保存多个值的数据流,并保存到 Redis
     * @param dataMap 数据列表
     * @param dataStream 数据流标识
     * @param maxSize 保存的最大个数
     * @param minVal 存储数据的最小值,低于该值则跳过;-1代表不限制
     * @param deviceCode 设备编号
     */
    private void processMultipleValueDataStream(Map<String,Object> dataMap, String dataStream,int maxSize,Double minVal,String deviceCode){
        // 筛选出当前数据流对应的数据
        Double value = Double.parseDouble(dataMap.get(dataStream).toString());
        //如果最小值不为空且不为-1,获取到的值小于最小值则跳过不做处理
        if(Objects.nonNull(minVal)&&minVal!=-1&&value<minVal){
            return;
        }
        //判断key是否存在
        boolean existKey = RedisUtil.hasKey(dataStream);
        if(existKey){
            long zSetSize = RedisUtil.getZSetSize(dataStream);
            //如果数据长度超过最大个数,则删除分数最低的数据
            if(zSetSize>=maxSize){
                RedisUtil.delZSetRange(dataStream,0,0);
            }
        }
        RedisUtil.addZSet(dataStream+"."+deviceCode,System.currentTimeMillis(),value);
    }
    /**