@Service@Slf4jpublic class InfluxQueryService { @Autowired private ObjectMapper objectMapper; @Autowired private InfluxRepository influxRepository; /** * 监测数据查询 * * @param start 起始范围时间点 * @param end 结束范围时间点 * @param every 时间片 * @param filterList 筛选条件集合(集合内元素例:pointName>csd-001) * @param clazz 去除数据时map对象映射的类对象 * @param sort 时间字段排序规则 */ public <T> List<T> findMonitoringDataInFluxDB( String start, String end, String every, List<String> filterList, Class<? extends T> clazz, boolean sort) { // mainTag和 subTag需要特殊处理,将逗号替换成"|"正则表达 filterList = filterList.stream() .map(filter -> StringUtils.replace(filter, ",", "|")) .collect(Collectors.toList()); SearchParams<T> searchParams = new SearchParams<>(); searchParams.setStart(start); searchParams.setEnd(end); searchParams.setEvery(every); searchParams.setFilterList(filterList); searchParams.setMapClazz(clazz); searchParams.setSortRule(sort); List<FluxTable> fluxTableList = influxRepository.findMonitoringData(searchParams); return mapFluxData(fluxTableList, clazz); } /** * 解析原始数据 * * @param data 原始数据 */ public <T> List<T> mapFluxData(List<FluxTable> data, Class<? extends T> clazz) { List<T> result = new LinkedList<>(); for (FluxTable ft : data) { List<FluxRecord> records = ft.getRecords(); for (FluxRecord rc : records) { try { T originData = objectMapper.readValue(objectMapper.writeValueAsString(rc.getValues()), clazz); result.add(originData); } catch (JsonProcessingException e) { log.error("influx查询数据转换为DTO时解析出错"); throw new RuntimeException(e); } } } return result; }}业务Service构造查询条件,并提供相应的:查询结果实体 => 实体之间的转换方法
/** * 设备指标监测值 * * @param start 起始范围时间点 * @param end 结束范围时间点 * @param every 时间片 * @param tagName 设备id */ public List<MonDataDTO> getMonitoringData( String start, String end, String every, String tagName) { // 筛选条件 List<String> filterList = new ArrayList<>(); filterList.add("_measurement> == \"monitoring_data\""); filterList.add("tagName> =~/" + tagName + "/"); // 处理时间参数 String startDate; String endDate; LocalDate startLocalDate = LocalDate.parse(start).plusDays(-1); // 一天内的数据 (开始时间的前一天的23点,到结束时间的23点,时区原因查询时时间减去8小时) // 跨天的数据(开始和结束时间减8小时) String endTime = (start.equals(end) ? "T15:00:00Z" : "T16:00:00Z"); startDate = startLocalDate + endTime; endDate = end + endTime; List<MonDataDTO> dataInFluxDB = influxQueryService.findMonitoringDataInFluxDB( startDate, endDate, every, filterList, MonDataDTO.class, false); return dataInFluxDB; }
经验总结扩展阅读
- 2023年10月安装柱子黄道吉日 2023年10月哪天适合安装柱子
- 爱情树怎么养的
- Deepin系统navicat15安装
- 2023年农历九月初八安装房门吉日 2023年10月22日适合安装房门吗
- 2023年10月22日安装柱子黄道吉日 2023年10月22日安装柱子吉日一览表
- 2023年10月22日安装门户行吗 2023年10月22日适合安装门户吗
- 2023年农历九月初八宜安装门框吗 2023年10月22日安装门框黄道吉日
- 2023年农历九月初八安装家电吉日 2023年10月22日适合安装家电吗
- 2023年10月22日安装窗帘黄道吉日 2023年10月22日安装窗帘行吗
- 2023年10月22日是安装机器的黄道吉日吗 2023年10月22日安装机器好吗