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
d2afa625
Commit
d2afa625
authored
Aug 22, 2023
by
hanbing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[add] 新信号评价-运行评价-方案问题
parent
90bd6481
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
168 additions
and
4 deletions
+168
-4
RunningEvaluateController.java
...a/net/wanji/opt/controller/RunningEvaluateController.java
+14
-1
RunningEvaluateService.java
...in/java/net/wanji/opt/service/RunningEvaluateService.java
+3
-0
RunningEvaluateServiceImpl.java
...et/wanji/opt/service/impl/RunningEvaluateServiceImpl.java
+111
-3
RunningEvaluateSchemeProblemsVO.java
...ava/net/wanji/opt/vo/RunningEvaluateSchemeProblemsVO.java
+40
-0
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/controller/RunningEvaluateController.java
View file @
d2afa625
...
@@ -9,8 +9,9 @@ import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
...
@@ -9,8 +9,9 @@ import net.wanji.databus.bo.CrossIdAndStartEndDateBO;
import
net.wanji.databus.vo.RunningEvaluateCrossListVO
;
import
net.wanji.databus.vo.RunningEvaluateCrossListVO
;
import
net.wanji.opt.bo.CrossNameBO
;
import
net.wanji.opt.bo.CrossNameBO
;
import
net.wanji.opt.service.impl.RunningEvaluateServiceImpl
;
import
net.wanji.opt.service.impl.RunningEvaluateServiceImpl
;
import
net.wanji.opt.vo.RunningEvaluateIndexStatusVO
;
import
net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO
;
import
net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO
;
import
net.wanji.opt.vo.RunningEvaluateIndexStatusVO
;
import
net.wanji.opt.vo.RunningEvaluateSchemeProblemsVO
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
...
@@ -95,4 +96,16 @@ public class RunningEvaluateController {
...
@@ -95,4 +96,16 @@ public class RunningEvaluateController {
return
JsonViewObject
.
newInstance
().
success
(
res
);
return
JsonViewObject
.
newInstance
().
success
(
res
);
}
}
@ApiOperation
(
value
=
"方案问题"
,
notes
=
"方案问题"
,
response
=
JsonViewObject
.
class
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@PostMapping
(
value
=
"/schemeProblems"
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
RunningEvaluateSchemeProblemsVO
.
class
),
})
public
JsonViewObject
schemeProblems
(
@RequestBody
CrossIdAndStartEndDateBO
bo
)
{
List
<
RunningEvaluateSchemeProblemsVO
>
res
=
runningEvaluateService
.
schemeProblems
(
bo
);
return
JsonViewObject
.
newInstance
().
success
(
res
);
}
}
}
\ No newline at end of file
signal-optimize-service/src/main/java/net/wanji/opt/service/RunningEvaluateService.java
View file @
d2afa625
...
@@ -5,6 +5,7 @@ import net.wanji.databus.vo.RunningEvaluateCrossListVO;
...
@@ -5,6 +5,7 @@ import net.wanji.databus.vo.RunningEvaluateCrossListVO;
import
net.wanji.opt.bo.CrossNameBO
;
import
net.wanji.opt.bo.CrossNameBO
;
import
net.wanji.opt.vo.RunningEvaluateIndexStatusVO
;
import
net.wanji.opt.vo.RunningEvaluateIndexStatusVO
;
import
net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO
;
import
net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO
;
import
net.wanji.opt.vo.RunningEvaluateSchemeProblemsVO
;
import
java.util.List
;
import
java.util.List
;
...
@@ -18,4 +19,6 @@ public interface RunningEvaluateService {
...
@@ -18,4 +19,6 @@ public interface RunningEvaluateService {
List
<
RunningEvaluateIndexStatusVO
>
unbalanceStatus
(
CrossIdAndStartEndDateBO
bo
);
List
<
RunningEvaluateIndexStatusVO
>
unbalanceStatus
(
CrossIdAndStartEndDateBO
bo
);
List
<
RunningEvaluateIndexStatusVO
>
spilloverStatus
(
CrossIdAndStartEndDateBO
bo
);
List
<
RunningEvaluateIndexStatusVO
>
spilloverStatus
(
CrossIdAndStartEndDateBO
bo
);
List
<
RunningEvaluateSchemeProblemsVO
>
schemeProblems
(
CrossIdAndStartEndDateBO
bo
);
}
}
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/RunningEvaluateServiceImpl.java
View file @
d2afa625
...
@@ -6,7 +6,9 @@ import net.wanji.common.enums.CrossStatusEnum;
...
@@ -6,7 +6,9 @@ import net.wanji.common.enums.CrossStatusEnum;
import
net.wanji.common.utils.tool.CrossUtil
;
import
net.wanji.common.utils.tool.CrossUtil
;
import
net.wanji.common.utils.tool.TimeArrayUtil
;
import
net.wanji.common.utils.tool.TimeArrayUtil
;
import
net.wanji.databus.bo.CrossIdAndStartEndDateBO
;
import
net.wanji.databus.bo.CrossIdAndStartEndDateBO
;
import
net.wanji.databus.dao.entity.BaseCrossSchemePO
;
import
net.wanji.databus.dao.entity.CrossSectionPO
;
import
net.wanji.databus.dao.entity.CrossSectionPO
;
import
net.wanji.databus.dao.mapper.BaseCrossSchemeMapper
;
import
net.wanji.databus.dao.mapper.BaseCrossSectionMapper
;
import
net.wanji.databus.dao.mapper.BaseCrossSectionMapper
;
import
net.wanji.databus.dao.mapper.CrossDataHistMapper
;
import
net.wanji.databus.dao.mapper.CrossDataHistMapper
;
import
net.wanji.databus.dao.mapper.CrossDataRealtimeMapper
;
import
net.wanji.databus.dao.mapper.CrossDataRealtimeMapper
;
...
@@ -17,15 +19,19 @@ import net.wanji.opt.bo.CrossNameBO;
...
@@ -17,15 +19,19 @@ import net.wanji.opt.bo.CrossNameBO;
import
net.wanji.opt.service.RunningEvaluateService
;
import
net.wanji.opt.service.RunningEvaluateService
;
import
net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO
;
import
net.wanji.opt.vo.RunningEvaluateCrossEvaluateVO
;
import
net.wanji.opt.vo.RunningEvaluateIndexStatusVO
;
import
net.wanji.opt.vo.RunningEvaluateIndexStatusVO
;
import
net.wanji.opt.vo.RunningEvaluateSchemeProblemsVO
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.NotNull
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
java.text.DecimalFormat
;
import
java.text.DecimalFormat
;
import
java.text.SimpleDateFormat
;
import
java.text.SimpleDateFormat
;
import
java.time.LocalDate
;
import
java.time.ZoneId
;
import
java.util.*
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
import
java.util.stream.Stream
;
import
java.util.stream.Stream
;
import
java.time.Instant
;
/**
/**
* @author Kent HAN
* @author Kent HAN
...
@@ -37,13 +43,16 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
...
@@ -37,13 +43,16 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
private
final
CrossDataRealtimeMapper
crossDataRealtimeMapper
;
private
final
CrossDataRealtimeMapper
crossDataRealtimeMapper
;
private
final
CrossDataHistMapper
crossDataHistMapper
;
private
final
CrossDataHistMapper
crossDataHistMapper
;
private
final
BaseCrossSectionMapper
baseCrossSectionMapper
;
private
final
BaseCrossSectionMapper
baseCrossSectionMapper
;
private
final
BaseCrossSchemeMapper
baseCrossSchemeMapper
;
public
RunningEvaluateServiceImpl
(
CrossDataRealtimeMapper
crossDataRealtimeMapper
,
public
RunningEvaluateServiceImpl
(
CrossDataRealtimeMapper
crossDataRealtimeMapper
,
CrossDataHistMapper
crossDataHistMapper
,
CrossDataHistMapper
crossDataHistMapper
,
@Qualifier
(
"baseCrossSectionMapper"
)
BaseCrossSectionMapper
baseCrossSectionMapper
)
{
@Qualifier
(
"baseCrossSectionMapper"
)
BaseCrossSectionMapper
baseCrossSectionMapper
,
@Qualifier
(
"baseCrossSchemeMapper"
)
BaseCrossSchemeMapper
baseCrossSchemeMapper
)
{
this
.
crossDataRealtimeMapper
=
crossDataRealtimeMapper
;
this
.
crossDataRealtimeMapper
=
crossDataRealtimeMapper
;
this
.
crossDataHistMapper
=
crossDataHistMapper
;
this
.
crossDataHistMapper
=
crossDataHistMapper
;
this
.
baseCrossSectionMapper
=
baseCrossSectionMapper
;
this
.
baseCrossSectionMapper
=
baseCrossSectionMapper
;
this
.
baseCrossSchemeMapper
=
baseCrossSchemeMapper
;
}
}
@Override
@Override
...
@@ -124,6 +133,107 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
...
@@ -124,6 +133,107 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
return
buildRes
(
bo
,
crossId
,
status
);
return
buildRes
(
bo
,
crossId
,
status
);
}
}
@Override
public
List
<
RunningEvaluateSchemeProblemsVO
>
schemeProblems
(
CrossIdAndStartEndDateBO
bo
)
{
String
crossId
=
bo
.
getCrossId
();
List
<
RunningEvaluateSchemeProblemsVO
>
res
=
new
ArrayList
<>();
List
<
String
>
timeArray
=
TimeArrayUtil
.
getTimeArray
();
for
(
String
time
:
timeArray
)
{
RunningEvaluateSchemeProblemsVO
vo
=
new
RunningEvaluateSchemeProblemsVO
();
vo
.
setTime
(
time
);
List
<
CrossDataHistPO
>
crossDataHistPOList
=
buildCrossDataHistPOList
(
bo
,
crossId
);
// 找出有问题的记录
List
<
CrossDataHistPO
>
collect
=
crossDataHistPOList
.
stream
()
.
filter
(
po
->
!
Objects
.
equals
(
po
.
getStatus
(),
CrossStatusEnum
.
NORMAL
.
getCode
()))
.
collect
(
Collectors
.
toList
());
// 按采集时间小时进行聚合
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"HH"
);
Map
<
String
,
List
<
CrossDataHistPO
>>
timePOMap
=
crossDataHistPOList
.
stream
()
.
collect
(
Collectors
.
groupingBy
(
po
->
{
Date
date
=
new
Date
((
long
)
po
.
getBatchTime
()
*
1000
);
// 将10位时间戳转换为Date对象
return
sdf
.
format
(
date
);
// 将Date对象转换为"HH"格式的字符串
}));
// 找出当前小时的记录
List
<
CrossDataHistPO
>
currentHourList
=
timePOMap
.
get
(
time
.
substring
(
0
,
2
));
// 保留小时字符串
if
(
currentHourList
!=
null
)
{
// 按相同开始时间去重,保留持续时间最长的一个
List
<
CrossDataHistPO
>
uniqueList
=
currentHourList
.
stream
()
.
collect
(
Collectors
.
groupingBy
(
CrossDataHistPO:
:
getStartTime
,
// 按startTime分组
Collectors
.
collectingAndThen
(
// 在每个组中找到duration最大的元素
Collectors
.
maxBy
(
Comparator
.
comparingLong
(
CrossDataHistPO:
:
getDuration
)),
Optional:
:
get
// 从Optional中获取元素
)
))
.
values
().
stream
().
collect
(
Collectors
.
toList
());
// 从Map中获取值并收集到新的列表中
// 统计数量
vo
.
setCounts
(
uniqueList
.
size
());
// 找出出现问题的日期和方案
List
<
RunningEvaluateSchemeProblemsVO
.
DateAndScheme
>
dateAndSchemeList
=
new
ArrayList
<>();
dateAndSchemeList
=
buildDateAndSchemeList
(
uniqueList
,
crossId
);
vo
.
setDateAndSchemeList
(
dateAndSchemeList
);
}
res
.
add
(
vo
);
}
return
res
;
}
private
List
<
RunningEvaluateSchemeProblemsVO
.
DateAndScheme
>
buildDateAndSchemeList
(
List
<
CrossDataHistPO
>
uniqueList
,
String
crossId
)
{
List
<
RunningEvaluateSchemeProblemsVO
.
DateAndScheme
>
res
=
new
ArrayList
<>();
// 将问题按日期分组
Map
<
LocalDate
,
List
<
CrossDataHistPO
>>
groupedByDate
=
uniqueList
.
stream
()
.
collect
(
Collectors
.
groupingBy
(
// 将10位时间戳转换为Instant
crossDataHistPO
->
Instant
.
ofEpochSecond
(
crossDataHistPO
.
getBatchTime
())
.
atZone
(
ZoneId
.
systemDefault
())
// 将Instant转换为系统默认时区的ZonedDateTime
.
toLocalDate
()
// 获取LocalDate
));
for
(
Map
.
Entry
<
LocalDate
,
List
<
CrossDataHistPO
>>
entry
:
groupedByDate
.
entrySet
())
{
LocalDate
localDate
=
entry
.
getKey
();
// 获取日期
List
<
CrossDataHistPO
>
crossDataHistPOs
=
entry
.
getValue
();
// 获取该日期下的CrossDataHistPO对象列表
RunningEvaluateSchemeProblemsVO
.
DateAndScheme
dateAndScheme
=
new
RunningEvaluateSchemeProblemsVO
.
DateAndScheme
();
Date
date
=
Date
.
from
(
localDate
.
atStartOfDay
()
.
atZone
(
ZoneId
.
systemDefault
())
.
toInstant
());
dateAndScheme
.
setProblemDate
(
date
);
Set
<
String
>
schemeNameSet
=
new
HashSet
<>();
for
(
CrossDataHistPO
abnormalEvent
:
crossDataHistPOs
)
{
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"HH:mm"
);
Date
abnormalEventStartTime
=
abnormalEvent
.
getStartTime
();
Integer
duration
=
abnormalEvent
.
getDuration
();
Date
abnormalEventEndTime
=
DateUtil
.
offsetMinute
(
abnormalEventStartTime
,
duration
);
String
eventStartTime
=
sdf
.
format
(
abnormalEventStartTime
);
String
eventEndTime
=
sdf
.
format
(
abnormalEventEndTime
);
List
<
CrossSectionPO
>
crossSectionPOList
=
baseCrossSectionMapper
.
selectByCrossId
(
crossId
);
for
(
CrossSectionPO
crossSectionPO
:
crossSectionPOList
)
{
String
sectionStartTime
=
crossSectionPO
.
getStartTime
();
String
sectionEndTime
=
crossSectionPO
.
getEndTime
();
// 比较两组时间段是否相交
boolean
isIntersecting
=
isTimeIntersecting
(
eventStartTime
,
eventEndTime
,
sectionStartTime
,
sectionEndTime
);
if
(
isIntersecting
)
{
Integer
schemeId
=
crossSectionPO
.
getSchemeId
();
BaseCrossSchemePO
baseCrossSchemePO
=
baseCrossSchemeMapper
.
selectById
(
schemeId
);
schemeNameSet
.
add
(
baseCrossSchemePO
.
getName
());
dateAndScheme
.
setSchemeNameSet
(
schemeNameSet
);
}
}
}
res
.
add
(
dateAndScheme
);
}
return
res
;
}
@NotNull
@NotNull
private
List
<
RunningEvaluateIndexStatusVO
>
buildRes
(
CrossIdAndStartEndDateBO
bo
,
String
crossId
,
int
status
)
{
private
List
<
RunningEvaluateIndexStatusVO
>
buildRes
(
CrossIdAndStartEndDateBO
bo
,
String
crossId
,
int
status
)
{
List
<
CrossDataHistPO
>
crossDataHistPOList
=
buildCrossDataHistPOList
(
bo
,
crossId
);
List
<
CrossDataHistPO
>
crossDataHistPOList
=
buildCrossDataHistPOList
(
bo
,
crossId
);
...
@@ -138,9 +248,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
...
@@ -138,9 +248,7 @@ public class RunningEvaluateServiceImpl implements RunningEvaluateService {
@NotNull
@NotNull
private
List
<
RunningEvaluateIndexStatusVO
>
buildRunningEvaluateIndexStatusVOList
(
private
List
<
RunningEvaluateIndexStatusVO
>
buildRunningEvaluateIndexStatusVOList
(
List
<
CrossDataHistPO
>
crossDataHistPOList
,
int
status
)
{
List
<
CrossDataHistPO
>
crossDataHistPOList
,
int
status
)
{
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"HH"
);
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"HH"
);
Map
<
String
,
List
<
CrossDataHistPO
>>
timePOMap
=
crossDataHistPOList
.
stream
()
Map
<
String
,
List
<
CrossDataHistPO
>>
timePOMap
=
crossDataHistPOList
.
stream
()
.
collect
(
Collectors
.
groupingBy
(
po
->
{
.
collect
(
Collectors
.
groupingBy
(
po
->
{
Date
date
=
new
Date
((
long
)
po
.
getBatchTime
()
*
1000
);
// 将10位时间戳转换为Date对象
Date
date
=
new
Date
((
long
)
po
.
getBatchTime
()
*
1000
);
// 将10位时间戳转换为Date对象
...
...
signal-optimize-service/src/main/java/net/wanji/opt/vo/RunningEvaluateSchemeProblemsVO.java
0 → 100644
View file @
d2afa625
package
net
.
wanji
.
opt
.
vo
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Set
;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel
(
value
=
"RunningEvaluateSchemeProblemsVO"
,
description
=
"查询方案问题返回值"
)
public
class
RunningEvaluateSchemeProblemsVO
{
@ApiModelProperty
(
value
=
"时间"
)
private
String
time
;
@ApiModelProperty
(
value
=
"次数"
)
private
Integer
counts
;
@ApiModelProperty
(
value
=
"问题方案"
)
private
List
<
DateAndScheme
>
dateAndSchemeList
;
@Data
@NoArgsConstructor
public
static
class
DateAndScheme
{
@ApiModelProperty
(
value
=
"日期"
)
@JsonFormat
(
shape
=
JsonFormat
.
Shape
.
STRING
,
pattern
=
"M/d"
,
timezone
=
"GMT+8"
)
private
Date
problemDate
;
@ApiModelProperty
(
value
=
"方案名称"
)
private
Set
<
String
>
schemeNameSet
;
}
}
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