Преглед на файлове

feat(audio): 新增音频数据监测与分析功能

- 添加NoiseInfo实体类定义音频信息表结构
- 实现音频数据的分页查询和异常数据监测接口
- 提供按设备统计功率数据和功率趋势分析功能
- 添加获取设备最新监测数据和设备编码列表接口
- 集成MyBatis-Plus实现数据库操作和映射配置
- 支持按时间范围和阈值条件进行数据筛选查询
林仔 преди 2 месеца
родител
ревизия
e81f1344a4

+ 80 - 0
audio-service/src/main/java/com/zksy/audio/domain/NoiseInfo.java

@@ -0,0 +1,80 @@
+package com.zksy.audio.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 噪音信息表
+ * @TableName noise_info
+ */
+@TableName(value ="noise_info")
+@Data
+public class NoiseInfo implements Serializable {
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 设备编号
+     */
+    @TableField(value = "encode")
+    private String encode;
+
+    /**
+     * 功率值
+     */
+    @TableField(value = "power")
+    private Double power;
+
+    /**
+     * 增益值
+     */
+    @TableField(value = "gain")
+    private Double gain;
+
+    /**
+     * 特征值
+     */
+    @TableField(value = "rms")
+    private Integer rms;
+
+    /**
+     * 中心频率
+     */
+    @TableField(value = "center_frequency")
+    private Double centerFrequency;
+
+    /**
+     * 文件路径
+     */
+    @TableField(value = "filepath")
+    private String filepath;
+
+    /**
+     * 时间戳(格式:yyyy-MM-dd HH:mm:ss)
+     */
+    @TableField(value = "ts")
+    private String ts;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time")
+    private Date updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 18 - 0
audio-service/src/main/java/com/zksy/audio/mapper/NoiseInfoMapper.java

@@ -0,0 +1,18 @@
+package com.zksy.audio.mapper;
+
+import com.zksy.audio.domain.NoiseInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【noise_info(噪音信息表)】的数据库操作Mapper
+* @createDate 2026-01-15 10:25:10
+* @Entity com.zksy.audio.domain.NoiseInfo
+*/
+public interface NoiseInfoMapper extends BaseMapper<NoiseInfo> {
+
+}
+
+
+
+

+ 14 - 0
audio-service/src/main/java/com/zksy/audio/service/NoiseInfoService.java

@@ -0,0 +1,14 @@
+package com.zksy.audio.service;
+
+import com.zksy.audio.domain.NoiseInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【noise_info(噪音信息表)】的数据库操作Service
+* @createDate 2026-01-15 10:25:10
+*/
+public interface NoiseInfoService extends IService<NoiseInfo> {
+    NoiseInfo selectNoiseInfoByDeviceNo(String deviceNo);
+
+}

+ 29 - 0
audio-service/src/main/java/com/zksy/audio/service/impl/NoiseInfoServiceImpl.java

@@ -0,0 +1,29 @@
+package com.zksy.audio.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.audio.domain.NoiseInfo;
+import com.zksy.audio.service.NoiseInfoService;
+import com.zksy.audio.mapper.NoiseInfoMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【noise_info(噪音信息表)】的数据库操作Service实现
+* @createDate 2026-01-15 10:25:10
+*/
+@Service
+public class NoiseInfoServiceImpl extends ServiceImpl<NoiseInfoMapper, NoiseInfo>
+    implements NoiseInfoService{
+
+    @Override
+    public NoiseInfo selectNoiseInfoByDeviceNo(String deviceNo) {
+        return lambdaQuery().eq(NoiseInfo::getEncode, deviceNo)
+                .orderByDesc(NoiseInfo::getCreateTime)
+                .last("limit 1")
+                .one();
+    }
+}
+
+
+
+

+ 26 - 0
audio-service/src/main/resources/mapper/NoiseInfoMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.audio.mapper.NoiseInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.audio.domain.NoiseInfo">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="encode" column="encode" jdbcType="VARCHAR"/>
+            <result property="power" column="power" jdbcType="DOUBLE"/>
+            <result property="gain" column="gain" jdbcType="DOUBLE"/>
+            <result property="rms" column="rms" jdbcType="INTEGER"/>
+            <result property="centerFrequency" column="center_frequency" jdbcType="DOUBLE"/>
+            <result property="filepath" column="filepath" jdbcType="VARCHAR"/>
+            <result property="ts" column="ts" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,encode,power,
+        gain,rms,center_frequency,
+        filepath,ts,create_time,
+        update_time
+    </sql>
+</mapper>

+ 125 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/audio/NoiseInfoController.java

@@ -0,0 +1,125 @@
+package com.zksy.web.controller.base.audio;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.audio.domain.NoiseInfo;
+import com.zksy.base.audio.service.NoiseInfoService;
+import com.zksy.common.annotation.Anonymous;
+import com.zksy.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 音频数据分析与监测接口
+ */
+@RestController
+@RequestMapping("/api/audio/noise")
+@Api(tags = "音频数据分析与监测接口")
+@Anonymous
+public class NoiseInfoController {
+
+    @Autowired
+    private NoiseInfoService noiseInfoService;
+
+    /**
+     * 分页查询音频监测数据
+     */
+    @GetMapping("/page")
+    @ApiOperation("分页查询音频监测数据")
+    public AjaxResult queryPage(
+            @RequestParam(defaultValue = "1") Integer pageNum,
+            @RequestParam(defaultValue = "10") Integer pageSize,
+            @RequestParam(required = false) String encode,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime) {
+
+        try {
+            Page<NoiseInfo> page = new Page<>(pageNum, pageSize);
+            IPage<NoiseInfo> resultPage = noiseInfoService.queryPage(page, encode, startTime, endTime);
+            return AjaxResult.success("查询成功", resultPage);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 查询异常数据(功率超过阈值)
+     */
+    @GetMapping("/visualization/abnormal")
+    @ApiOperation("查询异常数据(功率超过阈值)")
+    public AjaxResult queryAbnormalData(
+            @RequestParam Double threshold,
+            @RequestParam String startTime,
+            @RequestParam String endTime,
+            @RequestParam(defaultValue = "1") Integer pageNum,
+            @RequestParam(defaultValue = "10") Integer pageSize) {
+
+        try {
+            Page<NoiseInfo> page = new Page<>(pageNum, pageSize);
+            IPage<NoiseInfo> resultPage = noiseInfoService.queryAbnormalData(page, threshold, startTime, endTime);
+            return AjaxResult.success("查询成功", resultPage);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/visualization/stat/device")
+    @ApiOperation("按设备统计功率数据")
+    public AjaxResult statPowerByDevice(
+            @RequestParam String startTime,
+            @RequestParam String endTime) {
+        try {
+            List<Map<String, Object>> data = noiseInfoService.statPowerByDevice(startTime, endTime);
+            return AjaxResult.success("统计成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/visualization/stat/trend")
+    @ApiOperation("按小时统计设备瞬时功率数据")
+    public AjaxResult statPowerTrendByHour(
+            @RequestParam String encode,
+            @RequestParam String startTime,
+            @RequestParam String endTime) {
+        try {
+            List<Map<String, Object>> data = noiseInfoService.statPowerTrendByHour(encode, startTime, endTime);
+            return AjaxResult.success("统计成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/visualization/latest")
+    @ApiOperation("查询指定设备最新的数据")
+    public AjaxResult getLatestDataByDevice(@RequestParam String encode) {
+        try {
+            NoiseInfo data = noiseInfoService.getLatestDataByDevice(encode);
+            if (data == null) {
+                return AjaxResult.warn("未查询到该设备的最新数据", null);
+            }
+            return AjaxResult.success("查询成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+
+    @GetMapping("/visualization/devices")
+    @ApiOperation("查询所有设备编码")
+    public AjaxResult getAllDeviceCodes() {
+        try {
+            List<String> data = noiseInfoService.getAllDeviceCodes();
+            return AjaxResult.success("查询成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+}

+ 80 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/audio/domain/NoiseInfo.java

@@ -0,0 +1,80 @@
+package com.zksy.base.audio.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 音频信息表
+ * @TableName noise_info
+ */
+@TableName(value ="noise_info")
+@Data
+public class NoiseInfo implements Serializable {
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 设备编号
+     */
+    @TableField(value = "encode")
+    private String encode;
+
+    /**
+     * 功率值
+     */
+    @TableField(value = "power")
+    private Double power;
+
+    /**
+     * 增益值
+     */
+    @TableField(value = "gain")
+    private Double gain;
+
+    /**
+     * 特征值
+     */
+    @TableField(value = "rms")
+    private Integer rms;
+
+    /**
+     * 中心频率
+     */
+    @TableField(value = "center_frequency")
+    private Double centerFrequency;
+
+    /**
+     * 文件路径
+     */
+    @TableField(value = "filepath")
+    private String filepath;
+
+    /**
+     * 时间戳(格式:yyyy-MM-dd HH:mm:ss)
+     */
+    @TableField(value = "ts")
+    private String ts;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "update_time")
+    private LocalDateTime updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 64 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/audio/mapper/NoiseInfoMapper.java

@@ -0,0 +1,64 @@
+package com.zksy.base.audio.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.audio.domain.NoiseInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author Administrator
+* @description 针对表【noise_info(音频信息表)】的数据库操作Mapper
+* @createDate 2026-01-16 15:23:32
+* @Entity com.zksy.base.audio.domain.NoiseInfo
+*/
+public interface NoiseInfoMapper extends BaseMapper<NoiseInfo> {
+    /**
+     * 按设备分组统计功率平均值
+     */
+    @Select("SELECT encode, AVG(power) as avg_power, COUNT(*) as data_count " +
+            "FROM noise_info " +
+            "WHERE ts BETWEEN #{startTime} AND #{endTime} " +
+            "GROUP BY encode")
+    List<Map<String, Object>> statPowerByDevice(@Param("startTime") String startTime,
+                                                @Param("endTime") String endTime);
+
+    /**
+     * 按时间区间统计功率趋势(按小时)
+     */
+    @Select("SELECT DATE_FORMAT(ts, '%Y-%m-%d %H:00:00') as hour_time, " +
+            "AVG(power) as avg_power, MAX(power) as max_power, MIN(power) as min_power " +
+            "FROM noise_info " +
+            "WHERE encode = #{encode} AND ts BETWEEN #{startTime} AND #{endTime} " +
+            "GROUP BY hour_time ORDER BY hour_time")
+    List<Map<String, Object>> statPowerTrendByHour(@Param("encode") String encode,
+                                                   @Param("startTime") String startTime,
+                                                   @Param("endTime") String endTime);
+
+    /**
+     * 查询异常数据(功率超过阈值)
+     */
+    @Select("SELECT * FROM noise_info " +
+            "WHERE power > #{threshold} AND ts BETWEEN #{startTime} AND #{endTime} " +
+            "ORDER BY ts DESC")
+    IPage<NoiseInfo> queryAbnormalData(Page<NoiseInfo> page,
+                                       @Param("threshold") Double threshold,
+                                       @Param("startTime") String startTime,
+                                       @Param("endTime") String endTime);
+
+    /**
+     * 获取设备最新数据
+     */
+    @Select("SELECT * FROM noise_info " +
+            "WHERE encode = #{encode} " +
+            "ORDER BY ts DESC LIMIT 1")
+    NoiseInfo getLatestDataByDevice(@Param("encode") String encode);
+}
+
+
+
+

+ 46 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/audio/service/NoiseInfoService.java

@@ -0,0 +1,46 @@
+package com.zksy.base.audio.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.audio.domain.NoiseInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author Administrator
+* @description 针对表【noise_info(音频信息表)】的数据库操作Service
+* @createDate 2026-01-16 15:23:32
+*/
+public interface NoiseInfoService extends IService<NoiseInfo> {
+    /**
+     * 分页查询音频数据
+     */
+    IPage<NoiseInfo> queryPage(Page<NoiseInfo> page, String encode, String startTime, String endTime);
+
+    /**
+     * 按设备统计功率数据
+     */
+    List<Map<String, Object>> statPowerByDevice(String startTime, String endTime);
+
+    /**
+     * 按小时统计功率趋势
+     */
+    List<Map<String, Object>> statPowerTrendByHour(String encode, String startTime, String endTime);
+
+    /**
+     * 查询异常数据
+     */
+    IPage<NoiseInfo> queryAbnormalData(Page<NoiseInfo> page, Double threshold, String startTime, String endTime);
+
+    /**
+     * 获取设备最新监测数据
+     */
+    NoiseInfo getLatestDataByDevice(String encode);
+
+    /**
+     * 获取所有设备编号
+     */
+    List<String> getAllDeviceCodes();
+}

+ 75 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/audio/service/impl/NoiseInfoServiceImpl.java

@@ -0,0 +1,75 @@
+package com.zksy.base.audio.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.base.audio.domain.NoiseInfo;
+import com.zksy.base.audio.service.NoiseInfoService;
+import com.zksy.base.audio.mapper.NoiseInfoMapper;
+import com.zksy.common.utils.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* @author Administrator
+* @description 针对表【noise_info(音频信息表)】的数据库操作Service实现
+* @createDate 2026-01-16 15:23:32
+*/
+@Service
+public class NoiseInfoServiceImpl extends ServiceImpl<NoiseInfoMapper, NoiseInfo>
+    implements NoiseInfoService{
+    @Override
+    public IPage<NoiseInfo> queryPage(Page<NoiseInfo> page, String encode, String startTime, String endTime) {
+        LambdaQueryWrapper<NoiseInfo> queryWrapper = new LambdaQueryWrapper<>();
+        // 设备编号过滤
+        if (StringUtils.hasText(encode)) {
+            queryWrapper.eq(NoiseInfo::getEncode, encode);
+        }
+        // 时间范围过滤
+        if (StringUtils.hasText(startTime) && StringUtils.hasText(endTime)) {
+            queryWrapper.between(NoiseInfo::getTs, startTime, endTime);
+        }
+        // 按时间倒序
+        queryWrapper.orderByDesc(NoiseInfo::getTs);
+        return baseMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public List<Map<String, Object>> statPowerByDevice(String startTime, String endTime) {
+        return baseMapper.statPowerByDevice(startTime, endTime);
+    }
+
+    @Override
+    public List<Map<String, Object>> statPowerTrendByHour(String encode, String startTime, String endTime) {
+        return baseMapper.statPowerTrendByHour(encode, startTime, endTime);
+    }
+
+    @Override
+    public IPage<NoiseInfo> queryAbnormalData(Page<NoiseInfo> page, Double threshold, String startTime, String endTime) {
+        return baseMapper.queryAbnormalData(page, threshold, startTime, endTime);
+    }
+
+    @Override
+    public NoiseInfo getLatestDataByDevice(String encode) {
+        if (!StringUtils.hasText(encode)) {
+            return null;
+        }
+        return baseMapper.getLatestDataByDevice(encode);
+    }
+
+    @Override
+    public List<String> getAllDeviceCodes() {
+        LambdaQueryWrapper<NoiseInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(NoiseInfo::getEncode).groupBy(NoiseInfo::getEncode);
+        return baseMapper.selectObjs(queryWrapper).stream()
+                .map(obj -> (String) obj).collect(Collectors.toList());
+    }
+}
+
+
+
+

+ 26 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/base/audio/NoiseInfoMapper.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zksy.base.audio.mapper.NoiseInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.base.audio.domain.NoiseInfo">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="encode" column="encode" jdbcType="VARCHAR"/>
+            <result property="power" column="power" jdbcType="DOUBLE"/>
+            <result property="gain" column="gain" jdbcType="DOUBLE"/>
+            <result property="rms" column="rms" jdbcType="INTEGER"/>
+            <result property="centerFrequency" column="center_frequency" jdbcType="DOUBLE"/>
+            <result property="filepath" column="filepath" jdbcType="VARCHAR"/>
+            <result property="ts" column="ts" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,encode,power,
+        gain,rms,center_frequency,
+        filepath,ts,create_time,
+        update_time
+    </sql>
+</mapper>