Commit f99357b9 authored by hanbing's avatar hanbing

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

parent 80012ddb
...@@ -7,7 +7,7 @@ import io.swagger.annotations.ApiResponses; ...@@ -7,7 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject; import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdAndPhaseIdsDTO; import net.wanji.web.dto.CrossIdAndPhaseIdsDTO;
import net.wanji.web.dto.CrossIdAndTimeDTO; 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.SaveSchemeConfigDTO;
import net.wanji.web.dto.ScheduleIdDTO; import net.wanji.web.dto.ScheduleIdDTO;
import net.wanji.web.dto.SchemeIdDTO; import net.wanji.web.dto.SchemeIdDTO;
......
...@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject; 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.dto.SaveLaneInfoDTO;
import net.wanji.web.service.scheme.impl.CrossConfigServiceImpl; import net.wanji.web.service.scheme.impl.CrossConfigServiceImpl;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
......
...@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -4,7 +4,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject; 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.dto.SaveLightsInfoDTO;
import net.wanji.web.service.scheme.impl.LightsConfigServiceImpl; import net.wanji.web.service.scheme.impl.LightsConfigServiceImpl;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
......
...@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject; 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.dto.RunningPlanDTO;
import net.wanji.web.service.scheme.impl.RunningPlanServiceImpl; import net.wanji.web.service.scheme.impl.RunningPlanServiceImpl;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
......
...@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -5,7 +5,7 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses; import io.swagger.annotations.ApiResponses;
import net.wanji.feign.pojo.result.JsonViewObject; 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.LaneIdDTO;
import net.wanji.web.dto.LightIdDTO; import net.wanji.web.dto.LightIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO; import net.wanji.web.dto.SaveSchemeConfigDTO;
......
...@@ -16,6 +16,6 @@ public class CrossIdAndTimeDTO { ...@@ -16,6 +16,6 @@ public class CrossIdAndTimeDTO {
@ApiModelProperty(value = "路口ID,如:c7e7b1f352dd4acab4a60088eb391cca", required = true) @ApiModelProperty(value = "路口ID,如:c7e7b1f352dd4acab4a60088eb391cca", required = true)
private String crossId; private String crossId;
@ApiModelProperty(value = "当前日期时间 yyyy-MM-dd HH:mm:ss", required = true) @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; private Date datetime;
} }
...@@ -2,7 +2,7 @@ package net.wanji.web.service; ...@@ -2,7 +2,7 @@ package net.wanji.web.service;
import net.wanji.feign.pojo.result.JsonViewObject; import net.wanji.feign.pojo.result.JsonViewObject;
import net.wanji.web.dto.CrossIdAndTimeDTO; 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.CrossIdAndPhaseIdsDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO; import net.wanji.web.dto.SaveSchemeConfigDTO;
import net.wanji.web.dto.ScheduleIdDTO; import net.wanji.web.dto.ScheduleIdDTO;
......
...@@ -14,7 +14,7 @@ import net.wanji.feign.pojo.vo.SchemeSendVO; ...@@ -14,7 +14,7 @@ import net.wanji.feign.pojo.vo.SchemeSendVO;
import net.wanji.feign.service.UtcFeignClients; import net.wanji.feign.service.UtcFeignClients;
import net.wanji.web.dto.CrossIdAndPhaseIdsDTO; import net.wanji.web.dto.CrossIdAndPhaseIdsDTO;
import net.wanji.web.dto.CrossIdAndTimeDTO; 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.RunningPlanDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO; import net.wanji.web.dto.SaveSchemeConfigDTO;
import net.wanji.web.dto.ScheduleIdDTO; import net.wanji.web.dto.ScheduleIdDTO;
......
package net.wanji.web.service.scheme; package net.wanji.web.service.scheme;
import net.wanji.web.dto.CrossIdDTO; import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLaneInfoDTO; import net.wanji.web.dto.SaveLaneInfoDTO;
/** /**
......
package net.wanji.web.service.scheme; package net.wanji.web.service.scheme;
import net.wanji.web.dto.CrossIdDTO; import net.wanji.common.dto.CrossIdDTO;
import net.wanji.web.dto.SaveLightsInfoDTO; import net.wanji.web.dto.SaveLightsInfoDTO;
/** /**
......
package net.wanji.web.service.scheme; 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 net.wanji.web.dto.RunningPlanDTO;
import java.text.ParseException; import java.text.ParseException;
......
package net.wanji.web.service.scheme; 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.LaneIdDTO;
import net.wanji.web.dto.LightIdDTO; import net.wanji.web.dto.LightIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO; import net.wanji.web.dto.SaveSchemeConfigDTO;
......
...@@ -3,7 +3,7 @@ package net.wanji.web.service.scheme.impl; ...@@ -3,7 +3,7 @@ package net.wanji.web.service.scheme.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import net.wanji.web.common.enums.LightsAddressEnum; import net.wanji.web.common.enums.LightsAddressEnum;
import net.wanji.web.common.exception.LightLaneConflictException; 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.DirListElement;
import net.wanji.web.dto.LaneListElement; import net.wanji.web.dto.LaneListElement;
import net.wanji.web.dto.LedConfigListElement; import net.wanji.web.dto.LedConfigListElement;
......
package net.wanji.web.service.scheme.impl; 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.dto.SaveLightsInfoDTO;
import net.wanji.web.service.scheme.LightsConfigService; import net.wanji.web.service.scheme.LightsConfigService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
......
package net.wanji.web.service.scheme.impl; package net.wanji.web.service.scheme.impl;
import cn.hutool.core.collection.CollectionUtil; 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.dto.RunningPlanDTO;
import net.wanji.web.mapper.scheme.CrossPlanMapper; import net.wanji.web.mapper.scheme.CrossPlanMapper;
import net.wanji.web.mapper.scheme.CrossSchedulesMapper; import net.wanji.web.mapper.scheme.CrossSchedulesMapper;
......
...@@ -3,7 +3,7 @@ package net.wanji.web.service.scheme.impl; ...@@ -3,7 +3,7 @@ package net.wanji.web.service.scheme.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import net.wanji.web.common.constant.ControlModeConst; import net.wanji.web.common.constant.ControlModeConst;
import net.wanji.web.common.exception.PhaseNoNotUniqueException; 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.LaneIdDTO;
import net.wanji.web.dto.LightIdDTO; import net.wanji.web.dto.LightIdDTO;
import net.wanji.web.dto.SaveSchemeConfigDTO; import net.wanji.web.dto.SaveSchemeConfigDTO;
......
...@@ -4,10 +4,12 @@ import io.swagger.annotations.Api; ...@@ -4,10 +4,12 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse; 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.framework.rest.JsonViewObject; import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO; import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO; import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.service.impl.TrendServiceImpl; import net.wanji.opt.service.impl.TrendServiceImpl;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossVO; import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.GreenwaveListVO; import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats; import net.wanji.opt.vo.GreenwaveStats;
...@@ -61,7 +63,7 @@ public class TrendController { ...@@ -61,7 +63,7 @@ public class TrendController {
@PostMapping(value = "/abnormalCrossList", @PostMapping(value = "/abnormalCrossList",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON) produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "OK", response = GreenwaveVO.class), @ApiResponse(code = 200, message = "OK", response = AbnormalCrossVO.class),
}) })
public JsonViewObject abnormalCrossList(@RequestBody AbnormalCrossListDTO abnormalCrossListDTO) { public JsonViewObject abnormalCrossList(@RequestBody AbnormalCrossListDTO abnormalCrossListDTO) {
AbnormalCrossVO abnormalCrossVO = trendService.abnormalCrossList(abnormalCrossListDTO); AbnormalCrossVO abnormalCrossVO = trendService.abnormalCrossList(abnormalCrossListDTO);
...@@ -69,4 +71,18 @@ public class TrendController { ...@@ -69,4 +71,18 @@ public class TrendController {
return jsonViewObject.success(abnormalCrossVO); 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; package net.wanji.opt.dao.mapper.trend;
import net.wanji.opt.po.trend.CrossDataRealtimePO;
import net.wanji.opt.vo.AbnormalCrossListVO; import net.wanji.opt.vo.AbnormalCrossListVO;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -14,4 +15,6 @@ import java.util.List; ...@@ -14,4 +15,6 @@ import java.util.List;
@Repository @Repository
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);
} }
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; ...@@ -13,78 +13,78 @@ import java.util.Date;
@Data @Data
public class CrossDataRealtimePO { public class CrossDataRealtimePO {
/** 路口编号 */ /** 路口编号 */
@ApiModelProperty(name = "路口编号",notes = "") @ApiModelProperty(value = "路口编号",notes = "")
private String crossId ; private String crossId ;
/** 路口状态:0正常;1失衡;2拥堵;3溢出;4死锁 */ /** 路口状态:0正常;1失衡;2拥堵;3溢出;4死锁 */
@ApiModelProperty(name = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁",notes = "") @ApiModelProperty(value = "路口状态:0正常;1失衡;2拥堵;3溢出;4死锁",notes = "")
private Integer status ; private Integer status ;
/** 拥堵类型:1常规;2异常 */ /** 拥堵类型:1常规;2异常 */
@ApiModelProperty(name = "拥堵类型:1常规;2异常",notes = "") @ApiModelProperty(value = "拥堵类型:1常规;2异常",notes = "")
private Integer type ; private Integer type ;
/** 交通指数(1~10) */ /** 交通指数(1~10) */
@ApiModelProperty(name = "交通指数(1~10)",notes = "") @ApiModelProperty(value = "交通指数(1~10)",notes = "")
private Double trafficIndex ; private Double trafficIndex ;
/** 开始时间:yyyy-MM-dd HH;mm:ss */ /** 开始时间: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 ; private Date startTime ;
/** 持续时间(单位:分钟) */ /** 持续时间(单位:分钟) */
@ApiModelProperty(name = "持续时间(单位:分钟)",notes = "") @ApiModelProperty(value = "持续时间(单位:分钟)",notes = "")
private Integer duration ; private Integer duration ;
/** 是否失衡:0否;1是 */ /** 是否失衡:0否;1是 */
@ApiModelProperty(name = "是否失衡:0否;1是",notes = "") @ApiModelProperty(value = "是否失衡:0否;1是",notes = "")
private Integer isUnbalance ; private Integer isUnbalance ;
/** 是否溢出:0否;1是 */ /** 是否溢出:0否;1是 */
@ApiModelProperty(name = "是否溢出:0否;1是",notes = "") @ApiModelProperty(value = "是否溢出:0否;1是",notes = "")
private Integer isSpillover ; private Integer isSpillover ;
/** 是否拥堵:0否;1是 */ /** 是否拥堵:0否;1是 */
@ApiModelProperty(name = "是否拥堵:0否;1是",notes = "") @ApiModelProperty(value = "是否拥堵:0否;1是",notes = "")
private Integer isCongestion ; private Integer isCongestion ;
/** 失衡指数 */ /** 失衡指数 */
@ApiModelProperty(name = "失衡指数",notes = "") @ApiModelProperty(value = "失衡指数",notes = "")
private Double unbalanceIndex ; private Double unbalanceIndex ;
/** 溢出指数 */ /** 溢出指数 */
@ApiModelProperty(name = "溢出指数",notes = "") @ApiModelProperty(value = "溢出指数",notes = "")
private Double spilloverIndex ; private Double spilloverIndex ;
/** 拥堵指数 */ /** 拥堵指数 */
@ApiModelProperty(name = "拥堵指数",notes = "") @ApiModelProperty(value = "拥堵指数",notes = "")
private Double congestionIndex ; private Double congestionIndex ;
/** 路口失衡方向:1,2,3... */ /** 路口失衡方向:1,2,3... */
@ApiModelProperty(name = "路口失衡方向:1,2,3...",notes = "") @ApiModelProperty(value = "路口失衡方向:1,2,3...",notes = "")
private String unbalanceDirs ; private String unbalanceDirs ;
/** 路口溢出方向:1,2,3... */ /** 路口溢出方向:1,2,3... */
@ApiModelProperty(name = "路口溢出方向:1,2,3...",notes = "") @ApiModelProperty(value = "路口溢出方向:1,2,3...",notes = "")
private String spilloverDirs ; private String spilloverDirs ;
/** 路口拥堵方向:1,2,3... */ /** 路口拥堵方向:1,2,3... */
@ApiModelProperty(name = "路口拥堵方向:1,2,3...",notes = "") @ApiModelProperty(value = "路口拥堵方向:1,2,3...",notes = "")
private String congestionDirs ; private String congestionDirs ;
/** 交通流量(辆) */ /** 交通流量(辆) */
@ApiModelProperty(name = "交通流量(辆)",notes = "") @ApiModelProperty(value = "交通流量(辆)",notes = "")
private Integer flow ; private Integer flow ;
/** 交通流率/h */ /** 交通流率/h */
@ApiModelProperty(name = "交通流率/h",notes = "") @ApiModelProperty(value = "交通流率/h",notes = "")
private Double flowRate ; private Double flowRate ;
/** 平均速度(km/h) */ /** 平均速度(km/h) */
@ApiModelProperty(name = "平均速度(km/h)",notes = "") @ApiModelProperty(value = "平均速度(km/h)",notes = "")
private Double speed ; private Double speed ;
/** 最大排队(米) */ /** 最大排队(米) */
@ApiModelProperty(name = "最大排队(米)",notes = "") @ApiModelProperty(value = "最大排队(米)",notes = "")
private Double queueLength ; private Double queueLength ;
/** 停车次数(次) */ /** 停车次数(次) */
@ApiModelProperty(name = "停车次数(次)",notes = "") @ApiModelProperty(value = "停车次数(次)",notes = "")
private Double stopTimes ; private Double stopTimes ;
/** 延误时间(秒) */ /** 延误时间(秒) */
@ApiModelProperty(name = "延误时间(秒)",notes = "") @ApiModelProperty(value = "延误时间(秒)",notes = "")
private Integer delayTime ; private Integer delayTime ;
/** 饱和度 */ /** 饱和度 */
@ApiModelProperty(name = "饱和度",notes = "") @ApiModelProperty(value = "饱和度",notes = "")
private Double sturation ; private Double sturation ;
/** 采集时间(10位时间戳) */ /** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "") @ApiModelProperty(value = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ; private Integer batchTime ;
/** 创建时间 */ /** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "") @ApiModelProperty(value = "创建时间",notes = "")
private Date gmtCreate ; private Date gmtCreate ;
/** 修改时间 */ /** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "") @ApiModelProperty(value = "修改时间",notes = "")
private Date gmtModified ; 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; package net.wanji.opt.service;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO; import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO; import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossVO; import net.wanji.opt.vo.AbnormalCrossVO;
import net.wanji.opt.vo.GreenwaveListVO; import net.wanji.opt.vo.GreenwaveListVO;
import net.wanji.opt.vo.GreenwaveStats; import net.wanji.opt.vo.GreenwaveStats;
...@@ -19,4 +21,6 @@ public interface TrendService { ...@@ -19,4 +21,6 @@ public interface TrendService {
GreenwaveStats buildGreenwaveStats(List<GreenwaveListVO> greenwaveListVOList); GreenwaveStats buildGreenwaveStats(List<GreenwaveListVO> greenwaveListVOList);
AbnormalCrossVO abnormalCrossList(AbnormalCrossListDTO abnormalCrossListDTO); AbnormalCrossVO abnormalCrossList(AbnormalCrossListDTO abnormalCrossListDTO);
AbnormalCrossDetailVO abnormalCrossDetail(CrossIdDTO crossIdDTO);
} }
...@@ -3,14 +3,21 @@ package net.wanji.opt.service.impl; ...@@ -3,14 +3,21 @@ package net.wanji.opt.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import net.wanji.common.dto.CrossIdDTO;
import net.wanji.common.utils.tool.CrossUtil; import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.opt.dao.mapper.CrossInfoMapper; import net.wanji.opt.dao.mapper.CrossInfoMapper;
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.dao.mapper.trend.CrossTurnDataRealtimeMapper;
import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper; import net.wanji.opt.dao.mapper.trend.GreenwaveInfoMapper;
import net.wanji.opt.dto.trend.AbnormalCrossListDTO; import net.wanji.opt.dto.trend.AbnormalCrossListDTO;
import net.wanji.opt.dto.trend.GreenwaveListDTO; import net.wanji.opt.dto.trend.GreenwaveListDTO;
import net.wanji.opt.po.base.CrossInfoPO; 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.service.TrendService;
import net.wanji.opt.vo.AbnormalCrossDetailVO;
import net.wanji.opt.vo.AbnormalCrossListVO; import net.wanji.opt.vo.AbnormalCrossListVO;
import net.wanji.opt.vo.AbnormalCrossStats; import net.wanji.opt.vo.AbnormalCrossStats;
import net.wanji.opt.vo.AbnormalCrossVO; import net.wanji.opt.vo.AbnormalCrossVO;
...@@ -21,6 +28,8 @@ import org.springframework.stereotype.Service; ...@@ -21,6 +28,8 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* @author Kent HAN * @author Kent HAN
...@@ -31,11 +40,15 @@ public class TrendServiceImpl implements TrendService { ...@@ -31,11 +40,15 @@ public class TrendServiceImpl implements TrendService {
private final GreenwaveInfoMapper greenwaveInfoMapper; private final GreenwaveInfoMapper greenwaveInfoMapper;
private final CrossInfoMapper crossInfoMapper; private final CrossInfoMapper crossInfoMapper;
private final CrossDataRealtimeMapper crossDataRealtimeMapper; 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.greenwaveInfoMapper = greenwaveInfoMapper;
this.crossInfoMapper = crossInfoMapper; this.crossInfoMapper = crossInfoMapper;
this.crossDataRealtimeMapper = crossDataRealtimeMapper; this.crossDataRealtimeMapper = crossDataRealtimeMapper;
this.crossTurnDataRealtimeMapper = crossTurnDataRealtimeMapper;
this.crossDirDataHistMapper = crossDirDataHistMapper;
} }
@Override @Override
...@@ -110,6 +123,93 @@ public class TrendServiceImpl implements TrendService { ...@@ -110,6 +123,93 @@ public class TrendServiceImpl implements TrendService {
return abnormalCrossVO; 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, private static void buildAbnormalCrossStats(AbnormalCrossVO abnormalCrossVO,
List<AbnormalCrossListVO> abnormalCrossListVOList) { List<AbnormalCrossListVO> abnormalCrossListVOList) {
AbnormalCrossStats abnormalCrossStats = new AbnormalCrossStats(); 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 { ...@@ -27,7 +27,7 @@ public class AbnormalCrossListVO {
@ApiModelProperty(value = "路口状态 1失衡 2拥堵 3溢出") @ApiModelProperty(value = "路口状态 1失衡 2拥堵 3溢出")
private Integer realtimeStatus; private Integer realtimeStatus;
@ApiModelProperty(value = "开始时间 格式 08:20:23") @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; private Date startTime;
@ApiModelProperty(value = "持续时长 分钟") @ApiModelProperty(value = "持续时长 分钟")
private Long duration; private Long duration;
......
...@@ -19,15 +19,15 @@ public class GreenwaveListVO { ...@@ -19,15 +19,15 @@ public class GreenwaveListVO {
private String name; private String name;
@ApiModelProperty(value = "协调方式") @ApiModelProperty(value = "协调方式")
private Integer infoStatus; private Integer infoStatus;
@ApiModelProperty(value = "路口状态:1畅通;2缓行;3拥堵") @ApiModelProperty(value = "路口状态:1畅通;2缓行;3拥堵;5未知")
private Integer realtimeStatus; private Integer realtimeStatus;
@ApiModelProperty(value = "拥堵指数") @ApiModelProperty(value = "拥堵指数")
private Double trafficIndex; private Double trafficIndex;
@ApiModelProperty(value = "开始时间 格式 08:20:23") @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; private Date startTime;
@ApiModelProperty(value = "结束时间 格式 08:20:23") @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; private Date endTime;
@ApiModelProperty(value = "持续时长 分钟") @ApiModelProperty(value = "持续时长 分钟")
private Long duration; private Long duration;
......
...@@ -21,7 +21,17 @@ ...@@ -21,7 +21,17 @@
<if test="type != null"> <if test="type != null">
and t1.type = #{type} and t1.type = #{type}
</if> </if>
<if test="status == null">
and t1.status in (1, 2, 3)
</if>
</where> </where>
</select> </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> </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 io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
...@@ -48,7 +48,7 @@ public class User extends TrackableEntity { ...@@ -48,7 +48,7 @@ public class User extends TrackableEntity {
private String phone; private String phone;
@ApiModelProperty(value = "用户生日") @ApiModelProperty(value = "用户生日")
@JsonFormat(pattern = "yyyy-MM-dd" ) @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date birthday; private Date birthday;
@ApiModelProperty(value = "邮箱") @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