Commit f81f05e0 authored by hanbing's avatar hanbing

[add] 诊断优化,路口列表

parent 86d97bc5
package net.wanji.opt.common.exception; package net.wanji.opt.common.exception;
import net.wanji.common.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError; import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError; import org.springframework.validation.ObjectError;
...@@ -32,11 +33,22 @@ public class GlobalExceptionHandler { ...@@ -32,11 +33,22 @@ public class GlobalExceptionHandler {
return jsonViewObject.fail(message); return jsonViewObject.fail(message);
} }
@ExceptionHandler(value = RuntimeException.class) @ExceptionHandler(value = DuplicateKeyException.class)
public JsonViewObject runtimeExceptionHandler(RuntimeException e) { public JsonViewObject duplicateKeyExceptionHandler(DuplicateKeyException e) {
return JsonViewObject.newInstance().fail(e); return JsonViewObject.newInstance().fail(e);
} }
@ExceptionHandler(value = UniqueException.class)
public JsonViewObject uniqueExceptionHandler(UniqueException e) {
return JsonViewObject.newInstance().fail(e);
}
@ExceptionHandler(value = Exception.class)
public JsonViewObject exceptionHandler(Exception e) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.fail("服务器内部错误");
}
private Map<String, String> getErrors(BindingResult result) { private Map<String, String> getErrors(BindingResult result) {
Map<String, String> map = new HashMap<>(); Map<String, String> map = new HashMap<>();
List<FieldError> list = result.getFieldErrors(); List<FieldError> list = result.getFieldErrors();
......
package net.wanji.opt.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.dto.DiagnoCrossListDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.service.DiagnoService;
import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.DiagnoCrossVO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.ws.rs.core.MediaType;
import java.util.List;
/**
* 诊断优化
*
* @author Kent HAN
*/
@Api(value = "DiagnoController", description = "诊断优化")
@RequestMapping("/diagno")
@RestController
public class DiagnoController {
private final DiagnoService diagnoService;
public DiagnoController(DiagnoService diagnoService) {
this.diagnoService = diagnoService;
}
@ApiOperation(value = "路口列表", notes = "路口列表", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/diagnoCrossList",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = DiagnoCrossVO.class),
})
public JsonViewObject diagnoCrossList(@RequestBody @Valid DiagnoCrossListDTO diagnoCrossListDTO) {
List<DiagnoCrossVO> diagnoCrossVOList = diagnoService.diagnoCrossList(diagnoCrossListDTO);
return JsonViewObject.newInstance().success(diagnoCrossVOList);
}
@ApiOperation(value = "查询路口当前场景", notes = "查询路口当前场景", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/queryCrossScene",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AddOrUpdateSceneDTO.class),
})
public JsonViewObject queryCrossScene(@RequestBody CrossIdDTO crossIdDTO) {
AddOrUpdateSceneDTO addOrUpdateSceneDTO = diagnoService.queryCrossScene(crossIdDTO);
return JsonViewObject.newInstance().success(addOrUpdateSceneDTO);
}
@ApiOperation(value = "查询当前路口相邻路口", notes = "查询当前路口相邻路口", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/queryNeighborCross",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = CrossIdAndLocationVO.class),
})
public JsonViewObject queryNeighborCross(@RequestBody CrossIdDTO crossIdDTO) {
List<CrossIdAndLocationVO> crossIdAndLocationVOList = diagnoService.queryNeighborCross(crossIdDTO);
return JsonViewObject.newInstance().success(crossIdAndLocationVOList);
}
}
\ No newline at end of file
...@@ -47,7 +47,7 @@ public class IdeaController { ...@@ -47,7 +47,7 @@ public class IdeaController {
try { try {
ideaService.addOrUpdateIdea(addOrUpdateIdeaDTO); ideaService.addOrUpdateIdea(addOrUpdateIdeaDTO);
} catch (DuplicateKeyException e) { } catch (DuplicateKeyException e) {
throw new RuntimeException("方法编号或方法名称不可重复"); throw new DuplicateKeyException("方法编号或方法名称不可重复");
} }
return JsonViewObject.newInstance().success(); return JsonViewObject.newInstance().success();
} }
......
...@@ -46,9 +46,9 @@ public class SceneController { ...@@ -46,9 +46,9 @@ public class SceneController {
try { try {
sceneService.addOrUpdateScene(addOrUpdateSceneDTO); sceneService.addOrUpdateScene(addOrUpdateSceneDTO);
} catch (DuplicateKeyException e) { } catch (DuplicateKeyException e) {
throw new RuntimeException("场景编号或场景名称不可重复"); throw new DuplicateKeyException("场景编号或场景名称不可重复");
} catch (UniqueException e) { } catch (UniqueException e) {
throw new RuntimeException("应用策略或优化方法不可重复"); throw new UniqueException("应用策略或优化方法不可重复");
} }
return JsonViewObject.newInstance().success(); return JsonViewObject.newInstance().success();
} }
......
...@@ -47,7 +47,7 @@ public class StrategyController { ...@@ -47,7 +47,7 @@ public class StrategyController {
try { try {
strategyService.addOrUpdateStrategy(addOrUpdateStrategyDTO); strategyService.addOrUpdateStrategy(addOrUpdateStrategyDTO);
} catch (DuplicateKeyException e) { } catch (DuplicateKeyException e) {
throw new RuntimeException("策略编号或策略名称不可重复"); throw new DuplicateKeyException("策略编号或策略名称不可重复");
} }
return JsonViewObject.newInstance().success(); return JsonViewObject.newInstance().success();
} }
......
...@@ -24,4 +24,8 @@ public interface CrossInfoMapper { ...@@ -24,4 +24,8 @@ public interface CrossInfoMapper {
List<CrossInfoPO> selectByCrossIds(List<String> crossIdList); List<CrossInfoPO> selectByCrossIds(List<String> crossIdList);
CrossInfoPO selectById(String crossId); CrossInfoPO selectById(String crossId);
List<CrossInfoPO> selectByName(String name);
List<CrossInfoPO> selectAll();
} }
...@@ -19,4 +19,6 @@ public interface SceneMapper { ...@@ -19,4 +19,6 @@ public interface SceneMapper {
void updateOne(ScenePO scenePO); void updateOne(ScenePO scenePO);
List<ScenePO> selectByNameAndTarget(String sceneName, Integer sceneTarget); List<ScenePO> selectByNameAndTarget(String sceneName, Integer sceneTarget);
ScenePO selectBySceneNum(Integer status);
} }
...@@ -16,5 +16,5 @@ import java.util.List; ...@@ -16,5 +16,5 @@ import java.util.List;
public interface CrossDataRealtimeMapper { public interface CrossDataRealtimeMapper {
List<AbnormalCrossListVO> selectAbnormalCross(Integer status, String name, Integer type); List<AbnormalCrossListVO> selectAbnormalCross(Integer status, String name, Integer type);
CrossDataRealtimePO selectById(String crossId); CrossDataRealtimePO selectByCrossId(String crossId);
} }
package net.wanji.opt.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.Pattern;
/**
* @author Kent HAN
* @date 2023/3/2 10:02
*/
@Data
public class DiagnoCrossListDTO {
@ApiModelProperty(name = "名称",notes = "")
@Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{0,20}$", message = "路口名称只能包含中文、英文、数字、下划线和中横线,0~20个字符")
private String name;
@ApiModelProperty(name = "应用对象 1路口;2干线;3区域",notes = "")
private Integer target;
}
...@@ -21,6 +21,8 @@ public class AddOrUpdateSceneDTO { ...@@ -21,6 +21,8 @@ public class AddOrUpdateSceneDTO {
@ApiModelProperty(value = "编号",required = true, notes = "") @ApiModelProperty(value = "编号",required = true, notes = "")
@Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{0,16}$", message = "编号只能包含中文、英文、数字、下划线和中横线,0~16个字符") @Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{0,16}$", message = "编号只能包含中文、英文、数字、下划线和中横线,0~16个字符")
private String sceneCode; private String sceneCode;
@ApiModelProperty(value = "场景代码 0正常 1失衡 2拥堵 3溢出",required = false, notes = "")
private Integer sceneNum;
@ApiModelProperty(value = "场景名称",required = true, notes = "") @ApiModelProperty(value = "场景名称",required = true, notes = "")
@Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{0,50}$", message = "场景名称只能包含中文、英文、数字、下划线和中横线,0~50个字符") @Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{0,50}$", message = "场景名称只能包含中文、英文、数字、下划线和中横线,0~50个字符")
private String sceneName; private String sceneName;
......
...@@ -15,6 +15,8 @@ public class ScenePO { ...@@ -15,6 +15,8 @@ public class ScenePO {
private Integer id ; private Integer id ;
@ApiModelProperty(value = "编号",notes = "") @ApiModelProperty(value = "编号",notes = "")
private String sceneCode ; private String sceneCode ;
@ApiModelProperty(value = "场景代码 0正常 1失衡 2拥堵 3溢出",notes = "")
private Integer sceneNum ;
@ApiModelProperty(value = "场景名称",notes = "") @ApiModelProperty(value = "场景名称",notes = "")
private String sceneName ; private String sceneName ;
/** 应用对象 1路口;2干线;3区域 */ /** 应用对象 1路口;2干线;3区域 */
......
package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dto.DiagnoCrossListDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.DiagnoCrossVO;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/3/2 10:09
*/
public interface DiagnoService {
List<DiagnoCrossVO> diagnoCrossList(DiagnoCrossListDTO diagnoCrossListDTO);
AddOrUpdateSceneDTO queryCrossScene(CrossIdDTO crossIdDTO);
List<CrossIdAndLocationVO> queryNeighborCross(CrossIdDTO crossIdDTO);
}
package net.wanji.opt.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
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.opt.dao.mapper.CrossDirInfoMapper;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.strategy.SceneMapper;
import net.wanji.opt.dao.mapper.strategy.SceneStrategyMapper;
import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper;
import net.wanji.opt.dto.DiagnoCrossListDTO;
import net.wanji.opt.dto.strategy.AddOrUpdateSceneDTO;
import net.wanji.opt.dto.strategy.QuerySceneDTO;
import net.wanji.opt.po.base.CrossInfoPO;
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.strategy.SceneService;
import net.wanji.opt.vo.CrossIdAndLocationVO;
import net.wanji.opt.vo.DiagnoCrossVO;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author Kent HAN
* @date 2023/3/2 10:09
*/
@Service
@Slf4j
public class DiagnoServiceImpl implements DiagnoService {
private final CrossInfoMapper crossInfoMapper;
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private final SceneService sceneService;
private final SceneMapper sceneMapper;
private final CrossDirInfoMapper crossDirInfoMapper;
private final RidInfoMapper ridInfoMapper;
public DiagnoServiceImpl(CrossInfoMapper crossInfoMapper, CrossDataRealtimeMapper crossDataRealtimeMapper,
SceneService sceneService, SceneStrategyMapper sceneStrategyMapper, SceneMapper sceneMapper, CrossDirInfoMapper crossDirInfoMapper, RidInfoMapper ridInfoMapper) {
this.crossInfoMapper = crossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.sceneService = sceneService;
this.sceneMapper = sceneMapper;
this.crossDirInfoMapper = crossDirInfoMapper;
this.ridInfoMapper = ridInfoMapper;
}
@Override
public List<DiagnoCrossVO> diagnoCrossList(DiagnoCrossListDTO diagnoCrossListDTO) {
String name = diagnoCrossListDTO.getName();
Integer target = diagnoCrossListDTO.getTarget();
if (target == 1) { // 路口
return queryCross(name);
}
return null;
}
@Override
public AddOrUpdateSceneDTO queryCrossScene(CrossIdDTO crossIdDTO) {
// 查询路口场景代码
String crossId = crossIdDTO.getCrossId();
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
Integer status = crossDataRealtimePO.getStatus();
// 获取场景名称
ScenePO scenePO = sceneMapper.selectBySceneNum(status);
String sceneName = scenePO.getSceneName();
// 构造请求体
QuerySceneDTO querySceneDTO = new QuerySceneDTO();
querySceneDTO.setSceneName(sceneName);
querySceneDTO.setSceneTarget(1);
querySceneDTO.setPageNum(1);
querySceneDTO.setPageSize(999);
PageInfo<AddOrUpdateSceneDTO> pageInfo = sceneService.queryScene(querySceneDTO);
List<AddOrUpdateSceneDTO> list = pageInfo.getList();
AddOrUpdateSceneDTO addOrUpdateSceneDTO = list.get(0);
return addOrUpdateSceneDTO;
}
@Override
public List<CrossIdAndLocationVO> queryNeighborCross(CrossIdDTO crossIdDTO) {
List<CrossIdAndLocationVO> crossIdAndLocationVOList = new ArrayList<>();
String crossId = crossIdDTO.getCrossId();
List<Integer> inDirs = crossDirInfoMapper.selectInDirsByCrossId(crossId);
for (Integer inDir : inDirs) {
CrossIdAndLocationVO crossIdAndLocationVO = new CrossIdAndLocationVO();
RidInfoEntity ridInfo = ridInfoMapper.selectByEndInDir(crossId, inDir);
if (ridInfo != null) {
// 关联路口坐标
String startCrossId = ridInfo.getStartCrossId();
crossIdAndLocationVO.setCrossId(startCrossId);
CrossInfoPO crossInfoPO = crossInfoMapper.selectById(startCrossId);
if (crossInfoPO != null) {
String startLocationStr = crossInfoPO.getLocation();
double[] startLonLat = CrossUtil.getLonLat(startLocationStr);
List<Double> startLocation = new ArrayList<>();
startLocation.add(startLonLat[0]);
startLocation.add(startLonLat[1]);
crossIdAndLocationVO.setLocation(startLocation);
}
}
crossIdAndLocationVOList.add(crossIdAndLocationVO);
}
return crossIdAndLocationVOList;
}
private List<DiagnoCrossVO> queryCross(String name) {
List<DiagnoCrossVO> diagnoCrossVOList = new ArrayList<>();
if (ObjectUtil.isNotEmpty(name)) {
// 根据name做模糊查询
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.selectByName(name);
diagnoCrossVOList = getDiagnoCrossVOList(crossInfoPOList);
} else {
// 返回全量数据
List<CrossInfoPO> crossInfoPOList = crossInfoMapper.selectAll();
diagnoCrossVOList = getDiagnoCrossVOList(crossInfoPOList);
}
return diagnoCrossVOList;
}
private List<DiagnoCrossVO> getDiagnoCrossVOList(List<CrossInfoPO> crossInfoPOList) {
List<DiagnoCrossVO> diagnoCrossVOList = new ArrayList<>();
for (CrossInfoPO crossInfoPO : crossInfoPOList) {
DiagnoCrossVO diagnoCrossVO = new DiagnoCrossVO();
diagnoCrossVO.setCrossName(crossInfoPO.getName());
String crossId = crossInfoPO.getId();
diagnoCrossVO.setCrossId(crossId);
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
Integer status = crossDataRealtimePO.getStatus();
diagnoCrossVO.setScene(status);
// 选择优先级最高的策略
QuerySceneDTO querySceneDTO = new QuerySceneDTO();
querySceneDTO.setSceneTarget(1);
querySceneDTO.setPageNum(1);
querySceneDTO.setPageSize(999);
PageInfo<AddOrUpdateSceneDTO> sceneList = sceneService.queryScene(querySceneDTO);
List<AddOrUpdateSceneDTO> list = sceneList.getList();
for (AddOrUpdateSceneDTO addOrUpdateSceneDTO : list) {
Integer sceneNum = addOrUpdateSceneDTO.getSceneNum();
if (Objects.equals(sceneNum, status)) {
List<AddOrUpdateSceneDTO.StrategyListElement> strategyList =
addOrUpdateSceneDTO.getStrategyList();
AddOrUpdateSceneDTO.StrategyListElement strategyListElement = strategyList.get(0);
diagnoCrossVO.setStrategy(strategyListElement.getStrategyName());
// 选择优先级最高的方法
List<AddOrUpdateSceneDTO.IdeaListElement> ideaList = strategyListElement.getIdeaList();
AddOrUpdateSceneDTO.IdeaListElement ideaListElement = ideaList.get(0);
diagnoCrossVO.setIdea(ideaListElement.getIdeaName());
}
}
diagnoCrossVOList.add(diagnoCrossVO);
}
return diagnoCrossVOList;
}
}
...@@ -196,11 +196,12 @@ public class TrendServiceImpl implements TrendService { ...@@ -196,11 +196,12 @@ public class TrendServiceImpl implements TrendService {
AbnormalCrossDetailVO abnormalCrossDetailVO = new AbnormalCrossDetailVO(); AbnormalCrossDetailVO abnormalCrossDetailVO = new AbnormalCrossDetailVO();
// 构造路口实时数据 // 构造路口实时数据
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectById(crossId); CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId(crossId);
abnormalCrossDetailVO.setCrossStatus(crossDataRealtimePO.getStatus()); abnormalCrossDetailVO.setCrossStatus(crossDataRealtimePO.getStatus());
abnormalCrossDetailVO.setCrossQueueLength(crossDataRealtimePO.getQueueLength()); abnormalCrossDetailVO.setCrossQueueLength(crossDataRealtimePO.getQueueLength());
abnormalCrossDetailVO.setCrossFlowRate(crossDataRealtimePO.getFlowRate()); abnormalCrossDetailVO.setCrossFlowRate(crossDataRealtimePO.getFlowRate());
abnormalCrossDetailVO.setCrossStopTimes(crossDataRealtimePO.getStopTimes()); abnormalCrossDetailVO.setCrossStopTimes(crossDataRealtimePO.getStopTimes());
abnormalCrossDetailVO.setCongestionIndex(crossDataRealtimePO.getCongestionIndex());
// 构造转向实时数据 // 构造转向实时数据
List<AbnormalCrossDetailVO.TurnDataElement> turnData = buildTurnData(crossId); List<AbnormalCrossDetailVO.TurnDataElement> turnData = buildTurnData(crossId);
abnormalCrossDetailVO.setTurnData(turnData); abnormalCrossDetailVO.setTurnData(turnData);
......
...@@ -130,6 +130,15 @@ public class SceneServiceImpl implements SceneService { ...@@ -130,6 +130,15 @@ public class SceneServiceImpl implements SceneService {
scenePO.setSceneCode(sceneCode); scenePO.setSceneCode(sceneCode);
String sceneName = addOrUpdateSceneDTO.getSceneName(); String sceneName = addOrUpdateSceneDTO.getSceneName();
scenePO.setSceneName(sceneName); scenePO.setSceneName(sceneName);
if (sceneName.startsWith("失衡")) {
scenePO.setSceneNum(1);
} else if (sceneName.startsWith("拥堵")) {
scenePO.setSceneNum(2);
} else if (sceneName.startsWith("溢出")) {
scenePO.setSceneNum(3);
} else {
scenePO.setSceneNum(0);
}
Integer secneTarget = addOrUpdateSceneDTO.getSecneTarget(); Integer secneTarget = addOrUpdateSceneDTO.getSecneTarget();
scenePO.setSceneTarget(secneTarget); scenePO.setSceneTarget(secneTarget);
} }
...@@ -159,6 +168,8 @@ public class SceneServiceImpl implements SceneService { ...@@ -159,6 +168,8 @@ public class SceneServiceImpl implements SceneService {
addOrUpdateSceneDTO.setId(id); addOrUpdateSceneDTO.setId(id);
String sceneCode = scenePO.getSceneCode(); String sceneCode = scenePO.getSceneCode();
addOrUpdateSceneDTO.setSceneCode(sceneCode); addOrUpdateSceneDTO.setSceneCode(sceneCode);
Integer sceneNum = scenePO.getSceneNum();
addOrUpdateSceneDTO.setSceneNum(sceneNum);
String sceneNameFromDb = scenePO.getSceneName(); String sceneNameFromDb = scenePO.getSceneName();
addOrUpdateSceneDTO.setSceneName(sceneNameFromDb); addOrUpdateSceneDTO.setSceneName(sceneNameFromDb);
Integer sceneTargetFromDb = scenePO.getSceneTarget(); Integer sceneTargetFromDb = scenePO.getSceneTarget();
......
...@@ -102,8 +102,8 @@ public class CrossMonitorTask { ...@@ -102,8 +102,8 @@ public class CrossMonitorTask {
// todo test数据 // todo test数据
List<CrossDataRealtimePO> crossDataRealtimePOList = new ArrayList<>(1); List<CrossDataRealtimePO> crossDataRealtimePOList = new ArrayList<>(1);
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectById("14Q1409IRF0"); CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectByCrossId("14Q1409IRF0");
CrossDataRealtimePO crossDataRealtimePO1 = crossDataRealtimeMapper.selectById("14Q0S09IQB0"); CrossDataRealtimePO crossDataRealtimePO1 = crossDataRealtimeMapper.selectByCrossId("14Q0S09IQB0");
crossDataRealtimePOList.add(crossDataRealtimePO); crossDataRealtimePOList.add(crossDataRealtimePO);
crossDataRealtimePOList.add(crossDataRealtimePO1); crossDataRealtimePOList.add(crossDataRealtimePO1);
......
...@@ -25,6 +25,8 @@ public class AbnormalCrossDetailVO { ...@@ -25,6 +25,8 @@ public class AbnormalCrossDetailVO {
private Double crossFlowRate; private Double crossFlowRate;
@ApiModelProperty(value = "平均停车次数") @ApiModelProperty(value = "平均停车次数")
private Double crossStopTimes; private Double crossStopTimes;
@ApiModelProperty(value = "拥堵指数")
private Double congestionIndex;
@ApiModelProperty(value = "转向实时数据") @ApiModelProperty(value = "转向实时数据")
private List<TurnDataElement> turnData; private List<TurnDataElement> turnData;
@ApiModelProperty(value = "方向实时数据") @ApiModelProperty(value = "方向实时数据")
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/3/2 11:33
*/
@Data
@NoArgsConstructor
@ApiModel(value = "CrossIdAndLocationVO")
public class CrossIdAndLocationVO {
@ApiModelProperty(value = "路口ID")
String crossId;
@ApiModelProperty(value = "路口坐标")
List<Double> location;
}
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "DiagnoCrossVO", description = "诊断优化路口列表元素")
public class DiagnoCrossVO {
@ApiModelProperty(name = "路口ID",notes = "")
private String crossId;
@ApiModelProperty(value = "路口名称")
String crossName;
@ApiModelProperty(value = "当前场景 0正常 1失衡 2拥堵 3溢出")
Integer scene;
@ApiModelProperty(value = "优化策略")
String strategy;
@ApiModelProperty(value = "优化方法")
String idea;
}
...@@ -58,4 +58,23 @@ ...@@ -58,4 +58,23 @@
where id = #{crossId} where id = #{crossId}
</select> </select>
<select id="selectByName" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
<where>
<if test="name != null and name != ''">
AND name LIKE CONCAT('%',#{name},'%')
</if>
</where>
order by id
</select>
<select id="selectAll" resultType="net.wanji.opt.po.base.CrossInfoPO">
select
id,name,type,level,area_code,is_signal,is_start,is_send,location
from t_base_cross_info
order by id
</select>
</mapper> </mapper>
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
AND idea_target = #{ideaTarget} AND idea_target = #{ideaTarget}
</if> </if>
</where> </where>
order by id
</select> </select>
<select id="selectById" resultType="net.wanji.opt.po.strategy.IdeaPO"> <select id="selectById" resultType="net.wanji.opt.po.strategy.IdeaPO">
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
<mapper namespace="net.wanji.opt.dao.mapper.strategy.SceneMapper"> <mapper namespace="net.wanji.opt.dao.mapper.strategy.SceneMapper">
<insert id="insertOne" keyProperty="id" useGeneratedKeys="true"> <insert id="insertOne" keyProperty="id" useGeneratedKeys="true">
insert into t_strategy_scene(scene_code,scene_name,scene_target) insert into t_strategy_scene(scene_code,scene_num,scene_name,scene_target)
values (#{sceneCode},#{sceneName},#{sceneTarget}) values (#{sceneCode},#{sceneNum},#{sceneName},#{sceneTarget})
</insert> </insert>
<update id="updateOne"> <update id="updateOne">
...@@ -13,10 +13,13 @@ ...@@ -13,10 +13,13 @@
<if test="sceneCode != null and sceneCode != ''"> <if test="sceneCode != null and sceneCode != ''">
scene_code = #{sceneCode}, scene_code = #{sceneCode},
</if> </if>
<if test="sceneNum != null">
scene_num = #{sceneNum},
</if>
<if test="sceneName != null and sceneName != ''"> <if test="sceneName != null and sceneName != ''">
scene_name = #{sceneName}, scene_name = #{sceneName},
</if> </if>
<if test="sceneTarget != null and sceneTarget != ''"> <if test="sceneTarget != null">
scene_target = #{sceneTarget}, scene_target = #{sceneTarget},
</if> </if>
</set> </set>
...@@ -33,7 +36,7 @@ ...@@ -33,7 +36,7 @@
<select id="selectByNameAndTarget" resultType="net.wanji.opt.po.strategy.ScenePO"> <select id="selectByNameAndTarget" resultType="net.wanji.opt.po.strategy.ScenePO">
select select
id,scene_code,scene_name,scene_target,gmt_create,gmt_modified id,scene_code,scene_num,scene_name,scene_target,gmt_create,gmt_modified
from t_strategy_scene from t_strategy_scene
<where> <where>
<if test="sceneName != null and sceneName != ''"> <if test="sceneName != null and sceneName != ''">
...@@ -43,6 +46,14 @@ ...@@ -43,6 +46,14 @@
AND scene_target = #{sceneTarget} AND scene_target = #{sceneTarget}
</if> </if>
</where> </where>
order by id
</select>
<select id="selectBySceneNum" resultType="net.wanji.opt.po.strategy.ScenePO">
select
id,scene_code,scene_num,scene_name,scene_target,gmt_create,gmt_modified
from t_strategy_scene
where scene_num = ${status}
</select> </select>
</mapper> </mapper>
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
AND strategyTarget = #{strategyTarget} AND strategyTarget = #{strategyTarget}
</if> </if>
</where> </where>
order by id
</select> </select>
<select id="selectById" resultType="net.wanji.opt.po.strategy.StrategyPO"> <select id="selectById" resultType="net.wanji.opt.po.strategy.StrategyPO">
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
</where> </where>
</select> </select>
<select id="selectById" resultType="net.wanji.opt.po.trend.CrossDataRealtimePO"> <select id="selectByCrossId" resultType="net.wanji.opt.po.trend.CrossDataRealtimePO">
select select
cross_id,status,type,traffic_index,start_time,duration,is_unbalance,is_spillover,is_congestion,unbalance_index,spillover_index,congestion_index,unbalance_dirs,spillover_dirs,congestion_dirs,flow,flow_rate,speed,queue_length,stop_times,delay_time,sturation,batch_time,gmt_create,gmt_modified cross_id,status,type,traffic_index,start_time,duration,is_unbalance,is_spillover,is_congestion,unbalance_index,spillover_index,congestion_index,unbalance_dirs,spillover_dirs,congestion_dirs,flow,flow_rate,speed,queue_length,stop_times,delay_time,sturation,batch_time,gmt_create,gmt_modified
from t_cross_data_realtime from t_cross_data_realtime
......
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