Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
traffic-signal-platform
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
signal
traffic-signal-platform
Commits
3838cf4d
Commit
3838cf4d
authored
Oct 18, 2023
by
duanruiming
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
dd756b7b
2ac30c82
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
242 additions
and
125 deletions
+242
-125
MainlineEvaluateServiceImpl.java
...t/wanji/opt/service/impl/MainlineEvaluateServiceImpl.java
+127
-65
TrendServiceImpl.java
...ain/java/net/wanji/opt/service/impl/TrendServiceImpl.java
+114
-56
CrossDataRealtimeMapper.xml
...bus/src/main/resources/mapper/CrossDataRealtimeMapper.xml
+1
-4
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/MainlineEvaluateServiceImpl.java
View file @
3838cf4d
...
...
@@ -140,22 +140,38 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
List
<
CrossDataHistPO
>
crossPOList
=
crossDataHistMapper
.
selectByCrossIdAndStartEnd
(
crossId
,
startTimeStamp
,
endTimeStamp
);
for
(
String
timeStr
:
timeList
)
{
Date
startDatetime
=
calcDate
(
timeStr
,
startTime
);
// 解析 timeStr 为 Calendar 对象
String
[]
timeParts
=
timeStr
.
split
(
":"
);
int
hour
=
Integer
.
parseInt
(
timeParts
[
0
]);
int
minute
=
Integer
.
parseInt
(
timeParts
[
1
]);
Calendar
startTimeCal
=
Calendar
.
getInstance
();
startTimeCal
.
set
(
Calendar
.
HOUR_OF_DAY
,
hour
);
startTimeCal
.
set
(
Calendar
.
MINUTE
,
minute
);
startTimeCal
.
set
(
Calendar
.
SECOND
,
0
);
startTimeCal
.
set
(
Calendar
.
MILLISECOND
,
0
);
// 计算结束时间
Calendar
endTimeCal
=
(
Calendar
)
startTimeCal
.
clone
();
endTimeCal
.
add
(
Calendar
.
MINUTE
,
minutes
);
// 过滤 crossPOList 中的记录
List
<
CrossDataHistPO
>
filteredList
=
crossPOList
.
stream
()
.
filter
(
crossPO
->
{
// 将 batchTime 转换为小时和分钟
Calendar
batchTimeCal
=
Calendar
.
getInstance
();
batchTimeCal
.
setTimeInMillis
(
crossPO
.
getBatchTime
()
*
1000L
);
// 将时间戳转换为毫秒
String
batchTimeStr
=
hourMinuteFormat
.
format
(
batchTimeCal
.
getTime
());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String
endTimeStr
=
hourMinuteFormat
.
format
(
endTimeCal
.
getTime
());
return
(
batchTimeStr
.
compareTo
(
timeStr
)
>=
0
&&
batchTimeStr
.
compareTo
(
endTimeStr
)
<=
0
);
})
.
collect
(
Collectors
.
toList
());
MainlineEvaluateBottomCurveVO
vo
=
new
MainlineEvaluateBottomCurveVO
();
vo
.
setMetricTime
(
timeStr
);
// 计算 endDatetime
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
startDatetime
);
calendar
.
add
(
Calendar
.
MINUTE
,
minutes
);
Date
endDatetime
=
calendar
.
getTime
();
// 转换为 10 位时间戳
int
startTimeStampPart
=
(
int
)
(
startDatetime
.
getTime
()
/
1000
);
int
endTimeStampPart
=
(
int
)
(
endDatetime
.
getTime
()
/
1000
);
// 使用流式编程进行筛选
List
<
CrossDataHistPO
>
filteredList
=
crossPOList
.
stream
()
.
filter
(
po
->
po
.
getBatchTime
()
>=
startTimeStampPart
&&
po
.
getBatchTime
()
<=
endTimeStampPart
)
.
collect
(
Collectors
.
toList
());
if
(
Objects
.
equals
(
metricCode
,
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
()))
{
double
v
=
filteredList
.
stream
()
.
mapToDouble
(
CrossDataHistPO:
:
getNoStopRate
)
...
...
@@ -229,8 +245,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId
,
startTimeStamp
,
endTimeStamp
);
for
(
String
timeStr
:
timeList
)
{
Date
startDatetime
=
calcDate
(
timeStr
,
startTime
);
for
(
String
dirStr
:
scopeList
)
{
int
index
=
dirStr
.
indexOf
(
"进口"
);
String
dirName
=
dirStr
.
substring
(
0
,
index
);
...
...
@@ -240,20 +254,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
vo
.
setMetricTime
(
timeStr
);
vo
.
setScopeName
(
dirStr
);
// 计算 endDatetime
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
startDatetime
);
calendar
.
add
(
Calendar
.
MINUTE
,
minutes
);
Date
endDatetime
=
calendar
.
getTime
();
// 转换为 10 位时间戳
int
startTimeStampPart
=
(
int
)
(
startDatetime
.
getTime
()
/
1000
);
int
endTimeStampPart
=
(
int
)
(
endDatetime
.
getTime
()
/
1000
);
// 使用流式编程进行筛选
// 解析 timeStr 为 Calendar 对象
String
[]
timeParts
=
timeStr
.
split
(
":"
);
int
hour
=
Integer
.
parseInt
(
timeParts
[
0
]);
int
minute
=
Integer
.
parseInt
(
timeParts
[
1
]);
Calendar
startTimeCal
=
Calendar
.
getInstance
();
startTimeCal
.
set
(
Calendar
.
HOUR_OF_DAY
,
hour
);
startTimeCal
.
set
(
Calendar
.
MINUTE
,
minute
);
startTimeCal
.
set
(
Calendar
.
SECOND
,
0
);
startTimeCal
.
set
(
Calendar
.
MILLISECOND
,
0
);
// 计算结束时间
Calendar
endTimeCal
=
(
Calendar
)
startTimeCal
.
clone
();
endTimeCal
.
add
(
Calendar
.
MINUTE
,
minutes
);
// 过滤 poList 中的记录
List
<
CrossDirDataHistPO
>
filteredList
=
dirPOList
.
stream
()
.
filter
(
po
->
po
.
getDirType
().
equals
(
dirCode
))
.
filter
(
po
->
po
.
getInOutType
().
equals
(
1
))
.
filter
(
po
->
po
.
getBatchTime
()
>=
startTimeStampPart
&&
po
.
getBatchTime
()
<=
endTimeStampPart
)
.
filter
(
po
->
{
// 将 batchTime 转换为小时和分钟
Calendar
batchTimeCal
=
Calendar
.
getInstance
();
batchTimeCal
.
setTimeInMillis
(
po
.
getBatchTime
()
*
1000L
);
// 将时间戳转换为毫秒
String
batchTimeStr
=
hourMinuteFormat
.
format
(
batchTimeCal
.
getTime
());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String
endTimeStr
=
hourMinuteFormat
.
format
(
endTimeCal
.
getTime
());
return
(
batchTimeStr
.
compareTo
(
timeStr
)
>=
0
&&
batchTimeStr
.
compareTo
(
endTimeStr
)
<=
0
);
})
.
collect
(
Collectors
.
toList
());
if
(
Objects
.
equals
(
metricCode
,
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
()))
{
double
v
=
filteredList
.
stream
()
...
...
@@ -322,8 +351,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId
,
endTimeStamp
,
startTimeStamp
);
for
(
String
timeStr
:
timeList
)
{
Date
startDatetime
=
calcDate
(
timeStr
,
startTime
);
for
(
String
turnStr
:
scopeList
)
{
int
index
=
turnStr
.
indexOf
(
"进口"
);
String
dirName
=
turnStr
.
substring
(
0
,
index
);
...
...
@@ -335,20 +362,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
vo
.
setMetricTime
(
timeStr
);
vo
.
setScopeName
(
turnStr
);
// 计算 endDatetime
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
startDatetime
);
calendar
.
add
(
Calendar
.
MINUTE
,
minutes
);
Date
endDatetime
=
calendar
.
getTime
();
// 转换为 10 位时间戳
int
startTimeStampPart
=
(
int
)
(
startDatetime
.
getTime
()
/
1000
);
int
endTimeStampPart
=
(
int
)
(
endDatetime
.
getTime
()
/
1000
);
// 使用流式编程进行筛选
// 解析 timeStr 为 Calendar 对象
String
[]
timeParts
=
timeStr
.
split
(
":"
);
int
hour
=
Integer
.
parseInt
(
timeParts
[
0
]);
int
minute
=
Integer
.
parseInt
(
timeParts
[
1
]);
Calendar
startTimeCal
=
Calendar
.
getInstance
();
startTimeCal
.
set
(
Calendar
.
HOUR_OF_DAY
,
hour
);
startTimeCal
.
set
(
Calendar
.
MINUTE
,
minute
);
startTimeCal
.
set
(
Calendar
.
SECOND
,
0
);
startTimeCal
.
set
(
Calendar
.
MILLISECOND
,
0
);
// 计算结束时间
Calendar
endTimeCal
=
(
Calendar
)
startTimeCal
.
clone
();
endTimeCal
.
add
(
Calendar
.
MINUTE
,
minutes
);
// 过滤 poList 中的记录
List
<
CrossTurnDataHistPO
>
filteredList
=
dirPOList
.
stream
()
.
filter
(
po
->
po
.
getInDir
().
equals
(
dirCode
))
.
filter
(
po
->
po
.
getTurnType
().
equals
(
turnCode
))
.
filter
(
po
->
po
.
getBatchTime
()
>=
startTimeStampPart
&&
po
.
getBatchTime
()
<=
endTimeStampPart
)
.
filter
(
po
->
{
// 将 batchTime 转换为小时和分钟
Calendar
batchTimeCal
=
Calendar
.
getInstance
();
batchTimeCal
.
setTimeInMillis
(
po
.
getBatchTime
()
*
1000L
);
// 将时间戳转换为毫秒
String
batchTimeStr
=
hourMinuteFormat
.
format
(
batchTimeCal
.
getTime
());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String
endTimeStr
=
hourMinuteFormat
.
format
(
endTimeCal
.
getTime
());
return
(
batchTimeStr
.
compareTo
(
timeStr
)
>=
0
&&
batchTimeStr
.
compareTo
(
endTimeStr
)
<=
0
);
})
.
collect
(
Collectors
.
toList
());
if
(
Objects
.
equals
(
metricCode
,
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
()))
{
double
v
=
filteredList
.
stream
()
...
...
@@ -417,8 +459,6 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId
,
endTimeStamp
,
startTimeStamp
);
for
(
String
timeStr
:
timeList
)
{
Date
startDatetime
=
calcDate
(
timeStr
,
startTime
);
for
(
String
laneStr
:
scopeList
)
{
int
indexOfJinKou
=
laneStr
.
indexOf
(
"进口"
);
int
indexOfCheDao
=
laneStr
.
indexOf
(
"车道"
);
...
...
@@ -434,20 +474,35 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
vo
.
setMetricTime
(
timeStr
);
vo
.
setScopeName
(
laneStr
);
// 计算 endDatetime
Calendar
calendar
=
Calendar
.
getInstance
();
calendar
.
setTime
(
startDatetime
);
calendar
.
add
(
Calendar
.
MINUTE
,
minutes
);
Date
endDatetime
=
calendar
.
getTime
();
// 转换为 10 位时间戳
int
startTimeStampPart
=
(
int
)
(
startDatetime
.
getTime
()
/
1000
);
int
endTimeStampPart
=
(
int
)
(
endDatetime
.
getTime
()
/
1000
);
// 筛选方向、车道序号
// 解析 timeStr 为 Calendar 对象
String
[]
timeParts
=
timeStr
.
split
(
":"
);
int
hour
=
Integer
.
parseInt
(
timeParts
[
0
]);
int
minute
=
Integer
.
parseInt
(
timeParts
[
1
]);
Calendar
startTimeCal
=
Calendar
.
getInstance
();
startTimeCal
.
set
(
Calendar
.
HOUR_OF_DAY
,
hour
);
startTimeCal
.
set
(
Calendar
.
MINUTE
,
minute
);
startTimeCal
.
set
(
Calendar
.
SECOND
,
0
);
startTimeCal
.
set
(
Calendar
.
MILLISECOND
,
0
);
// 计算结束时间
Calendar
endTimeCal
=
(
Calendar
)
startTimeCal
.
clone
();
endTimeCal
.
add
(
Calendar
.
MINUTE
,
minutes
);
// 过滤 poList 中的记录
List
<
CrossLaneDataHistPOExt
>
filteredList
=
lanePOList
.
stream
()
.
filter
(
po
->
po
.
getDir
().
equals
(
dirCode
))
.
filter
(
po
->
po
.
getSort
().
equals
(
laneSort
))
.
filter
(
po
->
po
.
getBatchTime
()
>=
startTimeStampPart
&&
po
.
getBatchTime
()
<=
endTimeStampPart
)
.
filter
(
po
->
{
// 将 batchTime 转换为小时和分钟
Calendar
batchTimeCal
=
Calendar
.
getInstance
();
batchTimeCal
.
setTimeInMillis
(
po
.
getBatchTime
()
*
1000L
);
// 将时间戳转换为毫秒
String
batchTimeStr
=
hourMinuteFormat
.
format
(
batchTimeCal
.
getTime
());
// 比较 batchTime 是否在 timeStr 和 endTimeStr 之间
String
endTimeStr
=
hourMinuteFormat
.
format
(
endTimeCal
.
getTime
());
return
(
batchTimeStr
.
compareTo
(
timeStr
)
>=
0
&&
batchTimeStr
.
compareTo
(
endTimeStr
)
<=
0
);
})
.
collect
(
Collectors
.
toList
());
if
(
Objects
.
equals
(
metricCode
,
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
()))
{
...
...
@@ -920,10 +975,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId
,
nonCoordDirCodeList
,
boStartDayStr
,
boEndDayStr
,
startHourMinute
,
endHourMinute
);
// 计算非协调方向指标(排队长度)
int
nonCoordValue
=
(
int
)
(
crossDirDataHistPOList
.
stream
()
double
nonCoordValueDouble
=
(
crossDirDataHistPOList
.
stream
()
.
mapToDouble
(
CrossDirDataHistPO:
:
getQueueLength
)
.
average
()
.
max
()
.
orElse
(
0.0
));
int
nonCoordValue
=
(
int
)
Math
.
round
(
nonCoordValueDouble
);
return
nonCoordValue
;
}
...
...
@@ -938,10 +994,11 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
crossId
,
coordDirCodeList
,
boStartDayStr
,
boEndDayStr
,
startHourMinute
,
endHourMinute
);
// 计算协调方向指标(不停车通过率)
int
coordValue
=
(
int
)
(
crossDirDataHistPOList
.
stream
()
double
coordValueDouble
=
(
crossDirDataHistPOList
.
stream
()
.
mapToDouble
(
CrossDirDataHistPO:
:
getNoStopRate
)
.
average
()
.
orElse
(
0.0
)
*
100
);
int
coordValue
=
(
int
)
Math
.
round
(
coordValueDouble
);
return
coordValue
;
}
...
...
@@ -1501,13 +1558,8 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
}
private
String
reverseDirName
(
String
input
,
String
character
)
{
int
index
=
input
.
indexOf
(
character
);
if
(
index
!=
-
1
)
{
String
part1
=
input
.
substring
(
index
+
character
.
length
());
// Part after "向"
String
part2
=
input
.
substring
(
0
,
index
+
character
.
length
());
// Part before and including "向"
return
part1
+
part2
;
}
return
input
;
String
[]
split
=
input
.
split
(
character
);
return
split
[
1
]
+
character
+
split
[
0
];
}
private
List
<
String
>
calcEvaluateData
(
...
...
@@ -1886,16 +1938,26 @@ public class MainlineEvaluateServiceImpl implements MainlineEvaluateService {
}
private
List
<
String
>
buildTimeList
(
Date
startTime
,
Date
endTime
,
Integer
minutes
)
{
// 用于存储时间区间的列表
List
<
String
>
timeList
=
new
ArrayList
<>();
Calendar
cal
=
Calendar
.
getInstance
();
cal
.
setTime
(
startTime
);
long
timeDifference
=
endTime
.
getTime
()
-
startTime
.
getTime
();
boolean
exceeds24Hours
=
timeDifference
>
(
24
*
60
*
60
*
1000
);
Set
<
String
>
timeSet
=
new
HashSet
<>();
while
(
cal
.
getTime
().
before
(
endTime
)
||
cal
.
getTime
().
equals
(
endTime
))
{
String
formattedTime
=
hourMinuteFormat
.
format
(
cal
.
getTime
());
if
(
exceeds24Hours
)
{
if
(
timeSet
.
contains
(
formattedTime
))
{
// 如果 startTime 和 endTime 时间差大于24小时,则 timeList 只保留第一条重复元素之前的元素
break
;
}
timeSet
.
add
(
formattedTime
);
}
timeList
.
add
(
formattedTime
);
// 增加指定分钟数
cal
.
add
(
Calendar
.
MINUTE
,
minutes
);
}
return
timeList
;
...
...
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/TrendServiceImpl.java
View file @
3838cf4d
...
...
@@ -361,8 +361,6 @@ public class TrendServiceImpl implements TrendService {
public
List
<
GreenwaveRunMonitorVO
>
greenwaveRunMonitor
(
GreenwaveIdBO
greenwaveIdBO
)
{
List
<
GreenwaveRunMonitorVO
>
res
=
new
ArrayList
<>();
Date
nowTime
=
new
Date
();
// todo 测试用,固定当前时间
nowTime
=
DateUtil
.
parse
(
"2023-06-09 15:00:00"
,
"yyyy-MM-dd HH:mm:ss"
);
List
<
GreenwaveHistPOExt
>
extList
=
greenwaveHistMapper
.
selectRunMonitor
(
nowTime
);
for
(
GreenwaveHistPOExt
greenwaveHistPOExt
:
extList
)
{
GreenwaveRunMonitorVO
greenWaveRunMonitorVO
=
new
GreenwaveRunMonitorVO
();
...
...
@@ -741,17 +739,28 @@ public class TrendServiceImpl implements TrendService {
@Override
public
List
<
GreenwaveCrossMetricsVO
>
greenwaveCrossMetrics
(
GreenwaveIdAndTimeStampBO
greenwaveIdAndTimeStampBO
)
{
List
<
GreenwaveCrossMetricsVO
>
res
=
new
ArrayList
<>();
Long
timeStamp
=
greenwaveIdAndTimeStampBO
.
getTimeStamp
();
Integer
greenwaveId
=
greenwaveIdAndTimeStampBO
.
getGreenwaveId
();
Long
timeStamp
=
greenwaveIdAndTimeStampBO
.
getTimeStamp
();
// todo 测试用,时间戳设定为 1676082600
timeStamp
=
1676082600L
;
GreenwaveInfoPO
greenwaveInfoPO
=
greenwaveInfoMapper
.
selectById
(
greenwaveId
);
String
greenwaveName
=
greenwaveInfoPO
.
getName
();
// 旅游路 东向西 转山西路至霞景路路段:正向绿波
String
[]
split
=
greenwaveName
.
split
(
" "
);
String
[]
split1
=
split
[
1
].
split
(
"向"
);
// 东向西
String
dirName1
=
split1
[
0
];
String
dirName2
=
split1
[
1
];
List
<
GreenwaveCrossPO
>
greenwaveCrossList
=
greenwaveCrossMapper
.
selectByGreenwaveId
(
greenwaveId
);
int
crossListSize
=
greenwaveCrossList
.
size
();
int
lastCrossIndex
=
crossListSize
-
1
;
for
(
int
i
=
0
;
i
<
crossListSize
;
i
++)
{
GreenwaveCrossPO
greenwaveCrossPO
=
greenwaveCrossList
.
get
(
i
);
// 根据路口ID去重,并按路口顺序号排序
Map
<
String
,
GreenwaveCrossPO
>
uniqueMap
=
greenwaveCrossList
.
stream
()
.
collect
(
Collectors
.
toMap
(
GreenwaveCrossPO:
:
getCrossId
,
// 使用crossId作为键
Function
.
identity
(),
// 使用对象本身作为值
(
existing
,
replacement
)
->
existing
));
// 如果有重复的key, 保留第一个
// 从uniqueMap中获取去重后的记录列表
List
<
GreenwaveCrossPO
>
uniqueList
=
new
ArrayList
<>(
uniqueMap
.
values
());
for
(
GreenwaveCrossPO
greenwaveCrossPO
:
uniqueList
)
{
GreenwaveCrossMetricsVO
greenwaveCrossMetricsVO
=
new
GreenwaveCrossMetricsVO
();
String
crossId
=
greenwaveCrossPO
.
getCrossId
();
greenwaveCrossMetricsVO
.
setCrossId
(
crossId
);
...
...
@@ -759,57 +768,93 @@ public class TrendServiceImpl implements TrendService {
if
(
baseCrossInfoPO
!=
null
)
{
greenwaveCrossMetricsVO
.
setCrossName
(
baseCrossInfoPO
.
getName
());
}
String
currentCrossId
=
crossId
;
long
currentSeconds
=
timeStamp
;
long
preSeconds
=
currentSeconds
-
60
*
5
;
// 获取当前方案
Integer
sectionId
=
greenwaveCrossPO
.
getSectionId
();
CrossSectionPO
crossSectionPO
=
baseCrossSectionMapper
.
selectById
(
sectionId
);
Integer
schemeId
=
crossSectionPO
.
getSchemeId
();
// 获取协调相位对应的车道集合
BaseCrossSchemePO
baseCrossSchemePO
=
baseCrossSchemeMapper
.
selectById
(
schemeId
);
Integer
coordPhaseID
=
baseCrossSchemePO
.
getCoordPhase
();
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
=
crossPhaseLightsMapper
.
selectByPhaseId
(
coordPhaseID
);
List
<
Integer
>
lightIds
=
crossPhaseLightsPOList
.
stream
()
.
map
(
CrossPhaseLightsPO:
:
getLightsId
)
.
collect
(
Collectors
.
toList
());
List
<
CrossLaneLightsPO
>
crossLaneLightsPOList
=
baseCrossLaneLightsMapper
.
selectByLightIds
(
lightIds
);
List
<
String
>
laneIds
=
crossLaneLightsPOList
.
stream
()
.
map
(
CrossLaneLightsPO:
:
getLaneId
)
.
collect
(
Collectors
.
toList
());
List
<
CrossBaseLaneInfoPO
>
lanePOList
=
crossBaseLaneInfoMapper
.
selectBatchIds
(
laneIds
);
// 构造方向+转向列表
List
<
List
<
Integer
>>
dirTurnList
=
new
ArrayList
<>();
for
(
CrossBaseLaneInfoPO
lanePO
:
lanePOList
)
{
Integer
dir
=
lanePO
.
getDir
();
Integer
turn
=
lanePO
.
getTurn
();
List
<
Integer
>
dirTurn
=
new
ArrayList
<>();
dirTurn
.
add
(
dir
);
dirTurn
.
add
(
turn
);
dirTurnList
.
add
(
dirTurn
);
}
// 计算指标
List
<
CrossTurnDataHistPO
>
listForNoPark
=
new
ArrayList
<>();
for
(
List
<
Integer
>
dirTurn
:
dirTurnList
)
{
Integer
dir
=
dirTurn
.
get
(
0
);
Integer
turnInt
=
dirTurn
.
get
(
1
);
String
turn
=
TurnConvertEnum
.
getCodeByKey
(
turnInt
);
CrossTurnDataHistPO
noPark
=
crossTurnDataHistMapper
.
selectNoPark
(
currentCrossId
,
dir
,
turn
,
currentSeconds
,
preSeconds
);
if
(
noPark
!=
null
)
{
listForNoPark
.
add
(
noPark
);
}
List
<
Integer
>
coordDirList
=
new
ArrayList
<
Integer
>();
int
direction
=
greenwaveInfoPO
.
getDir
();
if
(
direction
==
0
)
{
// 正向
Integer
dirCode
=
BaseEnum
.
SignalDirectionEnum
.
getCodeByName
(
dirName1
);
dirCode
=
convertDirCode
(
dirName1
,
crossId
,
dirCode
);
coordDirList
.
add
(
dirCode
);
}
else
if
(
direction
==
2
)
{
// 反向
Integer
dirCode
=
BaseEnum
.
SignalDirectionEnum
.
getCodeByName
(
dirName2
);
dirCode
=
convertDirCode
(
dirName2
,
crossId
,
dirCode
);
coordDirList
.
add
(
dirCode
);
}
else
{
// 双向
Integer
dirCode1
=
BaseEnum
.
SignalDirectionEnum
.
getCodeByName
(
dirName1
);
dirCode1
=
convertDirCode
(
dirName1
,
crossId
,
dirCode1
);
coordDirList
.
add
(
dirCode1
);
Integer
dirCode2
=
BaseEnum
.
SignalDirectionEnum
.
getCodeByName
(
dirName2
);
dirCode2
=
convertDirCode
(
dirName1
,
crossId
,
dirCode2
);
coordDirList
.
add
(
dirCode2
);
}
List
<
CrossTurnDataHistPO
>
allPO
=
crossTurnDataHistMapper
.
selectByCrossId
(
currentCrossId
,
currentSeconds
,
preSeconds
);
List
<
CrossTurnDataHistPO
>
listForPhaseQueue
=
getPhaseQueueList
(
listForNoPark
,
allPO
);
setMetrics
(
greenwaveCrossMetricsVO
,
greenwaveCrossPO
,
listForNoPark
,
listForPhaseQueue
);
int
currentSeconds
=
(
int
)
(
timeStamp
/
1000
);
int
preSeconds
=
(
int
)
(
currentSeconds
-
60
*
5
);
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
=
crossDirDataHistMapper
.
selectByCrossIdAndStartEnd
(
crossId
,
preSeconds
,
currentSeconds
);
greenwaveCrossMetricsVO
.
setNoparkPassRate
(
calcNoparkPassRate
(
crossDirDataHistPOList
,
coordDirList
));
greenwaveCrossMetricsVO
.
setUncoordinatePhaseQueue
(
calcUncoordinatePhaseQueue
(
crossDirDataHistPOList
,
coordDirList
));
Double
nextCrossLen
=
greenwaveCrossPO
.
getNextCrossLen
();
greenwaveCrossMetricsVO
.
setTrvalTime
(
calcTravelTime
(
crossDirDataHistPOList
,
coordDirList
,
nextCrossLen
));
res
.
add
(
greenwaveCrossMetricsVO
);
}
return
res
;
}
private
Integer
calcTravelTime
(
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
,
List
<
Integer
>
coordDirList
,
Double
nextCrossLen
)
{
double
average
=
crossDirDataHistPOList
.
stream
()
.
filter
(
po
->
po
.
getInOutType
()
==
1
&&
coordDirList
.
contains
(
po
.
getDirType
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getSpeed
)
.
average
()
.
orElse
(
0.0
);
if
(
average
!=
0.0
)
{
return
(
int
)
(
nextCrossLen
/
average
);
}
else
{
return
0
;
}
}
private
Integer
calcUncoordinatePhaseQueue
(
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
,
List
<
Integer
>
coordDirList
)
{
double
average
=
crossDirDataHistPOList
.
stream
()
.
filter
(
po
->
po
.
getInOutType
()
==
1
&&
!
coordDirList
.
contains
(
po
.
getDirType
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getQueueLength
)
.
average
()
.
orElse
(
0.0
);
return
(
int
)
average
;
}
private
Integer
calcNoparkPassRate
(
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
,
List
<
Integer
>
coordDirList
)
{
double
average
=
crossDirDataHistPOList
.
stream
()
.
filter
(
po
->
po
.
getInOutType
()
==
1
&&
coordDirList
.
contains
(
po
.
getDirType
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getNoStopRate
)
.
average
()
.
orElse
(
0.0
);
return
(
int
)
(
average
*
100
);
}
private
Integer
convertDirCode
(
String
dirStr
,
String
crossId
,
Integer
dirCode
)
{
if
(
Objects
.
equals
(
crossId
,
"13NF80B5QN0"
))
{
// 霞景路方向转换
if
(
Objects
.
equals
(
dirStr
,
"东"
))
{
dirCode
=
2
;
// 东北
}
else
if
(
Objects
.
equals
(
dirStr
,
"西"
))
{
dirCode
=
6
;
// 西南
}
}
else
if
(
Objects
.
equals
(
crossId
,
"13NGH0B5RC0"
))
{
// 洪山路方向转换
if
(
Objects
.
equals
(
dirStr
,
"西"
))
{
dirCode
=
6
;
// 西南
}
}
return
dirCode
;
}
private
List
<
CrossTurnDataHistPO
>
getPhaseQueueList
(
List
<
CrossTurnDataHistPO
>
listForNoPark
,
List
<
CrossTurnDataHistPO
>
allPO
)
{
// 去除协调相位,用于计算非协调相位二次排队
...
...
@@ -1010,7 +1055,22 @@ public class TrendServiceImpl implements TrendService {
private
List
<
GreenWaveCrossMonitorVO
>
buildRes
(
List
<
GreenwaveCrossPO
>
greenwaveCrossPOList
)
{
List
<
GreenWaveCrossMonitorVO
>
res
=
new
ArrayList
<>();
for
(
GreenwaveCrossPO
greenwaveCrossPO
:
greenwaveCrossPOList
)
{
// 根据路口ID去重,并按路口顺序号排序
Map
<
String
,
GreenwaveCrossPO
>
uniqueMap
=
greenwaveCrossPOList
.
stream
()
.
collect
(
Collectors
.
toMap
(
GreenwaveCrossPO:
:
getCrossId
,
// 使用crossId作为键
Function
.
identity
(),
// 使用对象本身作为值
(
existing
,
replacement
)
->
existing
));
// 如果有重复的key, 保留第一个
// 从uniqueMap中获取去重后的记录列表
List
<
GreenwaveCrossPO
>
uniqueList
=
new
ArrayList
<>(
uniqueMap
.
values
());
// 根据sort属性对uniqueList进行排序
uniqueList
.
sort
(
Comparator
.
comparingInt
(
GreenwaveCrossPO:
:
getSort
));
for
(
GreenwaveCrossPO
greenwaveCrossPO
:
uniqueList
)
{
GreenWaveCrossMonitorVO
greenWaveCrossMonitorVO
=
new
GreenWaveCrossMonitorVO
();
String
crossId
=
greenwaveCrossPO
.
getCrossId
();
...
...
@@ -1041,8 +1101,6 @@ public class TrendServiceImpl implements TrendService {
List
<
AbnormalCrossDetailVO
.
DirDataElement
>
dirData
=
new
ArrayList
<>();
// 获取当前时间之前40分钟的10位时间戳
long
currentSeconds
=
DateUtil
.
currentSeconds
();
// todo 测试,当前时间固定为 1676082536
currentSeconds
=
1676082536
;
long
preSeconds
=
currentSeconds
-
40
*
60
;
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
=
crossDirDataHistMapper
.
selectByCrossIdAndTimestamp
(
crossId
,
preSeconds
);
...
...
wj-databus/src/main/resources/mapper/CrossDataRealtimeMapper.xml
View file @
3838cf4d
...
...
@@ -78,10 +78,7 @@
on t1.cross_id = t2.id
<where>
<if
test=
"status != null"
>
and (t1.status = #{status}
<if
test=
"status == 1"
>
and t1.is_unbalance = 1
</if>
<if
test=
"status == 2"
>
and t1.is_congestion = 1
</if>
<if
test=
"status == 3"
>
and t1.is_spillover = 1
</if>
)
and t1.status = #{status}
</if>
<if
test=
"name != null and name != ''"
>
and t2.name like concat('%',#{name},'%')
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment