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
ada82b8f
Commit
ada82b8f
authored
Dec 06, 2023
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[add] 通过方案自动加载灯态接口
parent
04a76264
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
828 additions
and
13 deletions
+828
-13
CrossInfoCache.java
...ice/src/main/java/net/wanji/utc/cache/CrossInfoCache.java
+1
-1
CrossPhaseDirTurnCache.java
...main/java/net/wanji/utc/cache/CrossPhaseDirTurnCache.java
+97
-0
CrossSchemePhaseTimeCountCache.java
...a/net/wanji/utc/cache/CrossSchemePhaseTimeCountCache.java
+96
-0
SignalStatusController.java
...java/net/wanji/utc/controller/SignalStatusController.java
+5
-5
CrossSchemePhaseCountDownDTO.java
.../java/net/wanji/utc/dto/CrossSchemePhaseCountDownDTO.java
+16
-0
PhaseCountDownDTO.java
...ce/src/main/java/net/wanji/utc/dto/PhaseCountDownDTO.java
+16
-0
CrossPhaseDirTurnPojo.java
.../main/java/net/wanji/utc/po/hk/CrossPhaseDirTurnPojo.java
+19
-0
SignalStatusService.java
...et/wanji/utc/service/runninginfo/SignalStatusService.java
+1
-2
SignalStatusServiceImpl.java
...utc/service/runninginfo/impl/SignalStatusServiceImpl.java
+14
-5
SignalStatus4StaticSchemeTask.java
...ava/net/wanji/utc/task/SignalStatus4StaticSchemeTask.java
+563
-0
No files found.
signal-utc-service/src/main/java/net/wanji/utc/cache/CrossInfoCache.java
View file @
ada82b8f
...
...
@@ -26,7 +26,7 @@ public class CrossInfoCache implements CommandLineRunner {
@Resource
private
ManufacturerInfoMapper
manufacturerInfoMapper
;
p
rivate
static
List
<
CrossInfoPO
>
crossInfoList
=
new
ArrayList
<>();
p
ublic
static
List
<
CrossInfoPO
>
crossInfoList
=
new
ArrayList
<>();
/**
* 通过路口编号获取厂商编码
...
...
signal-utc-service/src/main/java/net/wanji/utc/cache/CrossPhaseDirTurnCache.java
0 → 100644
View file @
ada82b8f
package
net
.
wanji
.
utc
.
cache
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.databus.dao.entity.CrossLightsPO
;
import
net.wanji.databus.dao.entity.CrossPhaseLightsPO
;
import
net.wanji.databus.dao.entity.CrossPhasePO
;
import
net.wanji.databus.dao.entity.CrossSchemePO
;
import
net.wanji.databus.dao.mapper.*
;
import
net.wanji.databus.po.CrossInfoPO
;
import
net.wanji.utc.po.hk.CrossPhaseDirTurnPojo
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.boot.CommandLineRunner
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
* @author duanruiming
* @date 2023/09/11 17:42
*/
@Slf4j
@Component
@SuppressWarnings
(
"unchecked"
)
@RequiredArgsConstructor
public
class
CrossPhaseDirTurnCache
implements
CommandLineRunner
{
private
final
CrossInfoMapper
crossInfoMapper
;
private
final
CrossPhaseMapper
crossPhaseMapper
;
private
final
CrossSchemeMapper
crossSchemeMapper
;
private
final
CrossPhaseLightsMapper
crossPhaseLightsMapper
;
private
final
CrossLightsMapper
crossLightsMapper
;
private
static
final
Map
<
String
,
List
<
CrossPhaseDirTurnPojo
>>
crossInfoMap
=
new
HashMap
<>();
public
static
List
<
CrossPhaseDirTurnPojo
>
getCrossPhaseDirTurnCache
(
String
crossId
)
{
if
(!
crossInfoMap
.
isEmpty
())
{
return
crossInfoMap
.
get
(
crossId
);
}
return
null
;
}
@Override
public
void
run
(
String
...
args
)
throws
Exception
{
init
();
}
public
void
init
()
{
List
<
CrossInfoPO
>
crossInfoPOList
=
crossInfoMapper
.
selectAll
();
if
(!
CollectionUtils
.
isEmpty
(
crossInfoPOList
))
{
for
(
CrossInfoPO
crossInfoPO
:
crossInfoPOList
)
{
String
crossId
=
crossInfoPO
.
getId
();
List
<
CrossSchemePO
>
crossSchemePOS
=
crossSchemeMapper
.
selectByCrossId
(
crossId
);
Map
<
Integer
,
String
>
schemeIdNoMap
=
crossSchemePOS
.
stream
().
collect
(
Collectors
.
toMap
(
CrossSchemePO:
:
getId
,
CrossSchemePO:
:
getSchemeNo
));
List
<
CrossPhasePO
>
crossPhasePOS
=
crossPhaseMapper
.
selectByCrossId
(
crossId
);
if
(!
CollectionUtils
.
isEmpty
(
crossPhasePOS
))
{
List
<
CrossPhaseDirTurnPojo
>
results
=
new
ArrayList
<>();
for
(
CrossPhasePO
crossPhasePO
:
crossPhasePOS
)
{
CrossPhaseDirTurnPojo
crossPhaseDirTurnPojo
=
new
CrossPhaseDirTurnPojo
();
String
phaseNo
=
crossPhasePO
.
getPhaseNo
();
crossPhaseDirTurnPojo
.
setCrossId
(
crossId
);
crossPhaseDirTurnPojo
.
setPhaseNo
(
Integer
.
valueOf
(
phaseNo
));
Integer
planId
=
crossPhasePO
.
getPlanId
();
String
schemeNo
=
schemeIdNoMap
.
get
(
planId
);
if
(
StringUtils
.
isNotBlank
(
schemeNo
))
{
crossPhaseDirTurnPojo
.
setSchemeNo
(
Integer
.
valueOf
(
schemeNo
));
}
else
{
crossPhaseDirTurnPojo
.
setSchemeNo
(-
1
);
}
Integer
phaseId
=
crossPhasePO
.
getId
();
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
=
crossPhaseLightsMapper
.
selectByCrossId
(
crossId
);
List
<
Integer
>
phaseLightsList
=
crossPhaseLightsPOList
.
stream
()
.
filter
(
po
->
Objects
.
equals
(
po
.
getPhaseId
(),
phaseId
))
.
map
(
CrossPhaseLightsPO:
:
getLightsId
).
collect
(
Collectors
.
toList
());
List
<
CrossLightsPO
>
crossLightsPOS
=
crossLightsMapper
.
selectByCrossId
(
crossId
);
Map
<
Integer
,
List
<
CrossLightsPO
>>
phaseDirMap
=
crossLightsPOS
.
stream
().
filter
(
po
->
phaseLightsList
.
contains
(
po
.
getId
())).
collect
(
Collectors
.
groupingBy
(
CrossLightsPO:
:
getDir
));
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
=
new
HashMap
<>();
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
entry
:
phaseDirMap
.
entrySet
())
{
Integer
dir
=
entry
.
getKey
();
// List<Integer> turnList = entry.getValue().stream().map(CrossLightsPO::getTurn).sorted().collect(Collectors.toList());
// dirTurnMap.put(dir, turnList);
dirTurnMap
.
put
(
dir
,
entry
.
getValue
());
crossPhaseDirTurnPojo
.
setDirTurnMap
(
dirTurnMap
);
}
results
.
add
(
crossPhaseDirTurnPojo
);
}
crossInfoMap
.
put
(
crossId
,
results
);
}
}
}
}
}
signal-utc-service/src/main/java/net/wanji/utc/cache/CrossSchemePhaseTimeCountCache.java
0 → 100644
View file @
ada82b8f
package
net
.
wanji
.
utc
.
cache
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.databus.dao.entity.CrossPhasePO
;
import
net.wanji.databus.dao.entity.CrossSchemePO
;
import
net.wanji.databus.dao.mapper.CrossInfoMapper
;
import
net.wanji.databus.dao.mapper.CrossPhaseMapper
;
import
net.wanji.databus.dao.mapper.CrossSchemeMapper
;
import
net.wanji.databus.po.CrossInfoPO
;
import
net.wanji.utc.dto.CrossSchemePhaseCountDownDTO
;
import
net.wanji.utc.dto.PhaseCountDownDTO
;
import
org.springframework.boot.CommandLineRunner
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
* @author duanruiming
* @date 2023/09/22 14:19
*/
@Slf4j
@Component
@SuppressWarnings
(
"unchecked"
)
@RequiredArgsConstructor
public
class
CrossSchemePhaseTimeCountCache
implements
CommandLineRunner
{
public
static
final
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
=
new
ArrayList
<>();
@Resource
private
CrossPhaseMapper
crossPhaseMapper
;
@Resource
private
CrossSchemeMapper
crossSchemeMapper
;
@Resource
private
CrossInfoMapper
crossInfoMapper
;
@Override
public
void
run
(
String
...
args
)
throws
Exception
{
try
{
init
();
}
catch
(
Exception
e
)
{
log
.
error
(
"路口方案相位倒计时缓存加载失败"
,
e
);
throw
new
Exception
(
e
);
}
}
public
void
init
()
throws
Exception
{
List
<
CrossInfoPO
>
crossInfoPOList
=
crossInfoMapper
.
selectAll
();
if
(!
CollectionUtils
.
isEmpty
(
crossInfoPOList
))
{
for
(
CrossInfoPO
crossInfoPO
:
crossInfoPOList
)
{
String
crossId
=
crossInfoPO
.
getId
();
List
<
CrossPhasePO
>
crossPhasePOS
=
crossPhaseMapper
.
selectByCrossId
(
crossId
);
if
(!
CollectionUtils
.
isEmpty
(
crossPhasePOS
))
{
Map
<
Integer
,
List
<
CrossPhasePO
>>
schemeIdListMap
=
crossPhasePOS
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossPhasePO:
:
getPlanId
));
for
(
Map
.
Entry
<
Integer
,
List
<
CrossPhasePO
>>
entry
:
schemeIdListMap
.
entrySet
())
{
Integer
schemeId
=
entry
.
getKey
();
CrossSchemePhaseCountDownDTO
crossSchemePhaseCountDownDTO
=
new
CrossSchemePhaseCountDownDTO
();
CrossSchemePO
crossSchemePO
=
crossSchemeMapper
.
selectSchemePOById
(
schemeId
);
if
(
Objects
.
isNull
(
crossSchemePO
))
{
continue
;
}
Integer
cycle
=
crossSchemePO
.
getCycle
();
String
schemeNo
=
crossSchemePO
.
getSchemeNo
();
List
<
CrossPhasePO
>
schemeNoList
=
entry
.
getValue
();
if
(!
CollectionUtils
.
isEmpty
(
schemeNoList
))
{
List
<
CrossPhasePO
>
phaseSortList
=
schemeNoList
.
stream
().
sorted
(
Comparator
.
comparingInt
(
CrossPhasePO:
:
getSort
)).
collect
(
Collectors
.
toList
());
Integer
changePhaseTime
=
0
;
List
<
PhaseCountDownDTO
>
phaseCountDownDTOS
=
new
ArrayList
<>(
phaseSortList
.
size
());
for
(
CrossPhasePO
crossPhasePO
:
phaseSortList
)
{
String
phaseNo
=
crossPhasePO
.
getPhaseNo
();
Integer
phaseTime
=
crossPhasePO
.
getPhaseTime
();
Integer
yellowTime
=
crossPhasePO
.
getYellowTime
();
Integer
redTime
=
crossPhasePO
.
getRedTime
();
changePhaseTime
+=
phaseTime
;
PhaseCountDownDTO
phaseCountDownDTO
=
new
PhaseCountDownDTO
();
phaseCountDownDTO
.
setPhaseNo
(
phaseNo
);
phaseCountDownDTO
.
setPhaseTime
(
phaseTime
);
phaseCountDownDTO
.
setChangePhaseTime
(
changePhaseTime
);
phaseCountDownDTO
.
setYellowTime
(
yellowTime
);
phaseCountDownDTO
.
setRedTime
(
redTime
);
phaseCountDownDTOS
.
add
(
phaseCountDownDTO
);
}
crossSchemePhaseCountDownDTO
.
setPhaseCountDownDTOList
(
phaseCountDownDTOS
);
}
crossSchemePhaseCountDownDTO
.
setCrossId
(
crossId
);
crossSchemePhaseCountDownDTO
.
setSchemeNo
(
schemeNo
);
crossSchemePhaseCountDownList
.
add
(
crossSchemePhaseCountDownDTO
);
}
}
}
}
}
}
signal-utc-service/src/main/java/net/wanji/utc/controller/SignalStatusController.java
View file @
ada82b8f
...
...
@@ -74,7 +74,7 @@ public class SignalStatusController {
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
LightsStatusVO
.
class
)
})
public
JsonViewObject
lightStatusV2
()
throws
Exception
{
List
<
LightsStatusVO
>
lightsStatusVOList
=
signalStatusService
.
lightStatus
();
List
<
LightsStatusVO
>
lightsStatusVOList
=
signalStatusService
.
lightStatus
4StaticScheme
();
List
<
LightsStatusVO2
>
listResult
=
new
ArrayList
<>(
lightsStatusVOList
.
size
());
for
(
LightsStatusVO
lightsStatusVO
:
lightsStatusVOList
)
{
...
...
@@ -87,13 +87,13 @@ public class SignalStatusController {
LightsStatusVO2
.
DirInfo
dirInfo
=
new
LightsStatusVO2
.
DirInfo
();
String
dir
=
groupEntry
.
getKey
();
Map
<
String
,
Integer
>
turnDountMap
=
(
Map
<
String
,
Integer
>)
phaseMap
.
get
(
dir
);
Map
<
String
,
String
>
turnColorMap
=
(
Map
<
String
,
String
>)
groupEntry
.
getValue
();
Map
<
Integer
,
String
>
turnColorMap
=
(
Map
<
Integer
,
String
>)
groupEntry
.
getValue
();
List
<
LightsStatusVO2
.
TurnInfo
>
turnList
=
new
ArrayList
<>();
for
(
Map
.
Entry
<
String
,
String
>
turnEntry
:
turnColorMap
.
entrySet
())
{
String
turn
=
turnEntry
.
getKey
();
for
(
Map
.
Entry
<
Integer
,
String
>
turnEntry
:
turnColorMap
.
entrySet
())
{
Integer
turn
=
turnEntry
.
getKey
();
String
color
=
turnEntry
.
getValue
();
LightsStatusVO2
.
TurnInfo
turnInfo
=
new
LightsStatusVO2
.
TurnInfo
();
turnInfo
.
setTurn
(
turn
);
turnInfo
.
setTurn
(
String
.
valueOf
(
turn
)
);
turnInfo
.
setColor
(
color
);
Integer
countDown
=
turnDountMap
.
get
(
turn
);
turnInfo
.
setCountDown
(
countDown
);
...
...
signal-utc-service/src/main/java/net/wanji/utc/dto/CrossSchemePhaseCountDownDTO.java
0 → 100644
View file @
ada82b8f
package
net
.
wanji
.
utc
.
dto
;
import
lombok.Data
;
import
java.util.List
;
/**
* @author duanruiming
* @date 2023/09/22 14:26
*/
@Data
public
class
CrossSchemePhaseCountDownDTO
{
private
String
crossId
;
private
String
schemeNo
;
private
List
<
PhaseCountDownDTO
>
phaseCountDownDTOList
;
}
signal-utc-service/src/main/java/net/wanji/utc/dto/PhaseCountDownDTO.java
0 → 100644
View file @
ada82b8f
package
net
.
wanji
.
utc
.
dto
;
import
lombok.Data
;
/**
* @author duanruiming
* @date 2023/09/22 14:23
*/
@Data
public
class
PhaseCountDownDTO
{
private
String
phaseNo
;
private
Integer
changePhaseTime
;
private
Integer
phaseTime
;
private
Integer
yellowTime
;
private
Integer
redTime
;
}
signal-utc-service/src/main/java/net/wanji/utc/po/hk/CrossPhaseDirTurnPojo.java
0 → 100644
View file @
ada82b8f
package
net
.
wanji
.
utc
.
po
.
hk
;
import
lombok.Data
;
import
net.wanji.databus.dao.entity.CrossLightsPO
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author duanruiming
* @date 2023/09/12 10:24
*/
@Data
public
class
CrossPhaseDirTurnPojo
{
private
String
crossId
;
private
Integer
phaseNo
;
private
Integer
schemeNo
;
private
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
;
}
signal-utc-service/src/main/java/net/wanji/utc/service/runninginfo/SignalStatusService.java
View file @
ada82b8f
...
...
@@ -21,9 +21,8 @@ public interface SignalStatusService {
List
<
SignalStatusLogPO
>
runningStatusAlarm
(
String
crossId
);
List
<
LightsStatusVO
>
lightStatus
()
throws
Exception
;
List
<
LightsStatusVO
>
lightStatus4StaticScheme
()
throws
Exception
;
List
<
LightsStatusVO
>
lightStatus
(
String
crossId
)
throws
Exception
;
List
<
LightsStatusVO
>
lightStatusHist
(
String
crossId
,
Integer
batchTime
,
Integer
endBatchTime
)
throws
Exception
;
}
signal-utc-service/src/main/java/net/wanji/utc/service/runninginfo/impl/SignalStatusServiceImpl.java
View file @
ada82b8f
...
...
@@ -22,16 +22,14 @@ import net.wanji.utc.service.runninginfo.HkLightsStatusService;
import
net.wanji.utc.service.runninginfo.HkRunningStatusService
;
import
net.wanji.utc.service.runninginfo.SignalStatusService
;
import
net.wanji.utc.service.runninginfo.WanJiCommonRunningStatusService
;
import
net.wanji.utc.task.SignalStatus4StaticSchemeTask
;
import
net.wanji.utc.util.ListUtil
;
import
net.wanji.utc.util.RedisUtil
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -153,6 +151,16 @@ public class SignalStatusServiceImpl implements SignalStatusService {
return
resList
;
}
@Override
public
List
<
LightsStatusVO
>
lightStatus4StaticScheme
()
throws
Exception
{
Map
<
String
,
LightsStatusVO
>
runningStateInfoCache
=
SignalStatus4StaticSchemeTask
.
runningStateInfoCache
;
List
<
LightsStatusVO
>
result
=
new
ArrayList
<>();
for
(
Map
.
Entry
<
String
,
LightsStatusVO
>
entry
:
runningStateInfoCache
.
entrySet
())
{
result
.
add
(
entry
.
getValue
());
}
return
result
;
}
private
List
<
BaseCrossInfo
>
getBaseCrossInfoList
(
BasicEnum
.
ManufacturerEnum
manufacturerEnum
)
{
// 查询路口信息
ManufacturerInfoPO
manufacturerInfoPO
=
manufacturerInfoMapper
.
selectByCode
(
manufacturerEnum
.
getCode
());
...
...
@@ -181,7 +189,8 @@ public class SignalStatusServiceImpl implements SignalStatusService {
for
(
CrossLightsStatusHistPO
crossLightsStatusHistPO
:
crossLightsStatusHistPOS
)
{
String
lightsStatusJson
=
crossLightsStatusHistPO
.
getLightsStatusJson
();
ObjectMapper
instance
=
JacksonUtils
.
getInstance
();
List
<
LightsStatusVO
>
lightsStatusVOS
=
instance
.
readValue
(
lightsStatusJson
,
new
TypeReference
<
List
<
LightsStatusVO
>>()
{});
List
<
LightsStatusVO
>
lightsStatusVOS
=
instance
.
readValue
(
lightsStatusJson
,
new
TypeReference
<
List
<
LightsStatusVO
>>()
{
});
if
(!
CollectionUtils
.
isEmpty
(
lightsStatusVOS
))
{
LightsStatusVO
lightsStatusVO
=
lightsStatusVOS
.
get
(
0
);
result
.
add
(
lightsStatusVO
);
...
...
signal-utc-service/src/main/java/net/wanji/utc/task/SignalStatus4StaticSchemeTask.java
0 → 100644
View file @
ada82b8f
package
net
.
wanji
.
utc
.
task
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.framework.Constants
;
import
net.wanji.common.utils.tool.DateUtil
;
import
net.wanji.common.utils.tool.StringUtils
;
import
net.wanji.databus.dao.entity.*
;
import
net.wanji.databus.dao.mapper.CrossPhaseMapper
;
import
net.wanji.databus.dao.mapper.CrossSchedulesMapper
;
import
net.wanji.databus.dao.mapper.CrossSchemeMapper
;
import
net.wanji.databus.dao.mapper.CrossSectionMapper
;
import
net.wanji.databus.po.CrossInfoPO
;
import
net.wanji.databus.vo.LightsStatusVO
;
import
net.wanji.utc.cache.CrossInfoCache
;
import
net.wanji.utc.cache.CrossPhaseDirTurnCache
;
import
net.wanji.utc.cache.CrossSchemePhaseTimeCountCache
;
import
net.wanji.utc.dto.CrossSchemePhaseCountDownDTO
;
import
net.wanji.utc.dto.PhaseCountDownDTO
;
import
net.wanji.utc.po.hk.CrossPhaseDirTurnPojo
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
java.time.LocalTime
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
/**
* @author duanruiming
* @description 从信号机方案模拟信号机灯态
* @date 2023/12/01 10:28
*/
@Component
@Slf4j
public
class
SignalStatus4StaticSchemeTask
{
public
static
final
Map
<
String
,
LightsStatusVO
>
currentCrossLightStatusCache
=
new
HashMap
<>();
public
static
final
Map
<
String
,
LightsStatusVO
>
runningStateInfoCache
=
new
ConcurrentHashMap
<>();
@Resource
private
CrossSchedulesMapper
crossSchedulesMapper
;
@Resource
private
CrossSectionMapper
crossSectionMapper
;
@Resource
private
CrossSchemeMapper
crossSchemeMapper
;
@Resource
private
CrossPhaseMapper
crossPhaseMapper
;
@Scheduled
(
fixedRate
=
1000
)
public
void
signalStatusCountDown
()
throws
Exception
{
try
{
if
(!
currentCrossLightStatusCache
.
isEmpty
())
{
for
(
Map
.
Entry
<
String
,
LightsStatusVO
>
entry
:
currentCrossLightStatusCache
.
entrySet
())
{
String
crossId
=
entry
.
getKey
();
LightsStatusVO
lightsStatusVO
=
entry
.
getValue
();
long
timeStamp
=
Long
.
parseLong
(
lightsStatusVO
.
getTimeStamp
());
String
schemeStartTime
=
lightsStatusVO
.
getSchemeStartTime
();
String
phaseId
=
lightsStatusVO
.
getPhaseId
();
String
schemeId
=
lightsStatusVO
.
getSchemeId
();
CrossSchemePO
crossSchemePO
=
crossSchemeMapper
.
selectByCrossIdAndSchemeNo
(
crossId
,
Integer
.
valueOf
(
schemeId
));
executeNextPeriod
(
crossId
,
lightsStatusVO
,
phaseId
,
crossSchemePO
);
// 当前方案下一周期
setDirLampGroupMap
(
lightsStatusVO
);
if
(
Objects
.
nonNull
(
lightsStatusVO
.
getDirLampGroupMap
()))
{
// 当前时间戳自动加1s
lightsStatusVO
.
setTimeStamp
(
String
.
valueOf
(
timeStamp
+
1000
));
// 红灯倒计时
getRedCountDown
(
crossId
,
lightsStatusVO
,
schemeId
);
runningStateInfoCache
.
put
(
crossId
,
lightsStatusVO
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"定时任务计算路口相位灯态倒计时异常"
,
e
);
throw
new
Exception
(
e
);
}
}
/**
* 每隔1分钟获取路口方案号
*
* @throws Exception
*/
@Scheduled
(
fixedRate
=
60
*
1000
)
public
void
getStaticCrossRunningLightStatus
()
throws
Exception
{
try
{
List
<
CrossInfoPO
>
crossInfoList
=
CrossInfoCache
.
crossInfoList
;
for
(
CrossInfoPO
crossInfoPO
:
crossInfoList
)
{
String
crossId
=
crossInfoPO
.
getId
();
String
code
=
crossInfoPO
.
getCode
();
LightsStatusVO
lightsStatusVO
=
new
LightsStatusVO
();
List
<
CrossSectionPO
>
crossSectionPOS
=
crossSectionMapper
.
selectByCrossId
(
crossId
);
List
<
CrossSchedulesPO
>
crossSchedulesPOS
=
crossSchedulesMapper
.
selectByCrossIds
(
Arrays
.
asList
(
crossId
));
if
(!
CollectionUtils
.
isEmpty
(
crossSchedulesPOS
))
{
Map
<
Integer
,
List
<
CrossSchedulesPO
>>
schedulesMap
=
crossSchedulesPOS
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossSchedulesPO:
:
getPlanId
));
// 判断当前执行的调度,获取日计划号
Date
date
=
new
Date
();
LocalTime
currentTime
=
LocalTime
.
parse
(
DateUtil
.
getTime
());
Integer
currentPlanId
=
getCurrentPlanId
(
schedulesMap
,
date
);
Integer
schemeId
=
getCurrentSchemeId
(
crossSectionPOS
,
currentTime
,
currentPlanId
);
CrossSchemePO
crossSchemePO
=
crossSchemeMapper
.
selectSchemePOById
(
schemeId
);
if
(
Objects
.
nonNull
(
crossSchemePO
))
{
String
schemeNo
=
crossSchemePO
.
getSchemeNo
();
if
(
StringUtils
.
isNotBlank
(
schemeNo
))
{
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
=
CrossSchemePhaseTimeCountCache
.
crossSchemePhaseCountDownList
;
for
(
CrossSchemePhaseCountDownDTO
crossSchemePhaseCountDownDTO
:
crossSchemePhaseCountDownList
)
{
if
(
StringUtils
.
equalsIgnoreCase
(
schemeNo
,
crossSchemePhaseCountDownDTO
.
getSchemeNo
())
&&
StringUtils
.
equalsIgnoreCase
(
crossId
,
crossSchemePhaseCountDownDTO
.
getCrossId
()))
{
lightsStatusVO
.
setCrossId
(
crossId
);
lightsStatusVO
.
setCyclePhaseCountDown
(
crossSchemePO
.
getCycle
());
lightsStatusVO
.
setCycleCountDown
(
crossSchemePO
.
getCycle
());
lightsStatusVO
.
setSchemeId
(
schemeNo
);
lightsStatusVO
.
setCycleLen
(
crossSchemePO
.
getCycle
());
lightsStatusVO
.
setPhaseId
(
"1"
);
String
currentTimeStr
=
String
.
valueOf
(
date
.
getTime
());
lightsStatusVO
.
setTimeStamp
(
currentTimeStr
);
lightsStatusVO
.
setCode
(
code
);
lightsStatusVO
.
setRunMode
(
"11"
);
lightsStatusVO
.
setControlMode
(
"11"
);
currentCrossLightStatusCache
.
put
(
crossId
,
lightsStatusVO
);
}
}
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
error
(
"获取当前路口运行方案号失败:"
,
e
);
throw
new
Exception
(
e
);
}
}
private
static
Integer
getCurrentSchemeId
(
List
<
CrossSectionPO
>
crossSectionPOS
,
LocalTime
currentTime
,
Integer
currentPlanId
)
{
if
(!
CollectionUtils
.
isEmpty
(
crossSectionPOS
))
{
List
<
CrossSectionPO
>
currentPlanIdSectionList
=
crossSectionPOS
.
stream
().
filter
(
po
->
Objects
.
equals
(
currentPlanId
,
po
.
getPlanId
())).
collect
(
Collectors
.
toList
());
for
(
CrossSectionPO
crossSectionPO
:
currentPlanIdSectionList
)
{
Integer
schemeId
=
crossSectionPO
.
getSchemeId
();
LocalTime
startTime
=
LocalTime
.
parse
(
crossSectionPO
.
getStartTime
());
LocalTime
endTime
=
LocalTime
.
parse
(
crossSectionPO
.
getEndTime
());
// 过滤非当前时段数据
if
(
currentTime
.
isAfter
(
startTime
)
&&
currentTime
.
isBefore
(
endTime
))
{
return
schemeId
;
}
}
}
return
0
;
}
private
static
Integer
getCurrentPlanId
(
Map
<
Integer
,
List
<
CrossSchedulesPO
>>
schedulesMap
,
Date
currentDate
)
{
for
(
Map
.
Entry
<
Integer
,
List
<
CrossSchedulesPO
>>
entry
:
schedulesMap
.
entrySet
())
{
Integer
planId
=
entry
.
getKey
();
List
<
CrossSchedulesPO
>
schedulesPOS
=
entry
.
getValue
();
if
(!
CollectionUtils
.
isEmpty
(
schedulesPOS
))
{
for
(
CrossSchedulesPO
schedulesPO
:
schedulesPOS
)
{
Integer
isSpectialDay
=
schedulesPO
.
getWeek
();
// 0 为特殊日期
Date
specialDate
=
schedulesPO
.
getSpecialDate
();
String
specialDate4DB
=
DateUtil
.
format
(
specialDate
,
Constants
.
DATE_FORMAT
.
E_DATE_FORMAT_SECOND
);
String
currentDateStr
=
DateUtil
.
format
(
currentDate
,
Constants
.
DATE_FORMAT
.
E_DATE_FORMAT_SECOND
);
if
(
Objects
.
equals
(
0
,
isSpectialDay
))
{
if
(
StringUtils
.
equalsIgnoreCase
(
currentDateStr
.
substring
(
0
,
10
),
specialDate4DB
.
substring
(
0
,
10
)))
{
return
planId
;
}
}
Integer
week4DB
=
schedulesPO
.
getWeek
();
int
weekCurrent
=
DateUtil
.
getWeek
(
currentDate
);
if
(
week4DB
==
weekCurrent
)
{
return
planId
;
}
}
}
}
return
0
;
}
private
static
void
getRedCountDown
(
String
crossId
,
LightsStatusVO
lightsStatusVO
,
String
schemeId
)
{
Map
<
String
,
Object
>
phaseMap
=
new
HashMap
<>();
List
<
CrossPhaseDirTurnPojo
>
crossPhaseDirTurnCache
=
CrossPhaseDirTurnCache
.
getCrossPhaseDirTurnCache
(
crossId
);
List
<
PhaseCountDownDTO
>
phaseCountDownList
=
getPhaseCountDownList
(
crossId
,
schemeId
);
if
(!
CollectionUtils
.
isEmpty
(
phaseCountDownList
))
{
for
(
PhaseCountDownDTO
phaseCountDownDTO
:
phaseCountDownList
)
{
Integer
changePhaseTime
=
phaseCountDownDTO
.
getChangePhaseTime
();
Integer
phaseTime
=
phaseCountDownDTO
.
getPhaseTime
();
Integer
cycleLen
=
lightsStatusVO
.
getCycleLen
();
Integer
cycleCountDown
=
lightsStatusVO
.
getCycleCountDown
();
String
currenPhaseId
=
lightsStatusVO
.
getPhaseId
();
int
runtime
=
cycleLen
-
cycleCountDown
;
int
redCountDown
=
0
;
if
(!
CollectionUtils
.
isEmpty
(
crossPhaseDirTurnCache
))
{
for
(
CrossPhaseDirTurnPojo
dirTurnPojo
:
crossPhaseDirTurnCache
)
{
if
(
StringUtils
.
equalsIgnoreCase
(
schemeId
,
String
.
valueOf
(
dirTurnPojo
.
getSchemeNo
())))
{
if
(!
StringUtils
.
equalsIgnoreCase
(
currenPhaseId
,
String
.
valueOf
(
dirTurnPojo
.
getPhaseNo
())))
{
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
=
dirTurnPojo
.
getDirTurnMap
();
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
dirEntry
:
dirTurnMap
.
entrySet
())
{
Integer
dir
=
dirEntry
.
getKey
();
Map
<
Integer
,
Integer
>
turnCountDown
=
new
HashMap
<>();
List
<
CrossLightsPO
>
lightsPOS
=
dirEntry
.
getValue
();
if
(!
CollectionUtils
.
isEmpty
(
lightsPOS
))
{
// 忽略行人
List
<
CrossLightsPO
>
person
=
lightsPOS
.
stream
().
filter
(
po
->
po
.
getTurn
()
==
20
).
collect
(
Collectors
.
toList
());
if
(
person
.
size
()
==
lightsPOS
.
size
())
{
continue
;
}
Integer
type
=
lightsPOS
.
get
(
0
).
getType
();
redCountDown
=
changePhaseTime
-
runtime
-
phaseTime
;
if
(
redCountDown
<=
0
)
{
redCountDown
=
cycleLen
-
runtime
;
}
//if (redCountDown <= 0) {
// redCountDown = 1;
//}
if
(
type
==
2
)
{
// 圆饼灯
List
<
Integer
>
dirList
=
Arrays
.
asList
(
1
,
2
,
3
);
for
(
Integer
commonTurn
:
dirList
)
{
turnCountDown
.
put
(
commonTurn
,
redCountDown
);
}
}
else
{
Map
<
Integer
,
List
<
CrossLightsPO
>>
turnMap
=
lightsPOS
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossLightsPO:
:
getTurn
));
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
turnEntry
:
turnMap
.
entrySet
())
{
Integer
turn
=
turnEntry
.
getKey
();
List
<
CrossLightsPO
>
value
=
turnEntry
.
getValue
();
for
(
CrossLightsPO
lightsPO
:
value
)
{
if
(
lightsPO
.
getTurn
()
!=
20
)
{
turnCountDown
.
put
(
turn
,
redCountDown
);
}
}
}
}
}
setPhaseMap
(
phaseMap
,
dir
,
turnCountDown
);
}
}
else
{
Integer
cyclePhaseCountDown
=
lightsStatusVO
.
getCyclePhaseCountDown
();
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
=
dirTurnPojo
.
getDirTurnMap
();
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
dirEntry
:
dirTurnMap
.
entrySet
())
{
Integer
dir
=
dirEntry
.
getKey
();
Map
<
Integer
,
Integer
>
turnCountDown
=
new
HashMap
<>();
List
<
CrossLightsPO
>
lightsPOS
=
dirEntry
.
getValue
();
if
(!
CollectionUtils
.
isEmpty
(
lightsPOS
))
{
// 忽略行人
List
<
CrossLightsPO
>
person
=
lightsPOS
.
stream
().
filter
(
po
->
po
.
getTurn
()
==
20
).
collect
(
Collectors
.
toList
());
if
(
person
.
size
()
==
lightsPOS
.
size
())
{
continue
;
}
Integer
type
=
lightsPOS
.
get
(
0
).
getType
();
redCountDown
=
cyclePhaseCountDown
;
if
(
type
==
2
)
{
// 圆饼灯
List
<
Integer
>
dirList
=
Arrays
.
asList
(
1
,
2
,
3
);
for
(
Integer
commonTurn
:
dirList
)
{
turnCountDown
.
put
(
commonTurn
,
redCountDown
);
}
}
else
{
Map
<
Integer
,
List
<
CrossLightsPO
>>
turnMap
=
lightsPOS
.
stream
().
collect
(
Collectors
.
groupingBy
(
CrossLightsPO:
:
getTurn
));
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
turnEntry
:
turnMap
.
entrySet
())
{
Integer
turn
=
turnEntry
.
getKey
();
List
<
CrossLightsPO
>
value
=
turnEntry
.
getValue
();
for
(
CrossLightsPO
lightsPO
:
value
)
{
if
(
lightsPO
.
getTurn
()
!=
20
)
{
turnCountDown
.
put
(
turn
,
redCountDown
);
}
}
}
}
}
setPhaseMap
(
phaseMap
,
dir
,
turnCountDown
);
}
}
}
}
}
}
}
lightsStatusVO
.
setPhaseMap
(
phaseMap
);
}
/**
* 统一方向转向倒计时
*
* @param phaseMap
* @param dir
* @param turnCountDown
*/
private
static
void
setPhaseMap
(
Map
<
String
,
Object
>
phaseMap
,
Integer
dir
,
Map
<
Integer
,
Integer
>
turnCountDown
)
{
String
dirStr
=
String
.
valueOf
(
dir
);
if
(!
phaseMap
.
isEmpty
()
&&
Objects
.
nonNull
(
phaseMap
.
get
(
dirStr
)))
{
Map
<
Integer
,
Integer
>
turnCountDownCache
=
(
Map
<
Integer
,
Integer
>)
phaseMap
.
get
(
dirStr
);
turnCountDown
.
putAll
(
turnCountDownCache
);
phaseMap
.
put
(
String
.
valueOf
(
dir
),
turnCountDown
);
}
else
{
phaseMap
.
put
(
String
.
valueOf
(
dir
),
turnCountDown
);
}
}
/**
* @param crossId
* @param lightsStatusVO
* @param crossSchemePO
* @description 通过日计划缓存,切换下一个时段方案
*/
private
void
executeNextSectionScheme
(
String
crossId
,
LightsStatusVO
lightsStatusVO
,
CrossSchemePO
crossSchemePO
)
throws
Exception
{
if
(
Objects
.
nonNull
(
crossSchemePO
))
{
List
<
CrossPhasePO
>
nextSchemePhaseList
=
crossPhaseMapper
.
selectByCrossIdAndPlanId
(
crossId
,
String
.
valueOf
(
crossSchemePO
.
getId
()));
Integer
phaseTime
=
0
;
String
phaseId
=
null
;
if
(!
CollectionUtils
.
isEmpty
(
nextSchemePhaseList
))
{
for
(
CrossPhasePO
crossPhasePO
:
nextSchemePhaseList
)
{
if
(
Objects
.
equals
(
1
,
crossPhasePO
.
getSort
()))
{
phaseTime
=
crossPhasePO
.
getPhaseTime
();
phaseId
=
crossPhasePO
.
getPhaseNo
();
}
}
}
lightsStatusVO
.
setPhaseId
(
phaseId
);
lightsStatusVO
.
setCyclePhaseCountDown
(
phaseTime
);
}
}
/**
* @param crossId
* @param lightsStatusVO
* @param phaseId
* @param crossSchemePO
* @description 切换下一方案周期
*/
private
void
executeNextPeriod
(
String
crossId
,
LightsStatusVO
lightsStatusVO
,
String
phaseId
,
CrossSchemePO
crossSchemePO
)
throws
Exception
{
if
(
lightsStatusVO
.
getCyclePhaseCountDown
()
<=
1
&&
Objects
.
nonNull
(
crossSchemePO
))
{
List
<
CrossPhasePO
>
crossPhasePOS
=
crossPhaseMapper
.
selectByCrossIdAndPlanId
(
crossId
,
String
.
valueOf
(
crossSchemePO
.
getId
()));
Integer
nextPhaseTime
=
0
;
String
nextPhaseId
=
"0"
;
if
(!
CollectionUtils
.
isEmpty
(
crossPhasePOS
))
{
for
(
int
i
=
0
;
i
<
crossPhasePOS
.
size
();
i
++)
{
if
(
StringUtils
.
equalsIgnoreCase
(
phaseId
,
crossPhasePOS
.
get
(
i
).
getPhaseNo
()))
{
if
(
i
==
crossPhasePOS
.
size
()
-
1
)
{
nextPhaseTime
=
crossPhasePOS
.
get
(
0
).
getPhaseTime
();
nextPhaseId
=
"1"
;
}
else
{
nextPhaseTime
=
crossPhasePOS
.
get
(
i
+
1
).
getPhaseTime
();
nextPhaseId
=
crossPhasePOS
.
get
(
i
+
1
).
getPhaseNo
();
}
}
}
}
lightsStatusVO
.
setPhaseId
(
nextPhaseId
);
lightsStatusVO
.
setCyclePhaseCountDown
(
nextPhaseTime
);
}
else
{
lightsStatusVO
.
setCyclePhaseCountDown
(
lightsStatusVO
.
getCyclePhaseCountDown
()
-
1
);
Integer
cycleCountDown
=
lightsStatusVO
.
getCycleCountDown
();
lightsStatusVO
.
setCycleCountDown
(--
cycleCountDown
);
}
}
/**
* @param lightsStatusVO
* @description 通过当前周期倒计时方案相位灯态
*/
public
void
setDirLampGroupMap
(
LightsStatusVO
lightsStatusVO
)
throws
Exception
{
String
crossId
=
lightsStatusVO
.
getCrossId
();
String
currentSchemeNo
=
lightsStatusVO
.
getSchemeId
();
String
currentPhaseNo
=
lightsStatusVO
.
getPhaseId
();
Integer
cyclePhaseCountDown
=
lightsStatusVO
.
getCyclePhaseCountDown
();
List
<
CrossPhaseDirTurnPojo
>
crossPhaseDirTurnCache
=
CrossPhaseDirTurnCache
.
getCrossPhaseDirTurnCache
(
crossId
);
if
(!
CollectionUtils
.
isEmpty
(
crossPhaseDirTurnCache
))
{
Map
<
String
,
Object
>
dirLampGroupMap
=
new
HashMap
<>();
setPhaseLampColor
(
crossId
,
currentSchemeNo
,
currentPhaseNo
,
cyclePhaseCountDown
,
crossPhaseDirTurnCache
,
dirLampGroupMap
);
// 海信,箭头灯变圆饼灯
for
(
Map
.
Entry
<
String
,
Object
>
arrowEntry
:
dirLampGroupMap
.
entrySet
())
{
String
dir
=
arrowEntry
.
getKey
();
Map
<
Integer
,
String
>
turnColor
=
(
Map
<
Integer
,
String
>)
arrowEntry
.
getValue
();
if
(!
turnColor
.
isEmpty
()
&&
!
turnColor
.
containsKey
(
1
))
{
// 如果不包含左转, 左转灯色为直行
String
straightColor
=
turnColor
.
get
(
2
);
turnColor
.
put
(
1
,
straightColor
);
dirLampGroupMap
.
put
(
dir
,
turnColor
);
}
}
lightsStatusVO
.
setDirLampGroupMap
(
dirLampGroupMap
);
}
}
private
void
setPhaseLampColor
(
String
crossId
,
String
currentSchemeNo
,
String
currentPhaseNo
,
Integer
cyclePhaseCountDown
,
List
<
CrossPhaseDirTurnPojo
>
crossPhaseDirTurnCache
,
Map
<
String
,
Object
>
dirLampGroupMap
)
throws
Exception
{
for
(
CrossPhaseDirTurnPojo
phaseDirTurnPojo
:
crossPhaseDirTurnCache
)
{
String
schemeNo
=
String
.
valueOf
(
phaseDirTurnPojo
.
getSchemeNo
());
String
phaseNo
=
String
.
valueOf
(
phaseDirTurnPojo
.
getPhaseNo
());
if
(
StringUtils
.
equalsIgnoreCase
(
schemeNo
,
currentSchemeNo
))
{
if
(!
StringUtils
.
equalsIgnoreCase
(
currentPhaseNo
,
String
.
valueOf
(
phaseNo
)))
{
// 相位红灯
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
=
phaseDirTurnPojo
.
getDirTurnMap
();
if
(!
dirTurnMap
.
isEmpty
())
{
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
entry
:
dirTurnMap
.
entrySet
())
{
String
dir
=
String
.
valueOf
(
entry
.
getKey
());
Map
<
Integer
,
String
>
turnColor
=
null
;
if
(!
dirLampGroupMap
.
containsKey
(
dir
))
{
turnColor
=
new
HashMap
<>();
}
else
{
turnColor
=
(
Map
<
Integer
,
String
>)
dirLampGroupMap
.
get
(
dir
);
}
List
<
CrossLightsPO
>
value
=
entry
.
getValue
();
int
type
=
1
;
for
(
CrossLightsPO
crossLightsPO
:
value
)
{
Integer
turn
=
crossLightsPO
.
getTurn
();
type
=
crossLightsPO
.
getType
();
// 搭接相位跳过绿灯变红灯
if
(
turnColor
.
containsKey
(
turn
)
&&
turnColor
.
get
(
turn
).
equals
(
"green"
))
{
continue
;
}
turnColor
.
put
(
turn
,
"red"
);
}
if
(
type
==
2
)
{
setAllTurnColor
(
turnColor
,
"red"
);
//红灯时,圆饼灯操作
}
turnColor
.
put
(
3
,
"green"
);
dirLampGroupMap
.
put
(
dir
,
turnColor
);
}
}
}
else
{
// 相位绿灯
PhaseCountDownDTO
phaseCountDownDTO
=
getPhaseCountDownDTO
(
crossId
,
schemeNo
,
phaseNo
);
if
(
Objects
.
isNull
(
phaseCountDownDTO
))
{
continue
;
}
Integer
yellowTime
=
phaseCountDownDTO
.
getYellowTime
();
Integer
redTime
=
phaseCountDownDTO
.
getRedTime
();
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
=
phaseDirTurnPojo
.
getDirTurnMap
();
if
(!
dirTurnMap
.
isEmpty
())
{
setDirTurnColor
(
cyclePhaseCountDown
,
dirLampGroupMap
,
yellowTime
,
redTime
,
dirTurnMap
);
}
}
}
}
}
private
static
void
setDirTurnColor
(
Integer
cyclePhaseCountDown
,
Map
<
String
,
Object
>
dirLampGroupMap
,
Integer
yellowTime
,
Integer
redTime
,
Map
<
Integer
,
List
<
CrossLightsPO
>>
dirTurnMap
)
throws
Exception
{
for
(
Map
.
Entry
<
Integer
,
List
<
CrossLightsPO
>>
dirEntry
:
dirTurnMap
.
entrySet
())
{
String
dir
=
String
.
valueOf
(
dirEntry
.
getKey
());
List
<
CrossLightsPO
>
lightsList
=
dirEntry
.
getValue
();
if
(
CollectionUtils
.
isEmpty
(
lightsList
))
{
continue
;
}
Map
<
Integer
,
String
>
turnColor
=
null
;
if
(!
dirLampGroupMap
.
containsKey
(
dir
))
{
turnColor
=
new
HashMap
<>();
}
else
{
turnColor
=
(
Map
<
Integer
,
String
>)
dirLampGroupMap
.
get
(
dir
);
}
Integer
type
=
2
;
// 灯组类型:1箭头;2圆饼;3行人;
String
color
=
null
;
for
(
CrossLightsPO
crossLightsPO
:
lightsList
)
{
type
=
crossLightsPO
.
getType
();
Integer
turn
=
crossLightsPO
.
getTurn
();
color
=
setTurnColor
(
cyclePhaseCountDown
,
yellowTime
,
redTime
,
turnColor
,
color
,
turn
);
turnColor
.
put
(
turn
,
color
);
}
if
(
type
==
2
)
{
setAllTurnColor
(
turnColor
,
color
);
}
dirLampGroupMap
.
put
(
dir
,
turnColor
);
}
}
private
static
String
setTurnColor
(
Integer
cyclePhaseCountDown
,
Integer
yellowTime
,
Integer
redTime
,
Map
<
Integer
,
String
>
turnColor
,
String
color
,
Integer
turn
)
throws
Exception
{
if
(
cyclePhaseCountDown
>
yellowTime
+
redTime
)
{
color
=
"green"
;
if
(
turn
==
20
)
{
turnColor
.
put
(
turn
,
"red"
);
}
}
if
(
cyclePhaseCountDown
<=
yellowTime
+
redTime
&&
cyclePhaseCountDown
>
redTime
)
{
color
=
"yellow"
;
if
(
turn
==
20
)
{
turnColor
.
put
(
turn
,
"red"
);
}
}
if
(
cyclePhaseCountDown
<=
redTime
)
{
color
=
"red"
;
if
(
turn
==
20
)
{
turnColor
.
put
(
turn
,
"green"
);
}
}
return
color
;
}
/**
* 两秒倒计时,全场红
*
* @param turnColor
* @param type
* @param color
*/
private
static
void
setAllTurnColorRed
(
Map
<
Integer
,
String
>
turnColor
,
Integer
type
,
String
color
)
throws
Exception
{
List
<
Integer
>
allTurn
=
Arrays
.
asList
(
1
,
2
,
3
);
for
(
Integer
turnStr
:
allTurn
)
{
if
(!
turnColor
.
containsKey
(
turnStr
))
{
turnColor
.
put
(
turnStr
,
"red"
);
}
}
for
(
Map
.
Entry
<
Integer
,
String
>
entry
:
turnColor
.
entrySet
())
{
entry
.
setValue
(
"red"
);
}
}
/**
* 圆饼灯设置所有方向灯色
*
* @param turnColor
* @param color
*/
private
static
void
setAllTurnColor
(
Map
<
Integer
,
String
>
turnColor
,
String
color
)
throws
Exception
{
List
<
Integer
>
allTurn
=
Arrays
.
asList
(
1
,
2
);
for
(
Integer
turn
:
allTurn
)
{
if
(!
turnColor
.
containsKey
(
turn
))
{
turnColor
.
put
(
turn
,
color
);
}
}
turnColor
.
put
(
3
,
"green"
);
// 右转常绿
}
/**
* @param crossId
* @param schemeNo
* @param phaseNo
* @return
* @description 获取路口方案相位倒计时
*/
private
PhaseCountDownDTO
getPhaseCountDownDTO
(
String
crossId
,
String
schemeNo
,
String
phaseNo
)
{
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
=
CrossSchemePhaseTimeCountCache
.
crossSchemePhaseCountDownList
;
if
(!
CollectionUtils
.
isEmpty
(
crossSchemePhaseCountDownList
))
{
for
(
CrossSchemePhaseCountDownDTO
dto
:
crossSchemePhaseCountDownList
)
{
if
(
Objects
.
equals
(
crossId
,
dto
.
getCrossId
())
&&
Objects
.
equals
(
schemeNo
,
dto
.
getSchemeNo
()))
{
List
<
PhaseCountDownDTO
>
phaseCountDownDTOList
=
dto
.
getPhaseCountDownDTOList
();
if
(!
CollectionUtils
.
isEmpty
(
phaseCountDownDTOList
))
{
for
(
PhaseCountDownDTO
phaseCountDownDTO
:
phaseCountDownDTOList
)
{
if
(
Objects
.
equals
(
phaseNo
,
phaseCountDownDTO
.
getPhaseNo
()))
{
return
phaseCountDownDTO
;
}
}
}
}
}
}
return
null
;
}
private
static
List
<
PhaseCountDownDTO
>
getPhaseCountDownList
(
String
crossId
,
String
schemeNo
)
{
List
<
CrossSchemePhaseCountDownDTO
>
crossSchemePhaseCountDownList
=
CrossSchemePhaseTimeCountCache
.
crossSchemePhaseCountDownList
;
if
(!
CollectionUtils
.
isEmpty
(
crossSchemePhaseCountDownList
))
{
for
(
CrossSchemePhaseCountDownDTO
dto
:
crossSchemePhaseCountDownList
)
{
if
(
Objects
.
equals
(
crossId
,
dto
.
getCrossId
())
&&
Objects
.
equals
(
schemeNo
,
dto
.
getSchemeNo
()))
{
List
<
PhaseCountDownDTO
>
phaseCountDownDTOList
=
dto
.
getPhaseCountDownDTOList
();
if
(!
CollectionUtils
.
isEmpty
(
phaseCountDownDTOList
))
{
return
phaseCountDownDTOList
;
}
}
}
}
return
Collections
.
emptyList
();
}
}
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