@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; }
推荐阅读
- Deepin系统navicat15安装
- 手把手教你玩转 Gitea|使用 Docker 安装 Gitea
- Docker搭建kafka及监控
- VMware安装Win11+WSA子系统和使用教程
- 大华海康NVR录像JAVA下载及WEB播放
- Linux make编译
- 为什么下载不了小红书 小红书为什么下载不了
- 三星GT-N7102救砖步骤
- 如何安装iis软件 如何安装IIS?
- 怎样安装iis组件 怎样安装IIS