Commit c85b4a40 authored by duanruiming's avatar duanruiming

Merge remote-tracking branch 'origin/master'

parents 77821d13 290108eb
......@@ -64,14 +64,14 @@
<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
(select cross_id from t_greenwave_cross where green_id = #{greenId} and is_key_route = 1 limit 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 is_key_route = 1) cross_data
(select cross_id from t_greenwave_cross where green_id = #{greenId} and is_key_route = 1 limit 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>
......
......@@ -4,6 +4,10 @@ import com.alibaba.fastjson.JSONArray;
import net.wanji.opt.constant.DirEnum;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
/**
* @author duanruiming
* @date 2025/04/02 15:44
......@@ -15,17 +19,18 @@ public class CommonUtils {
**/
public static final String SEPARATOR_UNDER_LINE = "_";
public static String getStrJoin(String ... str) {
public static String getStrJoin(String... str) {
String join = String.join(SEPARATOR_UNDER_LINE, str);
return join;
}
/**
* 事件发生方向转换为描述
*
* @param dir
* @return
*/
public static String getEventHappenDirName(String dir){
public static String getEventHappenDirName(String dir) {
StringBuilder stringBuilder = new StringBuilder();
if (StringUtils.isNotEmpty(dir)) {
JSONArray dirArr = JSONArray.parseArray(dir);
......@@ -35,10 +40,28 @@ public class CommonUtils {
stringBuilder.append(dirName);
}
}
if (stringBuilder.length()>1){
if (stringBuilder.length() > 1) {
return stringBuilder.substring(1);
}
return null;
}
/**
* 获取两个时间之间相差多少分钟
* @param startTime
* @param endTime
* @param format
* @return
*/
public static int getTimeBetweenMinutes(String startTime, String endTime, String format) {
// 定义时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
// 解析时间字符串为LocalTime对象
LocalTime time1 = LocalTime.parse(startTime, formatter);
LocalTime time2 = LocalTime.parse(endTime, formatter);
// 计算时间差(以分钟为单位)
int minutes = (int) ChronoUnit.MINUTES.between(time1, time2);
return minutes;
}
}
......@@ -39,9 +39,10 @@ class GreenReportProblemOverallAnalysisResponse {
@ApiModelProperty(value = "区域干线总拥堵时长", example = "11小时")
private String totalCongestDuration;
@ApiModelProperty(value = "拥堵严重干线",example = "经十路(舜耕路-山大路)、经十路(洪山路-舜华路)")
@ApiModelProperty(value = "拥堵严重干线",example = "经十路(舜耕路-山大路)东向西、经十路(洪山路-舜华路)西向东",notes = "20250425修改为前端根据dataList数据中按方向交通指数取最大的两条")
private String congestHeavyGreenWave;
@ApiModelProperty(value = "区域干线方向拥堵排名情况")
private List<GreenReportProblemOverallData> dataList = new ArrayList<>();
}
......
......@@ -263,14 +263,22 @@ public class AnalysisGreenCongestionPeriodServiceImpl implements AnalysisGreenCo
//按拥堵指数降序排序
// List<AnalysisGreenCongestionPeriodVO> periodVOS = voList.stream().sorted(Comparator.comparing(AnalysisGreenCongestionPeriodVO::getCongestIndex).reversed())
// .collect(Collectors.toList());
// List<GreenReportProblemOverallDataVO> overallDataVOS = greenList.stream().sorted(Comparator.comparing(x -> {
// double congestIndexAll = 0;
// for (GreenWaveDirProblemDataVO dataVO : x.getList()) {
// congestIndexAll += dataVO.getCongestIndex();
// }
// return - congestIndexAll/x.getList().size();
// })).collect(Collectors.toList());
//按拥堵次数降序排序
List<GreenReportProblemOverallDataVO> overallDataVOS = greenList.stream().sorted(Comparator.comparing(x -> {
double congestIndexAll = 0;
double congestCountAll = 0;
for (GreenWaveDirProblemDataVO dataVO : x.getList()) {
congestIndexAll += dataVO.getCongestIndex();
congestCountAll += dataVO.getCongestCount();
}
return - congestIndexAll/x.getList().size();
return - congestCountAll;
})).collect(Collectors.toList());
Set<Integer> greenIds = new HashSet<>();
List<Integer> greenIds = new ArrayList<>();
for (GreenReportProblemOverallDataVO periodVO : overallDataVOS) {
greenIds.add(Integer.valueOf(periodVO.getGreenId()));
if (greenIds.size() >= 2) {
......
......@@ -104,7 +104,6 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
@Override
public GreenWaveOptimizeAnalysisResultResponseDTO getTotalityData(Integer year, Integer week, String ids) {
Integer yearWeek = Integer.valueOf(year + "" + week);
Integer yearWeekLast = Integer.valueOf(year + "" + (week - 1));
List<Integer> greenIdList = new ArrayList<>();
if (ObjectUtils.isEmpty(ids)) {
List<GreenwaveInfoPO> greenwaveInfoPOList = greenwaveInfoMapper.selectAll();
......@@ -124,12 +123,12 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
if (ObjectUtils.isEmpty(greenWaveOptimizeAnalysisDataDTO)) {
optimizeAnalysisResultResponseDTO.setWeekOptimizeCount("0次");
optimizeAnalysisResultResponseDTO.setWeekOptimizeDuration("0小时");
optimizeAnalysisResultResponseDTO.setWeekCapacitySituation("无变化");
optimizeAnalysisResultResponseDTO.setWeekStopTimesSituation("无变化");
optimizeAnalysisResultResponseDTO.setWeekTravelTimeSituation("无变化");
optimizeAnalysisResultResponseDTO.setWeekDelayTimeSituation("无变化");
optimizeAnalysisResultResponseDTO.setWeekAvgSpeedSituation("无变化");
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("无变化");
optimizeAnalysisResultResponseDTO.setWeekCapacitySituation("持平");
optimizeAnalysisResultResponseDTO.setWeekStopTimesSituation("持平");
optimizeAnalysisResultResponseDTO.setWeekTravelTimeSituation("持平");
optimizeAnalysisResultResponseDTO.setWeekDelayTimeSituation("持平");
optimizeAnalysisResultResponseDTO.setWeekAvgSpeedSituation("持平");
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("持平");
} else {
optimizeAnalysisResultResponseDTO.setWeekOptimizeCount(String.valueOf(greenWaveOptimizeAnalysisDataDTO.getOptimizeCount()) + "次");
optimizeAnalysisResultResponseDTO.setWeekOptimizeDuration(String.valueOf(greenWaveOptimizeAnalysisDataDTO.getOptimizeDuration() / 60 / 60) + "小时");
......@@ -160,6 +159,8 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
weekCapacitySituation = (analysisDataDTO.getCapacity() - analysisDataDTO.getLastCapacity()) * 100 / analysisDataDTO.getLastCapacity();
if (weekCapacitySituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekCapacitySituation("提升" + weekCapacitySituation + "%");
}else if (weekCapacitySituation == 0) {
optimizeAnalysisResultResponseDTO.setWeekCapacitySituation("持平");
} else {
optimizeAnalysisResultResponseDTO.setWeekCapacitySituation("降低" + Math.abs(weekCapacitySituation) + "%");
}
......@@ -171,6 +172,8 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
weekStopTimesSituation = Math.round((analysisDataDTO.getStopTimes() - analysisDataDTO.getLastStopTimes()) * 100 / analysisDataDTO.getLastStopTimes());
if (weekStopTimesSituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekStopTimesSituation("增加" + weekStopTimesSituation + "%");
}else if (weekStopTimesSituation == 0) {
optimizeAnalysisResultResponseDTO.setWeekStopTimesSituation("持平");
} else {
optimizeAnalysisResultResponseDTO.setWeekStopTimesSituation("减少" + Math.abs(weekStopTimesSituation) + "%");
}
......@@ -180,6 +183,8 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
weekTravelTimeSituation = (analysisDataDTO.getTravelTime() - analysisDataDTO.getLastTravelTime()) * 100 / analysisDataDTO.getLastTravelTime();
if (weekTravelTimeSituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekTravelTimeSituation("增加" + weekTravelTimeSituation + "%");
}else if (weekTravelTimeSituation == 0) {
optimizeAnalysisResultResponseDTO.setWeekTravelTimeSituation("持平");
} else {
optimizeAnalysisResultResponseDTO.setWeekTravelTimeSituation("减少" + Math.abs(weekTravelTimeSituation) + "%");
}
......@@ -189,6 +194,8 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
weekDelayTimeSituation = Math.round((analysisDataDTO.getDelayTime() - analysisDataDTO.getLastDelayTime()) * 100 / analysisDataDTO.getLastDelayTime());
if (weekDelayTimeSituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekDelayTimeSituation("增加" + weekDelayTimeSituation + "%");
}else if (weekDelayTimeSituation == 0) {
optimizeAnalysisResultResponseDTO.setWeekDelayTimeSituation("持平");
} else {
optimizeAnalysisResultResponseDTO.setWeekDelayTimeSituation("减少" + Math.abs(weekDelayTimeSituation) + "%");
}
......@@ -198,30 +205,20 @@ public class AnalysisGreenWaveOptimizeWeekServiceImpl extends ServiceImpl<Analys
weekAvgSpeedSituation = Math.round((analysisDataDTO.getAvgSpeed() - analysisDataDTO.getLastAvgSpeed()) * 100 / analysisDataDTO.getLastAvgSpeed());
if (weekAvgSpeedSituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekAvgSpeedSituation("提升" + weekAvgSpeedSituation + "%");
}else if (weekAvgSpeedSituation == 0) {
optimizeAnalysisResultResponseDTO.setWeekAvgSpeedSituation("持平");
} else {
optimizeAnalysisResultResponseDTO.setWeekAvgSpeedSituation("降低" + Math.abs(weekAvgSpeedSituation) + "%");
}
}
//本周总体情况
if (weekCapacitySituation >= 0 && weekTravelTimeSituation <= 0) {
if (weekCapacitySituation >= 0) {
if (weekCapacitySituation >= 5) {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("明显提升");
} else {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("略有提升");
}
} else if (weekCapacitySituation >= 0 && weekTravelTimeSituation > 0) {
if (weekCapacitySituation - weekTravelTimeSituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("略有提升");
} else {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("略有下降");
}
} else if (weekCapacitySituation < 0 && weekTravelTimeSituation <= 0) {
if (weekCapacitySituation - weekTravelTimeSituation > 0) {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("略有提升");
} else {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("略有下降");
}
} else if (weekCapacitySituation < 0 && weekTravelTimeSituation > 0) {
} else{
if (Math.abs(weekCapacitySituation) >= 5) {
optimizeAnalysisResultResponseDTO.setWeekTotalitySituation("明显下降");
} else {
......
......@@ -10,6 +10,7 @@ import net.wanji.common.utils.tool.DateUtil;
import net.wanji.databus.dao.entity.GreenwaveInfoPO;
import net.wanji.databus.dao.mapper.GreenwaveInfoMapper;
import net.wanji.opt.common.ArithOfBigDecmial;
import net.wanji.opt.common.CommonUtils;
import net.wanji.opt.common.enums.PeakNameEnum;
import net.wanji.opt.constant.PeakEnum;
import net.wanji.opt.constant.WeekDayEnum;
......@@ -29,6 +30,9 @@ import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
......@@ -121,7 +125,7 @@ public class AnalysisGreenWavePeakDetailServiceImpl extends BaseDubboInterfaceIm
if (vo1.getCongestStartTime() != null && vo2.getCongestEndTime() != null) {
weekData.setThisWeekCongestSpan(DateUtil.formatDate(vo1.getCongestStartTime(), "HH:mm") + "~" + DateUtil.formatDate(vo2.getCongestEndTime(), "HH:mm"));
}
if (Objects.nonNull(lastWeekDataList)){
if (Objects.nonNull(lastWeekDataList)) {
//上周高峰指标数据
Optional<AnalysisGreenWavePeakDetail> optional = lastWeekDataList.stream().filter(o -> Objects.equals(o.getWeekDay(), detail.getWeekDay()) && Objects.equals(o.getPeakType(), detail.getPeakType())).findFirst();
if (optional.isPresent()) {
......@@ -209,48 +213,62 @@ public class AnalysisGreenWavePeakDetailServiceImpl extends BaseDubboInterfaceIm
Double lastAvgCongestIndex = 0D;
//====================================================================================================================================================//
if (Objects.nonNull(earliestStartTimePo) && Objects.nonNull(lastWeekEarliestStartTimePo)) {
minutesStart = Minutes.minutesBetween(new DateTime(earliestStartTimePo.getPeakStartTime().getTime()), new DateTime(lastWeekEarliestStartTimePo.getPeakStartTime().getTime())).getMinutes();
minutesEnd = Minutes.minutesBetween(new DateTime(earliestStartTimePo.getPeakEndTime().getTime()), new DateTime(lastWeekEarliestStartTimePo.getPeakEndTime().getTime())).getMinutes();
String thisHM = DateUtil.formatDate(earliestStartTimePo.getPeakStartTime(), "HH:mm");
String lastHM = DateUtil.formatDate(lastWeekEarliestStartTimePo.getPeakStartTime(), "HH:mm");
// 计算时间差(以分钟为单位)
minutesStart = CommonUtils.getTimeBetweenMinutes(thisHM,lastHM,"HH:mm");
thisHM = DateUtil.formatDate(earliestStartTimePo.getPeakEndTime(), "HH:mm");
lastHM = DateUtil.formatDate(lastWeekEarliestStartTimePo.getPeakEndTime(), "HH:mm");
// 计算时间差(以分钟为单位)
minutesEnd = CommonUtils.getTimeBetweenMinutes(thisHM,lastHM,"HH:mm");
}
//====================================================================================================================================================//
//早高峰集中时段
if (Objects.nonNull(earliestStartTimePo) && Objects.nonNull(lastEndTimePo)) {
amPeakScope = DateUtil.formatDate(earliestStartTimePo.getPeakStartTime(), "HH:mm") + "~" + DateUtil.formatDate(lastEndTimePo.getPeakEndTime(), "HH:mm");
//持续时长
amDuration1 = Minutes.minutesBetween(new DateTime(earliestStartTimePo.getPeakStartTime().getTime()), new DateTime(lastEndTimePo.getPeakEndTime().getTime())).getMinutes();
String amPeakStart = DateUtil.formatDate(earliestStartTimePo.getPeakStartTime(), "HH:mm");
String amPeakEnd = DateUtil.formatDate(lastEndTimePo.getPeakEndTime(), "HH:mm");
amPeakScope = amPeakStart + "~" + amPeakEnd;
// 计算时间差(以分钟为单位)
amDuration1 = CommonUtils.getTimeBetweenMinutes(amPeakStart,amPeakEnd,"HH:mm");
}
//====================================================================================================================================================//
//开始时间比上周
String amPeakStartSituation = "";
if (minutesStart > 0) {
amPeakStartSituation = "提前" + minutesStart + "分钟";
amPeakStartSituation = "提前" + Math.abs(minutesStart) + "分钟";
} else {
amPeakStartSituation = "延后" + minutesStart + "分钟";
amPeakStartSituation = "延后" + Math.abs(minutesStart) + "分钟";
}
//====================================================================================================================================================//
//结束时间比上周
String amPeakEndSituation = "";
if (minutesEnd > 0) {
amPeakEndSituation = "提前" + minutesEnd + "分钟";
amPeakEndSituation = "提前" + Math.abs(minutesEnd) + "分钟";
} else {
amPeakEndSituation = "延后" + minutesEnd + "分钟";
amPeakEndSituation = "延后" + Math.abs(minutesEnd) + "分钟";
}
//====================================================================================================================================================//
//持续时长
if (Objects.nonNull(lastWeekEarliestStartTimePo) && Objects.nonNull(lastWeekLastEndTimePo)) {
amDuration2 = Minutes.minutesBetween(new DateTime(lastWeekEarliestStartTimePo.getPeakStartTime().getTime()), new DateTime(lastWeekLastEndTimePo.getPeakEndTime().getTime())).getMinutes();
String amPeakStart = DateUtil.formatDate(lastWeekEarliestStartTimePo.getPeakStartTime(), "HH:mm");
String amPeakEnd = DateUtil.formatDate(lastWeekLastEndTimePo.getPeakEndTime(), "HH:mm");
amDuration2 = CommonUtils.getTimeBetweenMinutes(amPeakStart,amPeakEnd,"HH:mm");
}
//本周高峰持续时长
String amPeakDuration = amDuration1 + "分钟";
String amDurationSameRatioSituation = "";
if (amDuration1 > amDuration2) {
amDurationSameRatioSituation = "增加" + (amDuration1 - amDuration2) + "分钟";
amDurationSameRatioSituation = "增加" + Math.abs((amDuration1 - amDuration2)) + "分钟";
} else {
amDurationSameRatioSituation = "减少" + (amDuration2 - amDuration1) + "分钟";
amDurationSameRatioSituation = "减少" + Math.abs((amDuration2 - amDuration1)) + "分钟";
}
//====================================================================================================================================================//
thisMaxTravelTime = thisWeekList.stream().map(AnalysisGreenWavePeakDetail::getTravelTime).max(Comparator.comparing(Integer::intValue)).orElse(0);
thisMaxTravelTime = (int)ArithOfBigDecmial.div(thisMaxTravelTime,60);//转为分钟
lastMaxTravelTime = lastWeekDataList.stream().map(AnalysisGreenWavePeakDetail::getTravelTime).max(Comparator.comparing(Integer::intValue)).orElse(0);
lastMaxTravelTime = (int)ArithOfBigDecmial.div(lastMaxTravelTime,60);//转为分钟
//最大行程时间状况
String maxTravelTimeSituation = "";
if (thisMaxTravelTime > lastMaxTravelTime) {
......@@ -266,9 +284,9 @@ public class AnalysisGreenWavePeakDetailServiceImpl extends BaseDubboInterfaceIm
//平均拥堵指数状况
String amAvgCongestIndex = "";
if (thisAvgCongestIndex > lastAvgCongestIndex) {
amAvgCongestIndex = "增加" + (Math.abs(thisAvgCongestIndex - lastAvgCongestIndex)) + "";
amAvgCongestIndex = "增加" + ArithOfBigDecmial.round(Math.abs(thisAvgCongestIndex - lastAvgCongestIndex),2) + "";
} else {
amAvgCongestIndex = "减少" + (Math.abs(thisAvgCongestIndex - lastAvgCongestIndex)) + "";
amAvgCongestIndex = "减少" + ArithOfBigDecmial.round(Math.abs(thisAvgCongestIndex - lastAvgCongestIndex),2)+ "";
}
//====================================================================================================================================================//
if (Objects.equals(peakType, 1)) {
......@@ -304,6 +322,14 @@ public class AnalysisGreenWavePeakDetailServiceImpl extends BaseDubboInterfaceIm
return vo;
}
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
LocalTime time1 = LocalTime.parse("0800", formatter);
LocalTime time2 = LocalTime.parse("0745", formatter);
// 计算时间差(以分钟为单位)
int minutesStart = (int) ChronoUnit.MINUTES.between(time1, time2);
System.out.println(minutesStart);
}
/**
* 获取峰值时间边界
......@@ -315,7 +341,7 @@ public class AnalysisGreenWavePeakDetailServiceImpl extends BaseDubboInterfaceIm
*/
private AnalysisGreenWavePeakDetail getPeakTimeBoundary(List<AnalysisGreenWavePeakDetail> list, Integer type, Integer peakType) {
if (Objects.isNull(list)) {
return null;
return null;
}
AnalysisGreenWavePeakDetail ret = null;
//修改为取交通指数最大的一条记录
......
......@@ -118,8 +118,8 @@
GROUP_CONCAT(t2.daily_plan_details SEPARATOR ', ') AS dailyPlanDetails
FROM
t_base_cross_info t3
LEFT join t_greenwave_cross t1 on t3.id =t1.cross_id
LEFT JOIN t_strategy_priority_daily_info t2 on t3.id = t2.cross_id and t2.type=1
LEFT JOIN t_strategy_priority_config t1 on t3.id=t1.cross_id
LEFT JOIN t_greenwave_info t4 on t4.id = t1.green_id
WHERE t3.is_signal='1'
GROUP BY t3.id
......
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