Commit e3d7551e authored by fengyasheng's avatar fengyasheng

干线周报4.1干线问题总体分析,4.2干线问题分析

parent f2b629eb
package net.wanji.opt.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author duanruiming
* @date 2024/12/11 20:33
*/
@Getter
@AllArgsConstructor
public enum ConsgestionStatusEnum {
AMBLE_STATUS(2, "缓行"),
CONSGESTION_STATUS(3, "拥堵");
private Integer code;
private String desc;
public static String getDesc(Integer code) {
for (ConsgestionStatusEnum value : ConsgestionStatusEnum.values()) {
if (Objects.equals(code, value.getCode())) {
return value.getDesc();
}
}
return ConsgestionStatusEnum.AMBLE_STATUS.getDesc();
}
}
package net.wanji.opt.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author duanruiming
* @date 2024/12/11 20:33
*/
@Getter
@AllArgsConstructor
public enum WeekEnum {
MON(1, "周一"),
TUE(2, "周二"),
WED(3, "周三"),
THU(4, "周四"),
FRI(5, "周五"),
SAT(6, "周六"),
SUN(7, "周日");
private Integer code;
private String desc;
public static String getDesc(Integer code) {
for (WeekEnum value : WeekEnum.values()) {
if (Objects.equals(code, value.getCode())) {
return value.getDesc();
}
}
return WeekEnum.MON.getDesc();
}
}
......@@ -12,10 +12,17 @@ import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.controllerv2.report.design.GreenReportOverviewAnalysisResult;
import net.wanji.opt.controllerv2.report.design.GreenReportProblemDetailAnalysis;
import net.wanji.opt.controllerv2.report.design.GreenReportProblemOverallAnalysis;
import net.wanji.opt.controllerv2.report.vo.GreenReportProblemDetailAnalysisResponse;
import net.wanji.opt.controllerv2.report.vo.GreenReportProblemOverallAnalysisResult;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisGreenCongestionPeriodService;
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;
/**
* <p>
* 干线概况 接口API
......@@ -30,21 +37,25 @@ import org.springframework.web.bind.annotation.RestController;
@Api(value="GreenWaveProblemAnalysisController", description="干线分析报告接口", tags = "干线分析报告-周报")
public class GreenWaveProblemAnalysisController {
@Autowired
private AnalysisGreenCongestionPeriodService analysisGreenCongestionPeriodService;
@ApiOperation(httpMethod="GET",value="4.1-干线问题-总体分析", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = false, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "20"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "13"),
})
@GetMapping(value = "/getProblemData")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenReportProblemOverallAnalysis.class),
})
public JsonViewObject getGreenInfoList(Integer year,Integer week, String ids) {
public JsonViewObject getGreenInfoList(Integer year,Integer week,@RequestParam(required = false) String ids) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
GreenReportProblemOverallAnalysisResult greenReportProblemOverallAnalysisResult = analysisGreenCongestionPeriodService.selectListByWeek(year,week,ids);
jsonViewObject.success(greenReportProblemOverallAnalysisResult);
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
......@@ -55,18 +66,19 @@ public class GreenWaveProblemAnalysisController {
//GreenReportProblemDetailAnalysis
@ApiOperation(httpMethod="GET",value="4.2-干线问题-问题详情", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔【为空时查询所有干线】", required = false, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "year", value = "年份", required = true, dataType = "String",defaultValue = "2025"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "20"),
@ApiImplicitParam(name = "week", value = "一年的第几周", required = true, dataType = "String",defaultValue = "13"),
})
@GetMapping(value = "/getProblemDetail")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenReportProblemDetailAnalysis.class),
})
public JsonViewObject getProblemDetail(Integer year,Integer week, String ids) {
public JsonViewObject getProblemDetail(Integer year,Integer week,@RequestParam(required = false) String ids) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
List<GreenReportProblemDetailAnalysisResponse> greenReportProblemDetailAnalysisResponseList = analysisGreenCongestionPeriodService.getProblemDetail(year,week,ids);
jsonViewObject.success(greenReportProblemDetailAnalysisResponseList);
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
......
package net.wanji.opt.controllerv2.report.util;
import lombok.Data;
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
public class TimeIntervalMerger {
// 定义时间区间类
@Data
static class TimeInterval {
private LocalTime start;
private LocalTime end;
public TimeInterval(LocalTime start, LocalTime end) {
this.start = start;
this.end = end;
}
// 判断两个区间是否重叠
public boolean overlapsWith(TimeInterval other) {
return !this.end.isBefore(other.start) && !other.end.isBefore(this.start);
}
// 合并两个区间
public TimeInterval mergeWith(TimeInterval other) {
return new TimeInterval(
this.start.isBefore(other.start) ? this.start : other.start,
this.end.isAfter(other.end) ? this.end : other.end
);
}
// 计算时间段的持续时间(以秒为单位)
public long getDurationInSeconds() {
return Duration.between(start, end).getSeconds();
}
}
// 定义支持单个数字小时部分的 DateTimeFormatter
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("H:mm");
public static String timeString(List<String> timeStrings) {
// 解析时间字符串为 TimeInterval 对象
List<TimeInterval> intervals = timeStrings.stream()
.map(timeStr -> {
String[] parts = timeStr.split("~");
LocalTime start = LocalTime.parse(parts[0].trim(), TIME_FORMATTER);
LocalTime end = LocalTime.parse(parts[1].trim(), TIME_FORMATTER);
return new TimeInterval(start, end);
})
.sorted(Comparator.comparing(TimeInterval::getStart)) // 按开始时间排序
.collect(Collectors.toList());
// 合并重叠的区间
List<TimeInterval> mergedIntervals = new ArrayList<>();
for (TimeInterval current : intervals) {
if (mergedIntervals.isEmpty() || !current.overlapsWith(mergedIntervals.get(mergedIntervals.size() - 1))) {
mergedIntervals.add(current); // 如果不重叠,直接添加
} else {
// 如果重叠,合并当前区间与最后一个区间
TimeInterval last = mergedIntervals.get(mergedIntervals.size() - 1);
mergedIntervals.set(mergedIntervals.size() - 1, last.mergeWith(current));
}
}
// 按时间段长度从大到小排序
mergedIntervals.sort((t1, t2) -> Long.compare(t2.getDurationInSeconds(), t1.getDurationInSeconds()));
// 截取前三个时间段
List<TimeInterval> topThreeIntervals = mergedIntervals.stream()
.limit(3)
.sorted(Comparator.comparing(TimeInterval::getStart)) // 按开始时间重新排序
.collect(Collectors.toList());
// 拼接结果字符串
StringBuilder result = new StringBuilder();
for (int i = 0; i < topThreeIntervals.size(); i++) {
TimeInterval interval = topThreeIntervals.get(i);
if (i > 0) {
result.append(",");
}
result.append(interval.getStart()).append("~").append(interval.getEnd());
}
return result.toString();
}
// 测试代码
public static void main(String[] args) {
List<String> timeStrings = Arrays.asList(
"7:00~8:00",
"12:00~13:30",
"17:30~18:40",
"7:30~9:00",
"17:00~18:00"
);
String result = timeString(timeStrings);
System.out.println(result); // 输出结果
}
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ApiModel(description = "绿波干线高峰时段分析实体类")
public class AnalysisGreenCongestionPeriodVO {
@ApiModelProperty(value = "干线ID", example = "1")
private Integer greenId;
@ApiModelProperty(value = "干线车流运行方向 (w2e/e2w/s2n/n2s)", example = "w2e")
private String roadDirection;
@ApiModelProperty(value = "星期几:1~7代表周一至周日", example = "1")
private Integer weekDay;
@ApiModelProperty(value = "拥堵开始时间", example = "2025-04-07 08:00:00")
private Date congestStartTime;
@ApiModelProperty(value = "拥堵截止时间", example = "2025-04-07 10:00:00")
private Date congestEndTime;
@ApiModelProperty(value = "平均拥堵指数", example = "1.5")
private Double congestIndex;
@ApiModelProperty(value = "拥堵类型:2缓行;3拥堵", example = "2")
private Integer status;
@ApiModelProperty(value = "行程时间,单位秒", example = "3600")
private Integer travelTime;
@ApiModelProperty(value = "平均速度 (km/h)", example = "40.5")
private Double speed;
@ApiModelProperty(value = "高峰类型:1早高峰;2晚高峰", example = "1")
private String peakType;
@ApiModelProperty(value = "一年中的第几周,格式yyyyw,如20251", example = "20251")
private Integer yearWeek;
@ApiModelProperty(value = "一周的第一天", example = "2025-04-07 00:00:00")
private Date weekStartTime;
@ApiModelProperty(value = "一周的最后一天", example = "2025-04-13 23:59:59")
private Date weekEndTime;
@ApiModelProperty(value = "数据插入时间", example = "2025-04-07 12:30:00")
private Date insertTime;
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class GreenReportProblemDetail {
@ApiModelProperty(value = "星期", example = "周一")
private String week;
@ApiModelProperty(value = "问题时段", example = "7:35~8:40")
private String problemSpan;
@ApiModelProperty(value = "状态:缓行/拥堵", example = "拥堵")
private String status;
@ApiModelProperty(value = "拥堵指数", example = "4.5")
private Double congestIndex;
@ApiModelProperty(value = "平均速度", example = "10")
private Double avgSpeed;
@ApiModelProperty(value = "行程时间,单位分钟", example = "10")
private Integer travelTime;
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenReportProblemDetailAnalysisResponse {
@ApiModelProperty(value = "干线ID", example = "")
private String greenId;
@ApiModelProperty(value = "干线名称", example = "经十路(舜耕路-山大路)")
private String greenName;
@ApiModelProperty(value = "干线工作日拥堵时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String workDayCongestSpan;
@ApiModelProperty(value = "干线工作日平均拥堵时长", example = "1小时")
private String workDayAvgCongestTime;
@ApiModelProperty(value = "干线工作日平均拥堵指数",example = "3.5")
private String workDayAvgCongestIndex;
//================================================================================================//
@ApiModelProperty(value = "干线工作日缓行时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String workDaySlowRunSpan;
@ApiModelProperty(value = "干线工作日平均缓行时长", example = "0.5小时")
private String workDayAvgSlowRunTime;
@ApiModelProperty(value = "干线工作日缓行平均拥堵指数",example = "3.5")
private String workDayAvgSlowAvgCongestIndex;
//================================================================================================//
@ApiModelProperty(value = "干线周末拥堵时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String weekEndCongestSpan;
@ApiModelProperty(value = "干线周末平均拥堵时长", example = "1小时")
private String weekEndAvgCongestTime;
@ApiModelProperty(value = "干线周末平均拥堵指数",example = "3.5")
private String weekEndAvgCongestIndex;
//================================================================================================//
@ApiModelProperty(value = "干线周末缓行时段分布情况", example = "7:00~8:00,12:00~13:30,17:30~18:40")
private String weekEndSlowRunSpan;
@ApiModelProperty(value = "干线周末平均缓行时长", example = "0.5小时")
private String weekEndAvgSlowRunTime;
@ApiModelProperty(value = "干线周末缓行平均拥堵指数",example = "3.5")
private String weekEndAvgSlowAvgCongestIndex;
private List<GreenReportProblemDetail> dataList = new ArrayList<>();
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenReportProblemOverallAnalysisResult {
@ApiModelProperty(value = "区域干线总拥堵次数", example = "56次")
private String totalCongestCount;
@ApiModelProperty(value = "区域干线总拥堵时长", example = "11小时")
private String totalCongestDuration;
@ApiModelProperty(value = "拥堵严重干线",example = "经十路(舜耕路-山大路)、经十路(洪山路-舜华路)")
private String congestHeavyGreenWave;
private List<GreenReportProblemOverallData> dataList = new ArrayList<>();
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class GreenReportProblemOverallData {
@ApiModelProperty(value = "干线ID", example = "")
private String greenId;
@ApiModelProperty(value = "干线名称", example = "经十路(舜耕路-山大路)")
private String greenName;
List<GreenWaveDirProblemData> list = new ArrayList<>();
}
\ No newline at end of file
package net.wanji.opt.controllerv2.report.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class GreenWaveDirProblemData{
@ApiModelProperty(value = "干线类型", example = "主干路")
private String greenWaveType;
@ApiModelProperty(value = "方向", example = "东向西")
private String dir;
@ApiModelProperty(value = "拥堵指数", example = "4.5")
private Double congestIndex;
@ApiModelProperty(value = "拥堵次数", example = "10")
private Integer congestCount;
@ApiModelProperty(value = "拥堵时长,单位秒", example = "10")
private Integer congestDuration;
}
\ No newline at end of file
package net.wanji.opt.dao.mapper.judgeanalysis;
import net.wanji.opt.controllerv2.report.vo.AnalysisGreenCongestionPeriodVO;
import net.wanji.opt.entity.judgeanalysis.AnalysisGreenCongestionPeriod;
import org.apache.ibatis.annotations.Param;
......@@ -9,4 +10,6 @@ import java.util.Map;
public interface AnalysisGreenCongestionPeriodMapper {
List<AnalysisGreenCongestionPeriod> selectGreenDataHist(@Param("date") String date);
void insertGreenCongestionPeriodData(Map<String, Object> map);
List<AnalysisGreenCongestionPeriodVO> selectListByWeek(@Param("yearWeek") Integer yearWeek);
}
package net.wanji.opt.servicev2.judgeanalysis;
import net.wanji.opt.controllerv2.report.vo.GreenReportProblemDetailAnalysisResponse;
import net.wanji.opt.controllerv2.report.vo.GreenReportProblemOverallAnalysisResult;
import java.text.ParseException;
import java.util.List;
public interface AnalysisGreenCongestionPeriodService {
public void selectCountByCongestionPeriod() throws ParseException;
GreenReportProblemOverallAnalysisResult selectListByWeek(Integer year, Integer week, String ids);
List<GreenReportProblemDetailAnalysisResponse> getProblemDetail(Integer year, Integer week, String ids);
}
......@@ -15,6 +15,10 @@
and a.green_id is not null
order by a.green_id,a.road_direction,a.start_time
</select>
<select id="selectListByWeek"
resultType="net.wanji.opt.controllerv2.report.vo.AnalysisGreenCongestionPeriodVO">
select * from t_analysis_green_wave_congest_time_span where year_week = #{yearWeek}
</select>
<insert id="insertGreenCongestionPeriodData" parameterType="map">
insert into t_analysis_green_wave_congest_time_span (green_id,road_direction,week_day,congest_start_time,congest_end_time,congest_index,status,travel_time,speed,peak_type,year_week,week_start_time,week_end_time,insert_time)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment