Commit 06210f5f authored by hanbing's avatar hanbing

[add] 诊断优化,下发手动干预、恢复下发

parent 4e0dce3b
......@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO;
import net.wanji.opt.dto.SendManualDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.service.DiagnoService;
import net.wanji.opt.vo.CrossIdAndLocationVO;
......@@ -83,4 +84,28 @@ public class DiagnoController {
List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = diagnoService.queryOptTime(crossIdAndSchemeIdDTO);
return JsonViewObject.newInstance().success(phaseOptTimeList);
}
@ApiOperation(value = "下发手动干预", notes = "下发手动干预", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/sendManual",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = JsonViewObject.class),
})
public JsonViewObject sendManual(@RequestBody SendManualDTO sendManualDTO) throws Exception {
diagnoService.sendManual(sendManualDTO);
return JsonViewObject.newInstance().success();
}
@ApiOperation(value = "恢复下发", notes = "恢复下发", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/restoreSend",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = JsonViewObject.class),
})
public JsonViewObject restoreSend(@RequestBody CrossIdDTO crossIdDTO) throws Exception {
diagnoService.restoreSend(crossIdDTO);
return JsonViewObject.newInstance().success();
}
}
\ No newline at end of file
package net.wanji.opt.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import net.wanji.opt.vo.SchemeOptVO;
import java.util.List;
/**
* @author hfx
* @date 2023/1/12 09:11
* @desc 路口基础信息
*/
@Data
@ApiModel(value = "SendManualDTO", description = "下发手动干预输入参数")
public class SendManualDTO {
@ApiModelProperty(value = "优化模式 0手动干预 1中心优化 6边缘优化")
private Integer optType;
@ApiModelProperty(value = "当前路口路口状态 1失衡 2拥堵 3溢出")
private Integer crossStatus;
@ApiModelProperty(value = "当前路口ID")
private String currentCrossId;
@ApiModelProperty(value = "下发路口ID")
private String sendCrossId;
@ApiModelProperty(value = "原方案ID")
private Integer schemeId;
@ApiModelProperty(value = "调整时间表格")
private List<SchemeOptVO.PhaseOptTime> phaseOptTimeList;
}
......@@ -2,6 +2,7 @@ package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO;
import net.wanji.opt.dto.SendManualDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.SchemeOptVO;
......@@ -20,4 +21,8 @@ public interface DiagnoService {
SchemeOptVO querySchemeOpt(CrossIdDTO crossIdDTO);
List<SchemeOptVO.PhaseOptTime> queryOptTime(CrossIdAndSchemeIdDTO crossIdAndSchemeIdDTO);
void sendManual(SendManualDTO sendManualDTO) throws Exception;
void restoreSend(CrossIdDTO crossIdDTO) throws Exception;
}
......@@ -6,6 +6,7 @@ import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.RidInfoMapper;
import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.opt.dao.mapper.CrossDirInfoMapper;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.CrossPhaseMapper;
......@@ -14,6 +15,7 @@ import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper;
import net.wanji.opt.dao.mapper.strategy.SceneMapper;
import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO;
import net.wanji.opt.dto.SendManualDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.dto.strategy.QuerySceneDTO;
import net.wanji.opt.po.base.CrossInfoPO;
......@@ -23,17 +25,22 @@ import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.po.strategy.ScenePO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.DiagnoService;
import net.wanji.opt.service.signalcontrol.FeignProxyService;
import net.wanji.opt.service.strategy.SceneService;
import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.SchemeOptSendVO;
import net.wanji.opt.vo.SchemeOptVO;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @author Kent HAN
......@@ -52,11 +59,13 @@ public class DiagnoServiceImpl implements DiagnoService {
private final CrossSchemeOptLogMapper crossSchemeOptLogMapper;
private final CrossSchemeMapper crossSchemeMapper;
private final CrossPhaseMapper crossPhaseMapper;
private final FeignProxyService feignProxyService;
public DiagnoServiceImpl(CrossInfoMapper crossInfoMapper, CrossDataRealtimeMapper crossDataRealtimeMapper,
SceneService sceneService, SceneMapper sceneMapper, CrossDirInfoMapper crossDirInfoMapper,
RidInfoMapper ridInfoMapper, CrossSchemeOptLogMapper crossSchemeOptLogMapper,
CrossSchemeMapper crossSchemeMapper, CrossPhaseMapper crossPhaseMapper) {
CrossSchemeMapper crossSchemeMapper, CrossPhaseMapper crossPhaseMapper,
FeignProxyService feignProxyService) {
this.crossInfoMapper = crossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.sceneService = sceneService;
......@@ -66,6 +75,7 @@ public class DiagnoServiceImpl implements DiagnoService {
this.crossSchemeOptLogMapper = crossSchemeOptLogMapper;
this.crossSchemeMapper = crossSchemeMapper;
this.crossPhaseMapper = crossPhaseMapper;
this.feignProxyService = feignProxyService;
}
@Override
......@@ -164,6 +174,115 @@ public class DiagnoServiceImpl implements DiagnoService {
return phaseOptTimeList;
}
@Override
public void sendManual(SendManualDTO sendManualDTO) throws Exception {
SchemeOptSendVO schemeOptSendVO = new SchemeOptSendVO();
Integer optTypeInt = sendManualDTO.getOptType();
String optTypeStr = String.valueOf(optTypeInt);
schemeOptSendVO.setOptType(optTypeStr);
Integer crossStatus = sendManualDTO.getCrossStatus();
String crossStatusStr = String.valueOf(crossStatus);
schemeOptSendVO.setOptReason(crossStatusStr);
String currentCrossId = sendManualDTO.getCurrentCrossId();
String sendCrossId = sendManualDTO.getSendCrossId();
if (!Objects.equals(currentCrossId, sendCrossId)) {
schemeOptSendVO.setRelationFlag(String.valueOf(0)); // 是否被关联调整 1否 0是
schemeOptSendVO.setRelationCrossId(currentCrossId);
} else {
schemeOptSendVO.setRelationFlag(String.valueOf(1));
}
Map<String, Integer> phaseOffsetTimeMap = new HashMap<>();
List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = sendManualDTO.getPhaseOptTimeList();
for (SchemeOptVO.PhaseOptTime phaseOptTime : phaseOptTimeList) {
phaseOffsetTimeMap.put(phaseOptTime.getPhaseNo(), phaseOptTime.getOptTime());
}
schemeOptSendVO.setPhaseOffsetTimeMap(phaseOffsetTimeMap);
schemeOptSendVO.setCrossCode(sendCrossId);
Integer schemeId = sendManualDTO.getSchemeId();
List<SchemeSendVO.Pattern> patternList = buildPatternList(sendCrossId, schemeId, phaseOffsetTimeMap);
schemeOptSendVO.setPatternList(patternList);
feignProxyService.schemeOptSend(schemeOptSendVO);
}
private List<SchemeSendVO.Pattern> buildPatternList(String sendCrossId, Integer schemeId,
Map<String, Integer> phaseOffsetTimeMap) {
List<SchemeSendVO.Pattern> patternList = new ArrayList<>();
CrossSchemePO crossSchemePO = crossSchemeMapper.selectById(schemeId);
SchemeSendVO.Pattern pattern = new SchemeSendVO.Pattern();
pattern.setPatternNo(crossSchemePO.getSchemeNo());
pattern.setPatternName(crossSchemePO.getName());
pattern.setCycle(crossSchemePO.getCycle().toString());
pattern.setCoordPhase(crossSchemePO.getCoordPhase().toString());
pattern.setOffset(crossSchemePO.getOffset().toString());
// 构造环列表
List<SchemeSendVO.Pattern.Ring> rings = buildRings(sendCrossId, schemeId, phaseOffsetTimeMap);
pattern.setRings(rings);
patternList.add(pattern);
return patternList;
}
private List<SchemeSendVO.Pattern.Ring> buildRings(String sendCrossId, Integer schemeId,
Map<String, Integer> phaseOffsetTimeMap) {
List<SchemeSendVO.Pattern.Ring> rings = new ArrayList<>();
// 根据路口ID和方案ID查询相位集合,根据ringNo分组,特殊控制ringNo为0
List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase(sendCrossId, schemeId.toString());
Map<Integer, List<CrossPhasePO>> collectMap = crossPhasePOList.stream()
.collect(Collectors.groupingBy(CrossPhasePO::getRingNo));
for (Map.Entry<Integer, List<CrossPhasePO>> entry : collectMap.entrySet()) {
SchemeSendVO.Pattern.Ring ring = new SchemeSendVO.Pattern.Ring();
ring.setRingNo(entry.getKey().toString());
// 构造相位列表
List<CrossPhasePO> phases = entry.getValue();
List<SchemeSendVO.Pattern.Ring.Phase> phaseList = buildPhaseList(phases, phaseOffsetTimeMap);
ring.setPhaseList(phaseList);
rings.add(ring);
}
return rings;
}
private List<SchemeSendVO.Pattern.Ring.Phase> buildPhaseList(List<CrossPhasePO> phases,
Map<String, Integer> phaseOffsetTimeMap) {
List<SchemeSendVO.Pattern.Ring.Phase> phaseList = new ArrayList<>();
for (CrossPhasePO phasePO : phases) {
SchemeSendVO.Pattern.Ring.Phase phase = new SchemeSendVO.Pattern.Ring.Phase();
String phaseNo = phasePO.getPhaseNo();
phase.setPhaseNo(phaseNo);
phase.setPhaseName(phasePO.getName());
phase.setSort(phasePO.getSort().toString());
phase.setControlMode(phasePO.getControlMode().toString());
phase.setMinGreenTime(phasePO.getMinGreenTime().toString());
phase.setMaxGreenTime(phasePO.getMaxGreenTime().toString());
phase.setPhaseTime(phasePO.getPhaseTime().toString());
Integer oldGreenTime = phasePO.getGreenTime();
Integer optTime = phaseOffsetTimeMap.get(phaseNo);
if (optTime != null) {
Integer newGreenTime = oldGreenTime + optTime;
phase.setGreenTime(newGreenTime.toString());
} else {
phase.setGreenTime(oldGreenTime.toString());
}
phase.setGreenFlashTime(phasePO.getGreenFlashTime().toString());
phase.setPedFlashTime(phasePO.getPedFlashTime().toString());
phase.setYellowTime(phasePO.getYellowTime().toString());
phase.setRedTime(phasePO.getRedTime().toString());
phaseList.add(phase);
}
return phaseList;
}
@Override
public void restoreSend(CrossIdDTO crossIdDTO) throws Exception {
String crossId = crossIdDTO.getCrossId();
feignProxyService.schemeOptRestore(crossId);
}
private Integer getNewGreenTime(String crossId, Integer schemeId, String phaseNo) {
List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase(crossId, String.valueOf(schemeId));
for (CrossPhasePO crossPhasePO : crossPhasePOList) {
......
......@@ -20,7 +20,7 @@ public class SchemeOptSendVO extends SchemeSendVO {
@ApiModelProperty(value = "优化类型: 0-手动优化; 1-自动优化; 2-恢复; 3-绿波优化; 4-区域优化; 5-高峰方案下发")
@NotBlank(message = "优化类型不能为空")
private String optType;
@ApiModelProperty(value = "调整原因: 1-失衡; 2-溢出; 3-拥堵; 4-绿波优化; 5-高峰方案下发-失衡; 6-高峰方案下发-溢出; 7-高峰方案下发-拥堵; 8-活动预案; 90-事故单点优化")
@ApiModelProperty(value = "调整原因: 1-失衡; 2-拥堵; 3-溢出; 4-绿波优化; 5-高峰方案下发-失衡; 6-高峰方案下发-溢出; 7-高峰方案下发-拥堵; 8-活动预案; 90-事故单点优化")
private String optReason;
@ApiModelProperty(value = "是否被关联调整: 1-否; 0-是")
private String relationFlag;
......
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