Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
W
wj-datacenter-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
jinan
wj-datacenter-platform
Commits
97090869
Commit
97090869
authored
Oct 21, 2023
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[update] 优化清空率,全场红校验
parent
d86905af
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
66 additions
and
61 deletions
+66
-61
CrossRealTimeCache.java
...n/java/net/wanji/datacenter/cache/CrossRealTimeCache.java
+0
-3
CrossSchemePhaseLightsCache.java
...t/wanji/datacenter/cache/CrossSchemePhaseLightsCache.java
+2
-0
CrossSchemePhaseDirTurnDTO.java
...wanji/datacenter/pojo/dto/CrossSchemePhaseDirTurnDTO.java
+1
-0
LanePeriodicDataProcessServiceImpl.java
...nter/service/impl/LanePeriodicDataProcessServiceImpl.java
+6
-2
DataProcessTask.java
.../main/java/net/wanji/datacenter/task/DataProcessTask.java
+57
-56
No files found.
wj-datacenter-service/src/main/java/net/wanji/datacenter/cache/CrossRealTimeCache.java
View file @
97090869
package
net
.
wanji
.
datacenter
.
cache
;
package
net
.
wanji
.
datacenter
.
cache
;
import
net.wanji.datacenter.pojo.dto.CrossDataIndexDTO
;
import
net.wanji.datacenter.pojo.dto.CrossDataIndexDTO
;
import
net.wanji.datacenter.pojo.dto.CrossStatusDurationDTO
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
...
...
wj-datacenter-service/src/main/java/net/wanji/datacenter/cache/CrossSchemePhaseLightsCache.java
View file @
97090869
...
@@ -50,6 +50,7 @@ public class CrossSchemePhaseLightsCache implements CommandLineRunner {
...
@@ -50,6 +50,7 @@ public class CrossSchemePhaseLightsCache implements CommandLineRunner {
for
(
CrossPhasePO
crossPhasePO
:
crossPhasePOList
)
{
for
(
CrossPhasePO
crossPhasePO
:
crossPhasePOList
)
{
Integer
phaseId
=
crossPhasePO
.
getId
();
Integer
phaseId
=
crossPhasePO
.
getId
();
String
phaseNo
=
crossPhasePO
.
getPhaseNo
();
String
phaseNo
=
crossPhasePO
.
getPhaseNo
();
Integer
redTime
=
crossPhasePO
.
getRedTime
();
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
=
baseCrossPhaseLightsMapper
.
selectByPhaseId
(
phaseId
);
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
=
baseCrossPhaseLightsMapper
.
selectByPhaseId
(
phaseId
);
if
(!
CollectionUtils
.
isEmpty
(
crossPhaseLightsPOList
))
{
if
(!
CollectionUtils
.
isEmpty
(
crossPhaseLightsPOList
))
{
for
(
CrossPhaseLightsPO
crossPhaseLightsPO
:
crossPhaseLightsPOList
)
{
for
(
CrossPhaseLightsPO
crossPhaseLightsPO
:
crossPhaseLightsPOList
)
{
...
@@ -65,6 +66,7 @@ public class CrossSchemePhaseLightsCache implements CommandLineRunner {
...
@@ -65,6 +66,7 @@ public class CrossSchemePhaseLightsCache implements CommandLineRunner {
if
(
turn
==
20
)
{
if
(
turn
==
20
)
{
continue
;
continue
;
}
}
crossSchemePhaseDirTurnDTO
.
setRedTime
(
redTime
);
crossSchemePhaseDirTurnDTO
.
setLightsTurn
(
turn
);
crossSchemePhaseDirTurnDTO
.
setLightsTurn
(
turn
);
crossSchemePhaseDirTurnDTOList
.
add
(
crossSchemePhaseDirTurnDTO
);
crossSchemePhaseDirTurnDTOList
.
add
(
crossSchemePhaseDirTurnDTO
);
}
}
...
...
wj-datacenter-service/src/main/java/net/wanji/datacenter/pojo/dto/CrossSchemePhaseDirTurnDTO.java
View file @
97090869
...
@@ -13,4 +13,5 @@ public class CrossSchemePhaseDirTurnDTO {
...
@@ -13,4 +13,5 @@ public class CrossSchemePhaseDirTurnDTO {
private
String
phaseNo
;
private
String
phaseNo
;
private
Integer
lightsDir
;
private
Integer
lightsDir
;
private
Integer
lightsTurn
;
private
Integer
lightsTurn
;
private
Integer
redTime
;
}
}
wj-datacenter-service/src/main/java/net/wanji/datacenter/service/impl/LanePeriodicDataProcessServiceImpl.java
View file @
97090869
...
@@ -25,6 +25,7 @@ import org.springframework.util.StringUtils;
...
@@ -25,6 +25,7 @@ import org.springframework.util.StringUtils;
import
java.text.DecimalFormat
;
import
java.text.DecimalFormat
;
import
java.util.*
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
/**
/**
...
@@ -46,6 +47,8 @@ public class LanePeriodicDataProcessServiceImpl implements DataProcessService {
...
@@ -46,6 +47,8 @@ public class LanePeriodicDataProcessServiceImpl implements DataProcessService {
private
static
CrossDataRealtimeMapper
crossDataRealTimeMapper
;
private
static
CrossDataRealtimeMapper
crossDataRealTimeMapper
;
private
final
LanePeriodicDataEventListConvert
lanePeriodicDataEventListConvert
;
private
final
LanePeriodicDataEventListConvert
lanePeriodicDataEventListConvert
;
private
final
ProducerHandler
producerHandler
;
private
final
ProducerHandler
producerHandler
;
// 五分钟周期内是否有全场红
public
static
final
ConcurrentHashMap
<
String
,
Integer
>
periodHaveAllRedMap
=
new
ConcurrentHashMap
<>();
@Autowired
@Autowired
public
void
setCrossDataRealTimeMapper
(
CrossDataRealtimeMapper
crossDataRealTimeMapper
,
public
void
setCrossDataRealTimeMapper
(
CrossDataRealtimeMapper
crossDataRealTimeMapper
,
...
@@ -630,8 +633,9 @@ public class LanePeriodicDataProcessServiceImpl implements DataProcessService {
...
@@ -630,8 +633,9 @@ public class LanePeriodicDataProcessServiceImpl implements DataProcessService {
if
(
notClearCarNums
==
0
)
{
if
(
notClearCarNums
==
0
)
{
clearRate
=
1.0
;
clearRate
=
1.0
;
}
}
if
(
notClearCarNums
>
10
)
{
Integer
allRed
=
periodHaveAllRedMap
.
get
(
crossId
);
clearRate
=
0.0
;
if
(!
Objects
.
equals
(
allRed
,
1
))
{
// 无全场红
clearRate
=
-
1.0
;
}
}
insertCrossDataRealtimePO
.
setClearRate
(
clearRate
);
insertCrossDataRealtimePO
.
setClearRate
(
clearRate
);
insertCrossDataRealtimePO
.
setNotClearCarNums
(
notClearCarNums
);
insertCrossDataRealtimePO
.
setNotClearCarNums
(
notClearCarNums
);
...
...
wj-datacenter-service/src/main/java/net/wanji/datacenter/task/DataProcessTask.java
View file @
97090869
package
net
.
wanji
.
datacenter
.
task
;
package
net
.
wanji
.
datacenter
.
task
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.enums.DateStyle
;
import
net.wanji.common.enums.DateStyle
;
import
net.wanji.common.framework.Constants
;
import
net.wanji.common.framework.rest.JsonViewObject
;
import
net.wanji.common.framework.rest.JsonViewObject
;
import
net.wanji.common.utils.tool.JacksonUtils
;
import
net.wanji.common.utils.tool.JacksonUtils
;
import
net.wanji.databus.vo.LightsStatusVO
;
import
net.wanji.databus.vo.LightsStatusVO
;
import
net.wanji.datacenter.cache.CrossRealTimeCache
;
import
net.wanji.datacenter.cache.CrossRealTimeCache
;
import
net.wanji.datacenter.cache.CrossSchemePhaseLightsCache
;
import
net.wanji.datacenter.cache.CrossSchemePhaseLightsCache
;
import
net.wanji.datacenter.common.UTCWEBTurnParseEnum
;
import
net.wanji.datacenter.kafka.ConsumerHandler
;
import
net.wanji.datacenter.kafka.ConsumerHandler
;
import
net.wanji.datacenter.pojo.dto.CrossSchemePhaseDirTurnDTO
;
import
net.wanji.datacenter.pojo.dto.CrossSchemePhaseDirTurnDTO
;
import
net.wanji.datacenter.pojo.dto.CrossSnapshotDataDTO
;
import
net.wanji.datacenter.pojo.dto.CrossSnapshotDataDTO
;
import
net.wanji.datacenter.service.DataProcessService
;
import
net.wanji.datacenter.pojo.dto.LanePeriodicDataDTO
;
import
net.wanji.datacenter.service.impl.LanePeriodicDataProcessServiceImpl
;
import
net.wanji.feign.service.UtcFeignClients
;
import
net.wanji.feign.service.UtcFeignClients
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.scheduling.annotation.Scheduled
;
...
@@ -33,8 +33,6 @@ import java.util.concurrent.ConcurrentHashMap;
...
@@ -33,8 +33,6 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Slf4j
public
class
DataProcessTask
{
public
class
DataProcessTask
{
@Resource
(
name
=
"crossSnapshotDataProcessService"
)
DataProcessService
crossSnapshotDataProcessService
;
@Resource
@Resource
UtcFeignClients
utcFeignClients
;
UtcFeignClients
utcFeignClients
;
...
@@ -47,7 +45,6 @@ public class DataProcessTask {
...
@@ -47,7 +45,6 @@ public class DataProcessTask {
*/
*/
@Scheduled
(
initialDelay
=
30
*
1000
,
fixedRate
=
1000
)
@Scheduled
(
initialDelay
=
30
*
1000
,
fixedRate
=
1000
)
public
void
calculateGreenLightsClearRate
()
throws
Exception
{
public
void
calculateGreenLightsClearRate
()
throws
Exception
{
List
<
CrossSchemePhaseDirTurnDTO
>
crossSchemePhaseDirTurnDTOList
=
CrossSchemePhaseLightsCache
.
crossSchemePhaseDirTurnDTOList
;
JsonViewObject
jsonViewObject
=
utcFeignClients
.
lightStatus
();
JsonViewObject
jsonViewObject
=
utcFeignClients
.
lightStatus
();
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
if
(
Objects
.
isNull
(
jsonViewObject
)
||
jsonViewObject
.
getCode
()
!=
200
)
{
log
.
error
(
"定时任务同步信号机灯态utcService调用异常"
);
log
.
error
(
"定时任务同步信号机灯态utcService调用异常"
);
...
@@ -59,70 +56,78 @@ public class DataProcessTask {
...
@@ -59,70 +56,78 @@ public class DataProcessTask {
String
crossId
=
lightsStatusVO
.
getCrossId
();
String
crossId
=
lightsStatusVO
.
getCrossId
();
String
schemeNo
=
lightsStatusVO
.
getSchemeId
();
String
schemeNo
=
lightsStatusVO
.
getSchemeId
();
String
currentPhaseId
=
lightsStatusVO
.
getPhaseId
();
// 当前相位红灯说明都是红灯,全场红
String
currentPhaseId
=
lightsStatusVO
.
getPhaseId
();
// 当前相位红灯说明都是红灯,全场红
Long
currenSignalTime
=
Long
.
valueOf
(
lightsStatusVO
.
getSchemeStartTime
());
long
currenSignalTime
=
Long
.
parseLong
(
lightsStatusVO
.
getSchemeStartTime
());
int
phaseSize
=
0
;
HashMap
<
String
,
Integer
>
tempMap
=
new
HashMap
<>();
ConcurrentHashMap
<
String
,
Integer
>
crossIdPhaseIdClearGreenMap
=
CrossRealTimeCache
.
crossPhaseCarNumsMap
;
ConcurrentHashMap
<
String
,
Integer
>
crossIdPhaseIdClearGreenMap
=
CrossRealTimeCache
.
crossPhaseCarNumsMap
;
for
(
Map
.
Entry
<
String
,
Integer
>
entry
:
crossIdPhaseIdClearGreenMap
.
entrySet
())
{
getClearRateCache
(
crossId
,
currentPhaseId
,
crossIdPhaseIdClearGreenMap
);
String
crossIdPhaseNo
=
entry
.
getKey
();
if
(
crossIdPhaseNo
.
contains
(
crossId
))
{
++
phaseSize
;
tempMap
.
put
(
crossId
,
entry
.
getValue
());
}
}
log
.
info
(
"当前路口相位信息:"
+
JacksonUtils
.
getInstance
().
writeValueAsString
(
crossIdPhaseIdClearGreenMap
));
if
(
startPhaseIdMap
.
containsValue
(
currentPhaseId
)
&&
phaseSize
>=
2
)
{
double
clearRate
=
0.0
;
for
(
Map
.
Entry
<
String
,
Integer
>
entry
:
tempMap
.
entrySet
())
{
int
value
=
entry
.
getValue
()
>
0
?
1
:
0
;
clearRate
+=
(
double
)
value
/
phaseSize
;
}
startPhaseIdMap
.
remove
(
crossId
);
// 只计算一次
log
.
info
(
"绿灯清空率为:"
+
(
1
-
clearRate
)
*
100
);
CrossRealTimeCache
.
crossPhaseIdClearGreenMap
.
put
(
crossId
,
1
-
clearRate
);
}
Map
<
String
,
Object
>
dirLampGroupMap
=
lightsStatusVO
.
getDirLampGroupMap
();
Map
<
String
,
Object
>
dirLampGroupMap
=
lightsStatusVO
.
getDirLampGroupMap
();
boolean
isAllRed
=
true
;
LanePeriodicDataProcessServiceImpl
.
periodHaveAllRedMap
.
put
(
crossId
,
0
);
if
(!
dirLampGroupMap
.
isEmpty
())
{
if
(!
dirLampGroupMap
.
isEmpty
())
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
dirLampGroupMap
.
entrySet
())
{
for
(
Map
.
Entry
<
String
,
Object
>
entry
:
dirLampGroupMap
.
entrySet
())
{
String
dir
=
entry
.
getKey
();
Map
<
String
,
String
>
turnLightColorMap
=
(
Map
<
String
,
String
>)
entry
.
getValue
();
Map
<
String
,
String
>
turnLightColorMap
=
(
Map
<
String
,
String
>)
entry
.
getValue
();
for
(
Map
.
Entry
<
String
,
String
>
colorEntry
:
turnLightColorMap
.
entrySet
())
{
for
(
Map
.
Entry
<
String
,
String
>
colorEntry
:
turnLightColorMap
.
entrySet
())
{
String
turn
=
colorEntry
.
getKey
();
String
lightColor
=
colorEntry
.
getValue
();
String
lightColor
=
colorEntry
.
getValue
();
String
currentDirTurn
=
dir
.
concat
(
Constants
.
SystemParam
.
SEPARATOR_UNDER_LINE
)
// 全场红,如果有一个绿灯就不计算
.
concat
(
String
.
valueOf
(
UTCWEBTurnParseEnum
.
getTypeByCode
(
Integer
.
valueOf
(
turn
))));
if
(
Objects
.
equals
(
lightColor
,
"green"
))
{
List
<
String
>
dirTurnList
=
new
ArrayList
<>();
isAllRed
=
false
;
for
(
CrossSchemePhaseDirTurnDTO
dto
:
crossSchemePhaseDirTurnDTOList
)
{
if
(
StringUtils
.
equals
(
crossId
,
dto
.
getCrossId
())
&&
StringUtils
.
equals
(
schemeNo
,
dto
.
getSchemeNo
())
&&
StringUtils
.
equals
(
currentPhaseId
,
dto
.
getPhaseNo
())
&&
StringUtils
.
equals
(
dir
,
String
.
valueOf
(
dto
.
getLightsDir
())))
{
dirTurnList
.
add
(
dir
.
concat
(
Constants
.
SystemParam
.
SEPARATOR_UNDER_LINE
).
concat
(
String
.
valueOf
(
dto
.
getLightsTurn
())));
}
}
}
if
(!
CollectionUtils
.
isEmpty
(
dirTurnList
))
{
}
if
(
Objects
.
equals
(
lightColor
,
"red"
)
&&
dirTurnList
.
contains
(
currentDirTurn
))
{
}
log
.
info
(
"lightColor:"
+
lightColor
+
" currentDirTurn:"
+
currentDirTurn
+
" dirTurnList:"
+
dirTurnList
);
}
Integer
carNums
=
getCarNums
(
crossId
,
currenSignalTime
);
carNums
+=
getCarNums
(
crossId
,
currenSignalTime
+
1000
);
// 如果全场红
startPhaseIdMap
.
putIfAbsent
(
crossId
,
currentPhaseId
);
if
(
isAllRed
)
{
if
(
carNums
>
0
)
{
List
<
CrossSchemePhaseDirTurnDTO
>
crossSchemePhaseDirTurnDTOList
=
CrossSchemePhaseLightsCache
.
crossSchemePhaseDirTurnDTOList
;
crossIdPhaseIdClearGreenMap
.
put
(
crossId
.
concat
(
currentPhaseId
),
carNums
);
int
redTime
=
2
;
break
;
if
(!
CollectionUtils
.
isEmpty
(
crossSchemePhaseDirTurnDTOList
))
{
}
else
{
for
(
CrossSchemePhaseDirTurnDTO
dto
:
crossSchemePhaseDirTurnDTOList
)
{
crossIdPhaseIdClearGreenMap
.
put
(
crossId
.
concat
(
currentPhaseId
),
0
);
String
crossIdCache
=
dto
.
getCrossId
();
}
String
schemeNoCache
=
dto
.
getSchemeNo
();
}
String
phaseNoCache
=
dto
.
getPhaseNo
();
if
(
StringUtils
.
equals
(
crossIdCache
,
crossId
)
&&
StringUtils
.
equals
(
schemeNoCache
,
schemeNo
)
&&
StringUtils
.
equals
(
currentPhaseId
,
phaseNoCache
))
{
redTime
=
dto
.
getRedTime
();
}
}
}
}
// 剩余红灯时间
if
(
redTime
>=
1
)
{
--
redTime
;
}
Integer
carNums
=
getCarNums
(
crossId
,
currenSignalTime
+
redTime
*
1000L
);
startPhaseIdMap
.
putIfAbsent
(
crossId
,
currentPhaseId
);
crossIdPhaseIdClearGreenMap
.
put
(
crossId
.
concat
(
currentPhaseId
),
carNums
);
}
}
LanePeriodicDataProcessServiceImpl
.
periodHaveAllRedMap
.
put
(
crossId
,
1
);
}
}
}
}
}
private
void
getClearRateCache
(
String
crossId
,
String
currentPhaseId
,
Map
<
String
,
Integer
>
crossIdPhaseIdClearGreenMap
)
throws
JsonProcessingException
{
int
phaseSize
=
0
;
HashMap
<
String
,
Integer
>
tempMap
=
new
HashMap
<>();
for
(
Map
.
Entry
<
String
,
Integer
>
entry
:
crossIdPhaseIdClearGreenMap
.
entrySet
())
{
String
crossIdPhaseNo
=
entry
.
getKey
();
if
(
crossIdPhaseNo
.
contains
(
crossId
))
{
++
phaseSize
;
tempMap
.
put
(
crossId
,
entry
.
getValue
());
}
}
log
.
info
(
"当前路口相位信息:"
+
JacksonUtils
.
getInstance
().
writeValueAsString
(
crossIdPhaseIdClearGreenMap
));
if
(
startPhaseIdMap
.
containsValue
(
currentPhaseId
)
&&
phaseSize
>=
2
)
{
double
clearRate
=
0.0
;
for
(
Map
.
Entry
<
String
,
Integer
>
entry
:
tempMap
.
entrySet
())
{
int
value
=
entry
.
getValue
()
>
0
?
1
:
0
;
clearRate
+=
(
double
)
value
/
phaseSize
;
}
startPhaseIdMap
.
remove
(
crossId
);
// 只计算一次
log
.
info
(
"绿灯清空率为:"
+
(
1
-
clearRate
)
*
100
);
CrossRealTimeCache
.
crossPhaseIdClearGreenMap
.
put
(
crossId
,
1
-
clearRate
);
}
}
}
/**
/**
* 通过路口编号获取主题消息中的车辆数量
* 通过路口编号获取主题消息中的车辆数量
*
* @param crossId
* @param [crossId]
* @return java.lang.Integer
* @return java.lang.Integer
* @description
* @description
*/
*/
...
@@ -140,10 +145,6 @@ public class DataProcessTask {
...
@@ -140,10 +145,6 @@ public class DataProcessTask {
for
(
CrossSnapshotDataDTO
.
EventList
element
:
eventList
)
{
for
(
CrossSnapshotDataDTO
.
EventList
element
:
eventList
)
{
String
currentCrossId
=
element
.
getCrossId
();
String
currentCrossId
=
element
.
getCrossId
();
if
(
StringUtils
.
equals
(
crossId
,
currentCrossId
))
{
if
(
StringUtils
.
equals
(
crossId
,
currentCrossId
))
{
if
(
crossId
.
equals
(
"13NGH0B5RC0"
))
{
log
.
error
(
"当前时间戳:{},当前车辆数:{}"
,
timeStamp
,
element
.
getCarNums
());
}
return
element
.
getCarNums
();
return
element
.
getCarNums
();
}
}
}
}
...
...
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