Commit a291ebf2 authored by hanbing's avatar hanbing

[update] 信号优化,态势监测-修改绿波路口指标计算方式

parent 936d3411
......@@ -8,6 +8,7 @@ import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.enums.EventAlarmEnum;
import net.wanji.common.enums.EventAlarmSourceEnum;
import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.*;
......@@ -61,6 +62,10 @@ public class TrendServiceImpl implements TrendService {
private final BaseCrossSectionMapper baseCrossSectionMapper;
private final BaseCrossSchemeMapper baseCrossSchemeMapper;
private final BaseCrossPhaseMapper baseCrossPhaseMapper;
private final BaseCrossPhaseLightsMapper crossPhaseLightsMapper;
private final BaseCrossLaneLightsMapper baseCrossLaneLightsMapper;
private final CrossBaseLaneInfoMapper crossBaseLaneInfoMapper;
private final CrossTurnDataHistMapper crossTurnDataHistMapper;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
......@@ -69,7 +74,7 @@ public class TrendServiceImpl implements TrendService {
CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper,
CrossDirDataHistMapper crossDirDataHistMapper, EventAlarmMapper eventAlarmMapper,
RidInfoMapper ridInfoMapper, BaseCrossDirInfoMapper baseCrossDirInfoMapper,
CrossSchemeOptLogMapper crossSchemeOptLogMapper, GreenwaveCrossMapper greenwaveCrossMapper, CrossDirDataRealtimeMapper crossDirDataRealtimeMapper, GreenwaveHistMapper greenwaveHistMapper, GreenwaveRealtimeMapper greenwaveRealtimeMapper, SceneStrategyIdeaMapper strategyIdeaMapper, StrategyMapper strategyMapper, BaseCrossSchedulesMapper baseCrossSchedulesMapper, CrossSchedulesPlanMapper crossSchedulesPlanMapper, BaseCrossSectionMapper baseCrossSectionMapper, BaseCrossSchemeMapper crossSchemeMapper, BaseCrossSchemeMapper baseCrossSchemeMapper, BaseCrossPhaseMapper baseCrossPhaseMapper) {
CrossSchemeOptLogMapper crossSchemeOptLogMapper, GreenwaveCrossMapper greenwaveCrossMapper, CrossDirDataRealtimeMapper crossDirDataRealtimeMapper, GreenwaveHistMapper greenwaveHistMapper, GreenwaveRealtimeMapper greenwaveRealtimeMapper, SceneStrategyIdeaMapper strategyIdeaMapper, StrategyMapper strategyMapper, BaseCrossSchedulesMapper baseCrossSchedulesMapper, CrossSchedulesPlanMapper crossSchedulesPlanMapper, BaseCrossSectionMapper baseCrossSectionMapper, BaseCrossSchemeMapper crossSchemeMapper, BaseCrossSchemeMapper baseCrossSchemeMapper, BaseCrossPhaseMapper baseCrossPhaseMapper, BaseCrossPhaseLightsMapper crossPhaseLightsMapper, BaseCrossLaneLightsMapper baseCrossLaneLightsMapper, CrossBaseLaneInfoMapper crossBaseLaneInfoMapper, CrossTurnDataHistMapper crossTurnDataHistMapper) {
this.greenwaveInfoMapper = greenwaveInfoMapper;
this.baseCrossInfoMapper = baseCrossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
......@@ -89,6 +94,10 @@ public class TrendServiceImpl implements TrendService {
this.baseCrossSectionMapper = baseCrossSectionMapper;
this.baseCrossSchemeMapper = baseCrossSchemeMapper;
this.baseCrossPhaseMapper = baseCrossPhaseMapper;
this.crossPhaseLightsMapper = crossPhaseLightsMapper;
this.baseCrossLaneLightsMapper = baseCrossLaneLightsMapper;
this.crossBaseLaneInfoMapper = crossBaseLaneInfoMapper;
this.crossTurnDataHistMapper = crossTurnDataHistMapper;
}
@Override
......@@ -389,33 +398,13 @@ public class TrendServiceImpl implements TrendService {
distanceToNextCross = (int)nextCrossLen;
}
greenwaveCross.setDistanceToNextCross(distanceToNextCross);
// 查找方向平均速度
Double speed = calcSpeed(greenwaveCrossList, i, crossId);
// 计算平均速度
Double speed = calcSpeed(greenwaveCrossPO, crossId);
greenwaveCross.setSpeed(speed);
// 根据当前时间获取方案信息
Date todayDate = new Date();
// 获取当前执行的调度
BaseCrossSchedulesPO baseCrossSchedulesPO = baseCrossSchedulesMapper.selectExecByCrossId(crossId);
Integer schedulesId = baseCrossSchedulesPO.getId();
// 获取日计划
Integer planId = null;
// 判断是否是特殊日期
CrossSchedulesPlanPO crossSchedulesPlanPO =
crossSchedulesPlanMapper.selectBySpecialDate(crossId, schedulesId, todayDate);
if (ObjectUtil.isNotEmpty(crossSchedulesPlanPO)) {
planId = crossSchedulesPlanPO.getPlanId();
} else {
// 判断是星期几
int weekday = convertWeekDay(DateUtil.dayOfWeek(todayDate));
CrossSchedulesPlanPO weekdayPlanPO =
crossSchedulesPlanMapper.selectByWeekday(crossId, schedulesId, weekday);
planId = weekdayPlanPO.getPlanId();
}
// 获取当前执行的方案
List<CrossSectionPO> baseCrossSectionPOList =
baseCrossSectionMapper.selectByCrossAndPlan(crossId, planId);
Integer currentSchemeId = findCurrentScheme(baseCrossSectionPOList, todayDate);
// 获取当前方案
Integer sectionId = greenwaveCrossPO.getSectionId();
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId);
Integer currentSchemeId = crossSectionPO.getSchemeId();
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(currentSchemeId);
greenwaveCross.setOffset(baseCrossSchemePO.getOffset());
// 构造相位时差图
......@@ -461,27 +450,6 @@ public class TrendServiceImpl implements TrendService {
return res;
}
private Integer findCurrentScheme(List<CrossSectionPO> baseCrossSectionPOList, Date todayDate) {
Integer schemeId = null;
for (CrossSectionPO crossSectionPO : baseCrossSectionPOList) {
String startTimeRaw = crossSectionPO.getStartTime();
String endTimeRaw = crossSectionPO.getEndTime();
String startTimeStr = startTimeRaw.replace(":", "");
String endTimeStr = endTimeRaw.replace(":", "");
int startTime = Integer.parseInt(startTimeStr);
int endTime = Integer.parseInt(endTimeStr);
String todayRaw = DateUtil.format(todayDate, "HH:mm");
String todayStr = todayRaw.replace(":", "");
int todayTime = Integer.parseInt(todayStr);
if (todayTime >= startTime && todayTime <= endTime) {
schemeId = crossSectionPO.getSchemeId();
}
}
return schemeId;
}
private int convertWeekDay(int i) {
if (1 == i) {
return 7;
......@@ -489,26 +457,11 @@ public class TrendServiceImpl implements TrendService {
return i - 1;
}
private Double calcSpeed(List<GreenwaveCrossPO> greenwaveCrossList, int i, String currentCrossId) {
int size = greenwaveCrossList.size();
int lastCrossIndex = size - 1;
if (i != lastCrossIndex) { // 不是最后一个路口
GreenwaveCrossPO nextCross = greenwaveCrossList.get(i + 1);
String nextCrossId = nextCross.getCrossId();
RidInfoEntity ridInfoEntity = ridInfoMapper.selectByStartEnd(currentCrossId, nextCrossId);
Integer outDir = ridInfoEntity.getOutDir();
private Double calcSpeed(GreenwaveCrossPO greenwaveCrossPO, String currentCrossId) {
Integer outDir = greenwaveCrossPO.getOutDir();
CrossDirDataRealtimePO crossDirDataRealtimePO =
crossDirDataRealtimeMapper.selectByCrossIdAndDirType(currentCrossId, outDir);
return crossDirDataRealtimePO.getSpeed();
} else {
GreenwaveCrossPO preCross = greenwaveCrossList.get(i - 1);
String preCrossId = preCross.getCrossId();
RidInfoEntity ridInfoEntity = ridInfoMapper.selectByStartEnd(preCrossId, currentCrossId);
Integer inDir = ridInfoEntity.getInDir();
CrossDirDataRealtimePO crossDirDataRealtimePO =
crossDirDataRealtimeMapper.selectByInDir(currentCrossId, inDir);
return crossDirDataRealtimePO.getSpeed();
}
}
@Override
......@@ -535,35 +488,69 @@ public class TrendServiceImpl implements TrendService {
String currentCrossId = crossId;
long currentSeconds = timeStamp;
long preSeconds = currentSeconds - 60 * 5;
// 如果不是最后一个路口
if (i != lastCrossIndex) {
GreenwaveCrossPO nextCross = greenwaveCrossList.get(i + 1);
String nextCrossId = nextCross.getCrossId();
// 当前路口出口方向
Integer outDir = greenwaveCrossPO.getOutDir();
List<CrossDirDataHistPO> listForNoPark =
crossDirDataHistMapper.selectNoPark(currentCrossId, outDir, currentSeconds, preSeconds);
List<CrossDirDataHistPO> listForPhaseQueue =
crossDirDataHistMapper.selectPhaseQueue(currentCrossId, outDir, currentSeconds, preSeconds);
setMetrics(greenwaveCrossMetricsVO, greenwaveCrossPO, listForNoPark, listForPhaseQueue);
} else {
// 最后一个路口
GreenwaveCrossPO preCross = greenwaveCrossList.get(i - 1);
String preCrossId = preCross.getCrossId();
// 当前路口入口方向
Integer inDir = greenwaveCrossPO.getInDir();
List<CrossDirDataHistPO> listForNoPark =
crossDirDataHistMapper.selectNoParkEnd(currentCrossId, inDir, currentSeconds, preSeconds);
List<CrossDirDataHistPO> listForPhaseQueue =
crossDirDataHistMapper.selectPhaseQueueEnd(currentCrossId, inDir, currentSeconds, preSeconds);
// 获取当前方案
Integer sectionId = greenwaveCrossPO.getSectionId();
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId);
Integer schemeId = crossSectionPO.getSchemeId();
// 获取协调相位对应的车道集合
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId);
Integer coordPhaseID = baseCrossSchemePO.getCoordPhase();
List<CrossPhaseLightsPO> crossPhaseLightsPOList = crossPhaseLightsMapper.selectByPhaseId(coordPhaseID);
List<Integer> lightIds = crossPhaseLightsPOList.stream()
.map(CrossPhaseLightsPO::getLightsId)
.collect(Collectors.toList());
List<CrossLaneLightsPO> crossLaneLightsPOList = baseCrossLaneLightsMapper.selectByLightIds(lightIds);
List<String> laneIds = crossLaneLightsPOList.stream()
.map(CrossLaneLightsPO::getLaneId)
.collect(Collectors.toList());
List<CrossBaseLaneInfoPO> lanePOList = crossBaseLaneInfoMapper.selectBatchIds(laneIds);
// 构造方向+转向列表
List<List<Integer>> dirTurnList = new ArrayList<>();
for (CrossBaseLaneInfoPO lanePO : lanePOList) {
Integer dir = lanePO.getDir();
Integer turn = lanePO.getTurn();
List<Integer> dirTurn = new ArrayList<>();
dirTurn.add(dir);
dirTurn.add(turn);
dirTurnList.add(dirTurn);
}
// 计算指标
List<CrossTurnDataHistPO> listForNoPark = new ArrayList<>();
for (List<Integer> dirTurn : dirTurnList) {
Integer dir = dirTurn.get(0);
Integer turnInt = dirTurn.get(1);
String turn = TurnConvertEnum.getCodeByKey(turnInt);
CrossTurnDataHistPO noPark =
crossTurnDataHistMapper.selectNoPark(currentCrossId, dir, turn, currentSeconds, preSeconds);
if (noPark != null) {
listForNoPark.add(noPark);
}
}
List<CrossTurnDataHistPO> allPO =
crossTurnDataHistMapper.selectByCrossId(currentCrossId, currentSeconds, preSeconds);
List<CrossTurnDataHistPO> listForPhaseQueue = getPhaseQueueList(listForNoPark, allPO);
setMetrics(greenwaveCrossMetricsVO, greenwaveCrossPO, listForNoPark, listForPhaseQueue);
}
res.add(greenwaveCrossMetricsVO);
}
return res;
}
private List<CrossTurnDataHistPO> getPhaseQueueList(
List<CrossTurnDataHistPO> listForNoPark, List<CrossTurnDataHistPO> allPO) {
Iterator<CrossTurnDataHistPO> iterator = allPO.iterator();
while (iterator.hasNext()) {
CrossTurnDataHistPO next = iterator.next();
for (CrossTurnDataHistPO crossTurnDataHistPO : listForNoPark) {
if (Objects.equals(next.getTurnType(), crossTurnDataHistPO.getTurnType())
&& Objects.equals(next.getInDir(), crossTurnDataHistPO.getInDir())) {
iterator.remove();
}
}
}
return allPO;
}
@Override
@Transactional
public void saveGreenwaveStrategy(SaveGreenwaveStrategyBO saveGreenwaveStrategyBO) {
......@@ -580,7 +567,7 @@ public class TrendServiceImpl implements TrendService {
}
private void setMetrics(GreenwaveCrossMetricsVO greenwaveCrossMetricsVO, GreenwaveCrossPO greenwaveCrossPO,
List<CrossDirDataHistPO> listForNoPark, List<CrossDirDataHistPO> listForPhaseQueue) {
List<CrossTurnDataHistPO> listForNoPark, List<CrossTurnDataHistPO> listForPhaseQueue) {
if (CollectionUtil.isNotEmpty(listForNoPark) && CollectionUtil.isNotEmpty(listForPhaseQueue)) {
Integer noparkPassRate = getAveRate(listForNoPark);
greenwaveCrossMetricsVO.setNoparkPassRate(noparkPassRate);
......@@ -593,9 +580,9 @@ public class TrendServiceImpl implements TrendService {
}
}
private Double getSpeed(List<CrossDirDataHistPO> listForNoPark) {
private Double getSpeed(List<CrossTurnDataHistPO> listForNoPark) {
Double total = 0.0;
for (CrossDirDataHistPO crossDirDataHistPO : listForNoPark) {
for (CrossTurnDataHistPO crossDirDataHistPO : listForNoPark) {
Double speed = crossDirDataHistPO.getSpeed();
total += speed;
}
......@@ -603,9 +590,9 @@ public class TrendServiceImpl implements TrendService {
return avgSpeed;
}
private Integer getPhaseQueue(List<CrossDirDataHistPO> listForPhaseQueue) {
private Integer getPhaseQueue(List<CrossTurnDataHistPO> listForPhaseQueue) {
double maxQueue = 0.0;
for (CrossDirDataHistPO crossDirDataHistPO : listForPhaseQueue) {
for (CrossTurnDataHistPO crossDirDataHistPO : listForPhaseQueue) {
double queueLength = crossDirDataHistPO.getQueueLength();
if (queueLength > maxQueue) {
maxQueue = queueLength;
......@@ -614,9 +601,9 @@ public class TrendServiceImpl implements TrendService {
return (int)maxQueue;
}
private Integer getAveRate(List<CrossDirDataHistPO> crossDirDataHistPOList) {
private Integer getAveRate(List<CrossTurnDataHistPO> crossDirDataHistPOList) {
Double total = 0.0;
for (CrossDirDataHistPO crossDirDataHistPO : crossDirDataHistPOList) {
for (CrossTurnDataHistPO crossDirDataHistPO : crossDirDataHistPOList) {
Double noStopRate = crossDirDataHistPO.getNoStopRate();
total += noStopRate;
}
......
......@@ -36,4 +36,5 @@ public interface BaseCrossLaneLightsMapper {
List<CrossLaneLightsPO> selectByLightsId(@Param("lightsId") Integer lightsId);
List<CrossLaneLightsPO> selectByLightIds(List<Integer> ids);
}
......@@ -22,4 +22,6 @@ public interface BaseCrossSectionMapper {
List<CrossSectionPO> listCrossSectionPO(@Param("entity") CrossSectionPO entity);
List<CrossSectionPO> selectByCrossAndPlan(String crossId, Integer planId);
CrossSectionPO selectById(Integer id);
}
......@@ -17,4 +17,7 @@ public interface CrossTurnDataHistMapper extends BaseMapper<CrossTurnDataHistPO>
void insertBatch(@Param("list") List<CrossTurnDataHistPO> list);
void deleteBatch(@Param("list") Collection<String> crossIds);
CrossTurnDataHistPO selectNoPark(String crossId, Integer dir, String turn, long currentSeconds, long preSeconds);
List<CrossTurnDataHistPO> selectByCrossId(String crossId, long currentSeconds, long preSeconds);
}
......@@ -34,8 +34,6 @@ public class CrossBaseLaneInfoPO {
@ApiModelProperty(name = "路段编号",notes = "")
private String rid;
@ApiModelProperty(name = "渠化编号",notes = "")
private String segmentId;
@ApiModelProperty(name = "车道长度",notes = "")
private Double length;
@ApiModelProperty(name = "车道宽度",notes = "")
private Double width;
......
......@@ -68,6 +68,16 @@ public class CrossTurnDataRealtimePO {
/** 可信度:0~1 */
@ApiModelProperty(name = "可信度:0~1",notes = "")
private Double quality ;
@ApiModelProperty(name = "不停车率",notes = "")
private Double noStopRate;
@ApiModelProperty(name = "一次停车率",notes = "")
private Double oneStopRate;
@ApiModelProperty(name = "二次停车率",notes = "")
private Double twoStopRate;
@ApiModelProperty(name = "三次停车率",notes = "")
private Double threeStopRate;
/** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ;
......
......@@ -81,5 +81,15 @@
where lights_id = #{lightsId}
</select>
<select id="selectByLightIds" resultType="net.wanji.databus.po.CrossLaneLightsPO">
select
id,lights_id,lane_id,cross_id,gmt_create,gmt_modified
from t_base_cross_lane_lights
where lights_id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</select>
</mapper>
......@@ -57,5 +57,11 @@
where cross_id = #{crossId} and plan_id = #{planId}
</select>
<select id="selectById" resultType="net.wanji.databus.dao.entity.CrossSectionPO">
select <include refid="Base_Column_list"/>
from t_base_cross_section
where id = #{id}
</select>
</mapper>
......@@ -28,7 +28,8 @@
<sql id="Base_Column_List">
id, turn_type, in_dir, out_dir, cross_id, flow, status, traffic_index, speed, in_speed, out_speed, queue_length,
stop_times, delay_time, sturation, vehhead_dist, vehhead_time, quality, batch_time, gmt_create, gmt_modified
stop_times, delay_time, sturation, vehhead_dist, vehhead_time, quality,no_stop_rate,one_stop_rate,two_stop_rate,
three_stop_rate, batch_time, gmt_create, gmt_modified
</sql>
<insert id="insertBatch" parameterType="net.wanji.databus.po.CrossTurnDataRealtimePO">
......@@ -49,4 +50,20 @@
</foreach>
</delete>
<select id="selectNoPark" resultType="net.wanji.databus.po.CrossTurnDataHistPO">
select <include refid="Base_Column_List"/>
from t_cross_turn_data_hist
where cross_id = #{crossId} and in_dir = #{dir} and turn_type = #{turn}
and batch_time <![CDATA[ <= ]]> #{currentSeconds}
and batch_time <![CDATA[ >= ]]> #{preSeconds}
</select>
<select id="selectByCrossId" resultType="net.wanji.databus.po.CrossTurnDataHistPO">
select <include refid="Base_Column_List"/>
from t_cross_turn_data_hist
where cross_id = #{crossId}
and batch_time <![CDATA[ <= ]]> #{currentSeconds}
and batch_time <![CDATA[ >= ]]> #{preSeconds}
</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