Commit dbf5d81c authored by 杜伟's avatar 杜伟

优化代码

parent db6b6365
......@@ -18,11 +18,7 @@ import net.wanji.databus.dao.entity.*;
import net.wanji.databus.dao.mapper.*;
import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.databus.po.*;
import net.wanji.databus.vo.AbnormalCrossListVO;
import net.wanji.databus.vo.CrossDataHistVO;
import net.wanji.databus.vo.CrossDirDataHistVO;
import net.wanji.databus.vo.CrossTurnDataHistVO;
import net.wanji.databus.vo.GreenwaveListVO;
import net.wanji.databus.vo.*;
import net.wanji.opt.bo.*;
import net.wanji.opt.cache.BaseCrossInfoCache;
import net.wanji.opt.common.ExcelExportUtils;
......@@ -1511,6 +1507,132 @@ public class TrendServiceImpl implements TrendService {
return sortedRes;
}
/**
* 构建车道级数据
* @param crossId
* @param poExtList
* @return
*/
private List<TableQueryVO.CycleDataElement> buildLaneCycleData(String crossId, List<CrossLaneDataHistVOExt> poExtList) {
List<TableQueryVO.CycleDataElement> res = new ArrayList<>();
// int pedFlow = 0;
for (CrossLaneDataHistVOExt po : poExtList) {
TableQueryVO.CycleDataElement vo = new TableQueryVO.CycleDataElement();
vo.setTime(po.getStartTime());
vo.setDir(po.getDir());
vo.setDirName(BaseEnum.SignalDirectionEnum.getNameByCode(po.getDir()));
String dirName = BaseEnum.SignalDirectionEnum.getNameByCode(po.getDir());
String turnName = TurnConvertEnum.getDescByKey(po.getTurn());
vo.setLaneSort(String.join("-", dirName, turnName, String.valueOf(po.getSort())));
vo.setPedFlow(po.getFlow());
vo.setTrafficFlowA(po.getTrafficFlowA());
vo.setTrafficFlowB(po.getTrafficFlowB());
vo.setTrafficFlowC(po.getTrafficFlowC());
vo.setNonMotorFlow(po.getNonMotorFlow());
Double speed = po.getSpeed();
vo.setSpeed((int) Math.round(speed));
vo.setFlow(po.getFlow());
vo.setAllFlow(po.getFlow() + po.getNonMotorFlow() + po.getFlow());
//----------------------------
// if (po.getId().contains(crossId.concat(Constants.SystemParam.SEPARATOR_MINUS))) {
// pedFlow += po.getFlow();
// }
Integer batchTime = po.getBatchTime();
// 将10位时间戳转换为毫秒
long millis = batchTime * 1000L;
// 使用毫秒值创建Date对象
// Date dateFromTimestamp = new Date(millis);
Double queueLength = po.getQueueLength();
vo.setQueueLength((int) Math.round(queueLength));
Integer delayTime = po.getDelayTime();
vo.setDelayTime(delayTime);
//路口效率指数
vo.setEfficiencyIndex(0.0);
//效率评价等级
vo.setEfficiencyEvaluateLevel(0.0);
Double stopTimes = po.getStopTimes();
vo.setStopTimes((int) Math.round(stopTimes));
Double vehheadTime = po.getVehheadTime();
vo.setVehheadTime((int) Math.round(vehheadTime));
//饱和度
vo.setSaturation(0.0);//po.getSaturation()
//拥堵指数
vo.setCongestionIndex(0.0);
//溢出指数
vo.setOverflowIndex(0.0);
//失衡指数
vo.setImbalanceIndex(0.0);
//拥堵次数
vo.setCongestionTimes(0);
//溢出次数
vo.setOverflowTimes(0);
//失衡次数
vo.setImbalanceTimes(0);
//空放次数
vo.setFreeFlowTimes(0);
//溢流率
vo.setOverflowRate(0.0);
//冲突点
vo.setConflictPoint(0);
Double timeOccupancyDouble = po.getTimeOccupancy();
if (timeOccupancyDouble != null) {
vo.setTimeOccupancy((int) Math.round(timeOccupancyDouble * 100));
}
Double vehicleLengthRatioMean = po.getVehicleLengthRatioMean();
if (vehicleLengthRatioMean != null) {
vo.setVehicleNumsRatioMean((int) Math.round(vehicleLengthRatioMean * 100));
}
//路口服务水平
vo.setServiceLevel(0);
//路口安全系数
vo.setSafetyCoefficient(0.0);
//安全评价等级
vo.setSafetyEvaluateLevel(0);
//交通事件数
vo.setTrafficEventNum(0);
//交通事故数
vo.setTrafficAccidentNum(0);
//不停车通过率
vo.setNoStopPassRate(0);
//一次停车通过率
vo.setOneStopPassRate(0);
//二次停车通过率
vo.setTwoStopPassRate(0);
//路口未清空率
vo.setCrossNoClearRate(0);
//平均排队长度
vo.setAvgQueueLength(0.0);
//绿灯有效利用率
vo.setGreenLightEfficiency(0.0);
//行人平均通过时间
vo.setPedAvgPassTime(0.0);
//行人闯红灯率
vo.setPedCrossRedLightRate(0.0);
vo.setVehheadDist(po.getVehheadDist());
vo.setV85(Math.round(po.getV85() * 100) / 100);
vo.setAllVehiceleFlow(po.getFlow() + po.getNonMotorFlow());
vo.setTurn(po.getTurn());
res.add(vo);
}
List<TableQueryVO.CycleDataElement> sortedRes = res.stream()
.sorted(Comparator.comparing(TableQueryVO.CycleDataElement::getTime).reversed())
.collect(Collectors.toList());
return sortedRes;
}
/**
* 构建转向级
* @param crossId
......@@ -2408,10 +2530,23 @@ public class TrendServiceImpl implements TrendService {
String crossId = crossIdDateTimeVO.getCrossId();
int start = (int) (crossIdDateTimeVO.getStart().getTime() / 1000);
int end = (int) (crossIdDateTimeVO.getEnd().getTime() / 1000);
String ids = crossIdDateTimeVO.getIds();
List<String> idsList = null;
if (!StringUtils.isBlank(ids)) {
idsList = Arrays.asList(ids.split(","));
}
//分析粒度【5m:五分钟 10m:10分钟 30m:30分钟 1h:一小时】
String granularity = crossIdDateTimeVO.getGranularity();
if (StringUtils.isBlank(granularity)) {
granularity = "5";
}else {
granularity = granularity.replace("m", "").replace("h", "");;
}
// 查询周期数据
List<CrossLaneDataHistPOExt> poExtList = crossLaneDataHistMapper.selectByCrossIdAndTimeSpan(crossId, start, end);
return buildCycleData(crossId, poExtList);
List<CrossLaneDataHistVOExt> poExtList = crossLaneDataHistMapper.selectByCrossIdAndTimeIds(crossId, start, end, granularity, idsList);
return buildLaneCycleData(crossId, poExtList);
} catch (Exception e) {
log.error("车道数据查询异常:", e);
throw new OptServiceException(e);
......
......@@ -18,9 +18,14 @@ import java.util.Date;
@NoArgsConstructor
@ApiModel(value = "CommonCrossIdDateTimeVO")
public class CommonCrossIdDateTimeVO {
@ApiModelProperty(value = "分析粒度【5m:五分钟 10m:10分钟 30m:30分钟 1h:一小时】")
private String granularity;
@ApiModelProperty(value = "路口ID")
@NotBlank(message = "路口编号不能为空")
private String crossId;
@ApiModelProperty(value = "车道IDs")
@NotBlank(message = "车道ids不能为空")
private String ids;
@ApiModelProperty(value = "开始时间")
@NotNull(message = "开始日期不能为空")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
......
......@@ -68,7 +68,7 @@
</rollingPolicy>
</appender>
<root level="INFO">
<root level="debug">
<appender-ref ref="consoleLog"/>
<appender-ref ref="fileInfoLog"/>
<appender-ref ref="fileErrorLog"/>
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.wanji.databus.dto.MetricHistDTO;
import net.wanji.databus.po.CrossLaneDataHistPO;
import net.wanji.databus.po.CrossLaneDataHistPOExt;
import net.wanji.databus.vo.CrossLaneDataHistVOExt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -26,4 +27,14 @@ public interface CrossLaneDataHistMapper extends BaseMapper<CrossLaneDataHistPO>
Integer selectCountByCrossIdAndTimeSpan(String crossId, int startTimeStamp, int endTimeStamp);
List<CrossLaneDataHistPOExt> selectByCrossIdAndTimeSpan(String crossId, int startTimeStamp, int endTimeStamp);
/**
* 车道级查询
* @param crossId 路口id
* @param startStamp
* @param endStamp
* @param ids 车道id集合
* @return
*/
List<CrossLaneDataHistVOExt> selectByCrossIdAndTimeIds(String crossId, int startStamp, int endStamp, String granularity, List<String> ids);
}
package net.wanji.databus.vo;
import lombok.Data;
import net.wanji.databus.po.CrossLaneDataRealTimePO;
/**
* @author duanruiming
* @date 2023/03/12 20:53
*/
@Data
public class CrossLaneDataHistVOExt extends CrossLaneDataRealTimePO {
// 方向
private Integer dir;
// 车道序号,从左车道开始编号11、12、13...
private Integer sort;
// 转向
private Integer turn;
}
......@@ -113,4 +113,71 @@
and batch_time <![CDATA[ >= ]]> #{startTimeStamp}
and batch_time <![CDATA[ <= ]]> #{endTimeStamp};
</select>
<!-- 车道级查询 -->
<select id="selectByCrossIdAndTimeIds" resultType="net.wanji.databus.vo.CrossLaneDataHistVOExt">
SELECT
t1.id AS id,
t2.dir AS dir,
t2.turn AS turn,
t2.sort AS sort,
<choose>
<!-- 小时 -->
<when test="granularity==1">
DATE_FORMAT(start_time, '%Y-%m-%d %H:00:00') AS startTime,
</when>
<!-- 分钟 -->
<otherwise>
DATE_FORMAT(
CONCAT( DATE ( t1.start_time ), ' ', HOUR ( t1.start_time ), ':', FLOOR( MINUTE ( t1.start_time ) / #{granularity} ) * #{granularity} ),
'%Y-%m-%d %H:%i:00'
) AS startTime,
</otherwise>
</choose>
sum( t1.flow ) AS flow,
sum( t1.traffic_flow_C ) AS trafficFlowC,
sum( t1.traffic_flow_B ) AS trafficFlowB,
sum( t1.traffic_flow_A ) AS trafficFlowA,
avg( t1.speed ) AS speed,
avg( t1.vehhead_dist ) AS vehheadDist,
avg( t1.vehhead_time ) AS vehheadTime,
t1.queue_length,
t1.delay_time,
t1.stop_times,
t1.vehhead_time,
t1.vehhead_dist,
t1.batch_time,
t1.time_occupancy,
t1.vehicle_nums_ratio_mean,
t1.start_time,
t1.v_85,
t1.non_motor_flow,
t1.time_occupancy,
t1.vehicle_length_ratio_mean
FROM
t_base_lane_info t2
LEFT JOIN t_lane_data_hist t1 ON t1.id = t2.id
WHERE
1 = 1
<if test="crossId != null">
AND t2.cross_id = #{crossId}
</if>
<if test="ids != null">
AND t2.id IN
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</if>
and t1.batch_time <![CDATA[ >= ]]> #{startStamp}
and t1.batch_time <![CDATA[ <= ]]> #{endStamp}
GROUP BY
t2.dir,
t2.turn,
t2.sort
ORDER BY
t1.start_time DESC,
t2.dir
</select>
</mapper>
\ No newline at end of file
......@@ -80,63 +80,64 @@
<!-- 交通指标转向级统计查询:条件:路口id、时间、驶入方向、转向 -->
<select id="selectByCrossIdTurn" resultType="net.wanji.databus.vo.CrossTurnDataHistVO">
SELECT
cross_id AS crossId,
in_dir AS inDir,
turn_type AS turnType,
t1.cross_id AS crossId,
t1.in_dir AS inDir,
t1.turn_type AS turnType,
<choose>
<!-- 小时 -->
<when test="granularity==1">
DATE_FORMAT(start_time, '%Y-%m-%d %H:00:00') AS startTime,
DATE_FORMAT(t2.start_time, '%Y-%m-%d %H:00:00') AS startTime,
</when>
<!-- 分钟 -->
<otherwise>
DATE_FORMAT(
CONCAT( DATE ( start_time ), ' ', HOUR ( start_time ), ':', FLOOR( MINUTE ( start_time ) / #{granularity} ) * #{granularity} ),
CONCAT( DATE (t2.start_time ), ' ', HOUR ( t2.start_time ), ':', FLOOR( MINUTE ( t2.start_time ) / #{granularity} ) * #{granularity} ),
'%Y-%m-%d %H:%i:00'
) AS startTime,
</otherwise>
</choose>
SUM( flow ) AS flow,
avg( traffic_flow_C ) AS trafficFlowC,
avg( traffic_flow_B ) AS trafficFlowB,
avg( traffic_flow_A ) AS trafficFlowA,
avg( speed ) AS speed,
MAX( queue_length ) AS queueLength,
AVG( stop_times ) AS stopTimes
SUM( t2.flow ) AS flow,
COALESCE(sum( t2.traffic_flow_C ), 0) AS trafficFlowC,
COALESCE(sum( t2.traffic_flow_B ), 0) AS trafficFlowB,
COALESCE(sum( t2.traffic_flow_A ), 0) AS trafficFlowA,
avg( t2.speed ) AS speed,
MAX( t2.queue_length ) AS queueLength,
AVG( t2.stop_times ) AS stopTimes
FROM
t_cross_turn_data_hist
t_base_cross_turn_info t1
LEFT JOIN t_cross_turn_data_hist t2 ON t1.id = t2.id
WHERE
1 = 1
<if test="crossId != null">
AND cross_id = #{crossId}
AND t1.cross_id = #{crossId}
</if>
<if test="inDirList != null">
AND in_dir IN
AND t1.in_dir IN
<foreach item="inDir" index="index" collection="inDirList"
open="(" separator="," close=")">
#{inDir}
</foreach>
</if>
<if test="turnTypeList != null">
AND turn_type IN
AND t1.turn_type IN
<foreach item="turnType" index="index" collection="turnTypeList"
open="(" separator="," close=")">
#{turnType}
</foreach>
</if>
and batch_time <![CDATA[ >= ]]> #{startStamp}
and batch_time <![CDATA[ <= ]]> #{endStamp}
and t2.batch_time <![CDATA[ >= ]]> #{startStamp}
and t2.batch_time <![CDATA[ <= ]]> #{endStamp}
GROUP BY
cross_id,
in_dir,
turn_type,
startTime
t1.cross_id,
t1.in_dir,
t1.turn_type,
t2.start_time
ORDER BY
startTime DESC,
in_dir,
turn_type
t2.start_time DESC,
t1.in_dir,
t1.turn_type
</select>
<select id="selectMetricHistDTO" resultType="net.wanji.databus.dto.MetricHistDTO">
......
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