Explorar el Código

feat(radar): 新增平升雷达流量计服务模块

- 创建雷达应用主类并配置包扫描路径
- 定义雷达数据实体类包含系统识别码、设备编码、流量参数等字段
- 实现雷达数据控制器提供分页查询、统计分析、异常检测等功能接口
- 开发数据访问层包含按设备统计、流量趋势分析、异常数据查询等方法
- 添加雷达数据服务接口及其实现类处理业务逻辑
- 配置MyBatis映射文件定义基础查询和统计SQL语句
林仔 hace 2 meses
padre
commit
e36be9b300

+ 153 - 0
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/base/radar/RadarDataController.java

@@ -0,0 +1,153 @@
+package com.zksy.web.controller.base.radar;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.radar.domain.RadarData;
+import com.zksy.base.radar.service.RadarDataService;
+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.format.annotation.DateTimeFormat;
+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.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 雷达流量计数据分析与监测接口
+ */
+@RestController
+@RequestMapping("/api/radar/data")
+@Api(tags = "雷达流量计数据接口")
+@Anonymous
+public class RadarDataController {
+
+    @Autowired
+    private RadarDataService radarDataService;
+
+    /**
+     * 分页查询雷达流量计数据
+     */
+    @GetMapping("/page")
+    @ApiOperation("分页查询雷达流量计数据")
+    public AjaxResult queryPage(
+            @RequestParam(defaultValue = "1") Integer pageNum,
+            @RequestParam(defaultValue = "10") Integer pageSize,
+            @RequestParam(required = false) String deviceCode,
+            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
+
+        try {
+            Page<RadarData> page = new Page<>(pageNum, pageSize);
+            IPage<RadarData> resultPage = radarDataService.queryPage(page, deviceCode, startTime, endTime);
+            return AjaxResult.success("查询成功", resultPage);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 按设备统计流速/水位数据
+     */
+    @GetMapping("/visualization/stat/device")
+    @ApiOperation("按设备统计流速/水位数据")
+    public AjaxResult statRadarByDevice(
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
+
+        try {
+            List<Map<String, Object>> data = radarDataService.statRadarByDevice(startTime, endTime);
+            return AjaxResult.success("统计成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 按小时统计设备瞬时流量趋势
+     */
+    @GetMapping("/visualization/stat/trend")
+    @ApiOperation("按小时统计设备瞬时流量趋势")
+    public AjaxResult statFlowTrendByHour(
+            @RequestParam String deviceCode,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime) {
+
+        try {
+            List<Map<String, Object>> data = radarDataService.statFlowTrendByHour(deviceCode, startTime, endTime);
+            return AjaxResult.success("统计成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("统计失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 查询异常数据(流速/水位超过阈值)
+     */
+    @GetMapping("/visualization/abnormal")
+    @ApiOperation("查询异常数据(流速/水位超过阈值)")
+    public AjaxResult queryAbnormalData(
+            @RequestParam Double speedThreshold,
+            @RequestParam Double levelThreshold,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
+            @RequestParam(defaultValue = "1") Integer pageNum,
+            @RequestParam(defaultValue = "10") Integer pageSize) {
+
+        try {
+            Page<RadarData> page = new Page<>(pageNum, pageSize);
+            IPage<RadarData> resultPage = radarDataService.queryAbnormalData(page, speedThreshold, levelThreshold, startTime, endTime);
+            return AjaxResult.success("查询成功", resultPage);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 获取设备最新监测数据
+     */
+    @GetMapping("/latest")
+    @ApiOperation("获取设备最新监测数据")
+    public AjaxResult getLatestDataByDevice(@RequestParam String deviceCode) {
+        try {
+            RadarData data = radarDataService.getLatestDataByDevice(deviceCode);
+            if (data == null) {
+                return AjaxResult.warn("未查询到该设备的最新数据", null);
+            }
+            return AjaxResult.success("查询成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 获取所有雷达设备编码
+     */
+    @GetMapping("/devices")
+    @ApiOperation("获取所有雷达设备编码")
+    public AjaxResult getAllDeviceCodes() {
+        try {
+            List<String> data = radarDataService.getAllDeviceCodes();
+            return AjaxResult.success("查询成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+    //根据设备编码分组查询
+    @GetMapping("/group")
+    @ApiOperation("根据设备编码分组查询")
+    public AjaxResult getDeviceGroup() {
+        try {
+            List<String> data = radarDataService.getDeviceGroup();
+            return AjaxResult.success("查询成功", data);
+        } catch (Exception e) {
+            return AjaxResult.error("查询失败:" + e.getMessage());
+        }
+    }
+}

+ 188 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/radar/domain/RadarData.java

@@ -0,0 +1,188 @@
+package com.zksy.base.radar.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 radar_data
+ */
+@TableName(value ="radar_data")
+@Data
+public class RadarData implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private String id;
+
+    /**
+     * 系统识别码
+     */
+    @TableField(value = "system_identifier")
+    private String systemIdentifier;
+
+    /**
+     * 整帧长度(字节数)
+     */
+    @TableField(value = "frame_length")
+    private String frameLength;
+
+    /**
+     * 包序号
+     */
+    @TableField(value = "packet_sequence")
+    private String packetSequence;
+
+    /**
+     * 数据类型(0x31=上报,0x34=结束)
+     */
+    @TableField(value = "data_type")
+    private String dataType;
+
+    /**
+     * 源地址(BCD格式)
+     */
+    @TableField(value = "source_addr")
+    private String sourceAddr;
+
+    /**
+     * 目的地址长度
+     */
+    @TableField(value = "dest_addr_length")
+    private String destAddrLength;
+
+    /**
+     * 目的地址(BCD格式)
+     */
+    @TableField(value = "dest_addr")
+    private String destAddr;
+
+    /**
+     * 设备编码
+     */
+    @TableField(value = "device_code")
+    private String deviceCode;
+
+    /**
+     * 功能码
+     */
+    @TableField(value = "function_code")
+    private String functionCode;
+
+    /**
+     * 保留1
+     */
+    @TableField(value = "reserve1")
+    private String reserve1;
+
+    /**
+     * 记录数量
+     */
+    @TableField(value = "record_count")
+    private String recordCount;
+
+    /**
+     * 记录格式(按位判断字段)
+     */
+    @TableField(value = "record_format")
+    private String recordFormat;
+
+    /**
+     * 电源电压(V)
+     */
+    @TableField(value = "power_voltage")
+    private String powerVoltage;
+
+    /**
+     * 现场状态
+     */
+    @TableField(value = "field_status")
+    private String fieldStatus;
+
+    /**
+     * 是否最后一包(现场状态D3位)
+     */
+    @TableField(value = "is_last_packet")
+    private Integer isLastPacket;
+
+    /**
+     * 协议版本
+     */
+    @TableField(value = "protocol_version")
+    private String protocolVersion;
+
+    /**
+     * 参数版本
+     */
+    @TableField(value = "param_version")
+    private String paramVersion;
+
+    /**
+     * 信号质量
+     */
+    @TableField(value = "signal_quality")
+    private String signalQuality;
+
+    /**
+     * 保留3
+     */
+    @TableField(value = "reserve3")
+    private String reserve3;
+
+    /**
+     * 时间戳(2000-1-1开始)
+     */
+    @TableField(value = "timestamp_since")
+    private LocalDateTime timestampSince;
+
+    /**
+     * 累计流量
+     */
+    @TableField(value = "meter1_net_total")
+    private String meter1NetTotal;
+
+    /**
+     * 瞬时流量
+     */
+    @TableField(value = "meter1_instant_flow")
+    private String meter1InstantFlow;
+
+    /**
+     * 流速
+     */
+    @TableField(value = "flow_speed")
+    private String flowSpeed;
+
+    /**
+     * 水位
+     */
+    @TableField(value = "water_level")
+    private String waterLevel;
+
+    /**
+     * 开关量
+     */
+    @TableField(value = "switch_value")
+    private String switchValue;
+
+    /**
+     * 历史记录详情(多字段拼接)
+     */
+    @TableField(value = "history_records")
+    private String historyRecords;
+
+    /**
+     * 数据插入时间
+     */
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 72 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/radar/mapper/RadarDataMapper.java

@@ -0,0 +1,72 @@
+package com.zksy.base.radar.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.radar.domain.RadarData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author Administrator
+* @description 针对表【radar_data(平升雷达流量计数据表)】的数据库操作Mapper
+* @createDate 2026-01-16 15:37:38
+* @Entity com.zksy.base.radar.domain.RadarData
+*/
+public interface RadarDataMapper extends BaseMapper<RadarData> {
+    /**
+     * 按设备分组统计关键指标(平均流速、平均水位)
+     */
+    @Select("SELECT device_code, " +
+            "AVG(CAST(flow_speed AS DECIMAL(10,2))) as avg_flow_speed, " +
+            "AVG(CAST(water_level AS DECIMAL(10,2))) as avg_water_level, " +
+            "COUNT(*) as data_count " +
+            "FROM radar_data " +
+            "WHERE create_time BETWEEN #{startTime} AND #{endTime} " +
+            "GROUP BY device_code")
+    List<Map<String, Object>> statRadarByDevice(@Param("startTime") LocalDateTime startTime,
+                                                @Param("endTime") LocalDateTime endTime);
+
+    /**
+     * 按小时统计设备流量趋势
+     */
+    @Select("SELECT DATE_FORMAT(create_time, '%Y-%m-%d %H:00:00') as hour_time, " +
+            "AVG(CAST(meter1_instant_flow AS DECIMAL(10,2))) as avg_instant_flow, " +
+            "MAX(CAST(meter1_instant_flow AS DECIMAL(10,2))) as max_instant_flow, " +
+            "MIN(CAST(meter1_instant_flow AS DECIMAL(10,2))) as min_instant_flow " +
+            "FROM radar_data " +
+            "WHERE device_code = #{deviceCode} AND create_time BETWEEN #{startTime} AND #{endTime} " +
+            "GROUP BY hour_time ORDER BY hour_time")
+    List<Map<String, Object>> statFlowTrendByHour(@Param("deviceCode") String deviceCode,
+                                                  @Param("startTime") LocalDateTime startTime,
+                                                  @Param("endTime") LocalDateTime endTime);
+
+    /**
+     * 查询异常数据(流速/水位超过阈值)
+     */
+    @Select("SELECT * FROM radar_data " +
+            "WHERE (CAST(flow_speed AS DECIMAL(10,2)) > #{speedThreshold} OR CAST(water_level AS DECIMAL(10,2)) > #{levelThreshold}) " +
+            "AND create_time BETWEEN #{startTime} AND #{endTime} " +
+            "ORDER BY create_time DESC")
+    IPage<RadarData> queryAbnormalData(Page<RadarData> page,
+                                       @Param("speedThreshold") Double speedThreshold,
+                                       @Param("levelThreshold") Double levelThreshold,
+                                       @Param("startTime") LocalDateTime startTime,
+                                       @Param("endTime") LocalDateTime endTime);
+
+    /**
+     * 获取设备最新数据
+     */
+    @Select("SELECT * FROM radar_data " +
+            "WHERE device_code = #{deviceCode} " +
+            "ORDER BY create_time DESC LIMIT 1")
+    RadarData getLatestDataByDevice(@Param("deviceCode") String deviceCode);
+}
+
+
+
+

+ 50 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/radar/service/RadarDataService.java

@@ -0,0 +1,50 @@
+package com.zksy.base.radar.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.zksy.base.radar.domain.RadarData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author Administrator
+* @description 针对表【radar_data(平升雷达流量计数据表)】的数据库操作Service
+* @createDate 2026-01-16 15:37:38
+*/
+public interface RadarDataService extends IService<RadarData> {
+
+    /**
+     * 分页查询雷达流量计数据
+     */
+    IPage<RadarData> queryPage(Page<RadarData> page, String deviceCode, LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 按设备统计流速/水位数据
+     */
+    List<Map<String, Object>> statRadarByDevice(LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 按小时统计瞬时流量趋势
+     */
+    List<Map<String, Object>> statFlowTrendByHour(String deviceCode, LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 查询异常数据(流速/水位超阈值)
+     */
+    IPage<RadarData> queryAbnormalData(Page<RadarData> page, Double speedThreshold, Double levelThreshold,
+                                       LocalDateTime startTime, LocalDateTime endTime);
+
+    /**
+     * 获取设备最新监测数据
+     */
+    RadarData getLatestDataByDevice(String deviceCode);
+
+    /**
+     * 获取所有设备编码
+     */
+    List<String> getAllDeviceCodes();
+    List<String> getDeviceGroup();
+}

+ 90 - 0
pipe-network-service/zksy-system/src/main/java/com/zksy/base/radar/service/impl/RadarDataServiceImpl.java

@@ -0,0 +1,90 @@
+package com.zksy.base.radar.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.pressure.domain.FirefightingPressure;
+import com.zksy.base.radar.domain.RadarData;
+import com.zksy.base.radar.service.RadarDataService;
+import com.zksy.base.radar.mapper.RadarDataMapper;
+import com.zksy.common.utils.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* @author Administrator
+* @description 针对表【radar_data(平升雷达流量计数据表)】的数据库操作Service实现
+* @createDate 2026-01-16 15:37:38
+*/
+@Service
+public class RadarDataServiceImpl extends ServiceImpl<RadarDataMapper, RadarData>
+    implements RadarDataService{
+    @Override
+    public IPage<RadarData> queryPage(Page<RadarData> page, String deviceCode, LocalDateTime startTime, LocalDateTime endTime) {
+        LambdaQueryWrapper<RadarData> queryWrapper = new LambdaQueryWrapper<>();
+        // 设备编码过滤
+        if (StringUtils.hasText(deviceCode)) {
+            queryWrapper.eq(RadarData::getDeviceCode, deviceCode);
+        }
+        // 时间范围过滤
+        if (startTime != null && endTime != null) {
+            queryWrapper.between(RadarData::getCreateTime, startTime, endTime);
+        }
+        // 按创建时间倒序
+        queryWrapper.orderByDesc(RadarData::getCreateTime);
+        return baseMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public List<Map<String, Object>> statRadarByDevice(LocalDateTime startTime, LocalDateTime endTime) {
+        return baseMapper.statRadarByDevice(startTime, endTime);
+    }
+
+    @Override
+    public List<Map<String, Object>> statFlowTrendByHour(String deviceCode, LocalDateTime startTime, LocalDateTime endTime) {
+        return baseMapper.statFlowTrendByHour(deviceCode, startTime, endTime);
+    }
+
+    @Override
+    public IPage<RadarData> queryAbnormalData(Page<RadarData> page, Double speedThreshold, Double levelThreshold,
+                                              LocalDateTime startTime, LocalDateTime endTime) {
+        return baseMapper.queryAbnormalData(page, speedThreshold, levelThreshold, startTime, endTime);
+    }
+
+    @Override
+    public RadarData getLatestDataByDevice(String deviceCode) {
+        if (!StringUtils.hasText(deviceCode)) {
+            return null;
+        }
+        return baseMapper.getLatestDataByDevice(deviceCode);
+    }
+
+    @Override
+    public List<String> getAllDeviceCodes() {
+        LambdaQueryWrapper<RadarData> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(RadarData::getDeviceCode).groupBy(RadarData::getDeviceCode);
+        return baseMapper.selectObjs(queryWrapper).stream()
+                .map(obj -> (String) obj).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<String> getDeviceGroup() {
+        return lambdaQuery()
+                .select(RadarData::getDeviceCode)
+                .groupBy(RadarData::getDeviceCode)
+                .list()
+                .stream()
+                .map(RadarData::getDeviceCode)
+                .map(String::valueOf)
+                .collect(Collectors.toList());
+    }
+}
+
+
+
+

+ 50 - 0
pipe-network-service/zksy-system/src/main/resources/mapper/base/radar/RadarDataMapper.xml

@@ -0,0 +1,50 @@
+<?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.radar.mapper.RadarDataMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.base.radar.domain.RadarData">
+            <id property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="systemIdentifier" column="system_identifier" jdbcType="VARCHAR"/>
+            <result property="frameLength" column="frame_length" jdbcType="VARCHAR"/>
+            <result property="packetSequence" column="packet_sequence" jdbcType="VARCHAR"/>
+            <result property="dataType" column="data_type" jdbcType="VARCHAR"/>
+            <result property="sourceAddr" column="source_addr" jdbcType="VARCHAR"/>
+            <result property="destAddrLength" column="dest_addr_length" jdbcType="VARCHAR"/>
+            <result property="destAddr" column="dest_addr" jdbcType="VARCHAR"/>
+            <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+            <result property="functionCode" column="function_code" jdbcType="VARCHAR"/>
+            <result property="reserve1" column="reserve1" jdbcType="VARCHAR"/>
+            <result property="recordCount" column="record_count" jdbcType="VARCHAR"/>
+            <result property="recordFormat" column="record_format" jdbcType="VARCHAR"/>
+            <result property="powerVoltage" column="power_voltage" jdbcType="VARCHAR"/>
+            <result property="fieldStatus" column="field_status" jdbcType="VARCHAR"/>
+            <result property="isLastPacket" column="is_last_packet" jdbcType="TINYINT"/>
+            <result property="protocolVersion" column="protocol_version" jdbcType="VARCHAR"/>
+            <result property="paramVersion" column="param_version" jdbcType="VARCHAR"/>
+            <result property="signalQuality" column="signal_quality" jdbcType="VARCHAR"/>
+            <result property="reserve3" column="reserve3" jdbcType="VARCHAR"/>
+            <result property="timestampSince" column="timestamp_since" jdbcType="TIMESTAMP"/>
+            <result property="meter1NetTotal" column="meter1_net_total" jdbcType="VARCHAR"/>
+            <result property="meter1InstantFlow" column="meter1_instant_flow" jdbcType="VARCHAR"/>
+            <result property="flowSpeed" column="flow_speed" jdbcType="VARCHAR"/>
+            <result property="waterLevel" column="water_level" jdbcType="VARCHAR"/>
+            <result property="switchValue" column="switch_value" jdbcType="VARCHAR"/>
+            <result property="historyRecords" column="history_records" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,system_identifier,frame_length,
+        packet_sequence,data_type,source_addr,
+        dest_addr_length,dest_addr,device_code,
+        function_code,reserve1,record_count,
+        record_format,power_voltage,field_status,
+        is_last_packet,protocol_version,param_version,
+        signal_quality,reserve3,timestamp_since,
+        meter1_net_total,meter1_instant_flow,flow_speed,
+        water_level,switch_value,history_records,
+        create_time
+    </sql>
+</mapper>

+ 26 - 0
radar-service/src/main/java/com/zksy/radar/RadarApplication.java

@@ -0,0 +1,26 @@
+package com.zksy.radar;
+
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@MapperScan({
+        "com.zksy.radar.mapper",
+        "com.zksy.base.mapper",
+        "com.zksy.system.mapper"
+})
+@SpringBootApplication(scanBasePackages = {
+        "com.zksy.radar",
+        "com.zksy.api",
+        "com.zksy.base.service",
+        "com.zksy.system.service",
+        "com.zksy.common",
+        "com.zksy.utils"
+})
+public class RadarApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(RadarApplication.class, args);
+        System.out.println("平升雷达流量计服务启动成功");
+    }
+}

+ 190 - 0
radar-service/src/main/java/com/zksy/radar/domain/RadarData.java

@@ -0,0 +1,190 @@
+package com.zksy.radar.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.LocalDate;
+import java.time.LocalDateTime;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 平升雷达流量计数据表
+ * @TableName radar_data
+ */
+@TableName(value ="radar_data")
+@Data
+public class RadarData implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /**
+     * 系统识别码
+     */
+    @TableField(value = "system_identifier")
+    private String systemIdentifier;
+
+    /**
+     * 整帧长度(字节数)
+     */
+    @TableField(value = "frame_length")
+    private String frameLength;
+
+    /**
+     * 包序号
+     */
+    @TableField(value = "packet_sequence")
+    private String packetSequence;
+
+    /**
+     * 数据类型(0x31=上报,0x34=结束)
+     */
+    @TableField(value = "data_type")
+    private String dataType;
+
+    /**
+     * 源地址(BCD格式)
+     */
+    @TableField(value = "source_addr")
+    private String sourceAddr;
+
+    /**
+     * 目的地址长度
+     */
+    @TableField(value = "dest_addr_length")
+    private String destAddrLength;
+
+    /**
+     * 目的地址(BCD格式)
+     */
+    @TableField(value = "dest_addr")
+    private String destAddr;
+
+    /**
+     * 设备编码
+     */
+    @TableField(value = "device_code")
+    private String deviceCode;
+
+    /**
+     * 功能码
+     */
+    @TableField(value = "function_code")
+    private String functionCode;
+
+    /**
+     * 保留1
+     */
+    @TableField(value = "reserve1")
+    private String reserve1;
+
+    /**
+     * 记录数量
+     */
+    @TableField(value = "record_count")
+    private String recordCount;
+
+    /**
+     * 记录格式(按位判断字段)
+     */
+    @TableField(value = "record_format")
+    private String recordFormat;
+
+    /**
+     * 电源电压(V)
+     */
+    @TableField(value = "power_voltage")
+    private String powerVoltage;
+
+    /**
+     * 现场状态
+     */
+    @TableField(value = "field_status")
+    private String fieldStatus;
+
+    /**
+     * 是否最后一包(现场状态D3位)
+     */
+    @TableField(value = "is_last_packet")
+    private Boolean isLastPacket;
+
+    /**
+     * 协议版本
+     */
+    @TableField(value = "protocol_version")
+    private String protocolVersion;
+
+    /**
+     * 参数版本
+     */
+    @TableField(value = "param_version")
+    private String paramVersion;
+
+    /**
+     * 信号质量
+     */
+    @TableField(value = "signal_quality")
+    private String signalQuality;
+
+    /**
+     * 保留3
+     */
+    @TableField(value = "reserve3")
+    private String reserve3;
+
+    /**
+     * 时间戳(2000-1-1开始)
+     */
+    @TableField(value = "timestamp_since")
+    private LocalDateTime timestampSince;
+
+    /**
+     * 累计流量
+     */
+    @TableField(value = "meter1_net_total")
+    private String meter1NetTotal;
+
+    /**
+     * 瞬时流量
+     */
+    @TableField(value = "meter1_instant_flow")
+    private String meter1InstantFlow;
+
+    /**
+     * 流速
+     */
+    @TableField(value = "flow_speed")
+    private String flowSpeed;
+
+    /**
+     * 水位
+     */
+    @TableField(value = "water_level")
+    private String waterLevel;
+
+    /**
+     * 开关量
+     */
+    @TableField(value = "switch_value")
+    private String switchValue;
+
+    /**
+     * 历史记录详情(多字段拼接)
+     */
+    @TableField(value = "history_records")
+    private String historyRecords;
+
+    /**
+     * 数据插入时间
+     */
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 18 - 0
radar-service/src/main/java/com/zksy/radar/mapper/RadarDataMapper.java

@@ -0,0 +1,18 @@
+package com.zksy.radar.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zksy.radar.domain.RadarData;
+
+/**
+* @author Administrator
+* @description 针对表【radar_data(平升雷达流量计数据表)】的数据库操作Mapper
+* @createDate 2026-01-14 13:17:27
+* @Entity com.zksy.radar.domain.RadarData
+*/
+public interface RadarDataMapper extends BaseMapper<RadarData> {
+
+}
+
+
+
+

+ 13 - 0
radar-service/src/main/java/com/zksy/radar/service/RadarDataService.java

@@ -0,0 +1,13 @@
+package com.zksy.radar.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.radar.domain.RadarData;
+
+/**
+* @author Administrator
+* @description 针对表【radar_data(平升雷达流量计数据表)】的数据库操作Service
+* @createDate 2026-01-14 13:17:27
+*/
+public interface RadarDataService extends IService<RadarData> {
+
+}

+ 22 - 0
radar-service/src/main/java/com/zksy/radar/service/impl/RadarDataServiceImpl.java

@@ -0,0 +1,22 @@
+package com.zksy.radar.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.radar.domain.RadarData;
+import com.zksy.radar.service.RadarDataService;
+import com.zksy.radar.mapper.RadarDataMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【radar_data(平升雷达流量计数据表)】的数据库操作Service实现
+* @createDate 2026-01-14 13:17:27
+*/
+@Service
+public class RadarDataServiceImpl extends ServiceImpl<RadarDataMapper, RadarData>
+    implements RadarDataService{
+
+}
+
+
+
+

+ 50 - 0
radar-service/src/main/resources/mapper/RadarDataMapper.xml

@@ -0,0 +1,50 @@
+<?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.radar.mapper.RadarDataMapper">
+
+    <resultMap id="BaseResultMap" type="com.zksy.radar.domain.RadarData">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="systemIdentifier" column="system_identifier" jdbcType="VARCHAR"/>
+        <result property="frameLength" column="frame_length" jdbcType="VARCHAR"/>
+        <result property="packetSequence" column="packet_sequence" jdbcType="VARCHAR"/>
+        <result property="dataType" column="data_type" jdbcType="VARCHAR"/>
+        <result property="sourceAddr" column="source_addr" jdbcType="VARCHAR"/>
+        <result property="destAddrLength" column="dest_addr_length" jdbcType="VARCHAR"/>
+        <result property="destAddr" column="dest_addr" jdbcType="VARCHAR"/>
+        <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+        <result property="functionCode" column="function_code" jdbcType="VARCHAR"/>
+        <result property="reserve1" column="reserve1" jdbcType="VARCHAR"/>
+        <result property="recordCount" column="record_count" jdbcType="VARCHAR"/>
+        <result property="recordFormat" column="record_format" jdbcType="VARCHAR"/>
+        <result property="powerVoltage" column="power_voltage" jdbcType="VARCHAR"/>
+        <result property="fieldStatus" column="field_status" jdbcType="VARCHAR"/>
+        <result property="isLastPacket" column="is_last_packet" jdbcType="TINYINT"/>
+        <result property="protocolVersion" column="protocol_version" jdbcType="VARCHAR"/>
+        <result property="paramVersion" column="param_version" jdbcType="VARCHAR"/>
+        <result property="signalQuality" column="signal_quality" jdbcType="VARCHAR"/>
+        <result property="reserve3" column="reserve3" jdbcType="VARCHAR"/>
+        <result property="timestampSince" column="timestamp_since" jdbcType="TIMESTAMP"/>
+        <result property="historyRecords" column="history_records" jdbcType="LONGVARCHAR"/>
+        <result property="meter1NetTotal" column="meter1_net_total" jdbcType="VARCHAR"/>
+        <result property="meter1InstantFlow" column="meter1_instant_flow" jdbcType="VARCHAR"/>
+        <result property="flowSpeed" column="flow_speed" jdbcType="VARCHAR"/>
+        <result property="waterLevel" column="water_level" jdbcType="VARCHAR"/>
+        <result property="switchValue" column="switch_value" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,system_identifier,frame_length,
+        packet_sequence,data_type,source_addr,
+        dest_addr_length,dest_addr,device_code,
+        function_code,reserve1,record_count,
+        record_format,power_voltage,field_status,
+        is_last_packet,protocol_version,param_version,
+        signal_quality,reserve3,timestamp_since,
+        meter1_net_total,meter1_instant_flow,flow_speed,
+        water_level,switch_value,history_records,
+        create_time
+    </sql>
+</mapper>