From 9e0f10452784f64d9b059be6343ab29320f22cde Mon Sep 17 00:00:00 2001 From: tianyongbao Date: Sun, 19 Oct 2025 12:34:21 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9C=B0=E5=9B=BE=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../intc-iot/src/main/resources/bootstrap.yml | 9 -- .../controller/TdEngineController.java | 24 +++- .../intc/tdengine/mapper/TdEngineMapper.java | 12 ++ .../tdengine/service/TdEngineService.java | 116 ++++++++++++++++-- .../mapper/tdengine/TdEngineMapper.xml | 16 ++- 5 files changed, 155 insertions(+), 22 deletions(-) diff --git a/intc-modules/intc-iot/src/main/resources/bootstrap.yml b/intc-modules/intc-iot/src/main/resources/bootstrap.yml index a2bad30..7375f36 100644 --- a/intc-modules/intc-iot/src/main/resources/bootstrap.yml +++ b/intc-modules/intc-iot/src/main/resources/bootstrap.yml @@ -39,15 +39,6 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - -# 管理端点配置 -management: - health: - db: - enabled: false # 临时禁用数据库健康检查 - endpoint: - health: - show-details: always # 用于服务监控可在线查看日志,该配置用于生产环境 logging: file: diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java index f8fb096..8131807 100644 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/controller/TdEngineController.java @@ -44,12 +44,32 @@ public class TdEngineController extends BaseController return AjaxResult.error("数据列表不能为空"); } try { - tdEngineService.batchInsertDeviceSensorData(dataList); - return AjaxResult.success("成功插入 " + dataList.size() + " 条数据"); + int count = tdEngineService.batchInsertDeviceSensorData(dataList); + return AjaxResult.success("成功插入 " + count + " 条数据"); } catch (Exception e) { logger.error("批量插入数据失败", e); return AjaxResult.error("批量插入数据失败: " + e.getMessage()); } } + /** + * 根据设备ID获取历史轨迹(按间隔采样) + */ + @GetMapping("/trajectory/{deviceId}") + @ApiOperation(value = "获取设备历史轨迹", notes = "根据设备ID查询历史移动轨迹数据,按间隔采样返回指定数量的数据") + public AjaxResult getDeviceTrajectory( + @PathVariable("deviceId") String deviceId, + @RequestParam(value = "startTime", required = false) String startTime, + @RequestParam(value = "endTime", required = false) String endTime, + @RequestParam(value = "sampleCount", required = false, defaultValue = "10") Integer sampleCount) + { + try { + List trajectory = tdEngineService.getDeviceTrajectory(deviceId, startTime, endTime, sampleCount); + return AjaxResult.success(trajectory); + } catch (Exception e) { + logger.error("获取设备轨迹失败", e); + return AjaxResult.error("获取设备轨迹失败: " + e.getMessage()); + } + } + } diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java index c525b17..841885e 100644 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/mapper/TdEngineMapper.java @@ -59,5 +59,17 @@ public interface TdEngineMapper */ int batchInsertDeviceSensorData(@Param("dataList") List dataList); + /** + * 根据设备ID获取历史轨迹 + * + * @param deviceId 设备ID + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return 历史轨迹数据列表 + */ + List getDeviceTrajectory(@Param("deviceId") String deviceId, + @Param("startTime") String startTime, + @Param("endTime") String endTime); + } diff --git a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java index 8c0225f..5ca8268 100644 --- a/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java +++ b/intc-modules/intc-tdengine/src/main/java/com/intc/tdengine/service/TdEngineService.java @@ -2,29 +2,36 @@ package com.intc.tdengine.service; import com.intc.tdengine.domain.DeviceSensorData; import com.intc.tdengine.mapper.TdEngineMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Date; import java.util.List; -import java.util.Map; /** * @ClassName TdEngineService * @Author YaphetS * @Date 2023/4/17 17:17 * @Version 1.0 - * @Description TODO + * @Description TDEngine数据库服务 */ +@Slf4j @Service public class TdEngineService { @Resource private TdEngineMapper tdEngineMapper; public List getLastData() { - List list = new ArrayList<>(); - list = tdEngineMapper.getLastData(); - return list; + try { + return tdEngineMapper.getLastData(); + } catch (Exception e) { + log.error("获取最新数据失败", e); + return new ArrayList<>(); + } } /** @@ -33,7 +40,100 @@ public class TdEngineService { * @param dataList 数据列表 * @return 影响行数 */ - public void batchInsertDeviceSensorData(List dataList) { - tdEngineMapper.batchInsertDeviceSensorData(dataList); + @Transactional(rollbackFor = Exception.class) + public int batchInsertDeviceSensorData(List dataList) { + if (dataList == null || dataList.isEmpty()) { + log.warn("批量插入数据列表为空"); + return 0; + } + + try { + // 为空的时间字段赋值当前时间 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String currentTime = sdf.format(new Date()); + + for (DeviceSensorData data : dataList) { + if (!StringUtils.hasText(data.getTime())) { + data.setTime(currentTime); + } + if (!StringUtils.hasText(data.getCreateTime())) { + data.setCreateTime(currentTime); + } + + // 检查并创建设备对应的子表 + if (StringUtils.hasText(data.getDeviceId())) { + try { + tdEngineMapper.createTable(data); + log.debug("创建或确认设备表: t_{}", data.getDeviceId()); + } catch (Exception e) { + // 表已存在时会抛异常,忽略即可 + log.debug("设备表 t_{} 已存在或创建失败: {}", data.getDeviceId(), e.getMessage()); + } + } + } + + log.info("开始批量插入 {} 条数据", dataList.size()); + int result = tdEngineMapper.batchInsertDeviceSensorData(dataList); + log.info("批量插入成功,影响 {} 行", result); + return result; + } catch (Exception e) { + log.error("批量插入数据失败,数据量: {}", dataList.size(), e); + throw new RuntimeException("批量插入数据失败: " + e.getMessage(), e); + } + } + + /** + * 根据设备ID获取历史轨迹(按固定间隔采样) + * + * @param deviceId 设备ID + * @param startTime 开始时间 + * @param endTime 结束时间 + * @param sampleCount 采样数量(返回多少条数据) + * @return 历史轨迹数据列表 + */ + public List getDeviceTrajectory(String deviceId, String startTime, String endTime, Integer sampleCount) { + if (!StringUtils.hasText(deviceId)) { + log.warn("设备ID为空,无法查询轨迹"); + return new ArrayList<>(); + } + + // 设置默认采样数量为10 + if (sampleCount == null || sampleCount <= 0) { + sampleCount = 10; + } + + try { + log.info("查询设备 {} 的历史轨迹,时间范围: {} - {},采样数量: {}", deviceId, startTime, endTime, sampleCount); + + // 先查询所有数据 + List allData = tdEngineMapper.getDeviceTrajectory(deviceId, startTime, endTime); + int totalCount = allData.size(); + log.info("设备 {} 查询到 {} 条原始轨迹数据", deviceId, totalCount); + + // 如果数据少于等于采样数量,直接返回 + if (totalCount <= sampleCount) { + return allData; + } + + // 按固定间隔采样 + List sampledData = new ArrayList<>(); + double interval = (double) (totalCount - 1) / (sampleCount - 1); // (n-1)个间隔,n个点 + + for (int i = 0; i < sampleCount; i++) { + int index = (int) Math.round(i * interval); + // 确保索引不越界 + if (index >= totalCount) { + index = totalCount - 1; + } + sampledData.add(allData.get(index)); + } + + log.info("设备 {} 采样后返回 {} 条轨迹数据", deviceId, sampledData.size()); + return sampledData; + + } catch (Exception e) { + log.error("查询设备轨迹失败,设备ID: {}", deviceId, e); + return new ArrayList<>(); + } } } diff --git a/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml b/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml index b68f995..05f2737 100644 --- a/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml +++ b/intc-modules/intc-tdengine/src/main/resources/mapper/tdengine/TdEngineMapper.xml @@ -31,13 +31,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into - `bds`.t_#{data.deviceId} + bds.t_${data.deviceId} using bds.sensor_data tags(#{data.deviceId}) - (time, createTime, longitude, latitude) values (#{data.time}, ${data.createTime}, ${data.longitude}, ${data.latitude}) + (time, createTime, longitude, latitude) values (#{data.time}, #{data.createTime}, #{data.longitude}, #{data.latitude}) @@ -45,10 +45,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create table if not exists - `bds`.t_#{deviceId} + bds.t_${deviceId} using bds.sensor_data tags(#{deviceId}) + +