Commit 0589d627 authored by duanruiming's avatar duanruiming

[add] 添加相位方案缓存

parent 5523315a
......@@ -34,6 +34,7 @@ public class CrossDirTurnPhaseCache implements CommandLineRunner {
CrossSchemeService crossSchemeService;
/**
* 当前时间路口运行的方案相位转向数据信息
* 统一获取缓存方法
* key: crossId-dir-turn value:CrossPhaseDTO
*
......@@ -114,7 +115,7 @@ public class CrossDirTurnPhaseCache implements CommandLineRunner {
}
}
long end = System.currentTimeMillis();
log.info("加载区域基础信息到缓存耗时:{}ms,条数据,size={}", (end - start), phaseMap.size());
log.info("加载路口当前运行的方案相位转向缓存耗时:{}ms,条数据,size={}", (end - start), phaseMap.size());
} catch (Exception e) {
log.error("相位方向转向缓存初始化失败", e);
}
......
package net.wanji.opt.cache;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.Constants;
import net.wanji.opt.dao.mapper.CrossPhaseMapper;
import net.wanji.opt.po.base.CrossPhasePO;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author duanruiming
* @date 2023/03/06 15:03
*/
@Component
@Slf4j
public class CrossPhaseInfoCache implements CommandLineRunner {
@Resource
CrossPhaseMapper crossPhaseMapper;
private static Map<String, List<CrossPhasePO>> crossPhaseInfoMap = new HashMap<>();
public static Map<String, List<CrossPhasePO>> getCrossPhaseInfoCache() {
return crossPhaseInfoMap;
}
public static List<CrossPhasePO> getCrossPhaseCacheByCrossId(String crossId) {
if (!crossPhaseInfoMap.isEmpty()) {
return crossPhaseInfoMap.get(crossId);
}
return Collections.EMPTY_LIST;
}
public void refresh() {
init();
}
@Override
public void run(String... args) throws Exception {
init();
}
public void init() {
List<CrossPhasePO> crossPhasePOS = crossPhaseMapper.listCrossPhase(Constants.SystemParam.NULL, Constants.SystemParam.NULL);
if (!CollectionUtils.isEmpty(crossPhasePOS)) {
crossPhaseInfoMap = crossPhasePOS.stream().collect(Collectors.groupingBy(CrossPhasePO::getCrossId));
}
}
}
package net.wanji.opt.cache;
import lombok.extern.slf4j.Slf4j;
import net.wanji.common.framework.Constants;
import net.wanji.opt.dao.mapper.CrossSchemeMapper;
import net.wanji.opt.po.base.CrossSchemePO;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author duanruiming
* @date 2023/03/06 14:30
*/
@Component
@Slf4j
public class CrossSchemeInfoCache implements CommandLineRunner {
@Resource
CrossSchemeMapper crossSchemeMapper;
/**
* key:crossId_id value:CrossSchemePO
*/
private static Map<String, CrossSchemePO> crossSchemeInfoMap = new HashMap<>();
public static Map<String, CrossSchemePO> getCrossSchemeInfosCache() {
return crossSchemeInfoMap;
}
public static CrossSchemePO geteSchemePOCache(String key) {
if (!crossSchemeInfoMap.isEmpty()) {
return crossSchemeInfoMap.get(key);
}
return null;
}
public void refresh() {
init();
}
@Override
public void run(String... args) throws Exception {
init();
}
private void init() {
try {
long start = System.currentTimeMillis();
List<CrossSchemePO> crossSchemePOS = crossSchemeMapper.listCrossSchemeInfo(Constants.SystemParam.NULL, Constants.SystemParam.NULL, null);
if (!CollectionUtils.isEmpty(crossSchemePOS)) {
crossSchemePOS.forEach(crossSchemePO -> {
String crossId = crossSchemePO.getCrossId();
Integer schemeId = crossSchemePO.getId();
String key = String.join("_", crossId, String.valueOf(schemeId));
crossSchemeInfoMap.put(key, crossSchemePO);
});
}
long end = System.currentTimeMillis();
log.info("加载路口方案信息到缓存耗时:{}ms,条数据,size={}", (end - start), crossSchemeInfoMap.size());
} catch (Exception e) {
log.info("加载路口方案信息到缓存失败", e);
}
}
}
......@@ -33,13 +33,15 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.stream.Collectors;
import static net.wanji.opt.cache.CrossPhaseInfoCache.getCrossPhaseCacheByCrossId;
import static net.wanji.opt.cache.CrossSchemeInfoCache.geteSchemePOCache;
/**
* @author hfx
* @date 2023/1/10 15:15
......@@ -79,17 +81,6 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
static Set<String> CROSS_OPT = new HashSet<>(); // 记录已优化的路口
/**
* 解决静态方法中不能使用mapper
*/
private static CrossOptimizeServiceImpl crossOptimizeService;
@PostConstruct
public void init() {
crossOptimizeService = this;
crossOptimizeService.crossPhaseMapper = this.crossPhaseMapper;
crossOptimizeService.crossSchemeMapper = this.crossSchemeMapper;
}
@Override
@Transactional
public String realtimeOptimize(List<CrossDataRealtimePO> abnormalCrossList, List<CrossDataRealtimePO> crossDataRealtimePOList) {
......@@ -512,52 +503,50 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
Integer schemeId = crossPhaseDTO.getSchemeId();
List<CrossSchemePO> crossSchemePOS = crossOptimizeService.crossSchemeMapper.listCrossSchemeInfo(crossId, null, schemeId);
List<CrossPhasePO> crossPhasePOS = crossOptimizeService.crossPhaseMapper.listCrossPhase(crossId, String.valueOf(schemeId));
Map<Integer, List<CrossPhasePO>> ringNoPhasePOMap = crossPhasePOS.stream().collect(Collectors.groupingBy(CrossPhasePO::getRingNo));
CrossSchemePO crossSchemePO = geteSchemePOCache(String.join("_", crossId, String.valueOf(schemeId)));
Map<Integer, List<CrossPhasePO>> ringNoPhasePOMap = getCrossPhaseCacheByCrossId(crossId).stream().collect(Collectors.groupingBy(CrossPhasePO::getRingNo));
SchemeSendVO schemeSendVO = new SchemeSendVO();
List<SchemeSendVO.Pattern> patternList = new ArrayList<>();
crossSchemePOS.forEach(crossSchemePO -> {
SchemeSendVO.Pattern pattern = new SchemeSendVO.Pattern();
pattern.setPatternName("实时监测优化方案".concat(crossSchemePO.getSchemeNo()));
pattern.setPatternNo(String.valueOf(crossSchemePO.getId()));
pattern.setCycle(String.valueOf(crossSchemePO.getCycle()));
pattern.setOffset(String.valueOf(crossSchemePO.getOffset()));
pattern.setCoordPhase(String.valueOf(crossSchemePO.getCoordPhase()));
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();
value.forEach(crossPhasePO -> {
SchemeSendVO.Pattern.Ring.Phase phase = new SchemeSendVO.Pattern.Ring.Phase();
phase.setPhaseNo(crossPhasePO.getPhaseNo());
phase.setPhaseName(crossPhasePO.getName());
phase.setSort(String.valueOf(crossPhasePO.getSort()));
phase.setControlMode(String.valueOf(crossPhasePO.getControlMode()));
phase.setMinGreenTime(String.valueOf(crossPhasePO.getMinGreenTime()));
phase.setMaxGreenTime(String.valueOf(crossPhasePO.getMaxGreenTime()));
// 可优化时间
Integer currentPhaseOffset = getCurrentPhaseOptOffsetTime(phaseTimeOptResultMap, crossPhasePO.getPhaseNo());
phase.setPhaseTime(String.valueOf(crossPhasePO.getPhaseTime() + currentPhaseOffset));
phase.setGreenTime(String.valueOf(crossPhasePO.getGreenTime() + currentPhaseOffset));
phase.setGreenFlashTime(String.valueOf(crossPhasePO.getGreenFlashTime()));
phase.setPedFlashTime(String.valueOf(crossPhasePO.getPedFlashTime()));
phase.setYellowTime(String.valueOf(crossPhasePO.getYellowTime()));
phase.setRedTime(String.valueOf(crossPhasePO.getRedTime()));
phaseList.add(phase);
});
ring.setRingNo(String.valueOf(entry.getKey()));
ring.setPhaseList(phaseList);
rings.add(ring);
});
pattern.setRings(rings);
patternList.add(pattern);
}
);
if (Objects.nonNull(crossSchemePO)) {
SchemeSendVO.Pattern pattern = new SchemeSendVO.Pattern();
pattern.setPatternName("实时监测优化方案".concat(crossSchemePO.getSchemeNo()));
pattern.setPatternNo(String.valueOf(crossSchemePO.getId()));
pattern.setCycle(String.valueOf(crossSchemePO.getCycle()));
pattern.setOffset(String.valueOf(crossSchemePO.getOffset()));
pattern.setCoordPhase(String.valueOf(crossSchemePO.getCoordPhase()));
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();
value.forEach(crossPhasePO -> {
SchemeSendVO.Pattern.Ring.Phase phase = new SchemeSendVO.Pattern.Ring.Phase();
phase.setPhaseNo(crossPhasePO.getPhaseNo());
phase.setPhaseName(crossPhasePO.getName());
phase.setSort(String.valueOf(crossPhasePO.getSort()));
phase.setControlMode(String.valueOf(crossPhasePO.getControlMode()));
phase.setMinGreenTime(String.valueOf(crossPhasePO.getMinGreenTime()));
phase.setMaxGreenTime(String.valueOf(crossPhasePO.getMaxGreenTime()));
// 可优化时间
Integer currentPhaseOffset = getCurrentPhaseOptOffsetTime(phaseTimeOptResultMap, crossPhasePO.getPhaseNo());
phase.setPhaseTime(String.valueOf(crossPhasePO.getPhaseTime() + currentPhaseOffset));
phase.setGreenTime(String.valueOf(crossPhasePO.getGreenTime() + currentPhaseOffset));
phase.setGreenFlashTime(String.valueOf(crossPhasePO.getGreenFlashTime()));
phase.setPedFlashTime(String.valueOf(crossPhasePO.getPedFlashTime()));
phase.setYellowTime(String.valueOf(crossPhasePO.getYellowTime()));
phase.setRedTime(String.valueOf(crossPhasePO.getRedTime()));
phaseList.add(phase);
});
ring.setRingNo(String.valueOf(entry.getKey()));
ring.setPhaseList(phaseList);
rings.add(ring);
});
pattern.setRings(rings);
patternList.add(pattern);
}
schemeSendVO.setCrossCode(crossId);
schemeSendVO.setPatternList(patternList);
......
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