Commit f99357b9 authored by hanbing's avatar hanbing

信控优化-态势监测,问题路口详情

parent 80012ddb
......@@ -7,7 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdAndPhaseIdsDTO;
import net.wanji.web.dto.CrossIdAndTimeDTO;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO;
import net.wanji.web.dto.ScheduleIdDTO;
import net.wanji.web.dto.SchemeIdDTO;
......
......@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLaneInfoDTO;
import net.wanji.web.service.scheme.impl.CrossConfigServiceImpl;
import org.springframework.web.bind.annotation.PostMapping;
......
......@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLightsInfoDTO;
import net.wanji.web.service.scheme.impl.LightsConfigServiceImpl;
import org.springframework.web.bind.annotation.PostMapping;
......
......@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.RunningPlanDTO;
import net.wanji.web.service.scheme.impl.RunningPlanServiceImpl;
import org.springframework.web.bind.annotation.PostMapping;
......
......@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.LaneIdDTO;
import net.wanji.web.dto.LightIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO;
......
......@@ -16,6 +16,6 @@ public class CrossIdAndTimeDTO {
@ApiModelProperty(value = "路口ID,如:c7e7b1f352dd4acab4a60088eb391cca", required = true)
private String crossId;
@ApiModelProperty(value = "当前日期时间 yyyy-MM-dd HH:mm:ss", required = true)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date datetime;
}
......@@ -2,7 +2,7 @@ package net.wanji.web.service;
import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdAndTimeDTO;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.CrossIdAndPhaseIdsDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO;
import net.wanji.web.dto.ScheduleIdDTO;
......
......@@ -14,7 +14,7 @@ import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.dto.CrossIdAndPhaseIdsDTO;
import net.wanji.web.dto.CrossIdAndTimeDTO;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.RunningPlanDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO;
import net.wanji.web.dto.ScheduleIdDTO;
......
package net.wanji.web.service.scheme;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLaneInfoDTO;
/**
......
package net.wanji.web.service.scheme;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLightsInfoDTO;
/**
......
package net.wanji.web.service.scheme;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.RunningPlanDTO;
import java.text.ParseException;
......
package net.wanji.web.service.scheme;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.LaneIdDTO;
import net.wanji.web.dto.LightIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO;
......
......@@ -3,7 +3,7 @@ package net.wanji.web.service.scheme.impl;
import cn.hutool.core.collection.CollectionUtil;
import net.wanji.web.common.enums.LightsAddressEnum;
import net.wanji.web.common.exception.LightLaneConflictException;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.DirListElement;
import net.wanji.web.dto.LaneListElement;
import net.wanji.web.dto.LedConfigListElement;
......
package net.wanji.web.service.scheme.impl;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLightsInfoDTO;
import net.wanji.web.service.scheme.LightsConfigService;
import org.springframework.stereotype.Service;
......
package net.wanji.web.service.scheme.impl;
import cn.hutool.core.collection.CollectionUtil;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.RunningPlanDTO;
import net.wanji.web.mapper.scheme.CrossPlanMapper;
import net.wanji.web.mapper.scheme.CrossSchedulesMapper;
......
......@@ -3,7 +3,7 @@ package net.wanji.web.service.scheme.impl;
import cn.hutool.core.collection.CollectionUtil;
import net.wanji.web.common.constant.ControlModeConst;
import net.wanji.web.common.exception.PhaseNoNotUniqueException;
import net.wanji.web.dto.CrossIdDTO;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.LaneIdDTO;
import net.wanji.web.dto.LightIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO;
......
......@@ -4,10 +4,12 @@ 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.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.service.impl.TrendServiceImpl;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
......@@ -61,7 +63,7 @@ public class TrendController {
@PostMapping(value = "/abnormalCrossList",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenwaveVO.class),
@ApiResponse(code = 200, message = "OK", response = AbnormalCrossVO.class),
})
public JsonViewObject abnormalCrossList(@RequestBody AbnormalCrossListDTO abnormalCrossListDTO) {
AbnormalCrossVO abnormalCrossVO = trendService.abnormalCrossList(abnormalCrossListDTO);
......@@ -69,4 +71,18 @@ public class TrendController {
return jsonViewObject.success(abnormalCrossVO);
}
@ApiOperation(value = "问题路口详情", notes = "问题路口详情", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/abnormalCrossDetail",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AbnormalCrossDetailVO.class),
})
public JsonViewObject abnormalCrossDetail(@RequestBody CrossIdDTO crossIdDTO) {
AbnormalCrossDetailVO abnormalCrossDetailVO = trendService.abnormalCrossDetail(crossIdDTO);
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
return jsonViewObject.success(abnormalCrossDetailVO);
}
}
\ No newline at end of file
package net.wanji.opt.dao.mapper.trend;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.vo.AbnormalCrossListVO;
import org.springframework.stereotype.Repository;
......@@ -14,4 +15,6 @@ import java.util.List;
@Repository
public interface CrossDataRealtimeMapper {
List<AbnormalCrossListVO> selectAbnormalCross(Integer status, String name, Integer type);
CrossDataRealtimePO selectById(String crossId);
}
package net.wanji.opt.dao.mapper.trend;
import net.wanji.opt.po.trend.CrossDirDataHistPO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 路口方向历史数据
*
* @author Kent HAN
* @date 2023/2/8 9:22
*/
@Repository
public interface CrossDirDataHistMapper {
List<CrossDirDataHistPO> selectByCrossIdAndTimestamp(String crossId, long preSeconds, long afterSeconds);
}
package net.wanji.opt.dao.mapper.trend;
import net.wanji.opt.po.trend.CrossTurnDataRealtimePO;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 路口转向实时数据
*
* @author Kent HAN
* @date 2023/2/8 9:22
*/
@Repository
public interface CrossTurnDataRealtimeMapper {
List<CrossTurnDataRealtimePO> selectByCrossId(String crossId);
}
......@@ -13,78 +13,78 @@ import java.util.Date;
@Data
public class CrossDataRealtimePO {
/** 路口编号 */
@ApiModelProperty(name = "路口编号",notes = "")
@ApiModelProperty(value = "路口编号",notes = "")
private String crossId ;
/** 路口状态:0正常;1失衡;2拥堵;3溢出;4死锁 */
@ApiModelProperty(name = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁",notes = "")
@ApiModelProperty(value = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁",notes = "")
private Integer status ;
/** 拥堵类型:1常规;2异常 */
@ApiModelProperty(name = "拥堵类型:1常规;2异常",notes = "")
@ApiModelProperty(value = "拥堵类型:1常规;2异常",notes = "")
private Integer type ;
/** 交通指数(1~10) */
@ApiModelProperty(name = "交通指数(1~10)",notes = "")
@ApiModelProperty(value = "交通指数(1~10)",notes = "")
private Double trafficIndex ;
/** 开始时间:yyyy-MM-dd HH;mm:ss */
@ApiModelProperty(name = "开始时间:yyyy-MM-dd HH",notes = "mm:ss")
@ApiModelProperty(value = "开始时间:yyyy-MM-dd HH",notes = "mm:ss")
private Date startTime ;
/** 持续时间(单位:分钟) */
@ApiModelProperty(name = "持续时间(单位:分钟)",notes = "")
@ApiModelProperty(value = "持续时间(单位:分钟)",notes = "")
private Integer duration ;
/** 是否失衡:0否;1是 */
@ApiModelProperty(name = "是否失衡:0否;1是",notes = "")
@ApiModelProperty(value = "是否失衡:0否;1是",notes = "")
private Integer isUnbalance ;
/** 是否溢出:0否;1是 */
@ApiModelProperty(name = "是否溢出:0否;1是",notes = "")
@ApiModelProperty(value = "是否溢出:0否;1是",notes = "")
private Integer isSpillover ;
/** 是否拥堵:0否;1是 */
@ApiModelProperty(name = "是否拥堵:0否;1是",notes = "")
@ApiModelProperty(value = "是否拥堵:0否;1是",notes = "")
private Integer isCongestion ;
/** 失衡指数 */
@ApiModelProperty(name = "失衡指数",notes = "")
@ApiModelProperty(value = "失衡指数",notes = "")
private Double unbalanceIndex ;
/** 溢出指数 */
@ApiModelProperty(name = "溢出指数",notes = "")
@ApiModelProperty(value = "溢出指数",notes = "")
private Double spilloverIndex ;
/** 拥堵指数 */
@ApiModelProperty(name = "拥堵指数",notes = "")
@ApiModelProperty(value = "拥堵指数",notes = "")
private Double congestionIndex ;
/** 路口失衡方向:1,2,3... */
@ApiModelProperty(name = "路口失衡方向:1,2,3...",notes = "")
@ApiModelProperty(value = "路口失衡方向:1,2,3...",notes = "")
private String unbalanceDirs ;
/** 路口溢出方向:1,2,3... */
@ApiModelProperty(name = "路口溢出方向:1,2,3...",notes = "")
@ApiModelProperty(value = "路口溢出方向:1,2,3...",notes = "")
private String spilloverDirs ;
/** 路口拥堵方向:1,2,3... */
@ApiModelProperty(name = "路口拥堵方向:1,2,3...",notes = "")
@ApiModelProperty(value = "路口拥堵方向:1,2,3...",notes = "")
private String congestionDirs ;
/** 交通流量(辆) */
@ApiModelProperty(name = "交通流量(辆)",notes = "")
@ApiModelProperty(value = "交通流量(辆)",notes = "")
private Integer flow ;
/** 交通流率/h */
@ApiModelProperty(name = "交通流率/h",notes = "")
@ApiModelProperty(value = "交通流率/h",notes = "")
private Double flowRate ;
/** 平均速度(km/h) */
@ApiModelProperty(name = "平均速度(km/h)",notes = "")
@ApiModelProperty(value = "平均速度(km/h)",notes = "")
private Double speed ;
/** 最大排队(米) */
@ApiModelProperty(name = "最大排队(米)",notes = "")
@ApiModelProperty(value = "最大排队(米)",notes = "")
private Double queueLength ;
/** 停车次数(次) */
@ApiModelProperty(name = "停车次数(次)",notes = "")
@ApiModelProperty(value = "停车次数(次)",notes = "")
private Double stopTimes ;
/** 延误时间(秒) */
@ApiModelProperty(name = "延误时间(秒)",notes = "")
@ApiModelProperty(value = "延误时间(秒)",notes = "")
private Integer delayTime ;
/** 饱和度 */
@ApiModelProperty(name = "饱和度",notes = "")
@ApiModelProperty(value = "饱和度",notes = "")
private Double sturation ;
/** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
@ApiModelProperty(value = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ;
/** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "")
@ApiModelProperty(value = "创建时间",notes = "")
private Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "")
@ApiModelProperty(value = "修改时间",notes = "")
private Date gmtModified ;
}
package net.wanji.opt.po.trend;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author hfx
* @date 2023/1/10 16:36
* @desc CrossDataRealtimePO
*/
@Data
public class CrossDirDataHistPO {
/** 路口方向ID(路口ID_方向_进出口_主辅路序号) */
@ApiModelProperty(name = "路口方向ID(路口ID_方向_进出口_主辅路序号)",notes = "")
private String id ;
/** 路口方向类型:1北;2东北;3东;4东南;5南;6西南;7西;8西北 */
@ApiModelProperty(name = "路口方向类型:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer dirType ;
/** 进出口类型:1进口;2出口 */
@ApiModelProperty(name = "进出口类型:1进口;2出口",notes = "")
private Integer inOutType ;
/** 路口ID */
@ApiModelProperty(name = "路口ID",notes = "")
private String crossId ;
/** 路段长度 */
@ApiModelProperty(name = "路段长度",notes = "")
private Double length ;
/** 交通状态:1畅通;2缓行;3拥堵;4严重拥堵;5未知 */
@ApiModelProperty(name = "交通状态:1畅通;2缓行;3拥堵;4严重拥堵;5未知",notes = "")
private Integer status ;
/** 交通指数 */
@ApiModelProperty(name = "交通指数",notes = "")
private Double trafficIndex ;
/** 交通流量(辆) */
@ApiModelProperty(name = "交通流量(辆)",notes = "")
private Integer flow ;
/** 平均速度(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 Long batchTime ;
/** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "")
private Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "")
private Date gmtModified ;
}
package net.wanji.opt.po.trend;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author hfx
* @date 2023/1/10 16:36
* @desc CrossDataRealtimePO
*/
@Data
public class CrossTurnDataRealtimePO {
/** 转向ID(路口ID_驶入方向_转向类型) */
@ApiModelProperty(name = "转向ID(路口ID_驶入方向_转向类型)",notes = "")
private String id ;
/** 转向类型:u掉头;l左转;s直行;r右转; */
@ApiModelProperty(name = "转向类型:u掉头;l左转;s直行;r右转;",notes = "")
private String turnType ;
/** 驶入方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北 */
@ApiModelProperty(name = "驶入方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer inDir ;
/** 驶出方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北 */
@ApiModelProperty(name = "驶出方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer outDir ;
/** 路口ID */
@ApiModelProperty(name = "路口ID",notes = "")
private String crossId ;
/** 交通流量(辆) */
@ApiModelProperty(name = "交通流量(辆)",notes = "")
private Integer flow ;
/** 平均速度(km/h) */
@ApiModelProperty(name = "平均速度(km/h)",notes = "")
private Double speed ;
/** 驶入速度(km/h) */
@ApiModelProperty(name = "驶入速度(km/h)",notes = "")
private Double inSpeed ;
/** 驶出速度(km/h) */
@ApiModelProperty(name = "驶出速度(km/h)",notes = "")
private Double outSpeed ;
/** 排队长度(米) */
@ApiModelProperty(name = "排队长度(米)",notes = "")
private Double queueLength ;
/** 停车次数(次) */
@ApiModelProperty(name = "停车次数(次)",notes = "")
private Double stopTimes ;
/** 延误时间(秒) */
@ApiModelProperty(name = "延误时间(秒)",notes = "")
private Integer delayTime ;
/** 饱和度 */
@ApiModelProperty(name = "饱和度",notes = "")
private Double sturation ;
/** 车头间距(米) */
@ApiModelProperty(name = "车头间距(米)",notes = "")
private Double vehheadDist ;
/** 车头时距(秒) */
@ApiModelProperty(name = "车头时距(秒)",notes = "")
private Double vehheadTime ;
/** 可信度:0~1 */
@ApiModelProperty(name = "可信度:0~1",notes = "")
private Double quality ;
/** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ;
/** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "")
private Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "")
private Date gmtModified ;
}
package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats;
......@@ -19,4 +21,6 @@ public interface TrendService {
GreenwaveStats buildGreenwaveStats(List<GreenwaveListVO> greenwaveListVOList);
AbnormalCrossVO abnormalCrossList(AbnormalCrossListDTO abnormalCrossListDTO);
AbnormalCrossDetailVO abnormalCrossDetail(CrossIdDTO crossIdDTO);
}
......@@ -3,14 +3,21 @@ package net.wanji.opt.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.opt.dao.mapper.CrossInfoMapper;
import net.wanji.opt.dao.mapper.trend.CrossDataRealtimeMapper;
import net.wanji.opt.dao.mapper.trend.CrossDirDataHistMapper;
import net.wanji.opt.dao.mapper.trend.CrossTurnDataRealtimeMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.po.base.CrossInfoPO;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.po.trend.CrossDirDataHistPO;
import net.wanji.opt.po.trend.CrossTurnDataRealtimePO;
import net.wanji.opt.service.TrendService;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossListVO;
import net.wanji.opt.vo.AbnormalCrossStats;
import net.wanji.opt.vo.AbnormalCrossVO;
......@@ -21,6 +28,8 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author Kent HAN
......@@ -31,11 +40,15 @@ public class TrendServiceImpl implements TrendService {
private final GreenwaveInfoMapper greenwaveInfoMapper;
private final CrossInfoMapper crossInfoMapper;
private final CrossDataRealtimeMapper crossDataRealtimeMapper;
private final CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper;
private final CrossDirDataHistMapper crossDirDataHistMapper;
public TrendServiceImpl(GreenwaveInfoMapper greenwaveInfoMapper, CrossInfoMapper crossInfoMapper, CrossDataRealtimeMapper crossDataRealtimeMapper) {
public TrendServiceImpl(GreenwaveInfoMapper greenwaveInfoMapper, CrossInfoMapper crossInfoMapper, CrossDataRealtimeMapper crossDataRealtimeMapper, CrossTurnDataRealtimeMapper crossTurnDataRealtimeMapper, CrossDirDataHistMapper crossDirDataHistMapper) {
this.greenwaveInfoMapper = greenwaveInfoMapper;
this.crossInfoMapper = crossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossTurnDataRealtimeMapper = crossTurnDataRealtimeMapper;
this.crossDirDataHistMapper = crossDirDataHistMapper;
}
@Override
......@@ -110,6 +123,93 @@ public class TrendServiceImpl implements TrendService {
return abnormalCrossVO;
}
@Override
public AbnormalCrossDetailVO abnormalCrossDetail(CrossIdDTO crossIdDTO) {
String crossId = crossIdDTO.getCrossId();
AbnormalCrossDetailVO abnormalCrossDetailVO = new AbnormalCrossDetailVO();
// 构造路口实时数据
CrossDataRealtimePO crossDataRealtimePO = crossDataRealtimeMapper.selectById(crossId);
abnormalCrossDetailVO.setCrossStatus(crossDataRealtimePO.getStatus());
abnormalCrossDetailVO.setCrossQueueLength(crossDataRealtimePO.getQueueLength());
abnormalCrossDetailVO.setCrossFlowRate(crossDataRealtimePO.getFlowRate());
abnormalCrossDetailVO.setCrossStopTimes(crossDataRealtimePO.getStopTimes());
// 构造转向实时数据
List<AbnormalCrossDetailVO.TurnDataElement> turnData = buildTurnData(crossId);
abnormalCrossDetailVO.setTurnData(turnData);
// 构造方向历史数据
List<AbnormalCrossDetailVO.DirDataElement> dirData = buildDirData(crossId);
abnormalCrossDetailVO.setDirData(dirData);
return abnormalCrossDetailVO;
}
private List<AbnormalCrossDetailVO.DirDataElement> buildDirData(String crossId) {
List<AbnormalCrossDetailVO.DirDataElement> dirData = new ArrayList<>();
// 获取当前时间前后20分钟的10位时间戳
long currentSeconds = DateUtil.currentSeconds();
long preSeconds = currentSeconds - 20 * 60;
long afterSeconds = currentSeconds + 20 * 60;
List<CrossDirDataHistPO> crossDirDataHistPOList =
crossDirDataHistMapper.selectByCrossIdAndTimestamp(crossId, preSeconds, afterSeconds);
for (CrossDirDataHistPO crossDirDataHistPO : crossDirDataHistPOList) {
AbnormalCrossDetailVO.DirDataElement dirDataElement = new AbnormalCrossDetailVO.DirDataElement();
dirDataElement.setDir(crossDirDataHistPO.getDirType());
// 获取采集时间
Long batchTime = crossDirDataHistPO.getBatchTime();
Date date = DateUtil.date(batchTime * 1000);
dirDataElement.setTime(date);
// 转换状态,3、4都算拥堵
Integer status = crossDirDataHistPO.getStatus();
if (status == 4) {
status = 3;
}
dirDataElement.setStatus(status);
dirData.add(dirDataElement);
}
return dirData;
}
private List<AbnormalCrossDetailVO.TurnDataElement> buildTurnData(String crossId) {
List<AbnormalCrossDetailVO.TurnDataElement> turnData = new ArrayList<>();
List<CrossTurnDataRealtimePO> crossTurnDataRealtimePOList = crossTurnDataRealtimeMapper.selectByCrossId(crossId);
Map<Integer, List<CrossTurnDataRealtimePO>> collect = crossTurnDataRealtimePOList.stream()
.collect(Collectors.groupingBy(CrossTurnDataRealtimePO::getInDir));
for (Map.Entry<Integer, List<CrossTurnDataRealtimePO>> entry : collect.entrySet()) {
AbnormalCrossDetailVO.TurnDataElement turnDataElement = new AbnormalCrossDetailVO.TurnDataElement();
Integer dir = entry.getKey();
turnDataElement.setDir(dir);
// 构造转向列表
List<CrossTurnDataRealtimePO> subList = entry.getValue();
List<AbnormalCrossDetailVO.TurnDataElement.TurnListElement> turnList = buildTurnList(subList);
turnDataElement.setTurnList(turnList);
turnData.add(turnDataElement);
}
return turnData;
}
private List<AbnormalCrossDetailVO.TurnDataElement.TurnListElement> buildTurnList(
List<CrossTurnDataRealtimePO> subList) {
List<AbnormalCrossDetailVO.TurnDataElement.TurnListElement> turnList = new ArrayList<>();
for (CrossTurnDataRealtimePO crossTurnDataRealtimePO : subList) {
AbnormalCrossDetailVO.TurnDataElement.TurnListElement turnListElement =
new AbnormalCrossDetailVO.TurnDataElement.TurnListElement();
turnListElement.setTurn(crossTurnDataRealtimePO.getTurnType());
turnListElement.setTurnQueueLength(crossTurnDataRealtimePO.getQueueLength());
turnListElement.setTurnStopTimes(crossTurnDataRealtimePO.getStopTimes());
turnListElement.setFlow(crossTurnDataRealtimePO.getFlow());
turnList.add(turnListElement);
}
return turnList;
}
private static void buildAbnormalCrossStats(AbnormalCrossVO abnormalCrossVO,
List<AbnormalCrossListVO> abnormalCrossListVOList) {
AbnormalCrossStats abnormalCrossStats = new AbnormalCrossStats();
......
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 = "AbnormalCrossListVO", description = "问题路口详情")
public class AbnormalCrossDetailVO {
@ApiModelProperty(value = "路口状态:1失衡;2拥堵;3溢出")
private Integer crossStatus;
@ApiModelProperty(value = "最大排队")
private Double crossQueueLength;
@ApiModelProperty(value = "流率")
private Double crossFlowRate;
@ApiModelProperty(value = "平均停车次数")
private Double crossStopTimes;
@ApiModelProperty(value = "转向实时数据")
private List<TurnDataElement> turnData;
@ApiModelProperty(value = "方向实时数据")
private List<DirDataElement> dirData;
@NoArgsConstructor
@Data
public static class TurnDataElement {
@ApiModelProperty(value = "方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北")
private Integer dir;
@ApiModelProperty(value = "转向列表")
private List<TurnListElement> turnList;
@NoArgsConstructor
@Data
public static class TurnListElement {
@ApiModelProperty(value = "转向:u掉头;l左转;s直行;r右转")
private String turn;
@ApiModelProperty(value = "转向排队长度")
private Double turnQueueLength;
@ApiModelProperty(value = "转向平均停车次数")
private Double turnStopTimes;
@ApiModelProperty(value = "转向流率 /5min")
private Integer flow;
}
}
@NoArgsConstructor
@Data
public static class DirDataElement {
@ApiModelProperty(value = "方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北")
private Integer dir;
@ApiModelProperty(value = "时间 格式08:12:25")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
private Date time;
@ApiModelProperty(value = "交通状态:1畅通;2缓行;3拥堵;5未知")
private Integer status;
}
}
......@@ -27,7 +27,7 @@ public class AbnormalCrossListVO {
@ApiModelProperty(value = "路口状态 1失衡 2拥堵 3溢出")
private Integer realtimeStatus;
@ApiModelProperty(value = "开始时间 格式 08:20:23")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@ApiModelProperty(value = "持续时长 分钟")
private Long duration;
......
......@@ -19,15 +19,15 @@ public class GreenwaveListVO {
private String name;
@ApiModelProperty(value = "协调方式")
private Integer infoStatus;
@ApiModelProperty(value = "路口状态:1畅通;2缓行;3拥堵")
@ApiModelProperty(value = "路口状态:1畅通;2缓行;3拥堵;5未知")
private Integer realtimeStatus;
@ApiModelProperty(value = "拥堵指数")
private Double trafficIndex;
@ApiModelProperty(value = "开始时间 格式 08:20:23")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@ApiModelProperty(value = "结束时间 格式 08:20:23")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss", timezone = "GMT+8")
private Date endTime;
@ApiModelProperty(value = "持续时长 分钟")
private Long duration;
......
......@@ -21,7 +21,17 @@
<if test="type != null">
and t1.type = #{type}
</if>
<if test="status == null">
and t1.status in (1, 2, 3)
</if>
</where>
</select>
<select id="selectById" resultType="net.wanji.opt.po.trend.CrossDataRealtimePO">
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_realtime
where cross_id = #{crossId}
</select>
</mapper>
<?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.trend.CrossDirDataHistMapper">
<select id="selectByCrossIdAndTimestamp" 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 batch_time <![CDATA[ >= ]]> #{preSeconds}
and batch_time <![CDATA[ <= ]]> #{afterSeconds}
order by batch_time
</select>
</mapper>
<?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.trend.CrossTurnDataRealtimeMapper">
<select id="selectByCrossId" resultType="net.wanji.opt.po.trend.CrossTurnDataRealtimePO">
select
id,turn_type,in_dir,out_dir,cross_id,flow,speed,in_speed,out_speed,queue_length,stop_times,delay_time,sturation,vehhead_dist,vehhead_time,quality,batch_time,gmt_create,gmt_modified
from t_cross_turn_data_realtime
where cross_id = #{crossId}
</select>
</mapper>
package net.wanji.web.dto;
package net.wanji.common.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......
......@@ -48,7 +48,7 @@ public class User extends TrackableEntity {
private String phone;
@ApiModelProperty(value = "用户生日")
@JsonFormat(pattern = "yyyy-MM-dd" )
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date birthday;
@ApiModelProperty(value = "邮箱")
......
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