Commit 489e3f6f authored by fengyasheng's avatar fengyasheng

交通分析报告-周总体拥堵概况-拥堵次数计算修改,注释掉启动时运行

parent cb2d36ed
......@@ -36,6 +36,26 @@ public class GreenWaveCrossRidController {
@ApiOperation(httpMethod="GET",value="干线拥堵信息", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔", required = true, dataType = "String",defaultValue = "1,2"),
@ApiImplicitParam(name = "dayType", value = "高峰类型 1早高峰 2晚高峰 3全天", required = true, dataType = "String",defaultValue = "1"),
})
@GetMapping(value = "/getGreenWeekDataList")
public JsonViewObject getGreenWeekDataList(@RequestParam(value = "ids", required = false, defaultValue = "2") String ids,
@RequestParam(value = "type", required = false, defaultValue = "2") String type
) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
try {
JSONObject object = greenWaveCrossRidService.getGreenInfoList(ids);
jsonViewObject.success(object);
} catch (Exception e) {
jsonViewObject.fail(I18nResourceBundle.getConstants("GET_FAILED_MSG"));
log.error("{} getAll error", this.getClass().getSimpleName(), e);
}
return jsonViewObject;
}
@ApiOperation(httpMethod="GET",value="干线基础信息", notes="")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "干线ID,多个id用','分隔", required = true, dataType = "String",defaultValue = "1,2"),
......
package net.wanji.opt.dao.mapper.report;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.databus.dao.entity.GreenwaveHistPO;
import net.wanji.opt.entity.report.ConfigPeakHours;
import net.wanji.opt.entity.report.GreenWaveWeekData;
import net.wanji.opt.servicev2.report.GreenWaveWeekDataService;
......@@ -22,5 +23,7 @@ public interface GreenWaveWeekDataMapper extends BaseMapper<GreenWaveWeekData> {
Integer getFlowByTime(@Param("greenId") Integer greenId,@Param("dir") Integer dir,@Param("startDate") String startDate,@Param("endDate") String endDate,@Param("startTime") String startTime,@Param("endTime") String endTime);
void insertOrUpdateBatch(@Param("list") List<GreenWaveWeekData> greenWaveWeekDataList);
List<GreenwaveHistPO> selectAllByTime(@Param("greenId") Integer greenId,@Param("roadDirection") String roadDirection,@Param("startDate") String startDate,@Param("endDate") String endDate,@Param("startTime") String startTime,@Param("endTime") String endTime);
// MyBatis-Plus 提供了基本的 CRUD 方法,这里无需额外定义
}
\ No newline at end of file
......@@ -29,7 +29,10 @@ public class GreenWaveWeekData {
private Integer congestCount; // 拥堵次数
@ApiModelProperty(value = "拥堵总时长,单位秒")
private Double congestDuration; // 拥堵总时长,单位秒
private Double congestDuration;
@ApiModelProperty(value = "最大拥堵持续时长,单位秒")
private Double maxCongestDuration;
@ApiModelProperty(value = "总流量")
private Integer flow; // 总流量
......@@ -40,11 +43,17 @@ public class GreenWaveWeekData {
@ApiModelProperty(value = "平均速度")
private Double speed; // 平均速度
@ApiModelProperty(value = "高峰类型 1早高峰 2晚高峰 3全天")
private String peakType;
@ApiModelProperty(value = "类型:1工作日 2节假日")
private String peakType; // 类型:1工作日 2节假日
private String dayType;
@ApiModelProperty(value = "高峰类型 1早高峰 2晚高峰 3全天")
private String dayType; // 高峰类型 1早高峰 2晚高峰 3全天
@ApiModelProperty(value = "最大拥堵时段")
private String maxCongestionPeriod;
@ApiModelProperty(value = "第二大拥堵时段")
private String secondCongestionPeriod;
@ApiModelProperty(value = "数据统计范围的开始时间")
private String startTime; // 数据统计范围的开始时间
......
......@@ -4,6 +4,8 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import net.wanji.databus.dao.entity.GreenwaveHistPO;
import net.wanji.databus.dao.mapper.GreenwaveHistMapper;
import net.wanji.opt.dao.mapper.report.GreenWaveWeekDataMapper;
import net.wanji.opt.entity.report.ConfigPeakHours;
import net.wanji.opt.entity.report.GreenWaveWeekData;
......@@ -13,16 +15,10 @@ import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.*;
@Service
@Slf4j
......@@ -32,6 +28,12 @@ public class GreenWaveWeekDataServiceImpl extends ServiceImpl<GreenWaveWeekDataM
private GreenWaveWeekDataService greenWaveWeekDataService;
@Autowired
private GreenWaveWeekDataMapper greenWaveWeekDataMapper;
@Autowired
private GreenwaveHistMapper greenwaveHistMapper;
private static final int TIME_GAP_THRESHOLD = 900; // 时间间隔阈值,单位为秒
private static final int MINUTES_PER_RECORD = 5; // 每条记录对应的时间,单位为分钟
private static final int SECONDS_PER_MINUTE = 60; // 每分钟的秒数
@Override
public void insertGreenWaveWeekData() {
......@@ -48,26 +50,26 @@ public class GreenWaveWeekDataServiceImpl extends ServiceImpl<GreenWaveWeekDataM
for (ConfigPeakHours configPeakHour : configPeakHours) {
String startTime = configPeakHour.getStartTime();
String endTime = configPeakHour.getEndTime();
List<GreenWaveWeekData> greenWaveWeekDataList = greenWaveWeekDataMapper.selectGreenWaveWeekDataByTime(startDate, endDate,startTime,endTime);
List<GreenWaveWeekData> greenWaveWeekDataList = greenWaveWeekDataMapper.selectGreenWaveWeekDataByTime(startDate, endDate, startTime, endTime);
greenWaveWeekDataList.forEach(x -> {
x.setPeakType(String.valueOf(configPeakHour.getPeakType()));
x.setDayType(String.valueOf(configPeakHour.getDayType()));
x.setStartTime(startDate);
x.setEndTime(endDate);
Integer dir = getDir(x.getRoadDirection());
Integer flow = greenWaveWeekDataMapper.getFlowByTime(x.getGreenId(), dir, startDate, endDate,startTime,endTime);
Integer flow = greenWaveWeekDataMapper.getFlowByTime(x.getGreenId(), dir, startDate, endDate, startTime, endTime);
x.setFlow(flow);
x.setYearWeek(getWeekNumberOfYear(startOfLastWeek));
x.setInsertTime(new Date());
GreenWaveWeekData greenWaveWeekData = getGreenWaveWeekData(x, startTime, endTime);
});
greenWaveWeekDataService.insertOrUpdateBatch(greenWaveWeekDataList);
log.info("周总体拥堵高峰期概况批量保存或更新成功!");
}
List<GreenWaveWeekData> greenWaveWeekDataList = greenWaveWeekDataMapper.selectGreenWaveWeekData(startDate, endDate);
greenWaveWeekDataList.forEach(x -> {
x.setPeakType("1");
x.setDayType("3");
x.setPeakType("3");
x.setDayType("1");
x.setStartTime(startDate);
x.setEndTime(endDate);
Integer dir = getDir(x.getRoadDirection());
......@@ -75,9 +77,165 @@ public class GreenWaveWeekDataServiceImpl extends ServiceImpl<GreenWaveWeekDataM
x.setFlow(flow);
x.setYearWeek(getWeekNumberOfYear(startOfLastWeek));
x.setInsertTime(new Date());
GreenWaveWeekData greenWaveWeekData = getGreenWaveWeekData(x, null, null);
});
greenWaveWeekDataService.insertOrUpdateBatch(greenWaveWeekDataList);
log.info("周总体拥堵高峰期概况批量保存或更新成功!");
log.info("周总体拥堵全天概况批量保存或更新成功!");
}
private GreenWaveWeekData getGreenWaveWeekData(GreenWaveWeekData x, String startTime, String endTime) {
List<GreenwaveHistPO> greenwaveHistPOS = greenWaveWeekDataMapper.selectAllByTime(x.getGreenId(), x.getRoadDirection(), x.getStartTime(), x.getEndTime(), startTime, endTime);
if (ObjectUtils.isEmpty(greenwaveHistPOS)) {
x.setCongestIndex(0.0);
x.setMaxCongestIndex(0.0);
x.setCongestCount(0);
x.setMaxCongestDuration(0.0);
return x;
}
//拥堵次数
int count = 1;
//每次拥堵条数
int mCount = 1;
//最大拥堵指数
double maxCongestIndex = 0;
//每次拥堵指数和
double congestIndex = greenwaveHistPOS.get(0).getTrafficIndex();
//拥堵指数和
double congestIndexAll = 0;
//最大拥堵持续时长
int maxCongestDuration = 0;
int secondCongestDuration = 0;
//拥堵时间
Date congestStartTime = greenwaveHistPOS.get(0).getStartTime();
Date congestEndTime = null;
Date maxCongestStartTime = null;
Date maxCongestEndTime = null;
Date secondCongestStartTime = null;
Date secondCongestEndTime = null;
Calendar calendar = Calendar.getInstance();
//判断是否只有一条拥堵数据
if (greenwaveHistPOS.size() == 1) {
maxCongestIndex = greenwaveHistPOS.get(0).getTrafficIndex();
congestIndexAll = maxCongestIndex;
maxCongestDuration = MINUTES_PER_RECORD * SECONDS_PER_MINUTE;
// 使用 Calendar 添加 5 分钟
calendar.setTime(congestStartTime);
calendar.add(Calendar.MINUTE, 5);
// 获取更新后的时间
maxCongestEndTime = calendar.getTime();
maxCongestStartTime = congestStartTime;
} else {
for (int i = 1; i < greenwaveHistPOS.size(); i++) {
GreenwaveHistPO greenwaveHistPONext = greenwaveHistPOS.get(i);
GreenwaveHistPO greenwaveHistPO = greenwaveHistPOS.get(i - 1);
if (greenwaveHistPONext.getBatchTime() - greenwaveHistPO.getBatchTime() > TIME_GAP_THRESHOLD) {
//获取最大拥堵指数
if (congestIndex / mCount > maxCongestIndex) {
maxCongestIndex = congestIndex / mCount;
}
//拥堵指数和
congestIndexAll += congestIndex / mCount;
//拥堵持续时间
int congestDuration = mCount * MINUTES_PER_RECORD * SECONDS_PER_MINUTE;
calendar.setTime(greenwaveHistPO.getStartTime());
calendar.add(Calendar.MINUTE, MINUTES_PER_RECORD);
// 获取更新后的时间
congestEndTime = calendar.getTime();
//最大拥堵持续时间
//最大拥堵持续时间
if (maxCongestDuration < congestDuration) {
maxCongestDuration = congestDuration;
maxCongestStartTime = congestStartTime;
maxCongestEndTime = congestEndTime;
}else if (secondCongestDuration < congestDuration) {
secondCongestDuration = congestDuration;
secondCongestStartTime = congestStartTime;
secondCongestEndTime = congestEndTime;
}
//新一次拥堵
count++;
mCount = 1;
congestIndex = greenwaveHistPONext.getTrafficIndex();
congestStartTime = greenwaveHistPONext.getStartTime();
if (i == greenwaveHistPOS.size() - 1) {
//获取最大拥堵指数
if (congestIndex / mCount > maxCongestIndex) {
maxCongestIndex = congestIndex / mCount;
}
//拥堵指数和
congestIndexAll += congestIndex / mCount;
//拥堵持续时间
congestDuration = mCount * MINUTES_PER_RECORD * SECONDS_PER_MINUTE;
// 使用 Calendar 添加 5 分钟
calendar.setTime(congestStartTime);
calendar.add(Calendar.MINUTE, MINUTES_PER_RECORD);
// 获取更新后的时间
congestEndTime = calendar.getTime();
//最大拥堵持续时间
if (maxCongestDuration < congestDuration) {
maxCongestDuration = congestDuration;
maxCongestStartTime = congestStartTime;
maxCongestEndTime = congestEndTime;
}else if (secondCongestDuration < congestDuration) {
secondCongestDuration = congestDuration;
secondCongestStartTime = congestStartTime;
secondCongestEndTime = congestEndTime;
}
}
} else {
congestIndex += greenwaveHistPONext.getTrafficIndex();
mCount++;
if (i == greenwaveHistPOS.size() - 1) {
//获取最大拥堵指数
if (congestIndex / mCount > maxCongestIndex) {
maxCongestIndex = congestIndex / mCount;
}
//拥堵指数和
congestIndexAll += congestIndex / mCount;
//拥堵持续时间
int congestDuration = mCount * MINUTES_PER_RECORD * SECONDS_PER_MINUTE;
// 获取更新后的时间
calendar.setTime(greenwaveHistPONext.getStartTime());
calendar.add(Calendar.MINUTE, MINUTES_PER_RECORD);
// 获取更新后的时间
congestEndTime = calendar.getTime();
//最大拥堵持续时间
if (maxCongestDuration < congestDuration) {
maxCongestDuration = congestDuration;
maxCongestStartTime = congestStartTime;
maxCongestEndTime = congestEndTime;
}else if (secondCongestDuration < congestDuration) {
secondCongestDuration = congestDuration;
secondCongestStartTime = congestStartTime;
secondCongestEndTime = congestEndTime;
}
}
}
}
}
x.setCongestIndex(congestIndexAll / count);
x.setMaxCongestIndex(maxCongestIndex);
x.setCongestCount(count);
x.setMaxCongestDuration((double) maxCongestDuration);
String formattedTimeRange = formatTimeRange(maxCongestStartTime, maxCongestEndTime);
x.setMaxCongestionPeriod(formattedTimeRange);
if (!ObjectUtils.isEmpty(secondCongestStartTime) && !ObjectUtils.isEmpty(secondCongestEndTime)) {
String formattedTimeRange1 = formatTimeRange(secondCongestStartTime, secondCongestEndTime);
if (!formattedTimeRange.equals(formattedTimeRange1)) {
x.setSecondCongestionPeriod(formattedTimeRange1);
}
}
return x;
}
@Override
......@@ -101,12 +259,19 @@ public class GreenWaveWeekDataServiceImpl extends ServiceImpl<GreenWaveWeekDataM
}
}
/*
* 获取周数
* */
public static int getWeekNumberOfYear(LocalDateTime date) {
WeekFields weekFields = WeekFields.of(Locale.getDefault()); // 使用默认区域设置
return date.get(weekFields.weekOfWeekBasedYear());
public static Integer getWeekNumberOfYear(LocalDateTime date) {
// 使用默认区域设置获取周字段
WeekFields weekFields = WeekFields.of(Locale.getDefault());
// 获取年份
int year = date.get(weekFields.weekBasedYear());
// 获取周数
int weekNumber = date.get(weekFields.weekOfWeekBasedYear());
// 拼接成 "yyyyw" 格式
String format = String.format("%d%d", year, weekNumber);
return Integer.valueOf(format);
}
/*
......@@ -149,4 +314,44 @@ public class GreenWaveWeekDataServiceImpl extends ServiceImpl<GreenWaveWeekDataM
.with(LocalTime.MAX); // 设置时间为 23:59:59
return lastSunday;
}
public static String formatTimeRange(Date startTime, Date endTime) {
// 将 Date 转换为 LocalDateTime
LocalDateTime startDateTime = startTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
LocalDateTime endDateTime = endTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
// 获取星期几
DayOfWeek dayOfWeek = startDateTime.getDayOfWeek();
String weekDay = getWeekDayName(dayOfWeek);
// 格式化时间为 HH:mm
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm");
String startTimeStr = startDateTime.format(timeFormatter);
String endTimeStr = endDateTime.format(timeFormatter);
// 拼接结果
return weekDay + " " + startTimeStr + "~" + endTimeStr;
}
private static String getWeekDayName(DayOfWeek dayOfWeek) {
// 映射 DayOfWeek 到中文星期名称
switch (dayOfWeek) {
case MONDAY:
return "周一";
case TUESDAY:
return "周二";
case WEDNESDAY:
return "周三";
case THURSDAY:
return "周四";
case FRIDAY:
return "周五";
case SATURDAY:
return "周六";
case SUNDAY:
return "周日";
default:
return "";
}
}
}
\ No newline at end of file
......@@ -21,7 +21,7 @@ public class GreenWaveWeekDataTask implements ApplicationRunner {
log.info("服务启动时--周总体拥堵概况更新--任务执行时间:" + LocalDateTime.now());
// 周总体拥堵概况更新
try {
greenWaveWeekDataService.insertGreenWaveWeekData();
// greenWaveWeekDataService.insertGreenWaveWeekData();
}catch (Exception e){
log.error("服务启动时--周总体拥堵概况更新--任务执行错误" + e);
}
......@@ -34,7 +34,7 @@ public class GreenWaveWeekDataTask implements ApplicationRunner {
@Scheduled(cron = "0 30 0 ? * MON")
public void executeWeeklyTask() {
//周总体拥堵概况更新
log.info("定时任务--周总体拥堵概况更新--执行结束时间:" + LocalDateTime.now());
log.info("定时任务--周总体拥堵概况更新--执行开始时间:" + LocalDateTime.now());
try {
greenWaveWeekDataService.insertGreenWaveWeekData();
}catch (Exception e){
......
......@@ -6,7 +6,7 @@
<insert id="insertOrUpdateBatch">
INSERT INTO t_analysis_green_wave_week_data (
green_id, road_direction, congest_index, max_congest_index, congest_count,
congest_duration, flow, travel_time, speed, peak_type, day_type,
congest_duration, max_congest_duration, flow, travel_time, speed, peak_type, max_congestion_period, second_congestion_period, day_type,
start_time, end_time, year_week, insert_time
)
VALUES
......@@ -18,10 +18,13 @@
#{item.maxCongestIndex},
#{item.congestCount},
#{item.congestDuration},
#{item.maxCongestDuration},
#{item.flow},
#{item.travelTime},
#{item.speed},
#{item.peakType},
#{item.maxCongestionPeriod},
#{item.secondCongestionPeriod},
#{item.dayType},
#{item.startTime},
#{item.endTime},
......@@ -34,9 +37,12 @@
max_congest_index = VALUES(max_congest_index),
congest_count = VALUES(congest_count),
congest_duration = VALUES(congest_duration),
max_congest_duration = VALUES(max_congest_duration),
flow = VALUES(flow),
travel_time = VALUES(travel_time),
speed = VALUES(speed),
max_congestion_period = VALUES(max_congestion_period),
second_congestion_period = VALUES(second_congestion_period),
start_time = VALUES(start_time),
end_time = VALUES(end_time),
insert_time = VALUES(insert_time);
......@@ -48,25 +54,33 @@
select * from t_config_peak_hours;
</select>
<select id="selectGreenWaveWeekDataByTime" resultType="net.wanji.opt.entity.report.GreenWaveWeekData">
SELECT green_id,road_direction,max(traffic_index) max_congest_index,avg(traffic_index) congest_index,sum(status>=3) congest_count,sum(status>=3)*60*5 congest_duration,avg(speed) speed,sum(trval_time) travel_time
from t_greenwave_hist where start_time BETWEEN #{startDate} and #{endDate} AND TIME( start_time ) BETWEEN #{startTime} AND #{endTime} GROUP BY green_id,road_direction
SELECT green_id,road_direction,max(traffic_index) max_congest_index,avg(traffic_index) congest_index,sum(status>=3)*60*5 congest_duration,avg(speed) speed,sum(trval_time) travel_time
from t_greenwave_hist where start_time BETWEEN #{startDate} AND #{endDate} AND TIME( start_time ) BETWEEN #{startTime} AND #{endTime} GROUP BY green_id,road_direction
</select>
<select id="selectGreenWaveWeekData" resultType="net.wanji.opt.entity.report.GreenWaveWeekData">
SELECT green_id,road_direction,max(traffic_index) max_congest_index,avg(traffic_index) congest_index,sum(status>=3) congest_count,sum(status>=3)*60*5 congest_duration,avg(speed) speed,sum(trval_time) travel_time
from t_greenwave_hist where start_time BETWEEN #{startDate} and #{endDate} GROUP BY green_id,road_direction
SELECT green_id,road_direction,max(traffic_index) max_congest_index,avg(traffic_index) congest_index,sum(status>=3)*60*5 congest_duration,avg(speed) speed,sum(trval_time) travel_time
from t_greenwave_hist where start_time BETWEEN #{startDate} AND #{endDate} GROUP BY green_id,road_direction
</select>
<select id="getFlow" resultType="java.lang.Integer">
SELECT COALESCE(flow, 0) from
(select cross_id from t_greenwave_cross where green_id = #{greenId} and sort = 1) cross_data
left join
(SELECT sum(flow) as flow,cross_id from t_cross_dir_data_hist where start_time BETWEEN #{startDate} and #{endDate} and dir_type = #{dir} GROUP BY cross_id) cross_flow on cross_data.cross_id = cross_flow.cross_id
(SELECT sum(flow) as flow,cross_id from t_cross_dir_data_hist where start_time BETWEEN #{startDate} AND #{endDate} and dir_type = #{dir} GROUP BY cross_id) cross_flow on cross_data.cross_id = cross_flow.cross_id
</select>
<select id="getFlowByTime" resultType="java.lang.Integer">
SELECT COALESCE(flow, 0) from
(select cross_id from t_greenwave_cross where green_id = #{greenId} and sort = 1) cross_data
left join
(SELECT sum(flow) as flow,cross_id from t_cross_dir_data_hist where start_time BETWEEN #{startDate} and #{endDate} AND TIME( start_time ) BETWEEN #{startTime} AND #{endTime} and dir_type = #{dir} GROUP BY cross_id) cross_flow on cross_data.cross_id = cross_flow.cross_id
(SELECT sum(flow) as flow,cross_id from t_cross_dir_data_hist where start_time BETWEEN #{startDate} AND #{endDate} AND TIME( start_time ) BETWEEN #{startTime} AND #{endTime} and dir_type = #{dir} GROUP BY cross_id) cross_flow on cross_data.cross_id = cross_flow.cross_id
</select>
<select id="selectAllByTime" resultType="net.wanji.databus.dao.entity.GreenwaveHistPO">
select * from t_greenwave_hist where start_time BETWEEN #{startDate} AND #{endDate}
<if test="startTime != null and startTime != '' and endTime != null and endTime != ''">
and TIME( start_time ) BETWEEN #{startTime} AND #{endTime}
</if>
and green_id = #{greenId}
and status >= 3 and road_direction = #{roadDirection} order by start_time
</select>
</mapper>
\ No newline at end of file
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