Commit 06cf65d0 authored by duanruiming's avatar duanruiming

[add] 实时监控-路口恢复原始方案

parent 9ff4f78e
package net.wanji.opt.dao.mapper;
import net.wanji.opt.po.base.CrossPhasePO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -17,5 +18,5 @@ public interface CrossPhaseMapper {
* 查询相位基础信息列表
* @return
*/
List<CrossPhasePO> listCrossPhase();
List<CrossPhasePO> listCrossPhase(@Param("crossId") String crossId, @Param("schemeId") String schemeId);
}
package net.wanji.opt.dao.mapper;
import net.wanji.opt.po.base.CrossSchemePO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
......@@ -18,6 +19,6 @@ public interface CrossSchemeMapper {
* @param crossId
* @return
*/
List<CrossSchemePO> listCrossSchemeInfo(String crossId);
List<CrossSchemePO> listCrossSchemeInfo(@Param("crossId") String crossId, @Param("schemeNo")String schemeNo);
}
......@@ -6,16 +6,22 @@ import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.enums.WeekEnum;
import net.wanji.common.framework.Constants;
import net.wanji.common.utils.tool.BeanListUtils;
import net.wanji.common.utils.tool.DateUtil;
import net.wanji.common.utils.tool.StringUtils;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.pojo.vo.SignalStatusVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.opt.dao.mapper.CrossPhaseMapper;
import net.wanji.opt.dao.mapper.CrossSchemeMapper;
import net.wanji.opt.dto.*;
import net.wanji.opt.po.base.CrossPhasePO;
import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.CrossSchedulesService;
import net.wanji.opt.service.CrossSchemeService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
......@@ -38,6 +44,12 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource
CrossSchedulesService crossSchedulesService;
@Resource
CrossPhaseMapper crossPhaseMapper;
@Resource
CrossSchemeMapper crossSchemeMapper;
@Resource
UtcFeignClients utcFeignClients;
......@@ -48,10 +60,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
try {
// 获取所有信控路口转向实时数据
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime();
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime(abnormalCrossList);
// 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息
Map<String, CrossPhaseDTO> phaseMap = listPhaseList();
// 恢复优化路口原始方案
restoreOptCrossOriPlan(abnormalCrossList, phaseMap);
Map<Integer, List<CrossDataRealtimeDTO>> crossDataMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getStatus));
abnormalCrossList = crossDataMap.get(CrossStatusEnum.SPILLOVER.getCode()); // 溢出
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
......@@ -72,6 +87,34 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
return null;
}
/**
* 通过第二批次列表,判断需要恢复的优化路口原始方案
*
* @param abnormalCrossList
*/
private void restoreOptCrossOriPlan(List<CrossDataRealtimeDTO> abnormalCrossList, Map<String, CrossPhaseDTO> phaseMap) throws Exception {
List<String> abnormalCrossIdList = abnormalCrossList.stream().map(CrossDataRealtimeDTO::getCrossId).collect(Collectors.toList());
for (String optCrossId : CROSS_OPT) {
String crossId = null;
if (!abnormalCrossIdList.contains(optCrossId)) {
// 路口原始方案 todo 优化后恢复方案
CrossSchemeDTO oriCrossSchemeDTO = null;
List<CrossSchemeDTO> schemeDTOList = crossSchemeService.listCrossSchemeDetails(optCrossId);
if (!CollectionUtils.isEmpty(schemeDTOList) && schemeDTOList.size() == 1) {
crossId = optCrossId;
oriCrossSchemeDTO = schemeDTOList.get(0);
}
}
// 下发原始方案
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, null);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发异常!");
throw new Exception();
}
}
}
/**
* 路口失衡优化
*
......@@ -104,29 +147,15 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 计算路口各相位调整时长(秒)
Map<String, Integer> phaseTimeOptResultMap = new HashMap<>();
Map<Integer, String> timeOffsetPhaseMap = getTimeOffsetPhaseMap(phaseMap, crossTurnDataRealtimeDTOS);
// 是否需要拆分相位
if (isSplitPhase(timeOffsetPhaseMap)) {
} else {
phaseTimeOptResultMap = getPhaseTimeOptMap(timeOffsetPhaseMap);
}
// 相位优化总的可加可减时间,
/**
*
* 结果输出
* 路口编号、计划号、方案号、相位号、原相位时长、优化后相位时长、调整时长
*/
// 方案优化下发
String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, "1", "s");
CrossPhaseDTO crossPhaseDTO = phaseMap.get(key);
String planNo = crossPhaseDTO.getPlanNo();
SchemeSendVO schemeSendVO = new SchemeSendVO();
List<SchemeSendVO.Pattern> patternList = new ArrayList<>();
SchemeSendVO.Pattern pattern = new SchemeSendVO.Pattern();
schemeSendVO.setCrossCode(crossId);
schemeSendVO.setPatternList(patternList);
// 修改原始方案绿灯时间为优化后时间,方案下发
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, phaseTimeOptResultMap);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发异常!");
......@@ -139,6 +168,61 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
/**
* 构建下发的优化方案
* 如果phaseTimeOptResultMap=null,下发的原始方案
* 否则原始方案和相位优化时间参数phaseTimeOptResultMap构建下发参数
*
* @param crossId
* @param phaseMap
* @param phaseTimeOptResultMap
* @return
*/
private SchemeSendVO getSchemeSendVO(String crossId, Map<String, CrossPhaseDTO> phaseMap, Map<String, Integer> phaseTimeOptResultMap) {
String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, "1", "s");
CrossPhaseDTO crossPhaseDTO = phaseMap.get(key);
String planNo = crossPhaseDTO.getPlanNo();
List<CrossSchemePO> crossSchemePOS = crossSchemeMapper.listCrossSchemeInfo(crossId, planNo);
List<CrossPhasePO> crossPhasePOS = crossPhaseMapper.listCrossPhase(crossId, planNo);
Map<Integer, List<CrossPhasePO>> ringNoPhasePOMap = crossPhasePOS.stream().collect(Collectors.groupingBy(CrossPhasePO::getRingNo));
SchemeSendVO schemeSendVO = new SchemeSendVO();
List<SchemeSendVO.Pattern> patternList = new ArrayList<>();
BeanListUtils.populateList(crossSchemePOS, patternList, SchemeSendVO.Pattern.class);
schemeSendVO.setPatternList(patternList);
schemeSendVO.setCrossCode(crossId);
List<SchemeSendVO.Pattern.Ring> rings = new ArrayList<>();
ringNoPhasePOMap.entrySet().forEach(entry -> {
SchemeSendVO.Pattern.Ring ring = new SchemeSendVO.Pattern.Ring();
List<SchemeSendVO.Pattern.Ring.Phase> phaseList = new ArrayList<>();
List<CrossPhasePO> value = entry.getValue();
BeanListUtils.populateList(value, phaseList, SchemeSendVO.Pattern.Ring.Phase.class);
ring.setRingNo(String.valueOf(entry.getKey()));
// 在原始方案基础绿灯时间+可优化时间
if (!CollectionUtils.isEmpty(phaseTimeOptResultMap)) {
phaseList.forEach(phaseInfo -> {
Integer optTime = phaseTimeOptResultMap.get(phaseInfo.getPhaseNo());
String greenTime = phaseInfo.getGreenTime();
phaseInfo.setGreenTime(greenTime + optTime);
});
}
ring.setPhaseList(phaseList);
rings.add(ring);
});
schemeSendVO.setCrossCode(crossId);
schemeSendVO.setPatternList(patternList);
return schemeSendVO;
}
/**
* 在最大最小绿范围内,通过转向优化计算相位可优化时间
*
* @param timeOffsetPhaseMap
* @return
*/
private static Map<String, Integer> getPhaseTimeOptMap(Map<Integer, String> timeOffsetPhaseMap) {
HashMap<String, Integer> phaseTimeOptResultMap = new HashMap<>();
// key:相位号 value:最大可加减时间
......@@ -359,10 +443,28 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
*
* @return
*/
public Map<String, List<CrossTurnDataRealtimeDTO>> listTurnDataRealtime() {
public Map<String, List<CrossTurnDataRealtimeDTO>> listTurnDataRealtime(List<CrossDataRealtimeDTO> abnormalCrossList) {
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtimeDTOList = new HashMap<>();
Map<String, List<CrossDataRealtimeDTO>> abnormalCrossGroupMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getCrossId));
abnormalCrossGroupMap.entrySet().forEach(entry -> {
String crossId = entry.getKey();
List<CrossDataRealtimeDTO> realTimeData = entry.getValue();
List<CrossTurnDataRealtimeDTO> crossTurnDataRealtimeDTOS = new ArrayList<>();
realTimeData.forEach(realData -> {
List<CrossDirInfoDTO> dirList = realData.getDirList();
List<CrossTurnInfoDTO> turnList = realData.getTurnList();
dirList.forEach(dirInfo -> {
turnList.forEach(turnInfo -> {
CrossTurnDataRealtimeDTO crossTurnDataRealtimeDTO = new CrossTurnDataRealtimeDTO();
BeanUtils.copyProperties(realData, crossTurnDataRealtimeDTO);
});
});
});
});
return turnDataRealtimeDTOList;
}
......
......@@ -40,7 +40,7 @@ public class CrossPhaseServiceImpl implements CrossPhaseService {
public List<CrossPhaseDTO> listCrossPhase() {
// 获取相位信息
List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase();
List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase("", "");
return BeanListUtils.populateList(crossPhasePOList, new ArrayList<>(), CrossPhaseDTO.class);
}
......
......@@ -34,7 +34,7 @@ public class CrossSchemeServiceImpl implements CrossSchemeService {
@Override
public List<CrossSchemeDTO> listCrossSchemeInfo(String crossId) {
List<CrossSchemePO> schemePOList = crossSchemeMapper.listCrossSchemeInfo(crossId);
List<CrossSchemePO> schemePOList = crossSchemeMapper.listCrossSchemeInfo(crossId, "");
return BeanListUtils.populateList(schemePOList, new ArrayList<>(), CrossSchemeDTO.class);
}
......
......@@ -15,18 +15,21 @@
<!-- 查询方案基础信息列表 -->
<select id="listCrossSchemeInfo" parameterType="String" resultMap="BaseResultMap">
select
id
,scheme_no
,name
,cross_id
,cycle
,coord_phase
,offset
id,
scheme_no,
name,
cross_id,
cycle,
coord_phase,
offset
from
t_base_cross_scheme
t_base_cross_scheme
where 1=1
<if test="crossId != null and crossId != ''">
and cross_id = #{crossId}
and cross_id = #{crossId}
</if>
<if test="schemeNo != null and schemeNo != ''">
and scheme_no = #{schemeNo}
</if>
</select>
......
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