Commit 6c87b648 authored by hanbing's avatar hanbing

[add] 诊断优化,查询优化效果

parent f4bafc14
...@@ -6,11 +6,13 @@ import io.swagger.annotations.ApiResponse; ...@@ -6,11 +6,13 @@ import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; 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.CrossIdAndDirDTO;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO; import net.wanji.opt.dto.CrossIdAndSchemeIdDTO;
import net.wanji.opt.dto.SendManualDTO; 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;
import net.wanji.opt.vo.OptEffectVO;
import net.wanji.opt.vo.SchemeOptVO; import net.wanji.opt.vo.SchemeOptVO;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -108,4 +110,16 @@ public class DiagnoController { ...@@ -108,4 +110,16 @@ public class DiagnoController {
diagnoService.restoreSend(crossIdDTO); diagnoService.restoreSend(crossIdDTO);
return JsonViewObject.newInstance().success(); return JsonViewObject.newInstance().success();
} }
@ApiOperation(value = "优化效果", notes = "优化效果", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/optEffect",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = OptEffectVO.class),
})
public JsonViewObject optEffect(@RequestBody CrossIdAndDirDTO crossIdAndDirDTO) {
OptEffectVO optEffectVO = diagnoService.optEffect(crossIdAndDirDTO);
return JsonViewObject.newInstance().success(optEffectVO);
}
} }
\ No newline at end of file
package net.wanji.opt.dao.mapper;
import net.wanji.opt.po.CrossDataHistPO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author hanbing
* @date 2023/1/12 13:24
* @desc CrossInfoMapper
*/
@Repository
public interface CrossDataHistMapper {
List<CrossDataHistPO> selectByCrossIdAndTimestamp(String crossId, long preSeconds);
}
...@@ -18,4 +18,6 @@ public interface CrossSchemeOptLogMapper { ...@@ -18,4 +18,6 @@ public interface CrossSchemeOptLogMapper {
int insertOne(CrossSchemeOptLogPO entity); int insertOne(CrossSchemeOptLogPO entity);
int insertBatch(@Param("list") List<CrossSchemeOptLogPO> list); int insertBatch(@Param("list") List<CrossSchemeOptLogPO> list);
List<CrossSchemeOptLogPO> selectMaxByCrossId(String crossId);
} }
...@@ -15,4 +15,6 @@ import java.util.List; ...@@ -15,4 +15,6 @@ import java.util.List;
public interface CrossDirDataHistMapper { public interface CrossDirDataHistMapper {
List<CrossDirDataHistPO> selectByCrossIdAndTimestamp(String crossId, long preSeconds); List<CrossDirDataHistPO> selectByCrossIdAndTimestamp(String crossId, long preSeconds);
List<CrossDirDataHistPO> selectByCrossIdDirAndTimestamp(String crossId, Integer dir, long preSeconds);
} }
package net.wanji.opt.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
*
* @author Kent HAN
* @date 2022/12/20 10:17
*/
@Data
public class CrossIdAndDirDTO {
@ApiModelProperty(value = "路口ID,如:14Q1409IRF0", required = true)
private String crossId;
@ApiModelProperty(value = "进口方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北", required = false)
private Integer dir;
}
package net.wanji.opt.dto;
import lombok.Data;
/**
*
* @author Kent HAN
* @date 2022/12/20 10:17
*/
@Data
public class OptDataExtend {
private String sceneName;
private String strategyName;
private String ideaName;
}
package net.wanji.opt.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author hanbing
* @date 2023/1/10 16:36
* @desc CrossDataRealtimePO
*/
@Data
public class CrossDataHistPO {
/** 路口编号 */
@ApiModelProperty(name = "路口编号",notes = "")
private String crossId ;
/** 路口状态:0正常;1失衡;2拥堵;3溢出;4死锁 */
@ApiModelProperty(name = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁",notes = "")
private Integer status ;
/** 拥堵类型:1常规;2异常 */
@ApiModelProperty(name = "拥堵类型:1常规;2异常",notes = "")
private Integer type ;
/** 交通指数(1~10) */
@ApiModelProperty(name = "交通指数(1~10)",notes = "")
private Double trafficIndex ;
/** 开始时间:yyyy-MM-dd HH;mm:ss */
@ApiModelProperty(name = "开始时间:yyyy-MM-dd HH",notes = "mm:ss")
private Date startTime ;
/** 持续时间(单位:分钟) */
@ApiModelProperty(name = "持续时间(单位:分钟)",notes = "")
private Integer duration ;
/** 是否失衡:0否;1是 */
@ApiModelProperty(name = "是否失衡:0否;1是",notes = "")
private Integer isUnbalance ;
/** 是否溢出:0否;1是 */
@ApiModelProperty(name = "是否溢出:0否;1是",notes = "")
private Integer isSpillover ;
/** 是否拥堵:0否;1是 */
@ApiModelProperty(name = "是否拥堵:0否;1是",notes = "")
private Integer isCongestion ;
/** 失衡指数 */
@ApiModelProperty(name = "失衡指数",notes = "")
private Double unbalanceIndex ;
/** 溢出指数 */
@ApiModelProperty(name = "溢出指数",notes = "")
private Double spilloverIndex ;
/** 拥堵指数 */
@ApiModelProperty(name = "拥堵指数",notes = "")
private Double congestionIndex ;
/** 路口失衡方向:1,2,3... */
@ApiModelProperty(name = "路口失衡方向:1,2,3...",notes = "")
private String unbalanceDirs ;
/** 路口溢出方向:1,2,3... */
@ApiModelProperty(name = "路口溢出方向:1,2,3...",notes = "")
private String spilloverDirs ;
/** 路口拥堵方向:1,2,3... */
@ApiModelProperty(name = "路口拥堵方向:1,2,3...",notes = "")
private String congestionDirs ;
/** 交通流量(辆) */
@ApiModelProperty(name = "交通流量(辆)",notes = "")
private Integer flow ;
/** 交通流率/h */
@ApiModelProperty(name = "交通流率/h",notes = "")
private Double flowRate ;
/** 平均速度(km/h) */
@ApiModelProperty(name = "平均速度(km/h)",notes = "")
private Double speed ;
/** 最大排队(米) */
@ApiModelProperty(name = "最大排队(米)",notes = "")
private Double queueLength ;
/** 停车次数(次) */
@ApiModelProperty(name = "停车次数(次)",notes = "")
private Double stopTimes ;
/** 延误时间(秒) */
@ApiModelProperty(name = "延误时间(秒)",notes = "")
private Integer delayTime ;
/** 饱和度 */
@ApiModelProperty(name = "饱和度",notes = "")
private Double sturation ;
/** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ;
/** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "")
private Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "")
private Date gmtModified ;
}
...@@ -53,7 +53,7 @@ public class CrossDirDataHistPO { ...@@ -53,7 +53,7 @@ public class CrossDirDataHistPO {
private Double sturation ; private Double sturation ;
/** 采集时间(10位时间戳) */ /** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "") @ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
private Long batchTime ; private Integer batchTime ;
/** 创建时间 */ /** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "") @ApiModelProperty(name = "创建时间",notes = "")
private Date gmtCreate ; private Date gmtCreate ;
......
package net.wanji.opt.service; package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO; import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dto.CrossIdAndDirDTO;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO; import net.wanji.opt.dto.CrossIdAndSchemeIdDTO;
import net.wanji.opt.dto.SendManualDTO; 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.OptEffectVO;
import net.wanji.opt.vo.SchemeOptVO; import net.wanji.opt.vo.SchemeOptVO;
import java.util.List; import java.util.List;
...@@ -25,4 +27,6 @@ public interface DiagnoService { ...@@ -25,4 +27,6 @@ public interface DiagnoService {
void sendManual(SendManualDTO sendManualDTO) throws Exception; void sendManual(SendManualDTO sendManualDTO) throws Exception;
void restoreSend(CrossIdDTO crossIdDTO) throws Exception; void restoreSend(CrossIdDTO crossIdDTO) throws Exception;
OptEffectVO optEffect(CrossIdAndDirDTO crossIdAndDirDTO);
} }
package net.wanji.opt.service.impl; package net.wanji.opt.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.wanji.common.dto.CrossIdDTO; 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.feign.pojo.vo.SchemeSendVO;
import net.wanji.opt.dao.mapper.CrossDataHistMapper;
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,32 +19,36 @@ import net.wanji.opt.dao.mapper.CrossSchemeMapper; ...@@ -14,32 +19,36 @@ import net.wanji.opt.dao.mapper.CrossSchemeMapper;
import net.wanji.opt.dao.mapper.CrossSchemeOptLogMapper; 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.dao.mapper.trend.CrossDirDataHistMapper;
import net.wanji.opt.dto.CrossIdAndDirDTO;
import net.wanji.opt.dto.CrossIdAndSchemeIdDTO; import net.wanji.opt.dto.CrossIdAndSchemeIdDTO;
import net.wanji.opt.dto.OptDataExtend;
import net.wanji.opt.dto.SendManualDTO; 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.CrossDataHistPO;
import net.wanji.opt.po.base.CrossInfoPO; import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.po.base.CrossPhasePO; import net.wanji.opt.po.base.CrossPhasePO;
import net.wanji.opt.po.base.CrossSchemeOptLogPO; 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.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.po.trend.CrossDirDataHistPO;
import net.wanji.opt.service.DiagnoService; import net.wanji.opt.service.DiagnoService;
import net.wanji.opt.service.signalcontrol.FeignProxyService; 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.OptEffectVO;
import net.wanji.opt.vo.SchemeOptSendVO; 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.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -60,12 +69,16 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -60,12 +69,16 @@ public class DiagnoServiceImpl implements DiagnoService {
private final CrossSchemeMapper crossSchemeMapper; private final CrossSchemeMapper crossSchemeMapper;
private final CrossPhaseMapper crossPhaseMapper; private final CrossPhaseMapper crossPhaseMapper;
private final FeignProxyService feignProxyService; private final FeignProxyService feignProxyService;
private final CrossDataHistMapper crossDataHistMapper;
private final CrossDirDataHistMapper crossDirDataHistMapper;
private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
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) { FeignProxyService feignProxyService, CrossDataHistMapper crossDataHistMapper, CrossDirDataHistMapper crossDirDataHistMapper) {
this.crossInfoMapper = crossInfoMapper; this.crossInfoMapper = crossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper; this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.sceneService = sceneService; this.sceneService = sceneService;
...@@ -76,6 +89,8 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -76,6 +89,8 @@ public class DiagnoServiceImpl implements DiagnoService {
this.crossSchemeMapper = crossSchemeMapper; this.crossSchemeMapper = crossSchemeMapper;
this.crossPhaseMapper = crossPhaseMapper; this.crossPhaseMapper = crossPhaseMapper;
this.feignProxyService = feignProxyService; this.feignProxyService = feignProxyService;
this.crossDataHistMapper = crossDataHistMapper;
this.crossDirDataHistMapper = crossDirDataHistMapper;
} }
@Override @Override
...@@ -132,11 +147,8 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -132,11 +147,8 @@ public class DiagnoServiceImpl implements DiagnoService {
String crossId = crossIdDTO.getCrossId(); String crossId = crossIdDTO.getCrossId();
SchemeOptVO schemeOptVO = new SchemeOptVO(); SchemeOptVO schemeOptVO = new SchemeOptVO();
schemeOptVO.setCrossId(crossId); schemeOptVO.setCrossId(crossId);
List<CrossSchemeOptLogPO> crossSchemeOptLogPOList = crossSchemeOptLogMapper.selectByCrossId(crossId);
// 选择数据批次时间最大的记录 // 选择数据批次时间最大的记录
Optional<CrossSchemeOptLogPO> max = crossSchemeOptLogPOList.stream() List<CrossSchemeOptLogPO> maxList = crossSchemeOptLogMapper.selectMaxByCrossId(crossId);
.max(Comparator.comparing(CrossSchemeOptLogPO::getDataBatchTime));
List<CrossSchemeOptLogPO> maxList = getMaxList(crossSchemeOptLogPOList, max);
CrossSchemeOptLogPO crossSchemeOptLogPO = maxList.get(0); CrossSchemeOptLogPO crossSchemeOptLogPO = maxList.get(0);
String optType = crossSchemeOptLogPO.getOptType(); String optType = crossSchemeOptLogPO.getOptType();
schemeOptVO.setOptType(Integer.parseInt(optType)); schemeOptVO.setOptType(Integer.parseInt(optType));
...@@ -156,11 +168,8 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -156,11 +168,8 @@ public class DiagnoServiceImpl implements DiagnoService {
String crossId = crossIdAndSchemeIdDTO.getCrossId(); String crossId = crossIdAndSchemeIdDTO.getCrossId();
Integer schemeId = crossIdAndSchemeIdDTO.getSchemeId(); Integer schemeId = crossIdAndSchemeIdDTO.getSchemeId();
List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = new ArrayList<>(); List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = new ArrayList<>();
List<CrossSchemeOptLogPO> crossSchemeOptLogPOList = crossSchemeOptLogMapper.selectByCrossId(crossId);
// 选择数据批次时间最大的记录 // 选择数据批次时间最大的记录
Optional<CrossSchemeOptLogPO> max = crossSchemeOptLogPOList.stream() List<CrossSchemeOptLogPO> maxList = crossSchemeOptLogMapper.selectMaxByCrossId(crossId);
.max(Comparator.comparing(CrossSchemeOptLogPO::getDataBatchTime));
List<CrossSchemeOptLogPO> maxList = getMaxList(crossSchemeOptLogPOList, max);
for (CrossSchemeOptLogPO crossSchemeOptLogPO : maxList) { for (CrossSchemeOptLogPO crossSchemeOptLogPO : maxList) {
SchemeOptVO.PhaseOptTime phaseOptTime = new SchemeOptVO.PhaseOptTime(); SchemeOptVO.PhaseOptTime phaseOptTime = new SchemeOptVO.PhaseOptTime();
String phaseNo = crossSchemeOptLogPO.getPhaseNo(); String phaseNo = crossSchemeOptLogPO.getPhaseNo();
...@@ -284,6 +293,114 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -284,6 +293,114 @@ public class DiagnoServiceImpl implements DiagnoService {
feignProxyService.schemeOptRestore(crossId); feignProxyService.schemeOptRestore(crossId);
} }
@Override
public OptEffectVO optEffect(CrossIdAndDirDTO crossIdAndDirDTO) {
String crossId = crossIdAndDirDTO.getCrossId();
OptEffectVO optEffectVO = new OptEffectVO();
CrossInfoPO crossInfoPO = crossInfoMapper.selectById(crossId);
optEffectVO.setCrossName(crossInfoPO.getName());
List<CrossSchemeOptLogPO> maxList = crossSchemeOptLogMapper.selectMaxByCrossId(crossId);
CrossSchemeOptLogPO crossSchemeOptLogPO = maxList.get(0);
String dataExtend = crossSchemeOptLogPO.getDataExtend();
OptDataExtend optDataExtend = gson.fromJson(dataExtend, OptDataExtend.class);
optEffectVO.setSceneName(optDataExtend.getSceneName());
optEffectVO.setStrategyName(optDataExtend.getStrategyName());
optEffectVO.setIdeaName(optDataExtend.getIdeaName());
optEffectVO.setOptStartTime(crossSchemeOptLogPO.getStartTime());
Date endTime = crossSchemeOptLogPO.getEndTime();
if (ObjectUtil.isEmpty(endTime)) {
optEffectVO.setStatus(2);
} else {
optEffectVO.setStatus(1);
}
Integer dir = crossIdAndDirDTO.getDir();
// 获取当前时间之前45分钟的10位时间戳
long currentSeconds = DateUtil.currentSeconds();
// todo 测试用 固定当前时间为1676082600
currentSeconds = 1676082600;
long preSeconds = currentSeconds - 45 * 60;
if (ObjectUtil.isEmpty(dir) || dir == 0) {
// 获取路口历史数据
List<CrossDataHistPO> crossDataHistPOList =
crossDataHistMapper.selectByCrossIdAndTimestamp(crossId, preSeconds);
List<OptEffectVO.IndexDelay> indexDelayList = buildIndexDelayList(crossDataHistPOList);
optEffectVO.setIndexDelayList(indexDelayList);
List<OptEffectVO.QueueStop> queueStopList = buildQueueStopList(crossDataHistPOList);
optEffectVO.setQueueStopList(queueStopList);
} else {
// 获取路口方向历史数据
List<CrossDirDataHistPO> crossDirDataHistPOList =
crossDirDataHistMapper.selectByCrossIdDirAndTimestamp(crossId, dir, preSeconds);
List<OptEffectVO.IndexDelay> indexDelayList = buildIndexDelayListDir(crossDirDataHistPOList);
optEffectVO.setIndexDelayList(indexDelayList);
List<OptEffectVO.QueueStop> queueStopList = buildQueueStopListDir(crossDirDataHistPOList);
optEffectVO.setQueueStopList(queueStopList);
}
return optEffectVO;
}
private List<OptEffectVO.QueueStop> buildQueueStopListDir(List<CrossDirDataHistPO> crossDirDataHistPOList) {
List<OptEffectVO.QueueStop> queueStopList = new ArrayList<>();
for (CrossDirDataHistPO crossDirDataHistPO : crossDirDataHistPOList) {
OptEffectVO.QueueStop queueStop = new OptEffectVO.QueueStop();
// 获取采集时间
Integer batchTime = crossDirDataHistPO.getBatchTime();
Date date = DateUtil.date(batchTime * 1000);
queueStop.setTime(date);
queueStop.setQueue(crossDirDataHistPO.getQueueLength());
queueStop.setStop(crossDirDataHistPO.getStopTimes());
queueStopList.add(queueStop);
}
return queueStopList;
}
private List<OptEffectVO.IndexDelay> buildIndexDelayListDir(List<CrossDirDataHistPO> crossDirDataHistPOList) {
List<OptEffectVO.IndexDelay> indexDelayList = new ArrayList<>();
for (CrossDirDataHistPO crossDirDataHistPO : crossDirDataHistPOList) {
OptEffectVO.IndexDelay indexDelay = new OptEffectVO.IndexDelay();
// 获取采集时间
Integer batchTime = crossDirDataHistPO.getBatchTime();
Date date = DateUtil.date(batchTime * 1000);
indexDelay.setTime(date);
indexDelay.setIndex(crossDirDataHistPO.getTrafficIndex());
indexDelay.setDelay(crossDirDataHistPO.getDelayTime());
indexDelayList.add(indexDelay);
}
return indexDelayList;
}
private List<OptEffectVO.QueueStop> buildQueueStopList(List<CrossDataHistPO> crossDataHistPOList) {
List<OptEffectVO.QueueStop> queueStopList = new ArrayList<>();
for (CrossDataHistPO crossDataHistPO : crossDataHistPOList) {
OptEffectVO.QueueStop queueStop = new OptEffectVO.QueueStop();
// 获取采集时间
Integer batchTime = crossDataHistPO.getBatchTime();
Date date = DateUtil.date(batchTime * 1000);
queueStop.setTime(date);
queueStop.setQueue(crossDataHistPO.getQueueLength());
queueStop.setStop(crossDataHistPO.getStopTimes());
queueStopList.add(queueStop);
}
return queueStopList;
}
private List<OptEffectVO.IndexDelay> buildIndexDelayList(List<CrossDataHistPO> crossDataHistPOList) {
List<OptEffectVO.IndexDelay> indexDelayList = new ArrayList<>();
for (CrossDataHistPO crossDataHistPO : crossDataHistPOList) {
OptEffectVO.IndexDelay indexDelay = new OptEffectVO.IndexDelay();
// 获取采集时间
Integer batchTime = crossDataHistPO.getBatchTime();
Date date = DateUtil.date(batchTime * 1000);
indexDelay.setTime(date);
indexDelay.setIndex(crossDataHistPO.getTrafficIndex());
indexDelay.setDelay(crossDataHistPO.getDelayTime());
indexDelayList.add(indexDelay);
}
return indexDelayList;
}
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) {
...@@ -295,19 +412,6 @@ public class DiagnoServiceImpl implements DiagnoService { ...@@ -295,19 +412,6 @@ public class DiagnoServiceImpl implements DiagnoService {
return 0; return 0;
} }
@NotNull
private static List<CrossSchemeOptLogPO> getMaxList(List<CrossSchemeOptLogPO> crossSchemeOptLogPOList,
Optional<CrossSchemeOptLogPO> max) {
int maxBatchTime = max.get().getDataBatchTime();
List<CrossSchemeOptLogPO> maxList = new ArrayList<>();
for (CrossSchemeOptLogPO crossSchemeOptLogPO : crossSchemeOptLogPOList) {
int dataBatchTime = crossSchemeOptLogPO.getDataBatchTime();
if (dataBatchTime == maxBatchTime) {
maxList.add(crossSchemeOptLogPO);
}
}
return maxList;
}
private List<SchemeOptVO.PhaseOptTime> buildPhaseOptTimeList(List<CrossSchemeOptLogPO> crossSchemeOptLogPOList) { private List<SchemeOptVO.PhaseOptTime> buildPhaseOptTimeList(List<CrossSchemeOptLogPO> crossSchemeOptLogPOList) {
List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = new ArrayList<>(); List<SchemeOptVO.PhaseOptTime> phaseOptTimeList = new ArrayList<>();
......
...@@ -276,7 +276,7 @@ public class TrendServiceImpl implements TrendService { ...@@ -276,7 +276,7 @@ public class TrendServiceImpl implements TrendService {
AbnormalCrossDetailVO.DirDataElement dirDataElement = new AbnormalCrossDetailVO.DirDataElement(); AbnormalCrossDetailVO.DirDataElement dirDataElement = new AbnormalCrossDetailVO.DirDataElement();
dirDataElement.setDir(crossDirDataHistPO.getDirType()); dirDataElement.setDir(crossDirDataHistPO.getDirType());
// 获取采集时间 // 获取采集时间
Long batchTime = crossDirDataHistPO.getBatchTime(); Integer batchTime = crossDirDataHistPO.getBatchTime();
Date date = DateUtil.date(batchTime * 1000); Date date = DateUtil.date(batchTime * 1000);
dirDataElement.setTime(date); dirDataElement.setTime(date);
// 转换状态,3、4都算拥堵 // 转换状态,3、4都算拥堵
......
package net.wanji.opt.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "OptEffectVO", description = "查询优化效果返回值")
public class OptEffectVO {
@ApiModelProperty(value = "路口名称")
String crossName;
@ApiModelProperty(value = "场景")
String sceneName;
@ApiModelProperty(value = "应用策略")
String strategyName;
@ApiModelProperty(value = "优化方法")
String ideaName;
@ApiModelProperty(value = "优化开始时间 格式2023-03-02 10:10")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
Date optStartTime;
@ApiModelProperty(value = "状态 1已完成 2优化中")
Integer status;
@ApiModelProperty(value = "拥堵指数延误折线图")
List<IndexDelay> indexDelayList;
@ApiModelProperty(value = "最大排队长度平均停车次数折线图")
List<QueueStop> queueStopList;
@Data
@NoArgsConstructor
@ApiModel(value = "IndexDelay", description = "拥堵指数延误折线图元素")
public static class IndexDelay {
@ApiModelProperty(value = "时间 格式14:00")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "GMT+8")
Date time;
@ApiModelProperty(value = "拥堵指数")
Double index;
@ApiModelProperty(value = "延误")
Integer delay;
}
@Data
@NoArgsConstructor
@ApiModel(value = "QueueStop", description = "最大排队长度平均停车次数折线图元素")
public static class QueueStop {
@ApiModelProperty(value = "时间 格式14:00")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm", timezone = "GMT+8")
Date time;
@ApiModelProperty(value = "最大排队长度")
Double queue;
@ApiModelProperty(value = "平均停车次数")
Double stop;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.wanji.opt.dao.mapper.CrossDataHistMapper">
<select id="selectByCrossIdAndTimestamp" resultType="net.wanji.opt.po.CrossDataHistPO">
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
from t_cross_data_hist
where cross_id = #{crossId}
and batch_time <![CDATA[ >= ]]> #{preSeconds}
order by batch_time
</select>
</mapper>
...@@ -45,6 +45,14 @@ ...@@ -45,6 +45,14 @@
</where> </where>
</select> </select>
<select id="selectMaxByCrossId" resultType="net.wanji.opt.po.base.CrossSchemeOptLogPO">
select
<include refid="Base_Column_List"/>
from t_base_cross_scheme_opt_log
where cross_id = #{crossId}
and data_batch_time=(SELECT MAX(ABS(data_batch_time)) FROM t_base_cross_scheme_opt_log);
</select>
<insert id="insertOne" parameterType="net.wanji.opt.po.base.CrossSchemeOptLogPO"> <insert id="insertOne" parameterType="net.wanji.opt.po.base.CrossSchemeOptLogPO">
insert into t_base_cross_scheme_opt_log (cross_id, scheme_no, dir_type, turn_type, offset, ring_no, phase_no, insert into t_base_cross_scheme_opt_log (cross_id, scheme_no, dir_type, turn_type, offset, ring_no, phase_no,
phase_order_id, ori_green_time, opt_time, opt_type, opt_reason, phase_order_id, ori_green_time, opt_time, opt_type, opt_reason,
......
...@@ -11,4 +11,13 @@ ...@@ -11,4 +11,13 @@
and batch_time <![CDATA[ >= ]]> #{preSeconds} and batch_time <![CDATA[ >= ]]> #{preSeconds}
order by batch_time order by batch_time
</select> </select>
<select id="selectByCrossIdDirAndTimestamp" resultType="net.wanji.opt.po.trend.CrossDirDataHistPO">
select
id,dir_type,in_out_type,cross_id,length,status,traffic_index,flow,speed,queue_length,stop_times,delay_time,sturation,batch_time,gmt_create,gmt_modified
from t_cross_dir_data_hist
where cross_id = #{crossId} and in_out_type = 1 and dir_type = #{dir}
and batch_time <![CDATA[ >= ]]> #{preSeconds}
order by batch_time
</select>
</mapper> </mapper>
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