Commit 53a9d564 authored by hanbing's avatar hanbing

[add] 绿波评价-干线方案评价、干线路口评价

parent 238e1068
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 java.util.Date;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/6/9 13:52
*/
@Data
@ApiModel(value = "MainlineCrossEvaluateBO", description = "干线路口评价")
public class MainlineCrossEvaluateBO {
@ApiModelProperty(value = "方案名称")
private String greenwaveName;
@ApiModelProperty(value = "指标名称")
private String metricName;
@ApiModelProperty(value = "路口ID列表")
private List<String> crossIdList;
@ApiModelProperty(value = "分析时段开始时间 格式 yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@ApiModelProperty(value = "分析时段结束时间 格式 yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
@ApiModelProperty(value = "干线方案时段开始时间 格式 HH:mm")
private String startHourMinute;
@ApiModelProperty(value = "干线方案时段结束时间 格式 HH:mm")
private String endHourMinute;
}
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 java.util.Date;
/**
* @author Kent HAN
* @date 2023/6/9 13:52
*/
@Data
@ApiModel(value = "MainlineSchemeEvaluateBO", description = "干线方案评价")
public class MainlineSchemeEvaluateBO {
@ApiModelProperty(value = "绿波ID")
private Integer greenwaveId;
@ApiModelProperty(value = "方向名称")
private String dirName;
@ApiModelProperty(value = "指标名称")
private String metricName;
@ApiModelProperty(value = "分析时段开始时间 格式 yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
@ApiModelProperty(value = "分析时段结束时间 格式 yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
}
......@@ -7,13 +7,9 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.opt.bo.BottomCurveBO;
import net.wanji.opt.bo.BottomMenuBO;
import net.wanji.opt.bo.MainlineSchemeAnalysisBO;
import net.wanji.opt.bo.*;
import net.wanji.opt.service.impl.MainlineEvaluateServiceImpl;
import net.wanji.opt.vo.MainlineEvaluateBottomCurveVO;
import net.wanji.opt.vo.MainlineListVO;
import net.wanji.opt.vo.MainlineSchemeAnalysisVO;
import net.wanji.opt.vo.*;
import org.springframework.web.bind.annotation.*;
import javax.ws.rs.core.MediaType;
......@@ -74,4 +70,28 @@ public class MainlineEvaluateController {
MainlineSchemeAnalysisVO res = mainlineEvaluateService.mainlineSchemeAnalysis(bo);
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "干线方案评价", notes = "干线方案评价", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/mainlineSchemeEvaluate",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = MainlineSchemeEvaluateVO.class),
})
public JsonViewObject mainlineSchemeEvaluate(@RequestBody MainlineSchemeEvaluateBO bo) {
MainlineSchemeEvaluateVO res = mainlineEvaluateService.mainlineSchemeEvaluate(bo);
return JsonViewObject.newInstance().success(res);
}
@ApiOperation(value = "干线路口评价", notes = "干线路口评价", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/mainlineCrossEvaluate",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = MainlineCrossEvaluateVO.class),
})
public JsonViewObject mainlineCrossEvaluate(@RequestBody MainlineCrossEvaluateBO bo) {
List<MainlineCrossEvaluateVO> res = mainlineEvaluateService.mainlineCrossEvaluate(bo);
return JsonViewObject.newInstance().success(res);
}
}
\ No newline at end of file
......@@ -21,4 +21,6 @@ public interface GreenwaveInfoMapper {
GreenwaveInfoPO selectById(Integer id);
List<GreenwaveInfoPO> selectAll();
GreenwaveInfoPO selectByName(String greenwaveName);
}
package net.wanji.opt.service;
import net.wanji.opt.bo.BottomCurveBO;
import net.wanji.opt.bo.BottomMenuBO;
import net.wanji.opt.bo.MainlineSchemeAnalysisBO;
import net.wanji.opt.vo.MainlineEvaluateBottomCurveVO;
import net.wanji.opt.vo.MainlineListVO;
import net.wanji.opt.vo.MainlineSchemeAnalysisVO;
import net.wanji.opt.bo.*;
import net.wanji.opt.vo.*;
import java.text.ParseException;
import java.util.List;
......@@ -19,4 +15,8 @@ public interface MainlineEvaluateService {
List<MainlineListVO> mainlineList();
MainlineSchemeAnalysisVO mainlineSchemeAnalysis(MainlineSchemeAnalysisBO bo);
MainlineSchemeEvaluateVO mainlineSchemeEvaluate(MainlineSchemeEvaluateBO bo);
List<MainlineCrossEvaluateVO> mainlineCrossEvaluate(MainlineCrossEvaluateBO bo);
}
......@@ -925,7 +925,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
stopTimesLong + StrategyAndMetricsEnum.Metrics.STOP_TIMES.getUnit());
// 计算指标是否合格
int level = calcEfficiencyLevel(maxDelayTime, maxQueueLength);
int level = CrossUtil.calcEfficiencyLevel(maxDelayTime, maxQueueLength);
if (level == 3) {
tableContent.setHasProblem(1);
problemList.add(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口"
......@@ -1243,7 +1243,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
crossId, dirCode, CrossInOutEnum.IN.getCode(), startTimeStamp, endTimeStamp);
Double maxQueueLength = crossDirDataHistMapper.selectMaxQueueLength(
crossId, dirCode, CrossInOutEnum.IN.getCode(), startTimeStamp, endTimeStamp);
int level = calcEfficiencyLevel(maxDelayTime, maxQueueLength);
int level = CrossUtil.calcEfficiencyLevel(maxDelayTime, maxQueueLength);
if (level == 3) {
strategyEvaluateList.add(BaseEnum.SignalDirectionEnum.getNameByCode(dirCode) + "进口延误较高效率较低");
} else if (level == 4) {
......@@ -1256,26 +1256,6 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
vo.setStrategyEvaluateList(strategyEvaluateList);
}
private int calcEfficiencyLevel(Integer delayTime, Double queueLength) {
int level = 0;
if (delayTime != null) {
if (delayTime >=40 && delayTime <= 49) {
level = 3;
} else if (delayTime >= 50) {
level = 4;
}
}
if (queueLength != null) {
int intQueueLength = (int) Math.round(queueLength);
if (intQueueLength >= 60 && intQueueLength <=79 && level < 3) {
level = 3;
} else if (intQueueLength >= 80) {
level = 4;
}
}
return level;
}
private SchemeEvaluateSchemeDetailOverallVO.OverallMetrics buildNoStopRateOverallMetrics(
int intStopTimesAverage) {
SchemeEvaluateSchemeDetailOverallVO.OverallMetrics overallMetrics =
......
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "MainlineCrossEvaluateVO", description = "干线路口评价")
public class MainlineCrossEvaluateVO {
@ApiModelProperty(value = "路口名称")
private String crossName;
@ApiModelProperty(value = "协调方向指标(不停车通过率)")
private Integer coordValue;
@ApiModelProperty(value = "非协调方向指标(排队长度)")
private Integer nonCoordValue;
@ApiModelProperty(value = "方向指标列表")
private List<DirElement> dirElementList;
@ApiModelProperty(value = "评价")
private List<String> crossEvaluateList;
@NoArgsConstructor
@Data
public static class DirElement {
@ApiModelProperty(value = "方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北")
private Integer dir;
@ApiModelProperty(value = "指标数值")
private Integer value;
}
}
......@@ -50,6 +50,9 @@ public class MainlineSchemeAnalysisVO {
@ApiModelProperty(value = "方案名称")
private String name;
@ApiModelProperty(value = "绿波ID")
private Integer greenwaveId;
@ApiModelProperty(value = "方向下拉列表")
private List<DirectionList> dirList;
}
......@@ -60,6 +63,15 @@ public class MainlineSchemeAnalysisVO {
private String name;
@ApiModelProperty(value = "指标列表")
private List<String> metricList;
private List<Metric> metricList;
}
@Data
public static class Metric {
@ApiModelProperty(value = "指标名称")
private String metricName;
@ApiModelProperty(value = "是否在干线路口评价下拉列表和底部曲线图下拉列表展示,0否 1是")
private Integer isShown;
}
}
package net.wanji.opt.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel(value = "MainlineSchemeEvaluateVO", description = "干线方案评价")
public class MainlineSchemeEvaluateVO {
@ApiModelProperty(value = "时段")
private String timeSection;
@ApiModelProperty(value = "控制策略")
private String strategyName;
@ApiModelProperty(value = "路口线路图")
private List<GreenwaveDetailVO.GreenwaveCross> greenwaveCrossList;
@ApiModelProperty(value = "曲线图")
private List<CurveElement> curveElementList;
@ApiModelProperty(value = "评价")
private List<String> evaluateList;
@NoArgsConstructor
@Data
public static class CurveElement {
@ApiModelProperty(value = "时间")
private String metricTime;
@ApiModelProperty(value = "数值")
private Integer value;
}
}
......@@ -42,4 +42,10 @@
from t_greenwave_info
</select>
<select id="selectByName" resultType="net.wanji.databus.dao.entity.GreenwaveInfoPO">
select <include refid="baseColumnList"></include>
from t_greenwave_info
where name = #{greenwaveName}
</select>
</mapper>
......@@ -92,6 +92,15 @@ public class StrategyAndMetricsEnum {
}
return null;
}
public static String getEnumNameByDescription(String description) {
for (Metrics metric : Metrics.values()) {
if (metric.description.equals(description)) {
return metric.name();
}
}
throw new IllegalArgumentException("No enum found with description: " + description);
}
}
public static final Map<Strategy, List<Metrics>> STRATEGY_METRICS_MAP;
......
......@@ -36,4 +36,24 @@ public class CrossUtil {
}
return res;
}
public static int calcEfficiencyLevel(Integer delayTime, Double queueLength) {
int level = 0;
if (delayTime != null) {
if (delayTime >=40 && delayTime <= 49) {
level = 3;
} else if (delayTime >= 50) {
level = 4;
}
}
if (queueLength != null) {
int intQueueLength = (int) Math.round(queueLength);
if (intQueueLength >= 60 && intQueueLength <=79 && level < 3) {
level = 3;
} else if (intQueueLength >= 80) {
level = 4;
}
}
return level;
}
}
......@@ -47,4 +47,47 @@ public class TimeArrayUtil {
}
return timeSegments;
}
/**
* 按分钟段返回指定区间的时间数组。如 ["00:15", "00:30" ... ]
* minutes,分钟段。如按每15分钟生成,则 minute 传15。
* @author Kent HAN
* @date 2022/11/3 16:30
*/
public static List<String> getCustomTimeIntervals(String startHourMinuteStr, String endHourMinuteStr, Integer minutes) {
int startMinutes = convertToMinutes(startHourMinuteStr);
int endMinutes = convertToMinutes(endHourMinuteStr);
List<String> res = new ArrayList<>();
for (int currentMinutes = startMinutes; currentMinutes < endMinutes; currentMinutes += minutes) {
res.add(convertToHourMinuteStr(currentMinutes));
}
return res;
}
private static int convertToMinutes(String hourMinuteStr) {
String[] parts = hourMinuteStr.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
return hours * 60 + minutes;
}
private static String convertToHourMinuteStr(int minutes) {
int hours = minutes / 60;
minutes %= 60;
return String.format("%02d:%02d", hours, minutes);
}
public static void main(String[] args) {
String startHourMinuteStr = "07:00";
String endHourMinuteStr = "9:10";
Integer intervalMinutes = 5;
List<String> intervals = getCustomTimeIntervals(startHourMinuteStr, endHourMinuteStr, intervalMinutes);
for (String interval : intervals) {
System.out.println(interval);
}
}
}
......@@ -50,4 +50,26 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> {
List<CrossDirDataHistPOExt> selectByMetrics(String crossId, int dirInt, int startTimeStamp, int endTimeStamp, List<String> laneIds);
List<CrossDirDataHistPO> selectByCrossIdsDirsAndTimestamp(List<String> crossIdList, List<Integer> dirCodeList, int startTimeStamp, int endTimeStamp);
List<CrossDirDataHistPO> selectByCrossIdDirsAndTimestamp(String crossId, List<Integer> dirCodeList, int startTimeStamp, int endTimeStamp);
List<CrossDirDataHistPO> selectByCrossDirAndTimeSection(
@Param("crossId") String crossId,
@Param("dirCode") Integer dirCode,
@Param("boStartDayStr") String boStartDayStr,
@Param("boEndDayStr") String boEndDayStr,
@Param("startHourMinuteStr") String startHourMinuteStr,
@Param("endHourMinuteStr") String endHourMinuteStr
);
List<CrossDirDataHistPO> selectByCrossDirsAndTimeSection(
@Param("crossId") String crossId,
@Param("dirCodeList") List<Integer> dirCodeList,
@Param("boStartDayStr") String boStartDayStr,
@Param("boEndDayStr") String boEndDayStr,
@Param("startHourMinuteStr") String startHourMinuteStr,
@Param("endHourMinuteStr") String endHourMinuteStr
);
}
......@@ -16,4 +16,6 @@ public interface GreenwaveHistMapper {
List<GreenwaveHistPOExt> selectRunMonitor(Date nowTime);
List<GreenwaveHistPO> selectByTimeSection(String startTimeStr, String endTimeStr);
List<GreenwaveHistPO> selectByIdAndTimeSection(Integer greenwaveId, String startTimeStr, String endTimeStr);
}
......@@ -39,7 +39,7 @@ public class CrossDirDataRealtimePO {
public Integer flow;
@ApiModelProperty(name = "平均速度(km/h)",notes = "")
public Double speed;
@ApiModelProperty(name = "排队长(米)",notes = "")
@ApiModelProperty(name = "排队长(米)",notes = "")
public Double queueLength;
@ApiModelProperty(name = "停车次数",notes = "")
public Double stopTimes;
......
......@@ -191,4 +191,58 @@
AND batch_time <![CDATA[ >= ]]> #{startTimeStamp}
</select>
<select id="selectByCrossIdsDirsAndTimestamp" resultType="net.wanji.databus.po.CrossDirDataHistPO">
select <include refid="Base_Column_List"></include>
from t_cross_dir_data_hist
where cross_id in
<foreach collection="crossIdList" item="crossId" separator="," open="(" close=")">
#{crossId}
</foreach>
and dir_type in
<foreach collection="dirCodeList" item="dirCode" separator="," open="(" close=")">
#{dirCode}
</foreach>
and in_out_type = 1
and batch_time <![CDATA[ >= ]]> #{startTimeStamp}
and batch_time <![CDATA[ <= ]]> #{endTimeStamp}
order by batch_time
</select>
<select id="selectByCrossDirAndTimeSection" resultType="net.wanji.databus.po.CrossDirDataHistPO">
SELECT <include refid="Base_Column_List"></include>
FROM t_cross_dir_data_hist
WHERE cross_id = #{crossId}
AND dir_type = #{dirCode}
AND in_out_type = 1
AND DATE_FORMAT(FROM_UNIXTIME(batch_time), '%Y-%m-%d') BETWEEN #{boStartDayStr} AND #{boEndDayStr}
AND DATE_FORMAT(FROM_UNIXTIME(batch_time), '%H:%i') BETWEEN #{startHourMinuteStr} AND #{endHourMinuteStr}
</select>
<select id="selectByCrossIdDirsAndTimestamp" resultType="net.wanji.databus.po.CrossDirDataHistPO">
select <include refid="Base_Column_List"></include>
from t_cross_dir_data_hist
where cross_id = #{crossId}
and dir_type in
<foreach collection="dirCodeList" item="dirCode" separator="," open="(" close=")">
#{dirCode}
</foreach>
and in_out_type = 1
and batch_time <![CDATA[ >= ]]> #{startTimeStamp}
and batch_time <![CDATA[ <= ]]> #{endTimeStamp}
order by batch_time
</select>
<select id="selectByCrossDirsAndTimeSection" resultType="net.wanji.databus.po.CrossDirDataHistPO">
SELECT <include refid="Base_Column_List"></include>
FROM t_cross_dir_data_hist
WHERE cross_id = #{crossId}
AND dir_type in
<foreach collection="dirCodeList" item="dirCode" separator="," open="(" close=")">
#{dirCode}
</foreach>
AND in_out_type = 1
AND DATE_FORMAT(FROM_UNIXTIME(batch_time), '%Y-%m-%d') BETWEEN #{boStartDayStr} AND #{boEndDayStr}
AND DATE_FORMAT(FROM_UNIXTIME(batch_time), '%H:%i') BETWEEN #{startHourMinuteStr} AND #{endHourMinuteStr}
</select>
</mapper>
\ No newline at end of file
......@@ -33,4 +33,12 @@
and t1.gmt_modified <![CDATA[ >= ]]> #{startTimeStr}
</select>
<select id="selectByIdAndTimeSection" resultType="net.wanji.databus.dao.entity.GreenwaveHistPO">
select <include refid="Base_Column_List"/>
from t_greenwave_hist
where id = #{greenwaveId}
and gmt_modified <![CDATA[ <= ]]> #{endTimeStr}
and gmt_modified <![CDATA[ >= ]]> #{startTimeStr}
</select>
</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