Commit a74541ec authored by 黄伟铭's avatar 黄伟铭

新增干线缓行,拥堵的时段分析数据,周一统计上一周的数据

parent 5409c18c
package net.wanji.opt.dao.mapper.judgeanalysis;
import net.wanji.opt.entity.judgeanalysis.AnalysisGreenCongestionPeriod;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface AnalysisGreenCongestionPeriodMapper {
List<AnalysisGreenCongestionPeriod> selectGreenDataHist(@Param("date") String date);
void insertGreenCongestionPeriodData(Map<String, Object> map);
}
package net.wanji.opt.entity.judgeanalysis;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "AnalysisGreenCongestionPeriod", description = "")
public class AnalysisGreenCongestionPeriod {
@ApiModelProperty(value = "干线ID")
private String greenId;
@ApiModelProperty(value = "道路方向")
private String roadDirection;
@ApiModelProperty(value = "开始时间")
private String startTime;
@ApiModelProperty(value = "状态")
private String status;
}
package net.wanji.opt.servicev2.judgeanalysis;
import java.text.ParseException;
public interface AnalysisGreenCongestionPeriodService {
public void selectCountByCongestionPeriod() throws ParseException;
}
package net.wanji.opt.servicev2.judgeanalysis.impl;
import net.wanji.opt.dao.mapper.judgeanalysis.AnalysisGreenCongestionPeriodMapper;
import net.wanji.opt.entity.judgeanalysis.AnalysisGreenCongestionPeriod;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisGreenCongestionPeriodService;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
* 干线拥堵时段实现类
* </p>
*
* @author hwm
* @since 2025-03-20
*/
@Service
public class AnalysisGreenCongestionPeriodServiceImpl implements AnalysisGreenCongestionPeriodService {
@Resource
private AnalysisGreenCongestionPeriodMapper analysisGreenCongestionPeriodMapper;
public void selectCountByCongestionPeriod() throws ParseException {
LocalDate currentDate = LocalDate.now();
// 获取本周一的日期
LocalDate mondayOfThisWeek = currentDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
// 获取上周一的日期
LocalDate todayOfWeek = mondayOfThisWeek.plusDays(-7);
//获取上周日的日期
LocalDate endOfWeek = mondayOfThisWeek.plusDays(-1);
WeekFields weekFields = WeekFields.of(Locale.getDefault());
//获取上周的周数
int Number = todayOfWeek.get(weekFields.weekOfYear());
int year = currentDate.getYear();
String weekNumber = String.valueOf(year) + String.valueOf(Number);
//循环7天处理数据
for (int i = 0; i < 7; i++) {
LocalDate date = todayOfWeek.plusDays(i);
//获取干线数据
List<AnalysisGreenCongestionPeriod> greenList = analysisGreenCongestionPeriodMapper.selectGreenDataHist(date.toString());
LinkedList<AnalysisGreenCongestionPeriod> queue = new LinkedList<>();
String greenId = "";
String roadDirection = "";
String startTime = "";
String endTime = "";
for(AnalysisGreenCongestionPeriod temp : greenList){
if(temp.getGreenId().equals(greenId) && temp.getRoadDirection().equals(roadDirection)){
if(temp.getStatus().equals("2")){
List<AnalysisGreenCongestionPeriod> list = queue.stream().filter(item -> item.getStatus().equals("3")).collect(Collectors.toList());
if(!CollectionUtils.isNotEmpty(list)){
List<AnalysisGreenCongestionPeriod> list1 = queue.stream().filter(item -> item.getStatus().equals("2")).collect(Collectors.toList());
if(!CollectionUtils.isNotEmpty(list1)){
startTime = temp.getStartTime();
}
}else {
if(list.size() == 1 && queue.getFirst().getStatus().equals("3") ){
endTime = queue.getFirst().getStartTime();
Map<String,Object> map = new HashMap<>();
map.put("startTime",startTime);
map.put("endTime",endTime);
map.put("weekNumber",weekNumber);
map.put("weekDay",i + 1);
map.put("roadDirection",roadDirection);
map.put("peakType",isMoning(startTime));
map.put("weekStartTime",todayOfWeek);
map.put("weekEndTime",endOfWeek);
map.put("greenId",greenId);
map.put("status",queue.getFirst().getStatus());
//写入缓行数据
analysisGreenCongestionPeriodMapper.insertGreenCongestionPeriodData(map);
//记录缓行开始时间
if(queue.get(1).getStatus().equals("2")) {
startTime = queue.get(1).getStartTime();
}else if (queue.getLast().getStatus().equals("2")) {
startTime = queue.getLast().getStartTime();
}else {
startTime = temp.getStartTime();
}
}
}
}else if(temp.getStatus().equals("1")){
List<AnalysisGreenCongestionPeriod> list = queue.stream().filter(item -> item.getStatus().equals("3")).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(list) && queue.size() > 2 && list.size() == 1 && queue.getFirst().getStatus().equals("3")){
endTime = queue.getFirst().getStartTime();
Map<String,Object> map = new HashMap<>();
map.put("startTime",startTime);
map.put("endTime",endTime);
map.put("weekNumber",weekNumber);
map.put("weekDay",i + 1);
map.put("roadDirection",roadDirection);
map.put("peakType",isMoning(startTime));
map.put("weekStartTime",todayOfWeek);
map.put("weekEndTime",endOfWeek);
map.put("greenId",greenId);
map.put("status",queue.getFirst().getStatus());
//写入缓行数据
analysisGreenCongestionPeriodMapper.insertGreenCongestionPeriodData(map);
if(queue.get(1).getStatus().equals("2")) {
startTime = queue.get(1).getStartTime();
}
}else {
List<AnalysisGreenCongestionPeriod> list1 = queue.stream().filter(item -> item.getStatus().equals("2")).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(list1) && queue.size() > 2 && list1.size() == 1 && queue.getFirst().getStatus().equals("2") && !queue.get(1).getStatus().equals("3")){
endTime = queue.getFirst().getStartTime();
Map<String,Object> map = new HashMap<>();
map.put("startTime",startTime);
map.put("endTime",endTime);
map.put("weekNumber",weekNumber);
map.put("weekDay",i + 1);
map.put("roadDirection",roadDirection);
map.put("peakType",isMoning(startTime));
map.put("weekStartTime",todayOfWeek);
map.put("weekEndTime",endOfWeek);
map.put("greenId",greenId);
map.put("status",queue.getFirst().getStatus());
//写入缓行数据
analysisGreenCongestionPeriodMapper.insertGreenCongestionPeriodData(map);
}
}
}else if(temp.getStatus().equals("3")){
List<AnalysisGreenCongestionPeriod> list = queue.stream().filter(item -> item.getStatus().equals("3")).collect(Collectors.toList());
if(!CollectionUtils.isNotEmpty(list)){
List<AnalysisGreenCongestionPeriod> list1 = queue.stream().filter(item -> item.getStatus().equals("2")).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(list1) && list1.size() >= 1 && queue.getLast().getStatus().equals("2") ){
endTime = queue.getLast().getStartTime();
Map<String,Object> map = new HashMap<>();
map.put("startTime",startTime);
map.put("endTime",endTime);
map.put("weekNumber",weekNumber);
map.put("weekDay",i + 1);
map.put("roadDirection",roadDirection);
map.put("peakType",isMoning(startTime));
map.put("weekStartTime",todayOfWeek);
map.put("weekEndTime",endOfWeek);
map.put("greenId",greenId);
map.put("status",queue.getLast().getStatus());
//写入缓行数据
analysisGreenCongestionPeriodMapper.insertGreenCongestionPeriodData(map);
//记录拥堵开始时间
startTime = temp.getStartTime();
}else {
startTime = temp.getStartTime();
}
}
}
enqueue(queue,temp);
}else if(temp.getGreenId().equals(greenId) && !temp.getRoadDirection().equals(roadDirection)){
queue.clear();
roadDirection = temp.getRoadDirection();
if(temp.getStatus().equals("2")){
startTime = temp.getStartTime();
}
enqueue(queue,temp);
}else {
queue.clear();
greenId = temp.getGreenId();
roadDirection = temp.getRoadDirection();
if(temp.getStatus().equals("2")){
startTime = temp.getStartTime();
}
enqueue(queue,temp);
}
}
}
}
public void enqueue(LinkedList<AnalysisGreenCongestionPeriod> queue , AnalysisGreenCongestionPeriod temp ){
if(queue.size() >= 3 ){
queue.poll();
}
queue.offer(temp);
}
public Integer isMoning(String date) throws ParseException {
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date temp = fmt.parse(date);
int hour = temp.getHours();
if(hour <= 12){
return 1;
}else {
return 2;
}
}
}
package net.wanji.opt.task;
import lombok.extern.slf4j.Slf4j;
import net.wanji.opt.servicev2.judgeanalysis.AnalysisGreenCongestionPeriodService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.ParseException;
@Component
@Configurable
@EnableScheduling
@Slf4j
@Profile("docker")
public class AnalysisGreenCongestionPeriodWeekTask {
@Autowired
private AnalysisGreenCongestionPeriodService analysisGreenCongestionPeriodService;
@Scheduled(cron = "0 0 2 ? * 1")
public void task() throws ParseException {
analysisGreenCongestionPeriodService.selectCountByCongestionPeriod();
}
}
<?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.judgeanalysis.AnalysisGreenCongestionPeriodMapper">
<!-- 通用查询映射结果 -->
<resultMap id="AnalysisGreenCongestionPeriodMap" type="net.wanji.opt.entity.judgeanalysis.AnalysisGreenCongestionPeriod">
<result column="green_id" property="greenId"/>
<result column="road_direction" property="roadDirection"/>
<result column="start_time" property="startTime"/>
<result column="status" property="status"/>
</resultMap>
<select id="selectGreenDataHist" parameterType="String" resultMap="AnalysisGreenCongestionPeriodMap">
SELECT a.green_id,a.road_direction,a.start_time,a.status FROM t_greenwave_hist a
where a.start_time between DATE_FORMAT(#{date},'%Y-%m-%d 00:00:00') and DATE_FORMAT(#{date},'%Y-%m-%d 23:59:59')
and a.green_id is not null
order by a.green_id,a.road_direction,a.start_time
</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)
SELECT a.green_id,a.road_direction,#{weekDay} as week_day, DATE_FORMAT(#{startTime},'%Y-%m-%d %H:%i:%s') as congest_start_time,DATE_FORMAT(DATE_ADD(#{endTime},INTERVAL 5 MINUTE),'%Y-%m-%d %H:%i:%s') as congest_end_time,AVG(traffic_index),#{status} as status,CEIL(AVG(trval_time)),AVG(speed),
#{peakType} as peak_type,#{weekNumber} as year_week,DATE_FORMAT(#{weekStartTime},'%Y-%m-%d') as week_start_time,DATE_FORMAT(#{weekEndTime},'%Y-%m-%d') as week_end_time,now()
FROM t_greenwave_hist a
where a.start_time between DATE_FORMAT(#{startTime},'%Y-%m-%d %H:%i:%s') and DATE_FORMAT(#{endTime},'%Y-%m-%d %H:%i:%s')
and a.green_id = #{greenId}
and a.road_direction = #{roadDirection}
</insert>
</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