Commit 97090869 authored by duanruiming's avatar duanruiming

[update] 优化清空率,全场红校验

parent d86905af
package net.wanji.datacenter.cache;
import net.wanji.datacenter.pojo.dto.CrossDataIndexDTO;
import net.wanji.datacenter.pojo.dto.CrossStatusDurationDTO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......
......@@ -50,6 +50,7 @@ public class CrossSchemePhaseLightsCache implements CommandLineRunner {
for (CrossPhasePO crossPhasePO : crossPhasePOList) {
Integer phaseId = crossPhasePO.getId();
String phaseNo = crossPhasePO.getPhaseNo();
Integer redTime = crossPhasePO.getRedTime();
List<CrossPhaseLightsPO> crossPhaseLightsPOList = baseCrossPhaseLightsMapper.selectByPhaseId(phaseId);
if (!CollectionUtils.isEmpty(crossPhaseLightsPOList)) {
for (CrossPhaseLightsPO crossPhaseLightsPO : crossPhaseLightsPOList) {
......@@ -65,6 +66,7 @@ public class CrossSchemePhaseLightsCache implements CommandLineRunner {
if (turn == 20) {
continue;
}
crossSchemePhaseDirTurnDTO.setRedTime(redTime);
crossSchemePhaseDirTurnDTO.setLightsTurn(turn);
crossSchemePhaseDirTurnDTOList.add(crossSchemePhaseDirTurnDTO);
}
......
......@@ -13,4 +13,5 @@ public class CrossSchemePhaseDirTurnDTO {
private String phaseNo;
private Integer lightsDir;
private Integer lightsTurn;
private Integer redTime;
}
......@@ -25,6 +25,7 @@ import org.springframework.util.StringUtils;
import java.text.DecimalFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
/**
......@@ -46,6 +47,8 @@ public class LanePeriodicDataProcessServiceImpl implements DataProcessService {
private static CrossDataRealtimeMapper crossDataRealTimeMapper;
private final LanePeriodicDataEventListConvert lanePeriodicDataEventListConvert;
private final ProducerHandler producerHandler;
// 五分钟周期内是否有全场红
public static final ConcurrentHashMap<String, Integer> periodHaveAllRedMap = new ConcurrentHashMap<>();
@Autowired
public void setCrossDataRealTimeMapper(CrossDataRealtimeMapper crossDataRealTimeMapper,
......@@ -630,8 +633,9 @@ public class LanePeriodicDataProcessServiceImpl implements DataProcessService {
if (notClearCarNums == 0) {
clearRate = 1.0;
}
if (notClearCarNums > 10) {
clearRate = 0.0;
Integer allRed = periodHaveAllRedMap.get(crossId);
if (!Objects.equals(allRed, 1)) { // 无全场红
clearRate = -1.0;
}
insertCrossDataRealtimePO.setClearRate(clearRate);
insertCrossDataRealtimePO.setNotClearCarNums(notClearCarNums);
......
package net.wanji.datacenter.task;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.enums.DateStyle;
import net.wanji.common.framework.Constants;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.common.utils.tool.JacksonUtils;
import net.wanji.databus.vo.LightsStatusVO;
import net.wanji.datacenter.cache.CrossRealTimeCache;
import net.wanji.datacenter.cache.CrossSchemePhaseLightsCache;
import net.wanji.datacenter.common.UTCWEBTurnParseEnum;
import net.wanji.datacenter.kafka.ConsumerHandler;
import net.wanji.datacenter.pojo.dto.CrossSchemePhaseDirTurnDTO;
import net.wanji.datacenter.pojo.dto.CrossSnapshotDataDTO;
import net.wanji.datacenter.service.DataProcessService;
import net.wanji.datacenter.pojo.dto.LanePeriodicDataDTO;
import net.wanji.datacenter.service.impl.LanePeriodicDataProcessServiceImpl;
import net.wanji.feign.service.UtcFeignClients;
import org.apache.commons.lang.StringUtils;
import org.springframework.scheduling.annotation.Scheduled;
......@@ -33,8 +33,6 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class DataProcessTask {
@Resource(name = "crossSnapshotDataProcessService")
DataProcessService crossSnapshotDataProcessService;
@Resource
UtcFeignClients utcFeignClients;
......@@ -47,7 +45,6 @@ public class DataProcessTask {
*/
@Scheduled(initialDelay = 30 * 1000, fixedRate = 1000)
public void calculateGreenLightsClearRate() throws Exception {
List<CrossSchemePhaseDirTurnDTO> crossSchemePhaseDirTurnDTOList = CrossSchemePhaseLightsCache.crossSchemePhaseDirTurnDTOList;
JsonViewObject jsonViewObject = utcFeignClients.lightStatus();
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("定时任务同步信号机灯态utcService调用异常");
......@@ -59,70 +56,78 @@ public class DataProcessTask {
String crossId = lightsStatusVO.getCrossId();
String schemeNo = lightsStatusVO.getSchemeId();
String currentPhaseId = lightsStatusVO.getPhaseId(); // 当前相位红灯说明都是红灯,全场红
Long currenSignalTime = Long.valueOf(lightsStatusVO.getSchemeStartTime());
int phaseSize = 0;
HashMap<String, Integer> tempMap = new HashMap<>();
long currenSignalTime = Long.parseLong(lightsStatusVO.getSchemeStartTime());
ConcurrentHashMap<String, Integer> crossIdPhaseIdClearGreenMap = CrossRealTimeCache.crossPhaseCarNumsMap;
for (Map.Entry<String, Integer> entry : crossIdPhaseIdClearGreenMap.entrySet()) {
String crossIdPhaseNo = entry.getKey();
if (crossIdPhaseNo.contains(crossId)) {
++phaseSize;
tempMap.put(crossId, entry.getValue());
}
}
log.info("当前路口相位信息:" + JacksonUtils.getInstance().writeValueAsString(crossIdPhaseIdClearGreenMap));
if (startPhaseIdMap.containsValue(currentPhaseId) && phaseSize >=2) {
double clearRate = 0.0;
for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {
int value = entry.getValue() > 0 ? 1 : 0;
clearRate += (double) value / phaseSize;
}
startPhaseIdMap.remove(crossId);// 只计算一次
log.info("绿灯清空率为:" + (1 - clearRate) * 100);
CrossRealTimeCache.crossPhaseIdClearGreenMap.put(crossId, 1 - clearRate);
}
getClearRateCache(crossId, currentPhaseId, crossIdPhaseIdClearGreenMap);
Map<String, Object> dirLampGroupMap = lightsStatusVO.getDirLampGroupMap();
boolean isAllRed = true;
LanePeriodicDataProcessServiceImpl.periodHaveAllRedMap.put(crossId, 0);
if (!dirLampGroupMap.isEmpty()) {
for (Map.Entry<String, Object> entry : dirLampGroupMap.entrySet()) {
String dir = entry.getKey();
Map<String, String> turnLightColorMap = (Map<String, String>) entry.getValue();
for (Map.Entry<String, String> colorEntry : turnLightColorMap.entrySet()) {
String turn = colorEntry.getKey();
String lightColor = colorEntry.getValue();
String currentDirTurn = dir.concat(Constants.SystemParam.SEPARATOR_UNDER_LINE)
.concat(String.valueOf(UTCWEBTurnParseEnum.getTypeByCode(Integer.valueOf(turn))));
List<String> dirTurnList = new ArrayList<>();
for (CrossSchemePhaseDirTurnDTO dto : crossSchemePhaseDirTurnDTOList) {
if (StringUtils.equals(crossId, dto.getCrossId()) && StringUtils.equals(schemeNo, dto.getSchemeNo())
&& StringUtils.equals(currentPhaseId, dto.getPhaseNo()) && StringUtils.equals(dir, String.valueOf(dto.getLightsDir()))) {
dirTurnList.add(dir.concat(Constants.SystemParam.SEPARATOR_UNDER_LINE).concat(String.valueOf(dto.getLightsTurn())));
}
// 全场红,如果有一个绿灯就不计算
if (Objects.equals(lightColor, "green")) {
isAllRed = false;
}
if (!CollectionUtils.isEmpty(dirTurnList)) {
if (Objects.equals(lightColor, "red") && dirTurnList.contains(currentDirTurn)) {
log.info("lightColor:" + lightColor + " currentDirTurn:" + currentDirTurn + " dirTurnList:" + dirTurnList);
Integer carNums = getCarNums(crossId, currenSignalTime);
carNums += getCarNums(crossId, currenSignalTime + 1000);
startPhaseIdMap.putIfAbsent(crossId, currentPhaseId);
if (carNums > 0) {
crossIdPhaseIdClearGreenMap.put(crossId.concat(currentPhaseId), carNums);
break;
} else {
crossIdPhaseIdClearGreenMap.put(crossId.concat(currentPhaseId), 0);
}
}
}
}
}
// 如果全场红
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 void getClearRateCache(String crossId, String currentPhaseId, Map<String, Integer> crossIdPhaseIdClearGreenMap) throws JsonProcessingException {
int phaseSize = 0;
HashMap<String, Integer> tempMap = new HashMap<>();
for (Map.Entry<String, Integer> entry : crossIdPhaseIdClearGreenMap.entrySet()) {
String crossIdPhaseNo = entry.getKey();
if (crossIdPhaseNo.contains(crossId)) {
++phaseSize;
tempMap.put(crossId, entry.getValue());
}
}
log.info("当前路口相位信息:" + JacksonUtils.getInstance().writeValueAsString(crossIdPhaseIdClearGreenMap));
if (startPhaseIdMap.containsValue(currentPhaseId) && phaseSize >= 2) {
double clearRate = 0.0;
for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {
int value = entry.getValue() > 0 ? 1 : 0;
clearRate += (double) value / phaseSize;
}
startPhaseIdMap.remove(crossId);// 只计算一次
log.info("绿灯清空率为:" + (1 - clearRate) * 100);
CrossRealTimeCache.crossPhaseIdClearGreenMap.put(crossId, 1 - clearRate);
}
}
/**
* 通过路口编号获取主题消息中的车辆数量
*
* @param [crossId]
* @param crossId
* @return java.lang.Integer
* @description
*/
......@@ -140,10 +145,6 @@ public class DataProcessTask {
for (CrossSnapshotDataDTO.EventList element : eventList) {
String currentCrossId = element.getCrossId();
if (StringUtils.equals(crossId, currentCrossId)) {
if (crossId.equals("13NGH0B5RC0")) {
log.error("当前时间戳:{},当前车辆数:{}", timeStamp, element.getCarNums());
}
return element.getCarNums();
}
}
......
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