Commit 0589d627 authored by duanruiming's avatar duanruiming

[add] 添加相位方案缓存

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