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
06cf65d0
Commit
06cf65d0
authored
Feb 01, 2023
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[add] 实时监控-路口恢复原始方案
parent
9ff4f78e
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
140 additions
and
33 deletions
+140
-33
CrossPhaseMapper.java
.../main/java/net/wanji/opt/dao/mapper/CrossPhaseMapper.java
+2
-1
CrossSchemeMapper.java
...main/java/net/wanji/opt/dao/mapper/CrossSchemeMapper.java
+2
-1
CrossOptimizeServiceImpl.java
.../net/wanji/opt/service/impl/CrossOptimizeServiceImpl.java
+122
-20
CrossPhaseServiceImpl.java
...ava/net/wanji/opt/service/impl/CrossPhaseServiceImpl.java
+1
-1
CrossSchemeServiceImpl.java
...va/net/wanji/opt/service/impl/CrossSchemeServiceImpl.java
+1
-1
CrossSchemeMapper.xml
...e-service/src/main/resources/mapper/CrossSchemeMapper.xml
+12
-9
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/dao/mapper/CrossPhaseMapper.java
View file @
06cf65d0
package
net
.
wanji
.
opt
.
dao
.
mapper
;
package
net
.
wanji
.
opt
.
dao
.
mapper
;
import
net.wanji.opt.po.base.CrossPhasePO
;
import
net.wanji.opt.po.base.CrossPhasePO
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Repository
;
import
org.springframework.stereotype.Repository
;
import
java.util.List
;
import
java.util.List
;
...
@@ -17,5 +18,5 @@ public interface CrossPhaseMapper {
...
@@ -17,5 +18,5 @@ public interface CrossPhaseMapper {
* 查询相位基础信息列表
* 查询相位基础信息列表
* @return
* @return
*/
*/
List
<
CrossPhasePO
>
listCrossPhase
();
List
<
CrossPhasePO
>
listCrossPhase
(
@Param
(
"crossId"
)
String
crossId
,
@Param
(
"schemeId"
)
String
schemeId
);
}
}
signal-optimize-service/src/main/java/net/wanji/opt/dao/mapper/CrossSchemeMapper.java
View file @
06cf65d0
package
net
.
wanji
.
opt
.
dao
.
mapper
;
package
net
.
wanji
.
opt
.
dao
.
mapper
;
import
net.wanji.opt.po.base.CrossSchemePO
;
import
net.wanji.opt.po.base.CrossSchemePO
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Repository
;
import
org.springframework.stereotype.Repository
;
import
java.util.List
;
import
java.util.List
;
...
@@ -18,6 +19,6 @@ public interface CrossSchemeMapper {
...
@@ -18,6 +19,6 @@ public interface CrossSchemeMapper {
* @param crossId
* @param crossId
* @return
* @return
*/
*/
List
<
CrossSchemePO
>
listCrossSchemeInfo
(
String
crossId
);
List
<
CrossSchemePO
>
listCrossSchemeInfo
(
@Param
(
"crossId"
)
String
crossId
,
@Param
(
"schemeNo"
)
String
schemeNo
);
}
}
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/CrossOptimizeServiceImpl.java
View file @
06cf65d0
...
@@ -6,16 +6,22 @@ import net.wanji.common.enums.CrossStatusEnum;
...
@@ -6,16 +6,22 @@ import net.wanji.common.enums.CrossStatusEnum;
import
net.wanji.common.enums.TurnConvertEnum
;
import
net.wanji.common.enums.TurnConvertEnum
;
import
net.wanji.common.enums.WeekEnum
;
import
net.wanji.common.enums.WeekEnum
;
import
net.wanji.common.framework.Constants
;
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.DateUtil
;
import
net.wanji.common.utils.tool.StringUtils
;
import
net.wanji.common.utils.tool.StringUtils
;
import
net.wanji.feign.pojo.result.JsonViewObject
;
import
net.wanji.feign.pojo.result.JsonViewObject
;
import
net.wanji.feign.pojo.vo.SchemeSendVO
;
import
net.wanji.feign.pojo.vo.SchemeSendVO
;
import
net.wanji.feign.pojo.vo.SignalStatusVO
;
import
net.wanji.feign.pojo.vo.SignalStatusVO
;
import
net.wanji.feign.service.UtcFeignClients
;
import
net.wanji.feign.service.UtcFeignClients
;
import
net.wanji.opt.dao.mapper.CrossPhaseMapper
;
import
net.wanji.opt.dao.mapper.CrossSchemeMapper
;
import
net.wanji.opt.dto.*
;
import
net.wanji.opt.dto.*
;
import
net.wanji.opt.po.base.CrossPhasePO
;
import
net.wanji.opt.po.base.CrossSchemePO
;
import
net.wanji.opt.service.CrossOptimizeService
;
import
net.wanji.opt.service.CrossOptimizeService
;
import
net.wanji.opt.service.CrossSchedulesService
;
import
net.wanji.opt.service.CrossSchedulesService
;
import
net.wanji.opt.service.CrossSchemeService
;
import
net.wanji.opt.service.CrossSchemeService
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
...
@@ -38,6 +44,12 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
...
@@ -38,6 +44,12 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
@Resource
@Resource
CrossSchedulesService
crossSchedulesService
;
CrossSchedulesService
crossSchedulesService
;
@Resource
CrossPhaseMapper
crossPhaseMapper
;
@Resource
CrossSchemeMapper
crossSchemeMapper
;
@Resource
@Resource
UtcFeignClients
utcFeignClients
;
UtcFeignClients
utcFeignClients
;
...
@@ -48,10 +60,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
...
@@ -48,10 +60,13 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
try
{
try
{
// 获取所有信控路口转向实时数据
// 获取所有信控路口转向实时数据
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
turnDataRealtime
=
listTurnDataRealtime
();
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
turnDataRealtime
=
listTurnDataRealtime
(
abnormalCrossList
);
// 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息
// 相位配时信息,key:路口编号_方向类型_转向类型,value 相位配时信息
Map
<
String
,
CrossPhaseDTO
>
phaseMap
=
listPhaseList
();
Map
<
String
,
CrossPhaseDTO
>
phaseMap
=
listPhaseList
();
// 恢复优化路口原始方案
restoreOptCrossOriPlan
(
abnormalCrossList
,
phaseMap
);
Map
<
Integer
,
List
<
CrossDataRealtimeDTO
>>
crossDataMap
=
abnormalCrossList
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossDataRealtimeDTO:
:
getStatus
));
Map
<
Integer
,
List
<
CrossDataRealtimeDTO
>>
crossDataMap
=
abnormalCrossList
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossDataRealtimeDTO:
:
getStatus
));
abnormalCrossList
=
crossDataMap
.
get
(
CrossStatusEnum
.
SPILLOVER
.
getCode
());
// 溢出
abnormalCrossList
=
crossDataMap
.
get
(
CrossStatusEnum
.
SPILLOVER
.
getCode
());
// 溢出
if
(
abnormalCrossList
!=
null
&&
!
abnormalCrossList
.
isEmpty
())
{
if
(
abnormalCrossList
!=
null
&&
!
abnormalCrossList
.
isEmpty
())
{
...
@@ -72,6 +87,34 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
...
@@ -72,6 +87,34 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
return
null
;
return
null
;
}
}
/**
* 通过第二批次列表,判断需要恢复的优化路口原始方案
*
* @param abnormalCrossList
*/
private
void
restoreOptCrossOriPlan
(
List
<
CrossDataRealtimeDTO
>
abnormalCrossList
,
Map
<
String
,
CrossPhaseDTO
>
phaseMap
)
throws
Exception
{
List
<
String
>
abnormalCrossIdList
=
abnormalCrossList
.
stream
().
map
(
CrossDataRealtimeDTO:
:
getCrossId
).
collect
(
Collectors
.
toList
());
for
(
String
optCrossId
:
CROSS_OPT
)
{
String
crossId
=
null
;
if
(!
abnormalCrossIdList
.
contains
(
optCrossId
))
{
// 路口原始方案 todo 优化后恢复方案
CrossSchemeDTO
oriCrossSchemeDTO
=
null
;
List
<
CrossSchemeDTO
>
schemeDTOList
=
crossSchemeService
.
listCrossSchemeDetails
(
optCrossId
);
if
(!
CollectionUtils
.
isEmpty
(
schemeDTOList
)
&&
schemeDTOList
.
size
()
==
1
)
{
crossId
=
optCrossId
;
oriCrossSchemeDTO
=
schemeDTOList
.
get
(
0
);
}
}
// 下发原始方案
SchemeSendVO
schemeSendVO
=
getSchemeSendVO
(
crossId
,
phaseMap
,
null
);
JsonViewObject
jsonViewObject
=
utcFeignClients
.
schemeSend
(
schemeSendVO
);
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
log
.
error
(
"实时监控路口优化方案下发异常!"
);
throw
new
Exception
();
}
}
}
/**
/**
* 路口失衡优化
* 路口失衡优化
*
*
...
@@ -104,29 +147,15 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
...
@@ -104,29 +147,15 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
// 计算路口各相位调整时长(秒)
// 计算路口各相位调整时长(秒)
Map
<
String
,
Integer
>
phaseTimeOptResultMap
=
new
HashMap
<>();
Map
<
String
,
Integer
>
phaseTimeOptResultMap
=
new
HashMap
<>();
Map
<
Integer
,
String
>
timeOffsetPhaseMap
=
getTimeOffsetPhaseMap
(
phaseMap
,
crossTurnDataRealtimeDTOS
);
Map
<
Integer
,
String
>
timeOffsetPhaseMap
=
getTimeOffsetPhaseMap
(
phaseMap
,
crossTurnDataRealtimeDTOS
);
// 是否需要拆分相位
if
(
isSplitPhase
(
timeOffsetPhaseMap
))
{
if
(
isSplitPhase
(
timeOffsetPhaseMap
))
{
}
else
{
}
else
{
phaseTimeOptResultMap
=
getPhaseTimeOptMap
(
timeOffsetPhaseMap
);
phaseTimeOptResultMap
=
getPhaseTimeOptMap
(
timeOffsetPhaseMap
);
}
}
// 相位优化总的可加可减时间,
// 修改原始方案绿灯时间为优化后时间,方案下发
/**
SchemeSendVO
schemeSendVO
=
getSchemeSendVO
(
crossId
,
phaseMap
,
phaseTimeOptResultMap
);
*
* 结果输出
* 路口编号、计划号、方案号、相位号、原相位时长、优化后相位时长、调整时长
*/
// 方案优化下发
String
key
=
String
.
join
(
Constants
.
SystemParam
.
SEPARATOR_UNDER_LINE
,
"1"
,
"s"
);
CrossPhaseDTO
crossPhaseDTO
=
phaseMap
.
get
(
key
);
String
planNo
=
crossPhaseDTO
.
getPlanNo
();
SchemeSendVO
schemeSendVO
=
new
SchemeSendVO
();
List
<
SchemeSendVO
.
Pattern
>
patternList
=
new
ArrayList
<>();
SchemeSendVO
.
Pattern
pattern
=
new
SchemeSendVO
.
Pattern
();
schemeSendVO
.
setCrossCode
(
crossId
);
schemeSendVO
.
setPatternList
(
patternList
);
JsonViewObject
jsonViewObject
=
utcFeignClients
.
schemeSend
(
schemeSendVO
);
JsonViewObject
jsonViewObject
=
utcFeignClients
.
schemeSend
(
schemeSendVO
);
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
log
.
error
(
"实时监控路口优化方案下发异常!"
);
log
.
error
(
"实时监控路口优化方案下发异常!"
);
...
@@ -139,6 +168,61 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
...
@@ -139,6 +168,61 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
}
}
/**
* 构建下发的优化方案
* 如果phaseTimeOptResultMap=null,下发的原始方案
* 否则原始方案和相位优化时间参数phaseTimeOptResultMap构建下发参数
*
* @param crossId
* @param phaseMap
* @param phaseTimeOptResultMap
* @return
*/
private
SchemeSendVO
getSchemeSendVO
(
String
crossId
,
Map
<
String
,
CrossPhaseDTO
>
phaseMap
,
Map
<
String
,
Integer
>
phaseTimeOptResultMap
)
{
String
key
=
String
.
join
(
Constants
.
SystemParam
.
SEPARATOR_UNDER_LINE
,
"1"
,
"s"
);
CrossPhaseDTO
crossPhaseDTO
=
phaseMap
.
get
(
key
);
String
planNo
=
crossPhaseDTO
.
getPlanNo
();
List
<
CrossSchemePO
>
crossSchemePOS
=
crossSchemeMapper
.
listCrossSchemeInfo
(
crossId
,
planNo
);
List
<
CrossPhasePO
>
crossPhasePOS
=
crossPhaseMapper
.
listCrossPhase
(
crossId
,
planNo
);
Map
<
Integer
,
List
<
CrossPhasePO
>>
ringNoPhasePOMap
=
crossPhasePOS
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossPhasePO:
:
getRingNo
));
SchemeSendVO
schemeSendVO
=
new
SchemeSendVO
();
List
<
SchemeSendVO
.
Pattern
>
patternList
=
new
ArrayList
<>();
BeanListUtils
.
populateList
(
crossSchemePOS
,
patternList
,
SchemeSendVO
.
Pattern
.
class
);
schemeSendVO
.
setPatternList
(
patternList
);
schemeSendVO
.
setCrossCode
(
crossId
);
List
<
SchemeSendVO
.
Pattern
.
Ring
>
rings
=
new
ArrayList
<>();
ringNoPhasePOMap
.
entrySet
().
forEach
(
entry
->
{
SchemeSendVO
.
Pattern
.
Ring
ring
=
new
SchemeSendVO
.
Pattern
.
Ring
();
List
<
SchemeSendVO
.
Pattern
.
Ring
.
Phase
>
phaseList
=
new
ArrayList
<>();
List
<
CrossPhasePO
>
value
=
entry
.
getValue
();
BeanListUtils
.
populateList
(
value
,
phaseList
,
SchemeSendVO
.
Pattern
.
Ring
.
Phase
.
class
);
ring
.
setRingNo
(
String
.
valueOf
(
entry
.
getKey
()));
// 在原始方案基础绿灯时间+可优化时间
if
(!
CollectionUtils
.
isEmpty
(
phaseTimeOptResultMap
))
{
phaseList
.
forEach
(
phaseInfo
->
{
Integer
optTime
=
phaseTimeOptResultMap
.
get
(
phaseInfo
.
getPhaseNo
());
String
greenTime
=
phaseInfo
.
getGreenTime
();
phaseInfo
.
setGreenTime
(
greenTime
+
optTime
);
});
}
ring
.
setPhaseList
(
phaseList
);
rings
.
add
(
ring
);
});
schemeSendVO
.
setCrossCode
(
crossId
);
schemeSendVO
.
setPatternList
(
patternList
);
return
schemeSendVO
;
}
/**
* 在最大最小绿范围内,通过转向优化计算相位可优化时间
*
* @param timeOffsetPhaseMap
* @return
*/
private
static
Map
<
String
,
Integer
>
getPhaseTimeOptMap
(
Map
<
Integer
,
String
>
timeOffsetPhaseMap
)
{
private
static
Map
<
String
,
Integer
>
getPhaseTimeOptMap
(
Map
<
Integer
,
String
>
timeOffsetPhaseMap
)
{
HashMap
<
String
,
Integer
>
phaseTimeOptResultMap
=
new
HashMap
<>();
HashMap
<
String
,
Integer
>
phaseTimeOptResultMap
=
new
HashMap
<>();
// key:相位号 value:最大可加减时间
// key:相位号 value:最大可加减时间
...
@@ -359,10 +443,28 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
...
@@ -359,10 +443,28 @@ public class CrossOptimizeServiceImpl implements CrossOptimizeService {
*
*
* @return
* @return
*/
*/
public
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
listTurnDataRealtime
()
{
public
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
listTurnDataRealtime
(
List
<
CrossDataRealtimeDTO
>
abnormalCrossList
)
{
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
turnDataRealtimeDTOList
=
new
HashMap
<>();
Map
<
String
,
List
<
CrossTurnDataRealtimeDTO
>>
turnDataRealtimeDTOList
=
new
HashMap
<>();
Map
<
String
,
List
<
CrossDataRealtimeDTO
>>
abnormalCrossGroupMap
=
abnormalCrossList
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossDataRealtimeDTO:
:
getCrossId
));
abnormalCrossGroupMap
.
entrySet
().
forEach
(
entry
->
{
String
crossId
=
entry
.
getKey
();
List
<
CrossDataRealtimeDTO
>
realTimeData
=
entry
.
getValue
();
List
<
CrossTurnDataRealtimeDTO
>
crossTurnDataRealtimeDTOS
=
new
ArrayList
<>();
realTimeData
.
forEach
(
realData
->
{
List
<
CrossDirInfoDTO
>
dirList
=
realData
.
getDirList
();
List
<
CrossTurnInfoDTO
>
turnList
=
realData
.
getTurnList
();
dirList
.
forEach
(
dirInfo
->
{
turnList
.
forEach
(
turnInfo
->
{
CrossTurnDataRealtimeDTO
crossTurnDataRealtimeDTO
=
new
CrossTurnDataRealtimeDTO
();
BeanUtils
.
copyProperties
(
realData
,
crossTurnDataRealtimeDTO
);
});
});
});
});
return
turnDataRealtimeDTOList
;
return
turnDataRealtimeDTOList
;
}
}
...
...
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/CrossPhaseServiceImpl.java
View file @
06cf65d0
...
@@ -40,7 +40,7 @@ public class CrossPhaseServiceImpl implements CrossPhaseService {
...
@@ -40,7 +40,7 @@ public class CrossPhaseServiceImpl implements CrossPhaseService {
public
List
<
CrossPhaseDTO
>
listCrossPhase
()
{
public
List
<
CrossPhaseDTO
>
listCrossPhase
()
{
// 获取相位信息
// 获取相位信息
List
<
CrossPhasePO
>
crossPhasePOList
=
crossPhaseMapper
.
listCrossPhase
();
List
<
CrossPhasePO
>
crossPhasePOList
=
crossPhaseMapper
.
listCrossPhase
(
""
,
""
);
return
BeanListUtils
.
populateList
(
crossPhasePOList
,
new
ArrayList
<>(),
CrossPhaseDTO
.
class
);
return
BeanListUtils
.
populateList
(
crossPhasePOList
,
new
ArrayList
<>(),
CrossPhaseDTO
.
class
);
}
}
...
...
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/CrossSchemeServiceImpl.java
View file @
06cf65d0
...
@@ -34,7 +34,7 @@ public class CrossSchemeServiceImpl implements CrossSchemeService {
...
@@ -34,7 +34,7 @@ public class CrossSchemeServiceImpl implements CrossSchemeService {
@Override
@Override
public
List
<
CrossSchemeDTO
>
listCrossSchemeInfo
(
String
crossId
)
{
public
List
<
CrossSchemeDTO
>
listCrossSchemeInfo
(
String
crossId
)
{
List
<
CrossSchemePO
>
schemePOList
=
crossSchemeMapper
.
listCrossSchemeInfo
(
crossId
);
List
<
CrossSchemePO
>
schemePOList
=
crossSchemeMapper
.
listCrossSchemeInfo
(
crossId
,
""
);
return
BeanListUtils
.
populateList
(
schemePOList
,
new
ArrayList
<>(),
CrossSchemeDTO
.
class
);
return
BeanListUtils
.
populateList
(
schemePOList
,
new
ArrayList
<>(),
CrossSchemeDTO
.
class
);
}
}
...
...
signal-optimize-service/src/main/resources/mapper/CrossSchemeMapper.xml
View file @
06cf65d0
...
@@ -15,18 +15,21 @@
...
@@ -15,18 +15,21 @@
<!-- 查询方案基础信息列表 -->
<!-- 查询方案基础信息列表 -->
<select
id=
"listCrossSchemeInfo"
parameterType=
"String"
resultMap=
"BaseResultMap"
>
<select
id=
"listCrossSchemeInfo"
parameterType=
"String"
resultMap=
"BaseResultMap"
>
select
select
id
id,
,scheme_no
scheme_no,
,name
name,
,cross_id
cross_id,
,cycle
cycle,
,coord_phase
coord_phase,
,
offset
offset
from
from
t_base_cross_scheme
t_base_cross_scheme
where 1=1
where 1=1
<if
test=
"crossId != null and crossId != ''"
>
<if
test=
"crossId != null and crossId != ''"
>
and cross_id = #{crossId}
and cross_id = #{crossId}
</if>
<if
test=
"schemeNo != null and schemeNo != ''"
>
and scheme_no = #{schemeNo}
</if>
</if>
</select>
</select>
...
...
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