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 >= #{start} AND time < #{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 >= #{start} AND time < #{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 >= #{start} AND time < #{end} ORDER BY time ASC </select> </mapper>