Commit 06210f5f authored by hanbing's avatar hanbing

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

parent 4e0dce3b
...@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiResponses; ...@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.dto.CrossIdDTO; import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO; 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.AddOrUpdateSceneDTO;
import net.wanji.opt.service.DiagnoService; import net.wanji.opt.service.DiagnoService;
import net.wanji.opt.vo.CrossIdAndLocationVO; import net.wanji.opt.vo.CrossIdAndLocationVO;
...@@ -83,4 +84,28 @@ public class DiagnoController { ...@@ -83,4 +84,28 @@ public class DiagnoController {
List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = diagnoService.queryOptTime(crossIdAndSchemeIdDTO); List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = diagnoService.queryOptTime(crossIdAndSchemeIdDTO);
return JsonViewObject.newInstance().success(phaseOptTimeList); 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; ...@@ -2,6 +2,7 @@ package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO; import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO; 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.AddOrUpdateSceneDTO;
import net.wanji.opt.vo.CrossIdAndLocationVO; import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.SchemeOptVO; import net.wanji.opt.vo.SchemeOptVO;
...@@ -20,4 +21,8 @@ public interface DiagnoService { ...@@ -20,4 +21,8 @@ public interface DiagnoService {
SchemeOptVO querySchemeOpt(CrossIdDTO crossIdDTO); SchemeOptVO querySchemeOpt(CrossIdDTO crossIdDTO);
List<SchemeOptVO.PhaseOptTime> queryOptTime(CrossIdAndSchemeIdDTO crossIdAndSchemeIdDTO); 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; ...@@ -6,6 +6,7 @@ import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.utils.tool.CrossUtil; import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.RidInfoEntity; import net.wanji.databus.dao.entity.RidInfoEntity;
import net.wanji.databus.dao.mapper.RidInfoMapper; 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.CrossDirInfoMapper;
import net.wanji.opt.dao.mapper.CrossInfoMapper; import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.CrossPhaseMapper; import net.wanji.opt.dao.mapper.CrossPhaseMapper;
...@@ -14,6 +15,7 @@ import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper; ...@@ -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.strategy.SceneMapper;
import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper; import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO; 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.AddOrUpdateSceneDTO;
import net.wanji.opt.dto.strategy.QuerySceneDTO; import net.wanji.opt.dto.strategy.QuerySceneDTO;
import net.wanji.opt.po.base.CrossInfoPO; import net.wanji.opt.po.base.CrossInfoPO;
...@@ -23,17 +25,22 @@ import net.wanji.opt.po.base.CrossSchemePO; ...@@ -23,17 +25,22 @@ import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.po.strategy.ScenePO; import net.wanji.opt.po.strategy.ScenePO;
import net.wanji.opt.po.trend.CrossDataRealtimePO; import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.DiagnoService; import net.wanji.opt.service.DiagnoService;
import net.wanji.opt.service.signalcontrol.FeignProxyService;
import net.wanji.opt.service.strategy.SceneService; import net.wanji.opt.service.strategy.SceneService;
import net.wanji.opt.vo.CrossIdAndLocationVO; import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.SchemeOptSendVO;
import net.wanji.opt.vo.SchemeOptVO; import net.wanji.opt.vo.SchemeOptVO;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
/** /**
* @author Kent HAN * @author Kent HAN
...@@ -52,11 +59,13 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -52,11 +59,13 @@ public class DiagnoServiceImpl implements DiagnoService {
private final CrossSchemeOptLogMapper crossSchemeOptLogMapper; private final CrossSchemeOptLogMapper crossSchemeOptLogMapper;
private final CrossSchemeMapper crossSchemeMapper; private final CrossSchemeMapper crossSchemeMapper;
private final CrossPhaseMapper crossPhaseMapper; private final CrossPhaseMapper crossPhaseMapper;
private final FeignProxyService feignProxyService;
public DiagnoServiceImpl(CrossInfoMapper crossInfoMapper, CrossDataRealtimeMapper crossDataRealtimeMapper, public DiagnoServiceImpl(CrossInfoMapper crossInfoMapper, CrossDataRealtimeMapper crossDataRealtimeMapper,
SceneService sceneService, SceneMapper sceneMapper, CrossDirInfoMapper crossDirInfoMapper, SceneService sceneService, SceneMapper sceneMapper, CrossDirInfoMapper crossDirInfoMapper,
RidInfoMapper ridInfoMapper, CrossSchemeOptLogMapper crossSchemeOptLogMapper, RidInfoMapper ridInfoMapper, CrossSchemeOptLogMapper crossSchemeOptLogMapper,
CrossSchemeMapper crossSchemeMapper, CrossPhaseMapper crossPhaseMapper) { CrossSchemeMapper crossSchemeMapper, CrossPhaseMapper crossPhaseMapper,
FeignProxyService feignProxyService) {
this.crossInfoMapper = crossInfoMapper; this.crossInfoMapper = crossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper; this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.sceneService = sceneService; this.sceneService = sceneService;
...@@ -66,6 +75,7 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -66,6 +75,7 @@ public class DiagnoServiceImpl implements DiagnoService {
this.crossSchemeOptLogMapper = crossSchemeOptLogMapper; this.crossSchemeOptLogMapper = crossSchemeOptLogMapper;
this.crossSchemeMapper = crossSchemeMapper; this.crossSchemeMapper = crossSchemeMapper;
this.crossPhaseMapper = crossPhaseMapper; this.crossPhaseMapper = crossPhaseMapper;
this.feignProxyService = feignProxyService;
} }
@Override @Override
...@@ -164,6 +174,115 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -164,6 +174,115 @@ public class DiagnoServiceImpl implements DiagnoService {
return phaseOptTimeList; 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) { private Integer getNewGreenTime(String crossId, Integer schemeId, String phaseNo) {
List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase(crossId, String.valueOf(schemeId)); List<CrossPhasePO> crossPhasePOList = crossPhaseMapper.listCrossPhase(crossId, String.valueOf(schemeId));
for (CrossPhasePO crossPhasePO : crossPhasePOList) { for (CrossPhasePO crossPhasePO : crossPhasePOList) {
......
...@@ -20,7 +20,7 @@ public class SchemeOptSendVO extends SchemeSendVO { ...@@ -20,7 +20,7 @@ public class SchemeOptSendVO extends SchemeSendVO {
@ApiModelProperty(value = "优化类型: 0-手动优化; 1-自动优化; 2-恢复; 3-绿波优化; 4-区域优化; 5-高峰方案下发") @ApiModelProperty(value = "优化类型: 0-手动优化; 1-自动优化; 2-恢复; 3-绿波优化; 4-区域优化; 5-高峰方案下发")
@NotBlank(message = "优化类型不能为空") @NotBlank(message = "优化类型不能为空")
private String optType; 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; private String optReason;
@ApiModelProperty(value = "是否被关联调整: 1-否; 0-是") @ApiModelProperty(value = "是否被关联调整: 1-否; 0-是")
private String relationFlag; 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