Commit d6bf5253 authored by fengyasheng's avatar fengyasheng

交通分析报告-周总体拥堵概况

parent 5409c18c
package net.wanji.opt.dao.mapper.report;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.opt.entity.report.ConfigPeakHours;
import net.wanji.opt.entity.report.GreenWaveWeekData;
import net.wanji.opt.servicev2.report.GreenWaveWeekDataService;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface GreenWaveWeekDataMapper extends BaseMapper<GreenWaveWeekData> {
List<ConfigPeakHours> selectConfigPeakHoursAll();
List<GreenWaveWeekData> selectGreenWaveWeekData(@Param("startDate") String startDate,@Param("endDate") String endDate);
Integer getFlow(@Param("greenId") Integer greenId,@Param("dir") Integer dir,@Param("startDate") String startDate,@Param("endDate") String endDate);
List<GreenWaveWeekData> selectGreenWaveWeekDataByTime(@Param("startDate") String startDate,@Param("endDate") String endDate,@Param("startTime") String startTime,@Param("endTime") String endTime);
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);
// MyBatis-Plus 提供了基本的 CRUD 方法,这里无需额外定义
}
\ No newline at end of file
package net.wanji.opt.entity.report;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalTime;
@Data
@TableName("t_config_peak_hours")
public class ConfigPeakHours {
@TableId(value = "id", type = IdType.AUTO)
private Integer id; // 主键ID
private Integer cityCode; // 城市代码
private Integer dayType; // 类型:1工作日 2节假日 3特殊日期
private Integer peakType; // 高峰类型 1早高峰 2晚高峰 3全天
private String startTime; // 高峰开始时间
private String endTime; // 高峰结束时间
}
\ No newline at end of file
package net.wanji.opt.entity.report;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@Data
@TableName("t_analysis_green_wave_week_data")
@ApiModel(value = "绿波干线周总体拥堵概况分析表", description = "用于存储绿波干线周数据的实体类")
public class GreenWaveWeekData {
@TableId(value = "green_id", type = IdType.INPUT)
@ApiModelProperty(value = "绿波ID")
private Integer greenId; // 绿波ID
@ApiModelProperty(value = "绿波方向")
private String roadDirection; // 绿波方向
@ApiModelProperty(value = "平均拥堵指数")
private Double congestIndex; // 平均拥堵指数
@ApiModelProperty(value = "最大拥堵指数")
private Double maxCongestIndex; // 最大拥堵指数
@ApiModelProperty(value = "拥堵次数")
private Integer congestCount; // 拥堵次数
@ApiModelProperty(value = "拥堵总时长,单位秒")
private Double congestDuration; // 拥堵总时长,单位秒
@ApiModelProperty(value = "总流量")
private Integer flow; // 总流量
@ApiModelProperty(value = "行程时间")
private Integer travelTime; // 行程时间
@ApiModelProperty(value = "平均速度")
private Double speed; // 平均速度
@ApiModelProperty(value = "类型:1工作日 2节假日")
private String peakType; // 类型:1工作日 2节假日
@ApiModelProperty(value = "高峰类型 1早高峰 2晚高峰 3全天")
private String dayType; // 高峰类型 1早高峰 2晚高峰 3全天
@ApiModelProperty(value = "数据统计范围的开始时间")
private String startTime; // 数据统计范围的开始时间
@ApiModelProperty(value = "数据统计范围的截止时间")
private String endTime; // 数据统计范围的截止时间
@ApiModelProperty(value = "一年的第几周")
private Integer yearWeek; // 一年的第几周
@ApiModelProperty(value = "数据插入时间")
private Date insertTime; // 数据插入时间
}
\ No newline at end of file
package net.wanji.opt.servicev2.report;
import com.baomidou.mybatisplus.extension.service.IService;
import net.wanji.opt.entity.report.GreenWaveWeekData;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface GreenWaveWeekDataService extends IService<GreenWaveWeekData> {
void insertGreenWaveWeekData();
void insertOrUpdateBatch(List<GreenWaveWeekData> greenWaveWeekDataList);
}
\ No newline at end of file
package net.wanji.opt.servicev2.report.impl;
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.opt.dao.mapper.report.GreenWaveWeekDataMapper;
import net.wanji.opt.entity.report.ConfigPeakHours;
import net.wanji.opt.entity.report.GreenWaveWeekData;
import net.wanji.opt.servicev2.report.GreenWaveWeekDataService;
import org.springframework.beans.factory.annotation.Autowired;
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.format.DateTimeFormatter;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
@Service
@Slf4j
public class GreenWaveWeekDataServiceImpl extends ServiceImpl<GreenWaveWeekDataMapper, GreenWaveWeekData>
implements GreenWaveWeekDataService {
@Autowired
private GreenWaveWeekDataService greenWaveWeekDataService;
@Autowired
private GreenWaveWeekDataMapper greenWaveWeekDataMapper;
@Override
public void insertGreenWaveWeekData() {
List<ConfigPeakHours> configPeakHours = greenWaveWeekDataMapper.selectConfigPeakHoursAll();
// 获取上周的开始时间(周一 00:00:00)
LocalDateTime startOfLastWeek = getStartOfLastWeek();
// 获取上周的结束时间(周日 23:59:59)
LocalDateTime endOfLastWeek = getEndOfLastWeek();
// 格式化输出
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String startDate = startOfLastWeek.format(formatter);
String endDate = endOfLastWeek.format(formatter);
for (ConfigPeakHours configPeakHour : configPeakHours) {
String startTime = configPeakHour.getStartTime();
String endTime = configPeakHour.getEndTime();
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);
x.setFlow(flow);
x.setYearWeek(getWeekNumberOfYear(startOfLastWeek));
x.setInsertTime(new Date());
});
greenWaveWeekDataService.insertOrUpdateBatch(greenWaveWeekDataList);
log.info("周总体拥堵高峰期概况批量保存或更新成功!");
}
List<GreenWaveWeekData> greenWaveWeekDataList = greenWaveWeekDataMapper.selectGreenWaveWeekData(startDate, endDate);
greenWaveWeekDataList.forEach(x -> {
x.setPeakType("1");
x.setDayType("3");
x.setStartTime(startDate);
x.setEndTime(endDate);
Integer dir = getDir(x.getRoadDirection());
Integer flow = greenWaveWeekDataMapper.getFlow(x.getGreenId(), dir, startDate, endDate);
x.setFlow(flow);
x.setYearWeek(getWeekNumberOfYear(startOfLastWeek));
x.setInsertTime(new Date());
});
greenWaveWeekDataService.insertOrUpdateBatch(greenWaveWeekDataList);
log.info("周总体拥堵高峰期概况批量保存或更新成功!");
}
@Override
public void insertOrUpdateBatch(List<GreenWaveWeekData> greenWaveWeekDataList) {
greenWaveWeekDataMapper.insertOrUpdateBatch(greenWaveWeekDataList);
}
private Integer getDir(String roadDirection) {
switch (roadDirection) {
case "e2w":
return 3;
case "w2e":
return 7;
case "s2n":
return 5;
case "n2s":
return 1;
default:
return 3;
}
}
/*
* 获取周数
* */
public static int getWeekNumberOfYear(LocalDateTime date) {
WeekFields weekFields = WeekFields.of(Locale.getDefault()); // 使用默认区域设置
return date.get(weekFields.weekOfWeekBasedYear());
}
/*
* 获取日期yyyy-MM-dd
* */
public List<String> getLastWeeKDays() {
LocalDate today = LocalDate.now();
LocalDate lastMonday = today.with(DayOfWeek.MONDAY).minusWeeks(1);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
List<String> dayList = new ArrayList<>();
for (int i = 0; i < 7; i++) {
LocalDate day = lastMonday.plusDays(i);
dayList.add(day.format(formatter));
}
return dayList;
}
/**
* 获取上周的开始时间(周一 00:00:00)
*/
public static LocalDateTime getStartOfLastWeek() {
// 获取当前日期
LocalDateTime now = LocalDateTime.now();
// 找到上周一
LocalDateTime lastMonday = now.with(DayOfWeek.MONDAY).minusWeeks(1)
.with(LocalTime.MIN); // 设置时间为 00:00:00
return lastMonday;
}
/**
* 获取上周的结束时间(周日 23:59:59)
*/
public static LocalDateTime getEndOfLastWeek() {
// 获取当前日期
LocalDateTime now = LocalDateTime.now();
// 找到上周日
LocalDateTime lastSunday = now.with(DayOfWeek.SUNDAY).minusWeeks(1)
.with(LocalTime.MAX); // 设置时间为 23:59:59
return lastSunday;
}
}
\ No newline at end of file
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.dao.mapper.report.GreenWaveWeekDataMapper;
import net.wanji.opt.servicev2.report.GreenWaveWeekDataService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
@Component
@Slf4j
public class GreenWaveWeekDataTask implements ApplicationRunner {
@Resource
private GreenWaveWeekDataService greenWaveWeekDataService;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("服务启动时--周总体拥堵概况更新--任务执行时间:" + LocalDateTime.now());
// 周总体拥堵概况更新
try {
greenWaveWeekDataService.insertGreenWaveWeekData();
}catch (Exception e){
log.error("服务启动时--周总体拥堵概况更新--任务执行错误" + e);
}
log.info("服务启动时--周总体拥堵概况更新--任务执行结束时间:" + LocalDateTime.now());
}
/**
* 每周一凌晨 0:30 执行的任务
*/
@Scheduled(cron = "0 30 0 ? * MON")
public void executeWeeklyTask() {
//周总体拥堵概况更新
log.info("定时任务--周总体拥堵概况更新--执行结束时间:" + LocalDateTime.now());
try {
greenWaveWeekDataService.insertGreenWaveWeekData();
}catch (Exception e){
log.error("定时任务--周总体拥堵概况更新--任务执行错误" + e);
}
log.info("定时任务--周总体拥堵概况更新--执行结束时间:" + LocalDateTime.now());
}
}
<?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="net.wanji.opt.dao.mapper.report.GreenWaveWeekDataMapper">
<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,
start_time, end_time, year_week, insert_time
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.greenId},
#{item.roadDirection},
#{item.congestIndex},
#{item.maxCongestIndex},
#{item.congestCount},
#{item.congestDuration},
#{item.flow},
#{item.travelTime},
#{item.speed},
#{item.peakType},
#{item.dayType},
#{item.startTime},
#{item.endTime},
#{item.yearWeek},
#{item.insertTime}
)
</foreach>
ON DUPLICATE KEY UPDATE
congest_index = VALUES(congest_index),
max_congest_index = VALUES(max_congest_index),
congest_count = VALUES(congest_count),
congest_duration = VALUES(congest_duration),
flow = VALUES(flow),
travel_time = VALUES(travel_time),
speed = VALUES(speed),
start_time = VALUES(start_time),
end_time = VALUES(end_time),
insert_time = VALUES(insert_time);
</insert>
<!-- 基本的 CRUD 方法由 MyBatis-Plus 自动生成,无需手动编写 -->
<select id="selectConfigPeakHoursAll" resultType="net.wanji.opt.entity.report.ConfigPeakHours">
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,count(status>=3) congest_count,count(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,count(status>=3) congest_count,count(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>
<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>
</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