zouyu
2025-11-24 fbc2429987b5d9a645349fabeb2960948d07fef4
cnas-device/src/main/java/com/ruoyi/device/service/impl/CollectBridgeServiceImpl.java
@@ -113,16 +113,16 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void dcResistanceDataAnalysis(String jsonStr,String deviceCode) {
    public void dcResistanceDataAnalysis(String jsonStr) {
        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());
        if(CollectionUtil.isNotEmpty(dataMap)){
            //过滤出包含实际电阻值的对象
            String entrustCode = getValueByDataStream(dataList,DCResistanceMqttConstants.NSDQCS_DQCS_SN);
            BigDecimal zxdzzValue = new BigDecimal(getValueByDataStream(dataList,DCResistanceMqttConstants.NSDQCS_DQCS_ZXDZZ));
            BigDecimal fxdzzValue = new BigDecimal(getValueByDataStream(dataList,DCResistanceMqttConstants.NSDQCS_DQCS_FXDZZ));
            String entrustCode = getValueByDataStream(dataMap,DCResistanceMqttConstants.NSDQCS_DQCS_SN);
            String deviceCode = getValueByDataStream(dataMap,DCResistanceMqttConstants.deviceName);
            BigDecimal zxdzzValue = new BigDecimal(getValueByDataStream(dataMap,DCResistanceMqttConstants.NSDQCS_DQCS_ZXDZZ));
            BigDecimal fxdzzValue = new BigDecimal(getValueByDataStream(dataMap,DCResistanceMqttConstants.NSDQCS_DQCS_FXDZZ));
//            BigDecimal testLength = new BigDecimal(getValueByDataStream(dataList,DCResistanceMqttConstants.NSDQCS_DQCS_CD));
            Double tempValue = new BigDecimal(getValueByDataStream(dataList,DCResistanceMqttConstants.NSDQCS_DQCS_WD)).setScale(2, RoundingMode.HALF_UP).doubleValue();
            Double tempValue = new BigDecimal(getValueByDataStream(dataMap,DCResistanceMqttConstants.NSDQCS_DQCS_WD)).setScale(2, RoundingMode.HALF_UP).doubleValue();
            //计算平均电阻值
            BigDecimal value = zxdzzValue.abs().add(fxdzzValue.abs()).divide(BigDecimal.valueOf(2L), RoundingMode.HALF_UP);
            Long count = collectBridgeMapper.selectCount(Wrappers.<CollectBridge>lambdaQuery().eq(CollectBridge::getEntrustCode, entrustCode));
@@ -140,45 +140,37 @@
    }
    @Override
    public void elongationDataAnalysis(String jsonStr,String deviceCode) {
    public void elongationDataAnalysis(String jsonStr) {
        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());
        if(CollectionUtil.isNotEmpty(dataMap)){
            // 伸长率:处理 NSTSSC.TSSC.SCL 数据
            processMultipleValueDataStream(dataList, ElongationMqttConstants.NSTSSC_TSSC_SCL,3,10.0,deviceCode);
        }else{
            processMultipleValueDataStream(dataMap, ElongationMqttConstants.NSTSSC1_TSSC_SCL,3,10.0,deviceCode);
            processMultipleValueDataStream(dataMap, ElongationMqttConstants.NSTSSC_TSSC_SCL,3,10.0);
        }
    }
    /**
     * 获取mqtt消息体中对应标识的值
     * @param dataList 数据列表
     * @param dataMap 数据列表
     * @param dataStream 数据流标识
     */
    private String getValueByDataStream(List<DeviceMqttVO> dataList, String dataStream) {
        DeviceMqttVO deviceMqttVO = dataList.stream()
                .filter(f -> StringUtils.equals(f.getDataStream(), dataStream))
                .findFirst()
                .orElse(null);
        if(Objects.nonNull(deviceMqttVO)){
            List<DeviceMqttVO.DataPoint> dataPoints = deviceMqttVO.getDataPoints();
            return CollectionUtil.isNotEmpty(dataPoints)?dataPoints.get(0).getValue():"";
    private String getValueByDataStream(Map<String,Object> dataMap, String dataStream) {
        try{
            return dataMap.get(dataStream).toString();
        }catch (Exception e){
            return "";
        }
        return "";
    }
    /**
     * 处理需要保存多个值的数据流,并保存到 Redis
     * @param dataList 数据列表
     * @param dataMap 数据列表
     * @param dataStream 数据流标识
     * @param maxSize 保存的最大个数
     * @param minVal 存储数据的最小值,低于该值则跳过;-1代表不限制
     * @param deviceCode 设备编号
     */
    private void processMultipleValueDataStream(List<DeviceMqttVO> dataList, String dataStream,int maxSize,Double minVal,String deviceCode){
    private void processMultipleValueDataStream(Map<String,Object> dataMap, String dataStream,int maxSize,Double minVal){
        // 筛选出当前数据流对应的数据
        Double value = Double.parseDouble(getValueByDataStream(dataList, dataStream));
        Double value = Double.parseDouble(getValueByDataStream(dataMap, dataStream));
        //如果最小值不为空且不为-1,获取到的值小于最小值则跳过不做处理
        if(Objects.nonNull(minVal)&&minVal!=-1&&value<minVal){
            return;
@@ -192,6 +184,7 @@
                RedisUtil.delZSetRange(dataStream,0,0);
            }
        }
        String deviceCode = getValueByDataStream(dataMap,ElongationMqttConstants.deviceName);
        RedisUtil.addZSet(dataStream+"."+deviceCode,System.currentTimeMillis(),value);
    }