Commit f369a95c authored by hanbing's avatar hanbing

[update] 新信号评价-方案评价-方案详情曲线图

parent 9aa6b062
package net.wanji.opt.bo;
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/6/9 13:52
*/
@Data
@ApiModel(value = "CurveChartBO", description = "方案详情-曲线图")
public class CurveChartBO {
@ApiModelProperty(value = "路口ID")
private String crossId;
@ApiModelProperty(value = "时间粒度(分钟)", required = true)
private Integer minutes;
@ApiModelProperty(value = "年月日,格式 2023/7/9")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/M/d", timezone = "GMT+8")
private Date problemDate;
@ApiModelProperty(value = "开始时间 HH:mm")
private String startTime;
@ApiModelProperty(value = "结束时间 HH:mm")
private String endTime;
@ApiModelProperty(value = "指标编号 1不停车通过率,2一/二/三次及以上停车通过率...")
private String MetricCode;
private List<DirTurn> dirTurnList;
@NoArgsConstructor
@Data
public static class DirTurn {
@ApiModelProperty(value = "进口方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北")
private String dir;
@ApiModelProperty(value = "转向:u掉头;l左转;s直行;r右转")
private String turn;
}
}
......@@ -25,6 +25,6 @@ public class MetricsDetailBO {
@ApiModelProperty(value = "日期 yyyy-MM-dd", required = true)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date date;
@ApiModelProperty(value = "对比时间间隔(分钟)", required = true)
@ApiModelProperty(value = "时间粒度(分钟)", required = true)
private Integer minutes;
}
......@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.CurveChartBO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.service.impl.SchemeEvaluateServiceImpl;
......@@ -97,4 +98,17 @@ public class SchemeEvaluateController {
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "方案详情-曲线图", notes = "方案详情-曲线图", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/curveChart",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = SchemeEvaluateCurveChartVO.class),
})
public JsonViewObject curveChart(@RequestBody CurveChartBO curveChartBO)
throws ParseException, NoSuchFieldException, IllegalAccessException {
List<SchemeEvaluateCurveChartVO> res = schemeEvaluateService.curveChart(curveChartBO);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package net.wanji.opt.service;
import net.wanji.databus.bo.CrossIdBO;
import net.wanji.opt.bo.CrossSchemeListBO;
import net.wanji.opt.bo.CurveChartBO;
import net.wanji.opt.bo.ProblemSchemeBO;
import net.wanji.opt.bo.SchemeDetailOverallBO;
import net.wanji.opt.vo.*;
......@@ -19,4 +20,6 @@ public interface SchemeEvaluateService {
SchemeEvaluateSchemeDetailOverallVO schemeDetailOverall(SchemeDetailOverallBO schemeDetailOverallBO) throws ParseException;
SchemeEvaluateSchemeDetailedProblemVO detailedProblem(SchemeDetailOverallBO schemeDetailOverallBO) throws ParseException;
List<SchemeEvaluateCurveChartVO> curveChart(CurveChartBO curveChartBO) throws ParseException, NoSuchFieldException, IllegalAccessException;
}
......@@ -304,8 +304,8 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
// 按时间段分组
Map<String, List<MetricHistDTO>> groupedByTime = metricHistDTOList.stream()
.collect(Collectors.groupingBy(metricHistDTO -> {
long timestampInSeconds = metricHistDTO.getBatchTime() * 1000L;
Date date = new Date(timestampInSeconds);
long timestampInMillSeconds = metricHistDTO.getBatchTime() * 1000L;
Date date = new Date(timestampInMillSeconds);
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
int minuteOfDay = date.getMinutes() + date.getHours() * 60;
int roundedMinute = (minuteOfDay / minutes) * minutes;
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "SchemeEvaluateCurveChartVO", description = "方案详情-曲线图")
public class SchemeEvaluateCurveChartVO {
@ApiModelProperty(value = "进口方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北")
private String dir;
@ApiModelProperty(value = "转向:u掉头;l左转;s直行;r右转")
private String turn;
@ApiModelProperty(value = "时间")
private String metricTime;
@ApiModelProperty(value = "指标数值")
private Integer metricValue;
}
......@@ -27,6 +27,9 @@ public class SchemeEvaluateSchemeDetailedProblemVO {
@NoArgsConstructor
@Data
public static class TableContent {
@ApiModelProperty(value = "位置代码 1,2,3...表示进口方向;l,r,s,u表示转向")
private String positionCode;
@ApiModelProperty(value = "位置")
private String position;
......
......@@ -33,5 +33,8 @@ public class SchemeEvaluateStrategyMetricMenuVO {
@ApiModelProperty(value = "指标名称")
private String metricName;
@ApiModelProperty(value = "在方案详情页是否展示,0否 1是")
private Integer isShownInDetail = 1;
}
}
......@@ -32,30 +32,40 @@ public class StrategyAndMetricsEnum {
@Getter
public enum Metrics {
NO_STOP_RATE("1", "不停车通过率", "%"),
STOP_RATE("2", "一/二/三次及以上停车通过率", "%"),
AVERAGE_DELAY("3", "平均延误", "s"),
MAX_QUEUE_LENGTH("4", "最大排队长度", "m"),
STOP_TIMES("5", "停车次数", "次"),
AVERAGE_SPEED("6", "平均速度", "km/h"),
GREEN_LIGHT_EFFICIENCY("7", "绿灯有效利用率", "%"),
SATURATION("8", "饱和度", ""),
LOAD_BALANCE("9", "负载均衡度", ""),
EFFUSION_RATE("10", "溢流率", "%"),
CLEAR_RATE("11", "绿灯间隔清空率", "%"),
EMERGENCY_COUNT("12", "三急一速数量", "");
NO_STOP_RATE("1", "不停车通过率", "%", "noStopRate"),
STOP_RATE("2", "一/二/三次及以上停车通过率", "%", "oneStopRate"),
AVERAGE_DELAY("3", "平均延误", "s", "delayTime"),
MAX_QUEUE_LENGTH("4", "最大排队长度", "m", "queueLength"),
STOP_TIMES("5", "停车次数", "次", "stopTimes"),
AVERAGE_SPEED("6", "平均速度", "km/h", "speed"),
GREEN_LIGHT_EFFICIENCY("7", "绿灯有效利用率", "%", "greenLightEfficiency"),
SATURATION("8", "饱和度", "", "sturation"),
LOAD_BALANCE("9", "负载均衡度", "", "loadBalance"),
EFFUSION_RATE("10", "溢流率", "%", "effusionRate"),
CLEAR_RATE("11", "绿灯间隔清空率", "%", "clearRate"),
EMERGENCY_COUNT("12", "三急一速数量", "", "emergencyCount");
private final String code;
private final String description;
private final String unit;
private final String field; // 实体类中的字段名
Metrics(String code, String description, String unit) {
Metrics(String code, String description, String unit, String field) {
this.code = code;
this.description = description;
this.unit = unit;
this.field = field;
}
public static String getFieldByCode(String code) {
for (Metrics value : Metrics.values()) {
if (value.code.equals(code)) {
return value.field;
}
}
return null;
}
}
public static final Map<Strategy, List<Metrics>> STRATEGY_METRICS_MAP;
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.databus.bo.CrossDirDataHistAvgBO;
import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.databus.po.CrossDirDataHistPO;
import net.wanji.databus.po.CrossDirDataHistPOExt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -44,4 +45,7 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> {
Double selectMaxSaturation(String crossId, Integer dirType, Integer inOutType, int startStamp, int endStamp);
Double selectMaxGreenLightEfficiency(String crossId, Integer dirCode, Integer code, int startTimeStamp, int endTimeStamp);
List<CrossDirDataHistPOExt> selectByMetrics(String crossId, int dirInt, int startTimeStamp, int endTimeStamp, List<String> laneIds);
}
......@@ -3,6 +3,7 @@ package net.wanji.databus.dao.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.databus.po.CrossTurnDataHistPO;
import net.wanji.databus.po.CrossTurnDataHistPOExt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -23,4 +24,6 @@ public interface CrossTurnDataHistMapper extends BaseMapper<CrossTurnDataHistPO>
List<CrossTurnDataHistPO> selectByCrossId(String crossId, long endTimeStamp, long startTimeStamp);
List<MetricHistDTO> selectMetricHistDTO(String crossId, int startStamp, int endStamp);
List<CrossTurnDataHistPOExt> selectByMetrics(String crossId, int dirInt, String turnType, int startTimeStamp, int endTimeStamp, List<String> laneIds);
}
package net.wanji.databus.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/03/12 20:49
*/
@Data
public class CrossDataHistPOExt extends CrossDataRealtimePO {
@ApiModelProperty(value = "三急一速数量", notes = "")
private Integer emergencyCount;
}
package net.wanji.databus.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/03/12 20:51
*/
@Data
public class CrossDirDataHistPOExt extends CrossDirDataRealtimePO {
@ApiModelProperty(value = "三急一速数量", notes = "")
public Integer emergencyCount;
}
......@@ -16,60 +16,60 @@ import java.util.Date;
@ApiModel(value = "CrossDirDataRealtimePO", description = "路口转向实时数据")
public class CrossDirDataRealtimePO {
@ApiModelProperty(name = "路口方向ID(路口ID_方向_进出口_主辅路序号)",notes = "")
private String id;
public String id;
@ApiModelProperty(name = "路口方向类型:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer dirType;
public Integer dirType;
@ApiModelProperty(name = "进出口类型:1进口;2出口",notes = "")
private Integer inOutType;
public Integer inOutType;
@ApiModelProperty(name = "路口编号",notes = "")
private String crossId;
public String crossId;
@ApiModelProperty(name = "路段长度",notes = "")
private Double length;
public Double length;
@ApiModelProperty(name = "交通状态:1畅通;2缓行;3拥堵;4严重拥堵;5未知",notes = "")
private Integer status;
public Integer status;
@ApiModelProperty(name = "交通指数",notes = "")
private Double trafficIndex;
public Double trafficIndex;
@ApiModelProperty(name = "开始时间",notes = "")
private Date startTime;
public Date startTime;
@ApiModelProperty(name = "通行能力",notes = "")
private Integer capacity;
public Integer capacity;
@ApiModelProperty(name = "持续时间",notes = "")
private Integer duration;
public Integer duration;
@ApiModelProperty(name = "交通流量(辆)",notes = "")
private Integer flow;
public Integer flow;
@ApiModelProperty(name = "平均速度(km/h)",notes = "")
private Double speed;
public Double speed;
@ApiModelProperty(name = "排队长(米)",notes = "")
private Double queueLength;
public Double queueLength;
@ApiModelProperty(name = "停车次数",notes = "")
private Double stopTimes;
public Double stopTimes;
@ApiModelProperty(name = "延误时间",notes = "")
private Integer delayTime;
public Integer delayTime;
@ApiModelProperty(name = "饱和度",notes = "")
private Double sturation;
public Double sturation;
@ApiModelProperty(name = "不停车率",notes = "")
private Double noStopRate;
public Double noStopRate;
@ApiModelProperty(name = "一次停车率",notes = "")
private Double oneStopRate;
public Double oneStopRate;
@ApiModelProperty(name = "二次停车率",notes = "")
private Double twoStopRate;
public Double twoStopRate;
@ApiModelProperty(name = "三次停车率",notes = "")
private Double threeStopRate;
public Double threeStopRate;
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
private Integer batchTime;
public Integer batchTime;
@ApiModelProperty(name = "创建时间",notes = "")
private Date gmtCreate ;
public Date gmtCreate ;
@ApiModelProperty(name = "修改时间",notes = "")
private Date gmtModified ;
public Date gmtModified ;
@ApiModelProperty(name = "溢流率:交叉口间路段车辆排队长度超出可容纳空间的时长与观测总时长的百分比",notes = "")
private Double effusionRate;
public Double effusionRate;
@ApiModelProperty(value = "绿灯间隔清空率", notes = "")
private Double clearRate;
public Double clearRate;
@ApiModelProperty(value = "负载均衡度", notes = "")
private Double loadBalance;
public Double loadBalance;
@ApiModelProperty(value = "绿灯有效利用率", notes = "")
private Double greenLightEfficiency;
public Double greenLightEfficiency;
}
package net.wanji.databus.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author duanruiming
* @date 2023/03/12 20:54
*/
@Data
public class CrossTurnDataHistPOExt extends CrossTurnDataRealtimePO {
@ApiModelProperty(value = "三急一速数量", notes = "")
public Integer emergencyCount;
}
......@@ -18,83 +18,83 @@ import java.util.Date;
public class CrossTurnDataRealtimePO {
/** 转向ID(路口ID_驶入方向_转向类型) */
@ApiModelProperty(name = "转向ID(路口ID_驶入方向_转向类型)",notes = "")
private String id ;
public String id ;
/** 转向类型:u掉头;l左转;s直行;r右转; */
@ApiModelProperty(name = "转向类型:u掉头;l左转;s直行;r右转;",notes = "")
private String turnType ;
public String turnType ;
/** 驶入方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北 */
@ApiModelProperty(name = "驶入方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer inDir ;
public Integer inDir ;
/** 驶出方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北 */
@ApiModelProperty(name = "驶出方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北",notes = "")
private Integer outDir ;
public Integer outDir ;
/** 路口ID */
@ApiModelProperty(name = "路口ID",notes = "")
private String crossId ;
public String crossId ;
/** 交通流量(辆) */
@ApiModelProperty(name = "交通流量(辆)",notes = "")
private Integer flow ;
public Integer flow ;
@ApiModelProperty(name = "交通状态:1畅通;2缓行;3拥堵;4严重拥堵;5未知",notes = "")
private Integer status;
public Integer status;
@ApiModelProperty(name = "交通指数",notes = "")
private Double trafficIndex;
public Double trafficIndex;
/** 平均速度(km/h) */
@ApiModelProperty(name = "平均速度(km/h)",notes = "")
private Double speed ;
public Double speed ;
/** 驶入速度(km/h) */
@ApiModelProperty(name = "驶入速度(km/h)",notes = "")
private Double inSpeed ;
public Double inSpeed ;
/** 驶出速度(km/h) */
@ApiModelProperty(name = "驶出速度(km/h)",notes = "")
private Double outSpeed ;
public Double outSpeed ;
/** 排队长度(米) */
@ApiModelProperty(name = "排队长度(米)",notes = "")
private Double queueLength ;
public Double queueLength ;
/** 停车次数(次) */
@ApiModelProperty(name = "停车次数(次)",notes = "")
private Double stopTimes ;
public Double stopTimes ;
/** 延误时间(秒) */
@ApiModelProperty(name = "延误时间(秒)",notes = "")
private Integer delayTime ;
public Integer delayTime ;
/** 饱和度 */
@ApiModelProperty(name = "饱和度",notes = "")
private Double sturation ;
public Double sturation ;
/** 车头间距(米) */
@ApiModelProperty(name = "车头间距(米)",notes = "")
private Double vehheadDist ;
public Double vehheadDist ;
/** 车头时距(秒) */
@ApiModelProperty(name = "车头时距(秒)",notes = "")
private Double vehheadTime ;
public Double vehheadTime ;
/** 可信度:0~1 */
@ApiModelProperty(name = "可信度:0~1",notes = "")
private Double quality ;
public Double quality ;
@ApiModelProperty(name = "不停车率",notes = "")
private Double noStopRate;
public Double noStopRate;
@ApiModelProperty(name = "一次停车率",notes = "")
private Double oneStopRate;
public Double oneStopRate;
@ApiModelProperty(name = "二次停车率",notes = "")
private Double twoStopRate;
public Double twoStopRate;
@ApiModelProperty(name = "三次停车率",notes = "")
private Double threeStopRate;
public Double threeStopRate;
@ApiModelProperty(name = "开始时间",notes = "")
private Date startTime;
public Date startTime;
/** 采集时间(10位时间戳) */
@ApiModelProperty(name = "采集时间(10位时间戳)",notes = "")
private Integer batchTime ;
public Integer batchTime ;
/** 创建时间 */
@ApiModelProperty(name = "创建时间",notes = "")
private Date gmtCreate ;
public Date gmtCreate ;
/** 修改时间 */
@ApiModelProperty(name = "修改时间",notes = "")
private Date gmtModified ;
public Date gmtModified ;
@ApiModelProperty(value = "绿灯间隔清空率", notes = "")
private Double clearRate;
public Double clearRate;
@ApiModelProperty(value = "负载均衡度", notes = "")
private Double loadBalance;
public Double loadBalance;
@ApiModelProperty(value = "绿灯有效利用率", notes = "")
private Double greenLightEfficiency;
public Double greenLightEfficiency;
@ApiModelProperty(name = "溢流率:交叉口间路段车辆排队长度超出可容纳空间的时长与观测总时长的百分比",notes = "")
private Double effusionRate;
public Double effusionRate;
}
......@@ -161,4 +161,34 @@
and batch_time <![CDATA[ <= ]]> #{endStamp}
</select>
<select id="selectByMetrics" resultType="net.wanji.databus.po.CrossDirDataHistPOExt">
SELECT <include refid="Base_Column_List"/>,
<choose>
<when test="laneIds != null and laneIds.size() > 0">
(
SELECT COUNT(*)
FROM holo_roadnet_jinan.t_event_info
WHERE type IN ('33', '34', '35', '6')
AND UNIX_TIMESTAMP(start_time) <![CDATA[ >= ]]> #{startTimeStamp}
AND UNIX_TIMESTAMP(start_time) <![CDATA[ <= ]]> #{endTimeStamp}
AND cross_id = #{crossId}
AND lane_id IN
<foreach collection="laneIds" item="id" separator="," open="(" close=")">
#{id}
</foreach>
)
</when>
<otherwise>
0
</otherwise>
</choose>
AS emergencyCount
FROM t_cross_dir_data_hist
WHERE cross_id = #{crossId}
AND in_out_type = 1
AND dir_type != #{dirInt}
AND batch_time <![CDATA[ <= ]]> #{endTimeStamp}
AND batch_time <![CDATA[ >= ]]> #{startTimeStamp}
</select>
</mapper>
\ No newline at end of file
......@@ -87,4 +87,35 @@
order by batch_time
</select>
<select id="selectByMetrics" resultType="net.wanji.databus.po.CrossTurnDataHistPOExt">
SELECT <include refid="Base_Column_List"/>,
<choose>
<when test="laneIds != null and laneIds.size() > 0">
(
SELECT COUNT(*)
FROM holo_roadnet_jinan.t_event_info
WHERE type IN ('33', '34', '35', '6')
AND UNIX_TIMESTAMP(start_time) <![CDATA[ >= ]]> #{startTimeStamp}
AND UNIX_TIMESTAMP(start_time) <![CDATA[ <= ]]> #{endTimeStamp}
AND cross_id = #{crossId}
AND lane_id IN
<foreach collection="laneIds" item="id" separator="," open="(" close=")">
#{id}
</foreach>
)
</when>
<otherwise>
0
</otherwise>
</choose>
AS emergencyCount
FROM t_cross_turn_data_hist
WHERE cross_id = #{crossId}
AND turn_type = #{turnType}
AND in_dir != #{dirInt}
AND batch_time <![CDATA[ <= ]]> #{endTimeStamp}
AND batch_time <![CDATA[ >= ]]> #{startTimeStamp}
</select>
</mapper>
\ No newline at end of file
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