Commit 8b8f1620 authored by duanruiming's avatar duanruiming

[update] review-代码逻辑优化

parent 439eb54a
...@@ -62,51 +62,56 @@ public class DataCenterTask { ...@@ -62,51 +62,56 @@ public class DataCenterTask {
int greenDelayTime = 0; // 每个路口绿波开始时间 int greenDelayTime = 0; // 每个路口绿波开始时间
List<GreenwaveCrossPO> greenwaveCrossPOList = entry.getValue(); List<GreenwaveCrossPO> greenwaveCrossPOList = entry.getValue();
if (!CollectionUtils.isEmpty(greenwaveCrossPOList)) { if (!CollectionUtils.isEmpty(greenwaveCrossPOList)) {
for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) { greenwaveWidth = calculate(greenwaveWidth, lastCrossDistance, crossTimeOffset, greenDelayTime, greenwaveCrossPOList);
String crossId = greenwaveCrossPO.getCrossId(); }
Integer sectionId = greenwaveCrossPO.getSectionId(); log.info("当前绿波编号:{}, 绿波带宽:{}", greenId, greenwaveWidth);
Integer inDir = greenwaveCrossPO.getInDir(); }
Integer offset = greenwaveCrossPO.getOffset(); } catch (Exception e) {
crossTimeOffset += (int) (lastCrossDistance / (100 / 6)); // 自由流速度60 log.error("获取绿波带宽异常", e);
if (sectionId != null) { throw new Exception("获取绿波带宽异常", e);
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId); }
if (Objects.nonNull(crossSectionPO)) { }
Integer schemeId = crossSectionPO.getSchemeId();
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId); private int calculate(int greenwaveWidth, Double lastCrossDistance, int crossTimeOffset, int greenDelayTime, List<GreenwaveCrossPO> greenwaveCrossPOList) {
if (Objects.nonNull(baseCrossSchemePO)) { for (GreenwaveCrossPO greenwaveCrossPO : greenwaveCrossPOList) {
String schemeNo = baseCrossSchemePO.getSchemeNo(); String crossId = greenwaveCrossPO.getCrossId();
List<CrossSchemePhaseDirTurnDTO> crossSchemePhaseDirTurnDTOList = CrossSchemePhaseLightsCache.crossSchemePhaseDirTurnDTOList; Integer sectionId = greenwaveCrossPO.getSectionId();
if (!CollectionUtils.isEmpty(crossSchemePhaseDirTurnDTOList)) { Integer inDir = greenwaveCrossPO.getInDir();
Integer offset = greenwaveCrossPO.getOffset();
crossTimeOffset += (int) (lastCrossDistance / (100 / 6)); // 自由流速度60
if (sectionId != null) {
CrossSectionPO crossSectionPO = baseCrossSectionMapper.selectById(sectionId);
if (Objects.nonNull(crossSectionPO)) {
Integer schemeId = crossSectionPO.getSchemeId();
BaseCrossSchemePO baseCrossSchemePO = baseCrossSchemeMapper.selectById(schemeId);
if (Objects.nonNull(baseCrossSchemePO)) {
String schemeNo = baseCrossSchemePO.getSchemeNo();
List<CrossSchemePhaseDirTurnDTO> crossSchemePhaseDirTurnDTOList = CrossSchemePhaseLightsCache.crossSchemePhaseDirTurnDTOList;
if (!CollectionUtils.isEmpty(crossSchemePhaseDirTurnDTOList)) {
// 过滤路口编号,方案号,直行或者圆饼灯, // 过滤路口编号,方案号,直行或者圆饼灯,
List<CrossSchemePhaseDirTurnDTO> currenSchemeList = crossSchemePhaseDirTurnDTOList.stream().filter(po -> StringUtils.equals(crossId, po.getCrossId()) && List<CrossSchemePhaseDirTurnDTO> currenSchemeList = crossSchemePhaseDirTurnDTOList.stream().filter(po -> StringUtils.equals(crossId, po.getCrossId()) &&
StringUtils.equals(po.getSchemeNo(), schemeNo) && StringUtils.equals(po.getSchemeNo(), schemeNo) &&
(Objects.equals(po.getLightsTurn(), 3) || Objects.equals(po.getLightsTurn(), 1))).collect(Collectors.toList()); (Objects.equals(po.getLightsTurn(), 3) || Objects.equals(po.getLightsTurn(), 1))).collect(Collectors.toList());
Integer lastPhaseTime = 0; // 上一个相位的时间 Integer lastPhaseTime = 0; // 上一个相位的时间
for (CrossSchemePhaseDirTurnDTO dto : currenSchemeList) { for (CrossSchemePhaseDirTurnDTO dto : currenSchemeList) {
// 当前路口方案绿波方向的绿灯时间 // 当前路口方案绿波方向的绿灯时间
lastPhaseTime += dto.getPhaseTime(); lastPhaseTime += dto.getPhaseTime();
if (Objects.equals(inDir, dto.getLightsDir())) { if (Objects.equals(inDir, dto.getLightsDir())) {
lastPhaseTime -= dto.getPhaseTime(); lastPhaseTime -= dto.getPhaseTime();
greenDelayTime = lastPhaseTime > greenDelayTime ? lastPhaseTime : greenDelayTime; greenDelayTime = lastPhaseTime > greenDelayTime ? lastPhaseTime : greenDelayTime;
Integer greenWaveStartIndex = offset + greenDelayTime + crossTimeOffset; Integer greenWaveStartIndex = offset + greenDelayTime + crossTimeOffset;
Integer greenWaveEndIndex = offset + dto.getPhaseTime(); Integer greenWaveEndIndex = offset + dto.getPhaseTime();
greenwaveWidth = Math.min(greenwaveWidth, greenWaveEndIndex - greenWaveStartIndex); greenwaveWidth = Math.min(greenwaveWidth, greenWaveEndIndex - greenWaveStartIndex);
}
}
}
} }
} }
} }
lastCrossDistance = greenwaveCrossPO.getNextCrossLen();
} }
} }
log.info("当前绿波编号:{}, 绿波带宽:{}", greenId, greenwaveWidth);
} }
} catch (Exception e) { lastCrossDistance = greenwaveCrossPO.getNextCrossLen();
log.error("获取绿波带宽异常", e);
throw new Exception("获取绿波带宽异常", e);
} }
return greenwaveWidth;
} }
} }
...@@ -12,7 +12,6 @@ import net.wanji.datacenter.cache.CrossSchemePhaseLightsCache; ...@@ -12,7 +12,6 @@ import net.wanji.datacenter.cache.CrossSchemePhaseLightsCache;
import net.wanji.datacenter.kafka.ConsumerHandler; import net.wanji.datacenter.kafka.ConsumerHandler;
import net.wanji.datacenter.pojo.dto.CrossSchemePhaseDirTurnDTO; import net.wanji.datacenter.pojo.dto.CrossSchemePhaseDirTurnDTO;
import net.wanji.datacenter.pojo.dto.CrossSnapshotDataDTO; import net.wanji.datacenter.pojo.dto.CrossSnapshotDataDTO;
import net.wanji.datacenter.pojo.dto.LanePeriodicDataDTO;
import net.wanji.datacenter.service.impl.LanePeriodicDataProcessServiceImpl; import net.wanji.datacenter.service.impl.LanePeriodicDataProcessServiceImpl;
import net.wanji.feign.service.UtcFeignClients; import net.wanji.feign.service.UtcFeignClients;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -52,59 +51,67 @@ public class DataProcessTask { ...@@ -52,59 +51,67 @@ public class DataProcessTask {
return; return;
} }
List<LightsStatusVO> lightsStatusVOS = JacksonUtils.getInstance().convertValue(jsonViewObject.getContent(), new TypeReference<List<LightsStatusVO>>() { List<LightsStatusVO> lightsStatusVOS = JacksonUtils.getInstance().convertValue(jsonViewObject.getContent(), new TypeReference<List<LightsStatusVO>>() {});
}); calculateData(lightsStatusVOS);
for (LightsStatusVO lightsStatusVO : lightsStatusVOS) { }catch (Exception e) {
String crossId = lightsStatusVO.getCrossId(); // log.error("",e);
String schemeNo = lightsStatusVO.getSchemeId(); }
String currentPhaseId = lightsStatusVO.getPhaseId(); // 当前相位红灯说明都是红灯,全场红 }
long currenSignalTime = Long.parseLong(lightsStatusVO.getSchemeStartTime());
ConcurrentHashMap<String, Integer> crossIdPhaseIdClearGreenMap = CrossRealTimeCache.crossPhaseCarNumsMap; private void calculateData(List<LightsStatusVO> lightsStatusVOS) throws Exception {
getClearRateCache(crossId, currentPhaseId, crossIdPhaseIdClearGreenMap); for (LightsStatusVO lightsStatusVO : lightsStatusVOS) {
Map<String, Object> dirLampGroupMap = lightsStatusVO.getDirLampGroupMap(); String crossId = lightsStatusVO.getCrossId();
boolean isAllRed = true; String schemeNo = lightsStatusVO.getSchemeId();
if (!dirLampGroupMap.isEmpty()) { String currentPhaseId = lightsStatusVO.getPhaseId(); // 当前相位红灯说明都是红灯,全场红
for (Map.Entry<String, Object> entry : dirLampGroupMap.entrySet()) { long currenSignalTime = Long.parseLong(lightsStatusVO.getSchemeStartTime());
Map<String, String> turnLightColorMap = (Map<String, String>) entry.getValue(); ConcurrentHashMap<String, Integer> crossIdPhaseIdClearGreenMap = CrossRealTimeCache.crossPhaseCarNumsMap;
for (Map.Entry<String, String> colorEntry : turnLightColorMap.entrySet()) { getClearRateCache(crossId, currentPhaseId, crossIdPhaseIdClearGreenMap);
String lightColor = colorEntry.getValue(); Map<String, Object> dirLampGroupMap = lightsStatusVO.getDirLampGroupMap();
// 全场红,如果有一个绿灯就不计算 20行人跳过 // 是否是全场红
String key = colorEntry.getKey(); boolean isAllRed = getAllRed(dirLampGroupMap);
if (Objects.equals(lightColor, "green") && !StringUtils.equals(key, "20")) { // 如果全场红
isAllRed = false; if (isAllRed) {
} List<CrossSchemePhaseDirTurnDTO> crossSchemePhaseDirTurnDTOList = CrossSchemePhaseLightsCache.crossSchemePhaseDirTurnDTOList;
int redTime = 2;
if (!CollectionUtils.isEmpty(crossSchemePhaseDirTurnDTOList)) {
for (CrossSchemePhaseDirTurnDTO dto : crossSchemePhaseDirTurnDTOList) {
String crossIdCache = dto.getCrossId();
String schemeNoCache = dto.getSchemeNo();
String phaseNoCache = dto.getPhaseNo();
if (StringUtils.equals(crossIdCache, crossId) && StringUtils.equals(schemeNoCache, schemeNo)
&& StringUtils.equals(currentPhaseId, phaseNoCache)) {
redTime = dto.getRedTime();
} }
} }
// 剩余红灯时间
if (redTime >= 1) {
--redTime;
}
Integer carNums = getCarNums(crossId, currenSignalTime + redTime * 1000L);
startPhaseIdMap.putIfAbsent(crossId, currentPhaseId);
crossIdPhaseIdClearGreenMap.put(crossId.concat(currentPhaseId), carNums);
} }
LanePeriodicDataProcessServiceImpl.periodHaveAllRedMap.put(crossId, 1);
}
}
}
// 如果全场红 private static boolean getAllRed(Map<String, Object> dirLampGroupMap) {
if (isAllRed) { boolean isAllRed = true;
List<CrossSchemePhaseDirTurnDTO> crossSchemePhaseDirTurnDTOList = CrossSchemePhaseLightsCache.crossSchemePhaseDirTurnDTOList; if (!dirLampGroupMap.isEmpty()) {
int redTime = 2; for (Map.Entry<String, Object> entry : dirLampGroupMap.entrySet()) {
if (!CollectionUtils.isEmpty(crossSchemePhaseDirTurnDTOList)) { Map<String, String> turnLightColorMap = (Map<String, String>) entry.getValue();
for (CrossSchemePhaseDirTurnDTO dto : crossSchemePhaseDirTurnDTOList) { for (Map.Entry<String, String> colorEntry : turnLightColorMap.entrySet()) {
String crossIdCache = dto.getCrossId(); String lightColor = colorEntry.getValue();
String schemeNoCache = dto.getSchemeNo(); // 全场红,如果有一个绿灯就不计算 20行人跳过
String phaseNoCache = dto.getPhaseNo(); String key = colorEntry.getKey();
if (StringUtils.equals(crossIdCache, crossId) && StringUtils.equals(schemeNoCache, schemeNo) if (Objects.equals(lightColor, "green") && !StringUtils.equals(key, "20")) {
&& StringUtils.equals(currentPhaseId, phaseNoCache)) { isAllRed = false;
redTime = dto.getRedTime();
}
}
// 剩余红灯时间
if (redTime >= 1) {
--redTime;
}
Integer carNums = getCarNums(crossId, currenSignalTime + redTime * 1000L);
startPhaseIdMap.putIfAbsent(crossId, currentPhaseId);
crossIdPhaseIdClearGreenMap.put(crossId.concat(currentPhaseId), carNums);
} }
LanePeriodicDataProcessServiceImpl.periodHaveAllRedMap.put(crossId, 1);
} }
} }
}catch (Exception e) {
// log.error("",e);
} }
return isAllRed;
} }
private void getClearRateCache(String crossId, String currentPhaseId, Map<String, Integer> crossIdPhaseIdClearGreenMap) throws JsonProcessingException { private void getClearRateCache(String crossId, String currentPhaseId, Map<String, Integer> crossIdPhaseIdClearGreenMap) throws JsonProcessingException {
......
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