Commit 06cf65d0 authored by duanruiming's avatar duanruiming

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

parent 9ff4f78e
package net.wanji.opt.dao.mapper; package net.wanji.opt.dao.mapper;
import net.wanji.opt.po.base.CrossPhasePO; import net.wanji.opt.po.base.CrossPhasePO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
...@@ -17,5 +18,5 @@ public interface CrossPhaseMapper { ...@@ -17,5 +18,5 @@ public interface CrossPhaseMapper {
* 查询相位基础信息列表 * 查询相位基础信息列表
* @return * @return
*/ */
List<CrossPhasePO> listCrossPhase(); List<CrossPhasePO> listCrossPhase(@Param("crossId") String crossId, @Param("schemeId") String schemeId);
} }
package net.wanji.opt.dao.mapper; package net.wanji.opt.dao.mapper;
import net.wanji.opt.po.base.CrossSchemePO; import net.wanji.opt.po.base.CrossSchemePO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List; import java.util.List;
...@@ -18,6 +19,6 @@ public interface CrossSchemeMapper { ...@@ -18,6 +19,6 @@ public interface CrossSchemeMapper {
* @param crossId * @param crossId
* @return * @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; ...@@ -6,16 +6,22 @@ import net.wanji.common.enums.CrossStatusEnum;
import net.wanji.common.enums.TurnConvertEnum; import net.wanji.common.enums.TurnConvertEnum;
import net.wanji.common.enums.WeekEnum; import net.wanji.common.enums.WeekEnum;
import net.wanji.common.framework.Constants; 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.DateUtil;
import net.wanji.common.utils.tool.StringUtils; import net.wanji.common.utils.tool.StringUtils;
import net.wanji.feign.pojo.result.JsonViewObject; import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.feign.pojo.vo.SchemeSendVO; import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.pojo.vo.SignalStatusVO; import net.wanji.feign.pojo.vo.SignalStatusVO;
import net.wanji.feign.service.UtcFeignClients; 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.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.CrossOptimizeService;
import net.wanji.opt.service.CrossSchedulesService; import net.wanji.opt.service.CrossSchedulesService;
import net.wanji.opt.service.CrossSchemeService; import net.wanji.opt.service.CrossSchemeService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -38,6 +44,12 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -38,6 +44,12 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource @Resource
CrossSchedulesService crossSchedulesService; CrossSchedulesService crossSchedulesService;
@Resource
CrossPhaseMapper crossPhaseMapper;
@Resource
CrossSchemeMapper crossSchemeMapper;
@Resource @Resource
UtcFeignClients utcFeignClients; UtcFeignClients utcFeignClients;
...@@ -48,10 +60,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -48,10 +60,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
try { try {
// 获取所有信控路口转向实时数据 // 获取所有信控路口转向实时数据
Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime(); Map<String, List<CrossTurnDataRealtimeDTO>> turnDataRealtime = listTurnDataRealtime(abnormalCrossList);
// 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息 // 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息
Map<String, CrossPhaseDTO> phaseMap = listPhaseList(); Map<String, CrossPhaseDTO> phaseMap = listPhaseList();
// 恢复优化路口原始方案
restoreOptCrossOriPlan(abnormalCrossList, phaseMap);
Map<Integer, List<CrossDataRealtimeDTO>> crossDataMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getStatus)); Map<Integer, List<CrossDataRealtimeDTO>> crossDataMap = abnormalCrossList.stream().collect(Collectors.groupingBy(CrossDataRealtimeDTO::getStatus));
abnormalCrossList = crossDataMap.get(CrossStatusEnum.SPILLOVER.getCode()); // 溢出 abnormalCrossList = crossDataMap.get(CrossStatusEnum.SPILLOVER.getCode()); // 溢出
if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) { if (abnormalCrossList != null && !abnormalCrossList.isEmpty()) {
...@@ -72,6 +87,34 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -72,6 +87,34 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
return null; 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 { ...@@ -104,29 +147,15 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 计算路口各相位调整时长(秒) // 计算路口各相位调整时长(秒)
Map<String, Integer> phaseTimeOptResultMap = new HashMap<>(); Map<String, Integer> phaseTimeOptResultMap = new HashMap<>();
Map<Integer, String> timeOffsetPhaseMap = getTimeOffsetPhaseMap(phaseMap, crossTurnDataRealtimeDTOS); Map<Integer, String> timeOffsetPhaseMap = getTimeOffsetPhaseMap(phaseMap, crossTurnDataRealtimeDTOS);
// 是否需要拆分相位
if (isSplitPhase(timeOffsetPhaseMap)) { if (isSplitPhase(timeOffsetPhaseMap)) {
} else { } else {
phaseTimeOptResultMap = getPhaseTimeOptMap(timeOffsetPhaseMap); phaseTimeOptResultMap = getPhaseTimeOptMap(timeOffsetPhaseMap);
} }
// 相位优化总的可加可减时间, // 修改原始方案绿灯时间为优化后时间,方案下发
/** SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, phaseTimeOptResultMap);
*
* 结果输出
* 路口编号、计划号、方案号、相位号、原相位时长、优化后相位时长、调整时长
*/
// 方案优化下发
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);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO); JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发异常!"); log.error("实时监控路口优化方案下发异常!");
...@@ -139,6 +168,61 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -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) { private static Map<String, Integer> getPhaseTimeOptMap(Map<Integer, String> timeOffsetPhaseMap) {
HashMap<String, Integer> phaseTimeOptResultMap = new HashMap<>(); HashMap<String, Integer> phaseTimeOptResultMap = new HashMap<>();
// key:相位号 value:最大可加减时间 // key:相位号 value:最大可加减时间
...@@ -359,10 +443,28 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -359,10 +443,28 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* *
* @return * @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<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; return turnDataRealtimeDTOList;
} }
......
...@@ -40,7 +40,7 @@ public class CrossPhaseServiceImpl implements CrossPhaseService { ...@@ -40,7 +40,7 @@ public class CrossPhaseServiceImpl implements CrossPhaseService {
public List<CrossPhaseDTO> listCrossPhase() { public List<CrossPhaseDTO> listCrossPhase() {
// 获取相位信息 // 获取相位信息
List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase(); List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase("", "");
return BeanListUtils.populateList(crossPhasePOList, new ArrayList<>(), CrossPhaseDTO.class); return BeanListUtils.populateList(crossPhasePOList, new ArrayList<>(), CrossPhaseDTO.class);
} }
......
...@@ -34,7 +34,7 @@ public class CrossSchemeServiceImpl implements CrossSchemeService { ...@@ -34,7 +34,7 @@ public class CrossSchemeServiceImpl implements CrossSchemeService {
@Override @Override
public List<CrossSchemeDTO> listCrossSchemeInfo(String crossId) { 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); return BeanListUtils.populateList(schemePOList, new ArrayList<>(), CrossSchemeDTO.class);
} }
......
...@@ -15,18 +15,21 @@ ...@@ -15,18 +15,21 @@
<!-- 查询方案基础信息列表 --> <!-- 查询方案基础信息列表 -->
<select id="listCrossSchemeInfo" parameterType="String" resultMap="BaseResultMap"> <select id="listCrossSchemeInfo" parameterType="String" resultMap="BaseResultMap">
select select
id id,
,scheme_no scheme_no,
,name name,
,cross_id cross_id,
,cycle cycle,
,coord_phase coord_phase,
,offset offset
from from
t_base_cross_scheme t_base_cross_scheme
where 1=1 where 1=1
<if test="crossId != null and crossId != ''"> <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> </if>
</select> </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