Commit 86d97bc5 authored by duanruiming's avatar duanruiming

[add] 路口优化->手动优化方案恢复

parent c5476999
...@@ -14,13 +14,14 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -14,13 +14,14 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
/** /**
* @author duanruiming * @author duanruiming
* @date 2023/03/01 20:44 * @date 2023/03/01 20:44
*/ */
@Api(value = "SignalCommandOptController", description = "手动优化数据下发服务") @Api(value = "SignalCommandOptController", description = "信号优化")
@RequestMapping("/signalControl") @RequestMapping("/signalControl")
@RestController @RestController
public class SignalCommandOptController { public class SignalCommandOptController {
...@@ -38,4 +39,14 @@ public class SignalCommandOptController { ...@@ -38,4 +39,14 @@ public class SignalCommandOptController {
return jsonViewObject; return jsonViewObject;
} }
@ApiOperation(value = "手动优化方案恢复", notes = "优化方案恢复", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/schemeOptRestore",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({@ApiResponse(code = 200, message = "OK", response = JsonViewObject.class)})
public JsonViewObject schemeOptRestore(@RequestBody @NotBlank String crossId) throws Exception{
JsonViewObject jsonViewObject = feignProxyService.schemeOptRestore(crossId);
return jsonViewObject;
}
} }
...@@ -23,8 +23,6 @@ import net.wanji.opt.po.base.CrossSchemeOptLogPO; ...@@ -23,8 +23,6 @@ import net.wanji.opt.po.base.CrossSchemeOptLogPO;
import net.wanji.opt.po.base.CrossSchemePO; import net.wanji.opt.po.base.CrossSchemePO;
import net.wanji.opt.po.trend.CrossDataRealtimePO; import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.service.CrossOptimizeService; import net.wanji.opt.service.CrossOptimizeService;
import net.wanji.opt.service.CrossSchedulesService;
import net.wanji.opt.service.CrossSchemeService;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
...@@ -32,6 +30,7 @@ import org.springframework.stereotype.Service; ...@@ -32,6 +30,7 @@ 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;
...@@ -47,10 +46,6 @@ import java.util.stream.Collectors; ...@@ -47,10 +46,6 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class CrossOptimizeServiceImpl implements CrossOptimizeService { public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource
CrossSchemeService crossSchemeService;
@Resource
CrossSchedulesService crossSchedulesService;
@Resource @Resource
CrossPhaseMapper crossPhaseMapper; CrossPhaseMapper crossPhaseMapper;
@Resource @Resource
...@@ -79,6 +74,17 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -79,6 +74,17 @@ 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) {
...@@ -268,11 +274,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -268,11 +274,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
} else { } else {
log.error("当前拥堵路口: {}, 实时监控优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId); log.error("当前拥堵路口: {}, 实时监控优化上游路口: {}时,未获取到上游路口的实时转向数据!", crossId, startCrossId);
} }
} }
} }
} }
} }
} }
...@@ -482,7 +486,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -482,7 +486,7 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
* @param phaseTimeOptResultMap * @param phaseTimeOptResultMap
* @return * @return
*/ */
private SchemeSendVO getSchemeSendVO(String crossId, Map<String, CrossPhaseDTO> phaseMap, Map<String, Integer> phaseTimeOptResultMap) throws Exception { public static SchemeSendVO getSchemeSendVO(String crossId, Map<String, CrossPhaseDTO> phaseMap, Map<String, Integer> phaseTimeOptResultMap) throws Exception {
String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, crossId, "1", "s"); String key = String.join(Constants.SystemParam.SEPARATOR_UNDER_LINE, crossId, "1", "s");
CrossPhaseDTO crossPhaseDTO = phaseMap.get(key); CrossPhaseDTO crossPhaseDTO = phaseMap.get(key);
if (Objects.isNull(crossPhaseDTO)) { if (Objects.isNull(crossPhaseDTO)) {
...@@ -491,8 +495,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService { ...@@ -491,8 +495,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
} }
Integer schemeId = crossPhaseDTO.getSchemeId(); Integer schemeId = crossPhaseDTO.getSchemeId();
List<CrossSchemePO> crossSchemePOS = crossSchemeMapper.listCrossSchemeInfo(crossId, null, schemeId); List<CrossSchemePO> crossSchemePOS = crossOptimizeService.crossSchemeMapper.listCrossSchemeInfo(crossId, null, schemeId);
List<CrossPhasePO> crossPhasePOS = crossPhaseMapper.listCrossPhase(crossId, String.valueOf(schemeId)); List<CrossPhasePO> crossPhasePOS = crossOptimizeService.crossPhaseMapper.listCrossPhase(crossId, String.valueOf(schemeId));
Map<Integer, List<CrossPhasePO>> ringNoPhasePOMap = crossPhasePOS.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();
......
...@@ -9,4 +9,5 @@ import net.wanji.opt.vo.SchemeOptSendVO; ...@@ -9,4 +9,5 @@ import net.wanji.opt.vo.SchemeOptSendVO;
*/ */
public interface FeignProxyService { public interface FeignProxyService {
JsonViewObject schemeOptSend(SchemeOptSendVO schemeOptSendVO) throws Exception; JsonViewObject schemeOptSend(SchemeOptSendVO schemeOptSendVO) throws Exception;
JsonViewObject schemeOptRestore(String crossId) throws Exception;
} }
...@@ -20,6 +20,8 @@ import java.time.LocalDateTime; ...@@ -20,6 +20,8 @@ import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
import java.util.*; import java.util.*;
import static net.wanji.opt.service.impl.CrossOptimizeServiceImpl.getSchemeSendVO;
/** /**
* @author duanruiming * @author duanruiming
* @date 2023/03/02 9:11 * @date 2023/03/02 9:11
...@@ -43,7 +45,7 @@ public class FeignProxyServiceImpl implements FeignProxyService { ...@@ -43,7 +45,7 @@ public class FeignProxyServiceImpl implements FeignProxyService {
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO); JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) { if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject); log.error("实时监控路口优化方案下发远程调用异常!", jsonViewObject);
throw new Exception(); return jsonViewObject.fail("手动下发优化方案,UTC服务调用异常");
} }
// 将优化记录插入方案优化记录表 // 将优化记录插入方案优化记录表
...@@ -52,6 +54,19 @@ public class FeignProxyServiceImpl implements FeignProxyService { ...@@ -52,6 +54,19 @@ public class FeignProxyServiceImpl implements FeignProxyService {
return jsonViewObject.success("手动下发优化方案成功"); return jsonViewObject.success("手动下发优化方案成功");
} }
@Override
public JsonViewObject schemeOptRestore(String crossId) throws Exception {
// 下发原始方案
Map<String, CrossPhaseDTO> phaseMap = phaseDirTurnCache.getPhaseDirTurnMap();
SchemeSendVO schemeSendVO = getSchemeSendVO(crossId, phaseMap, Collections.EMPTY_MAP);
JsonViewObject jsonViewObject = utcFeignClients.schemeSend(schemeSendVO);
if (Objects.isNull(jsonViewObject) || jsonViewObject.getCode() != 200) {
log.error("实时监控路口优化方案恢复远程调用异常!", jsonViewObject);
return jsonViewObject.fail("手动恢复优化方案,UTC服务调用异常");
}
return null;
}
/** /**
* 获取方案优化数据,插入到数据库 * 获取方案优化数据,插入到数据库
* *
......
...@@ -25,6 +25,7 @@ public class SchemeOptSendVO extends SchemeSendVO { ...@@ -25,6 +25,7 @@ public class SchemeOptSendVO extends SchemeSendVO {
@ApiModelProperty(value = "是否被关联调整: 1-否; 0-是") @ApiModelProperty(value = "是否被关联调整: 1-否; 0-是")
private String relationFlag; private String relationFlag;
@ApiModelProperty(value = "关联路口方向编号") @ApiModelProperty(value = "关联路口方向编号")
@javax.validation.constraints.Pattern(regexp = "^[A-za-z0-9]{11}$", message = "路口编号只能包含英文、数字,必须11个字符")
private String relationCrossId; private String relationCrossId;
@ApiModelProperty(value = "相位号-相位调整时间map") @ApiModelProperty(value = "相位号-相位调整时间map")
@NotEmpty @NotEmpty
......
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