cjl
6 hours ago 084fcff73e6858862544c3901361adfe5742016c
fix:雷达调整
5 files added
6 files modified
374 ■■■■■ changed files
screen-job/src/main/java/com/moral/api/controller/PubController.java 12 ●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/controller/RadarProcessController.java 50 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/mapper/RadarHourlySummaryMapper.java 36 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/RadarHourlySummaryService.java 18 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/service/impl/RadarHourlySummaryServiceImpl.java 62 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/vo/ComparisonResponse.java 31 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/vo/DailyDropHeightVO.java 20 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/vo/HourlyItemVO.java 22 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/vo/HourlyResponse.java 31 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/vo/RadarHourlySummaryVO.java 64 ●●●●● patch | view | raw | blame | history
screen-job/src/main/resources/mapper/RadarHourlySummaryMapper.xml 28 ●●●●● patch | view | raw | blame | history
screen-job/src/main/java/com/moral/api/controller/PubController.java
@@ -175,18 +175,18 @@
    @GetMapping("secondCruiserSort")
    @ApiOperation(value = "走航车排名", notes = "走航车排名")
    public ResultMessage secondCruiserSort() {
        String startTime ="2024-11-13 00:00:00";
        String endTime ="2024-11-14 00:00:00";
    public ResultMessage secondCruiserSort(String time) {
         String startTime = time+" 00:08:01";
         String endTime = time+" 23:23:00";
        historySecondCruiserService.sort(startTime,endTime);
        return new ResultMessage();
    }
    @GetMapping("insertCoordinateDetail")
    @ApiOperation(value = "路段录入", notes = "路段录入")
    public ResultMessage insertCoordinateDetail() {
        String startTime ="2024-06-06 00:07:01";
        String endTime ="2024-06-06 23:07:01";
    public ResultMessage insertCoordinateDetail(String startTime,String endTime) {
        startTime = startTime+" 00:08:01";
        endTime = endTime+" 23:23:00";
        manageCoordinateDetailService.insertCoordinateDetail(startTime,endTime);
        return new ResultMessage();
    }
screen-job/src/main/java/com/moral/api/controller/RadarProcessController.java
@@ -1,8 +1,12 @@
package com.moral.api.controller;
import com.moral.api.service.RadarHourlySummaryService;
import com.moral.api.vo.ComparisonResponse;
import com.moral.api.vo.HourlyResponse;
import com.moral.constant.ResultMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -46,8 +50,8 @@
     */
    @GetMapping("/process")
    public ResultMessage processHour() {
        String startStr = "2026-05-31 23:00:00";
        String endStr = "2026-09-08 14:00:00";
        String startStr = "2026-09-08 14:00:00";
        String endStr = "2026-09-09 13:00:00";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(startStr, formatter);
        LocalDateTime endTime = LocalDateTime.parse(endStr, formatter);
@@ -68,4 +72,46 @@
        hourlySummaryService.processHour(startStr);
        return new ResultMessage();
    }
    /**
     * 获取边界层对比数据
     * GET /radar/comparison?location=苏州&time=2026-09-09 09:00:00
     *
     * @param location 位置名称
     * @param time     请求时间,取前一整点作为 current
     */
    @GetMapping("/comparison")
    @ApiOperation("获取最近边界层数据")
    public ResultMessage getComparison(@RequestParam @ApiParam(value = "location",name = "地名") String location,
                                            @RequestParam @ApiParam(value = "time",name = "时间 yyyy-MM-dd HH:mm:ss") String time) {
        if(!location.equals("苏州")){
            return ResultMessage.ok("目前只有苏州区域有");
        }
        ComparisonResponse comparisonResponse = hourlySummaryService.getComparison(location, time);
        return ResultMessage.ok(comparisonResponse);
    }
    /**
     * 获取指定时间范围内每小时的雷达数据
     * GET /radar/hourly?location=苏州&startTime=2026-09-04 09:00:00&endTime=2026-09-09 09:00:00
     *
     * @param location  位置名称
     * @param startTime 起始时间(包含)
     * @param endTime   结束时间(不包含)
     */
    @GetMapping("/hourly")
    @ApiOperation("查询近5天逐小时边界层数据")
    public ResultMessage getHourly5Days(@RequestParam  @ApiParam(value = "location",name = "地名")  String location,
                                         @RequestParam  @ApiParam(value = "startTime",name = "开始时间")  String startTime,
                                         @RequestParam  @ApiParam(value = "endTime",name = "结束时间")  String endTime) {
        if(!location.equals("苏州")){
            return ResultMessage.ok("目前只有苏州区域有");
        }
        HourlyResponse getHourly5Days =  hourlySummaryService.getHourly5Days(location, startTime, endTime);
        return ResultMessage.ok(getHourly5Days);
    }
}
screen-job/src/main/java/com/moral/api/mapper/RadarHourlySummaryMapper.java
@@ -2,6 +2,11 @@
import com.moral.api.entity.RadarHourlySummary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.moral.api.vo.DailyDropHeightVO;
import com.moral.api.vo.RadarHourlySummaryVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -15,10 +20,39 @@
    /**
     * 查询时间范围内 a34004_drop_height 的平均值
     *
     * @param start 起始时间(包含)
     * @param end   结束时间(不包含)
     */
    Double getAvgDropHeightInRange(@Param("start") String start, @Param("end") String end);
    /**
     * 查询指定时间范围的汇总数据
     * 查询时间范围内每天 a34004_drop_height 的平均值,按天分组
     *
     * @param start 起始时间(包含)
     * @param end   结束时间(不包含)
     */
    List<DailyDropHeightVO> getDailyAvgDropHeight(@Param("start") String start, @Param("end") String end);
    /**
     * 根据精确时间获取一条汇总记录
     *
     * @param time 小时时间,格式 yyyy-MM-dd HH:mm:ss
     */
    RadarHourlySummaryVO getByTime(@Param("time") String time);
    /**
     * 查询时间范围内每小时的四项高度字段
     *
     * @param start 起始时间(包含)
     * @param end   结束时间(不包含)
     */
    List<RadarHourlySummaryVO> queryHourlyByRange(@Param("start") String start, @Param("end") String end);
}
screen-job/src/main/java/com/moral/api/service/RadarHourlySummaryService.java
@@ -2,6 +2,8 @@
import com.moral.api.entity.RadarHourlySummary;
import com.baomidou.mybatisplus.extension.service.IService;
import com.moral.api.vo.ComparisonResponse;
import com.moral.api.vo.HourlyResponse;
/**
 * <p>
@@ -24,4 +26,20 @@
     */
    void processLastHour();
    /**
     * 获取当前值与近30天对比数据
     *
     * @param location 位置,如"苏州"
     * @param time     请求时间,如"2026-09-09 09:00:00",取前一整点(8:00)作为 current
     */
    ComparisonResponse getComparison(String location, String time);
    /**
     * 获取指定时间范围内每小时的雷达数据
     *
     * @param location  位置
     * @param startTime 起始时间(包含)
     * @param endTime   结束时间(不包含)
     */
    HourlyResponse getHourly5Days(String location, String startTime, String endTime);
}
screen-job/src/main/java/com/moral/api/service/impl/RadarHourlySummaryServiceImpl.java
@@ -5,6 +5,8 @@
import com.moral.api.service.HistorySecondRadarService;
import com.moral.api.service.RadarHourlySummaryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.moral.api.vo.*;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -34,6 +36,7 @@
    private static final int PEAK_SEARCH_LIMIT = 200;
    private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00");
    private static final DateTimeFormatter DT_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -45,6 +48,65 @@
    }
    @Override
    public ComparisonResponse getComparison(String location, String time) {
        // 入参时间 → 前一个整点 = current 时刻
        LocalDateTime inputTime = LocalDateTime.parse(time, DT_FMT);
        LocalDateTime prevHour = inputTime.minusHours(1).withMinute(0).withSecond(0).withNano(0);
        String currentTime = prevHour.format(DT_FMT);
        // 30 天范围:currentTime(不含)往前推 30 天
        String endStr = currentTime;
        String startStr = prevHour.minusDays(30).format(DT_FMT);
        ComparisonResponse resp = new ComparisonResponse();
        resp.setLocation(location);
        resp.setTime(time);
        // current: 前一个整点的 a34004_drop_height
        RadarHourlySummaryVO cur = this.baseMapper.getByTime(currentTime);
        resp.setCurrent(cur != null && cur.getA34004DropHeight() != null ? cur.getA34004DropHeight().doubleValue() : 0.0);
        // avg30: 720 小时平均
        Double avg = this.baseMapper.getAvgDropHeightInRange(startStr, endStr);
        resp.setAvg30(avg != null ? avg : 0.0);
        // daily30: 按天分组,不含今天
        List<DailyDropHeightVO> rows = this.baseMapper.getDailyAvgDropHeight(startStr, endStr);
        if(CollectionUtils.isEmpty(rows)){
            List<DailyDropHeightVO> daily = new ArrayList<>();
            String todayStr = prevHour.toLocalDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            DailyDropHeightVO dropHeightVO  = new DailyDropHeightVO();
            dropHeightVO.setDate(todayStr);
            dropHeightVO.setDropHeight(0d);
            daily.add(dropHeightVO);
            resp.setDaily30(daily);
        }else {
            resp.setDaily30(rows);
        }
        return resp;
    }
    @Override
    public HourlyResponse getHourly5Days(String location, String startTime, String endTime) {
        HourlyResponse resp = new HourlyResponse();
        resp.setLocation(location);
        resp.setStartTime(startTime);
        resp.setEndTime(endTime);
        List<RadarHourlySummaryVO> list = this.baseMapper.queryHourlyByRange(startTime, endTime);
        List<HourlyItemVO> items = new ArrayList<>();
        for (RadarHourlySummaryVO s : list) {
            HourlyItemVO item = new HourlyItemVO();
            item.setTime(s.getTimeStr());
            item.setA34004DropHeight(s.getA34004DropHeight().doubleValue());
            items.add(item);
        }
        resp.setCount(items.size());
        resp.setHourly(items);
        return resp;
    }
    @Override
    public void processHour(String hourStart) {
        String hourEnd = nextHour(hourStart);
        List<String> rawList = radarService.queryRawDataByHour(hourStart, hourEnd);
screen-job/src/main/java/com/moral/api/vo/ComparisonResponse.java
New file
@@ -0,0 +1,31 @@
package com.moral.api.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
 * /radar/comparison 接口返回对象
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class ComparisonResponse {
    /** 当前位置,如"苏州" */
    private String location;
    /** 请求的时间,回显入参 */
    private String time;
    /** 最近一个整点的 a34004_drop_height */
    private Double current;
    /** 近30天(720小时)a34004_drop_height 总平均 */
    private Double avg30;
    /** 近30天每天平均,不含今天 */
    private List<DailyDropHeightVO> daily30;
}
screen-job/src/main/java/com/moral/api/vo/DailyDropHeightVO.java
New file
@@ -0,0 +1,20 @@
package com.moral.api.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * daily30 列表中单条数据
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class DailyDropHeightVO {
    /** 日期,格式 yyyy-MM-dd */
    private String date;
    /** 当日 a34004_drop_height 平均值 */
    private Double dropHeight;
}
screen-job/src/main/java/com/moral/api/vo/HourlyItemVO.java
New file
@@ -0,0 +1,22 @@
package com.moral.api.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * /radar/hourly 列表中单条每小时数据
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class HourlyItemVO {
    /** 小时时间,格式 yyyy-MM-dd HH:mm:ss */
    private String time;
    /** a34004-Avg 突变下降高度/边界层(m) */
    private Double a34004DropHeight;
}
screen-job/src/main/java/com/moral/api/vo/HourlyResponse.java
New file
@@ -0,0 +1,31 @@
package com.moral.api.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
 * /radar/hourly 接口返回对象
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class HourlyResponse {
    /** 当前位置,如"苏州" */
    private String location;
    /** 查询起始时间 */
    private String startTime;
    /** 查询结束时间(不包含) */
    private String endTime;
    /** 数据条数 */
    private int count;
    /** 每小时数据列表 */
    private List<HourlyItemVO> hourly;
}
screen-job/src/main/java/com/moral/api/vo/RadarHourlySummaryVO.java
New file
@@ -0,0 +1,64 @@
package com.moral.api.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 * 雷达小时汇总表
 * </p>
 *
 * @author moral
 * @since 2026-09-08
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class RadarHourlySummaryVO {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 小时时间,精确到小时
     */
    private String timeStr;
    /**
     * 小时平均数据 {"a34004-Avg": [...], "a34002-Avg": [...]}
     */
    private String radarData;
    /**
     * a34004-Avg 最高值所在高度(m)
     */
    private BigDecimal a34004PeakHeight;
    /**
     * a34004-Avg 突变下降高度(m)(边界层)
     */
    private BigDecimal a34004DropHeight;
    /**
     * a34002-Avg 最高值所在高度(m)
     */
    private BigDecimal a34002PeakHeight;
    /**
     * a34002-Avg 突变下降高度(m)(边界层)
     */
    private BigDecimal a34002DropHeight;
    private String createTime;
}
screen-job/src/main/resources/mapper/RadarHourlySummaryMapper.xml
@@ -13,5 +13,33 @@
                    <result column="a34002_drop_height" property="a34002DropHeight" />
                    <result column="create_time" property="createTime" />
        </resultMap>
    <select id="getAvgDropHeightInRange" resultType="java.lang.Double">
        SELECT COALESCE(ROUND(AVG(a34004_drop_height)), 0) as a34004 FROM radar_hourly_summary
         WHERE  time &gt;= #{start} AND time &lt; #{end}
    </select>
    <select id="getByTime" resultType="com.moral.api.vo.RadarHourlySummaryVO">
        SELECT id, DATE_FORMAT(time, '%Y-%m-%d %H:%i:%s') timeStr, radar_data, a34004_peak_height, a34004_drop_height, a34002_peak_height, a34002_drop_height FROM radar_hourly_summary WHERE time = #{time}
    </select>
    <select id="getDailyAvgDropHeight" resultType="com.moral.api.vo.DailyDropHeightVO">
        SELECT DATE_FORMAT(time, '%Y-%m-%d') as date, ROUND(AVG(a34004_drop_height)) AS dropHeight
         FROM radar_hourly_summary
        WHERE time &gt;= #{start} AND time &lt; #{end}
         GROUP BY DATE(time) ORDER BY date ASC
    </select>
<select id="queryHourlyByRange" resultType="com.moral.api.vo.RadarHourlySummaryVO">
    SELECT DATE_FORMAT(time, '%Y-%m-%d %H:%i:%s') timeStr, a34004_peak_height, a34004_drop_height,
    a34002_peak_height, a34002_drop_height
    FROM radar_hourly_summary
    WHERE time &gt;= #{start} AND time &lt; #{end}
     ORDER BY time ASC
</select>
</mapper>