Commit 97090869 authored by duanruiming's avatar duanruiming

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

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