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
74c07590
Commit
74c07590
authored
Feb 04, 2023
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[update] 实时监控-路口优化-拥堵优化
parent
0d9a77a9
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
90 additions
and
23 deletions
+90
-23
CrossOptimizeServiceImpl.java
.../net/wanji/opt/service/impl/CrossOptimizeServiceImpl.java
+90
-23
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/CrossOptimizeServiceImpl.java
View file @
74c07590
...
...
@@ -9,6 +9,8 @@ import net.wanji.common.framework.Constants;
import
net.wanji.common.utils.tool.BeanListUtils
;
import
net.wanji.common.utils.tool.DateUtil
;
import
net.wanji.common.utils.tool.StringUtils
;
import
net.wanji.databus.dao.entity.RidInfoEntity
;
import
net.wanji.databus.dao.mapper.RidInfoMapper
;
import
net.wanji.feign.pojo.result.JsonViewObject
;
import
net.wanji.feign.pojo.vo.SchemeSendVO
;
import
net.wanji.feign.pojo.vo.SignalStatusVO
;
...
...
@@ -50,6 +52,9 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource
CrossSchemeMapper
crossSchemeMapper
;
@Resource
RidInfoMapper
ridInfoMapper
;
@Resource
UtcFeignClients
utcFeignClients
;
...
...
@@ -72,11 +77,11 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
Map
<
Integer
,
List
<
CrossDataRealtimeDTO
>>
crossDataMap
=
abnormalCrossList
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossDataRealtimeDTO:
:
getStatus
));
abnormalCrossList
=
crossDataMap
.
get
(
CrossStatusEnum
.
SPILLOVER
.
getCode
());
// 溢出
if
(
abnormalCrossList
!=
null
&&
!
abnormalCrossList
.
isEmpty
())
{
// spilloverOpt();
}
abnormalCrossList
=
crossDataMap
.
get
(
CrossStatusEnum
.
CONGESTION
.
getCode
());
// 拥堵
if
(
abnormalCrossList
!=
null
&&
!
abnormalCrossList
.
isEmpty
())
{
congestionOpt
(
abnormalCrossList
,
turnDataRealtime
,
phaseMap
);
}
abnormalCrossList
=
crossDataMap
.
get
(
CrossStatusEnum
.
UNBALANCE
.
getCode
());
// 失衡
if
(
abnormalCrossList
!=
null
&&
!
abnormalCrossList
.
isEmpty
())
{
...
...
@@ -89,6 +94,55 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
return
null
;
}
/**
* 路口拥堵优化
*
* @param abnormalCrossList
* @param turnDataRealtimeMap
* @param phaseMap
*/
private
void
congestionOpt
(
List
<
CrossDataRealtimeDTO
>
abnormalCrossList
,
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
turnDataRealtimeMap
,
Map
<
String
,
CrossPhaseDTO
>
phaseMap
)
throws
Exception
{
Map
<
String
,
List
<
CrossDataRealtimeDTO
>>
congestCrossMap
=
abnormalCrossList
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossDataRealtimeDTO:
:
getCrossId
));
String
crossId
;
for
(
CrossDataRealtimeDTO
cross
:
abnormalCrossList
)
{
crossId
=
cross
.
getCrossId
();
// 判断信号机是否在线 todo 是否某些故障也不需要优化
// 判断当前路口是否存在特殊控制操作
if
(
isOffLineOrSpecialControlMode
(
crossId
))
{
continue
;
}
// 获取上游路口
List
<
RidInfoEntity
>
ridInfoEntities
=
ridInfoMapper
.
selectOne
(
""
,
crossId
);
// 不存在上游路口,不做处理
if
(
CollectionUtils
.
isEmpty
(
ridInfoEntities
))
{
continue
;
}
// 判断当前路口是否已优化
if
(
CROSS_OPT
.
contains
(
crossId
))
{
continue
;
}
// 拥堵路口对上游路口进行优化
for
(
RidInfoEntity
ridInfoEntity
:
ridInfoEntities
)
{
// 拥堵列表包含上游路口,不需要操作, 否则当前路口进行优化 优化当前开始路口的此方向直行,和逆时针方向左转
if
(!
congestCrossMap
.
containsKey
(
ridInfoEntity
.
getEndCrossId
()))
{
String
startCrossId
=
ridInfoEntity
.
getStartCrossId
();
doExecuteCrossOpt
(
turnDataRealtimeMap
,
phaseMap
,
startCrossId
);
}
}
// 判断路口是否是绿波
// 记录已优化的路口
CROSS_OPT
.
add
(
crossId
);
}
}
/**
* 设置异常数据转向数据
*
...
...
@@ -161,27 +215,8 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
// 判断路口是否是绿波
// 计算路口各转向所需的通行时长(秒)
List
<
CrossTurnDataRealtimeDTO
>
crossTurnDataRealtimeDTOS
=
turnDataRealtimeMap
.
get
(
crossId
);
crossTurnDataRealtimeDTOS
.
forEach
(
item
->
item
.
setPassTime
(
item
.
calPassTime
(
item
)));
// 计算路口各相位调整时长(秒)
Map
<
String
,
Integer
>
phaseTimeOptResultMap
=
new
HashMap
<>();
Map
<
Integer
,
String
>
timeOffsetPhaseMap
=
getTimeOffsetPhaseMap
(
phaseMap
,
crossTurnDataRealtimeDTOS
);
// 是否需要拆分相位
if
(
isSplitPhase
(
timeOffsetPhaseMap
))
{
}
else
{
phaseTimeOptResultMap
=
getPhaseTimeOptMap
(
timeOffsetPhaseMap
);
}
// 修改原始方案绿灯时间为优化后时间,方案下发
SchemeSendVO
schemeSendVO
=
getSchemeSendVO
(
crossId
,
phaseMap
,
phaseTimeOptResultMap
);
JsonViewObject
jsonViewObject
=
utcFeignClients
.
schemeSend
(
schemeSendVO
);
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
log
.
error
(
"实时监控路口优化方案下发远程调用异常!"
,
jsonViewObject
);
throw
new
Exception
();
}
// 执行路口优化
doExecuteCrossOpt
(
turnDataRealtimeMap
,
phaseMap
,
crossId
);
// 记录已优化的路口
CROSS_OPT
.
add
(
crossId
);
...
...
@@ -189,6 +224,38 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
/**
* 执行路口优化逻辑
* 计算路口相位优化时长并下发方案
*
* @param turnDataRealtimeMap
* @param phaseMap
* @param crossId
* @throws Exception
*/
private
void
doExecuteCrossOpt
(
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
turnDataRealtimeMap
,
Map
<
String
,
CrossPhaseDTO
>
phaseMap
,
String
crossId
)
throws
Exception
{
// 计算路口各转向所需的通行时长(秒)
List
<
CrossTurnDataRealtimeDTO
>
crossTurnDataRealtimeDTOS
=
turnDataRealtimeMap
.
get
(
crossId
);
crossTurnDataRealtimeDTOS
.
forEach
(
item
->
item
.
setPassTime
(
item
.
calPassTime
(
item
)));
// 计算路口各相位调整时长(秒)
Map
<
String
,
Integer
>
phaseTimeOptResultMap
=
new
HashMap
<>();
Map
<
Integer
,
String
>
timeOffsetPhaseMap
=
getTimeOffsetPhaseMap
(
phaseMap
,
crossTurnDataRealtimeDTOS
);
// 是否需要拆分相位
if
(
isSplitPhase
(
timeOffsetPhaseMap
))
{
}
else
{
phaseTimeOptResultMap
=
getPhaseTimeOptMap
(
timeOffsetPhaseMap
);
}
// 修改原始方案绿灯时间为优化后时间,方案下发
SchemeSendVO
schemeSendVO
=
getSchemeSendVO
(
crossId
,
phaseMap
,
phaseTimeOptResultMap
);
JsonViewObject
jsonViewObject
=
utcFeignClients
.
schemeSend
(
schemeSendVO
);
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
log
.
error
(
"实时监控路口优化方案下发远程调用异常!"
,
jsonViewObject
);
throw
new
Exception
();
}
}
/**
* 构建下发的优化方案
* 如果phaseTimeOptResultMap=null,下发的原始方案
...
...
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