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
8cc1f43e
Commit
8cc1f43e
authored
Sep 14, 2023
by
hanbing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[update] 新信号评价-方案评价-效率提升策略详细问题
parent
4cdf2cdd
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
338 additions
and
37 deletions
+338
-37
SchemeEvaluateController.java
...va/net/wanji/opt/controller/SchemeEvaluateController.java
+14
-4
SchemeEvaluateService.java
...ain/java/net/wanji/opt/service/SchemeEvaluateService.java
+3
-4
SchemeEvaluateServiceImpl.java
...net/wanji/opt/service/impl/SchemeEvaluateServiceImpl.java
+260
-19
SchemeEvaluateSchemeDetailedProblemVO.java
...t/wanji/opt/vo/SchemeEvaluateSchemeDetailedProblemVO.java
+51
-0
StrategyAndMetricsEnum.java
...n/java/net/wanji/common/enums/StrategyAndMetricsEnum.java
+6
-6
CrossDirDataHistMapper.java
.../net/wanji/databus/dao/mapper/CrossDirDataHistMapper.java
+1
-1
CrossTurnDataHistMapper.java
...net/wanji/databus/dao/mapper/CrossTurnDataHistMapper.java
+1
-1
CrossTurnDataHistMapper.xml
...bus/src/main/resources/mapper/CrossTurnDataHistMapper.xml
+2
-2
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/controller/SchemeEvaluateController.java
View file @
8cc1f43e
...
@@ -10,10 +10,7 @@ import net.wanji.opt.bo.CrossSchemeListBO;
...
@@ -10,10 +10,7 @@ import net.wanji.opt.bo.CrossSchemeListBO;
import
net.wanji.opt.bo.ProblemSchemeBO
;
import
net.wanji.opt.bo.ProblemSchemeBO
;
import
net.wanji.opt.bo.SchemeDetailOverallBO
;
import
net.wanji.opt.bo.SchemeDetailOverallBO
;
import
net.wanji.opt.service.impl.SchemeEvaluateServiceImpl
;
import
net.wanji.opt.service.impl.SchemeEvaluateServiceImpl
;
import
net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO
;
import
net.wanji.opt.vo.*
;
import
net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO
;
import
net.wanji.opt.vo.SchemeEvaluateSchemeDetailOverallVO
;
import
net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO
;
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
;
...
@@ -87,4 +84,17 @@ public class SchemeEvaluateController {
...
@@ -87,4 +84,17 @@ public class SchemeEvaluateController {
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
=
"/detailedProblem"
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
SchemeEvaluateSchemeDetailedProblemVO
.
class
),
})
public
JsonViewObject
detailedProblem
(
@RequestBody
SchemeDetailOverallBO
schemeDetailOverallBO
)
throws
ParseException
{
SchemeEvaluateSchemeDetailedProblemVO
res
=
schemeEvaluateService
.
detailedProblem
(
schemeDetailOverallBO
);
return
JsonViewObject
.
newInstance
().
success
(
res
);
}
}
}
\ No newline at end of file
signal-optimize-service/src/main/java/net/wanji/opt/service/SchemeEvaluateService.java
View file @
8cc1f43e
...
@@ -4,10 +4,7 @@ import net.wanji.databus.bo.CrossIdBO;
...
@@ -4,10 +4,7 @@ import net.wanji.databus.bo.CrossIdBO;
import
net.wanji.opt.bo.CrossSchemeListBO
;
import
net.wanji.opt.bo.CrossSchemeListBO
;
import
net.wanji.opt.bo.ProblemSchemeBO
;
import
net.wanji.opt.bo.ProblemSchemeBO
;
import
net.wanji.opt.bo.SchemeDetailOverallBO
;
import
net.wanji.opt.bo.SchemeDetailOverallBO
;
import
net.wanji.opt.vo.SchemeEvaluateCrossSchemeListVO
;
import
net.wanji.opt.vo.*
;
import
net.wanji.opt.vo.SchemeEvaluateProblemSchemeVO
;
import
net.wanji.opt.vo.SchemeEvaluateSchemeDetailOverallVO
;
import
net.wanji.opt.vo.SchemeEvaluateStrategyMetricMenuVO
;
import
java.text.ParseException
;
import
java.text.ParseException
;
import
java.util.List
;
import
java.util.List
;
...
@@ -20,4 +17,6 @@ public interface SchemeEvaluateService {
...
@@ -20,4 +17,6 @@ public interface SchemeEvaluateService {
List
<
SchemeEvaluateCrossSchemeListVO
>
crossSchemeList
(
CrossSchemeListBO
crossSchemeListBO
);
List
<
SchemeEvaluateCrossSchemeListVO
>
crossSchemeList
(
CrossSchemeListBO
crossSchemeListBO
);
SchemeEvaluateSchemeDetailOverallVO
schemeDetailOverall
(
SchemeDetailOverallBO
schemeDetailOverallBO
)
throws
ParseException
;
SchemeEvaluateSchemeDetailOverallVO
schemeDetailOverall
(
SchemeDetailOverallBO
schemeDetailOverallBO
)
throws
ParseException
;
SchemeEvaluateSchemeDetailedProblemVO
detailedProblem
(
SchemeDetailOverallBO
schemeDetailOverallBO
)
throws
ParseException
;
}
}
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/SchemeEvaluateServiceImpl.java
View file @
8cc1f43e
...
@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
...
@@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import
net.wanji.common.enums.BaseEnum
;
import
net.wanji.common.enums.BaseEnum
;
import
net.wanji.common.enums.CrossInOutEnum
;
import
net.wanji.common.enums.CrossInOutEnum
;
import
net.wanji.common.enums.StrategyAndMetricsEnum
;
import
net.wanji.common.enums.StrategyAndMetricsEnum
;
import
net.wanji.common.enums.TurnConvertEnum
;
import
net.wanji.common.utils.tool.CrossUtil
;
import
net.wanji.common.utils.tool.CrossUtil
;
import
net.wanji.databus.bo.CrossIdBO
;
import
net.wanji.databus.bo.CrossIdBO
;
import
net.wanji.databus.dao.entity.BaseCrossSchedulesPO
;
import
net.wanji.databus.dao.entity.BaseCrossSchedulesPO
;
...
@@ -17,6 +18,7 @@ import net.wanji.databus.dao.mapper.*;
...
@@ -17,6 +18,7 @@ import net.wanji.databus.dao.mapper.*;
import
net.wanji.databus.po.CrossDataHistPO
;
import
net.wanji.databus.po.CrossDataHistPO
;
import
net.wanji.databus.po.CrossDataRealtimePO
;
import
net.wanji.databus.po.CrossDataRealtimePO
;
import
net.wanji.databus.po.CrossDirDataHistPO
;
import
net.wanji.databus.po.CrossDirDataHistPO
;
import
net.wanji.databus.po.CrossTurnDataHistPO
;
import
net.wanji.opt.bo.CrossSchemeListBO
;
import
net.wanji.opt.bo.CrossSchemeListBO
;
import
net.wanji.opt.bo.ProblemSchemeBO
;
import
net.wanji.opt.bo.ProblemSchemeBO
;
import
net.wanji.opt.bo.SchemeDetailOverallBO
;
import
net.wanji.opt.bo.SchemeDetailOverallBO
;
...
@@ -57,6 +59,10 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -57,6 +59,10 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
private
final
CrossDataRealtimeMapper
crossDataRealtimeMapper
;
private
final
CrossDataRealtimeMapper
crossDataRealtimeMapper
;
private
final
CrossDirDataHistMapper
crossDirDataHistMapper
;
private
final
CrossDirDataHistMapper
crossDirDataHistMapper
;
private
final
BaseCrossDirInfoMapper
baseCrossDirInfoMapper
;
private
final
BaseCrossDirInfoMapper
baseCrossDirInfoMapper
;
private
final
CrossTurnDataHistMapper
crossTurnDataHistMapper
;
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
SimpleDateFormat
timeFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm"
);
public
SchemeEvaluateServiceImpl
(
CrossDataHistMapper
crossDataHistMapper
,
public
SchemeEvaluateServiceImpl
(
CrossDataHistMapper
crossDataHistMapper
,
RunningEvaluateServiceImpl
runningEvaluateService
,
RunningEvaluateServiceImpl
runningEvaluateService
,
...
@@ -68,7 +74,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -68,7 +74,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
@Qualifier
(
"baseCrossSchedulesMapper"
)
BaseCrossSchedulesMapper
baseCrossSchedulesMapper
,
@Qualifier
(
"baseCrossSchedulesMapper"
)
BaseCrossSchedulesMapper
baseCrossSchedulesMapper
,
@Qualifier
(
"baseCrossSchedulesPlanMapper"
)
BaseCrossSchedulesPlanMapper
baseCrossSchedulesPlanMapper
,
@Qualifier
(
"baseCrossSchedulesPlanMapper"
)
BaseCrossSchedulesPlanMapper
baseCrossSchedulesPlanMapper
,
CrossDataRealtimeMapper
crossDataRealtimeMapper
,
CrossDirDataHistMapper
crossDirDataHistMapper
,
CrossDataRealtimeMapper
crossDataRealtimeMapper
,
CrossDirDataHistMapper
crossDirDataHistMapper
,
@Qualifier
(
"baseCrossDirInfoMapper"
)
BaseCrossDirInfoMapper
baseCrossDirInfoMapper
)
{
@Qualifier
(
"baseCrossDirInfoMapper"
)
BaseCrossDirInfoMapper
baseCrossDirInfoMapper
,
CrossTurnDataHistMapper
crossTurnDataHistMapper
)
{
this
.
crossDataHistMapper
=
crossDataHistMapper
;
this
.
crossDataHistMapper
=
crossDataHistMapper
;
this
.
runningEvaluateService
=
runningEvaluateService
;
this
.
runningEvaluateService
=
runningEvaluateService
;
this
.
baseCrossSectionMapper
=
baseCrossSectionMapper
;
this
.
baseCrossSectionMapper
=
baseCrossSectionMapper
;
...
@@ -81,6 +88,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -81,6 +88,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
this
.
crossDataRealtimeMapper
=
crossDataRealtimeMapper
;
this
.
crossDataRealtimeMapper
=
crossDataRealtimeMapper
;
this
.
crossDirDataHistMapper
=
crossDirDataHistMapper
;
this
.
crossDirDataHistMapper
=
crossDirDataHistMapper
;
this
.
baseCrossDirInfoMapper
=
baseCrossDirInfoMapper
;
this
.
baseCrossDirInfoMapper
=
baseCrossDirInfoMapper
;
this
.
crossTurnDataHistMapper
=
crossTurnDataHistMapper
;
}
}
@Override
@Override
...
@@ -246,8 +254,6 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -246,8 +254,6 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
String
serviceLevel
=
CrossUtil
.
getServiceLevel
(
sturation
);
String
serviceLevel
=
CrossUtil
.
getServiceLevel
(
sturation
);
vo
.
setServiceLevel
(
serviceLevel
);
vo
.
setServiceLevel
(
serviceLevel
);
// 查询起止时间内历史数据
// 查询起止时间内历史数据
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
SimpleDateFormat
timeFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm"
);
String
dateStr
=
dateFormat
.
format
(
problemDate
);
String
dateStr
=
dateFormat
.
format
(
problemDate
);
String
concatenatedStartTime
=
dateStr
+
" "
+
startTime
;
String
concatenatedStartTime
=
dateStr
+
" "
+
startTime
;
String
concatenatedEndTime
=
dateStr
+
" "
+
endTime
;
String
concatenatedEndTime
=
dateStr
+
" "
+
endTime
;
...
@@ -269,6 +275,243 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -269,6 +275,243 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
return
vo
;
return
vo
;
}
}
@Override
public
SchemeEvaluateSchemeDetailedProblemVO
detailedProblem
(
SchemeDetailOverallBO
schemeDetailOverallBO
)
throws
ParseException
{
String
crossId
=
schemeDetailOverallBO
.
getCrossId
();
Date
problemDate
=
schemeDetailOverallBO
.
getProblemDate
();
String
startTime
=
schemeDetailOverallBO
.
getStartTime
();
String
endTime
=
schemeDetailOverallBO
.
getEndTime
();
String
strategyCode
=
schemeDetailOverallBO
.
getStrategyCode
();
// 查询起止时间内历史数据
String
dateStr
=
dateFormat
.
format
(
problemDate
);
String
concatenatedStartTime
=
dateStr
+
" "
+
startTime
;
String
concatenatedEndTime
=
dateStr
+
" "
+
endTime
;
int
startTimeStamp
=
(
int
)
(
timeFormat
.
parse
(
concatenatedStartTime
).
getTime
()
/
1000
);
int
endTimeStamp
=
(
int
)
(
timeFormat
.
parse
(
concatenatedEndTime
).
getTime
()
/
1000
);
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
=
crossDirDataHistMapper
.
selectByCrossIdAndStartEnd
(
crossId
,
startTimeStamp
,
endTimeStamp
);
List
<
CrossTurnDataHistPO
>
crossTurnDataHistPOList
=
crossTurnDataHistMapper
.
selectByCrossId
(
crossId
,
endTimeStamp
,
startTimeStamp
);
SchemeEvaluateSchemeDetailedProblemVO
vo
=
new
SchemeEvaluateSchemeDetailedProblemVO
();
if
(
Objects
.
equals
(
strategyCode
,
StrategyAndMetricsEnum
.
Strategy
.
EFFICIENCY
.
getCode
()))
{
buildEfficiencyDetailVO
(
crossDirDataHistPOList
,
crossTurnDataHistPOList
,
vo
,
crossId
,
startTimeStamp
,
endTimeStamp
);
}
else
if
(
Objects
.
equals
(
strategyCode
,
StrategyAndMetricsEnum
.
Strategy
.
BALANCE
.
getCode
()))
{
// buildBalanceDetailVO(
// crossDirDataHistPOList, crossTurnDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
}
else
if
(
Objects
.
equals
(
strategyCode
,
StrategyAndMetricsEnum
.
Strategy
.
SECURITY
.
getCode
()))
{
// buildSecurityDetailVO(
// crossDirDataHistPOList, crossTurnDataHistPOList, vo, crossId, startTimeStamp, endTimeStamp);
}
return
vo
;
}
private
void
buildEfficiencyDetailVO
(
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
,
List
<
CrossTurnDataHistPO
>
crossTurnDataHistPOList
,
SchemeEvaluateSchemeDetailedProblemVO
vo
,
String
crossId
,
int
startTimeStamp
,
int
endTimeStamp
)
{
List
<
String
>
problemList
=
new
ArrayList
<>();
List
<
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
>
tableContentList
=
new
ArrayList
<>();
// 获取路口方向
List
<
Integer
>
dirCodes
=
baseCrossDirInfoMapper
.
selectInDirsByCrossId
(
crossId
);
for
(
Integer
dirCode
:
dirCodes
)
{
Map
<
String
,
String
>
metricsMap
=
new
HashMap
<>();
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
tableContent
=
new
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
();
tableContent
.
setPosition
(
BaseEnum
.
SignalDirectionEnum
.
getNameByCode
(
dirCode
)
+
"进口"
);
// 流量加总
int
flow
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToInt
(
CrossDirDataHistPO:
:
getFlow
)
.
sum
();
tableContent
.
setFlow
(
flow
);
// 速度取平均
double
speed
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getSpeed
)
.
average
()
.
orElse
(
0.0
);
long
speedLong
=
Math
.
round
(
speed
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_SPEED
.
getCode
(),
speedLong
+
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_SPEED
.
getUnit
());
// 延误取最大
int
maxDelayTime
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToInt
(
CrossDirDataHistPO:
:
getDelayTime
)
.
max
()
.
orElse
(
0
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_DELAY
.
getCode
(),
maxDelayTime
+
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_DELAY
.
getUnit
());
// 排队长度取最大
double
maxQueueLength
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getQueueLength
)
.
max
()
.
orElse
(
0.0
);
long
queueLengthLong
=
Math
.
round
(
maxQueueLength
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
MAX_QUEUE_LENGTH
.
getCode
(),
queueLengthLong
+
StrategyAndMetricsEnum
.
Metrics
.
MAX_QUEUE_LENGTH
.
getUnit
());
// 不停车通过率取平均
double
noStopRate
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getNoStopRate
)
.
average
()
.
orElse
(
0.0
);
long
noStopRateLong
=
Math
.
round
(
noStopRate
*
100
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
(),
noStopRateLong
+
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getUnit
());
// 一/二/三次及以上停车通过率取最大
double
stopRate
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getOneStopRate
)
.
max
()
.
orElse
(
0.0
);
long
stopRateLong
=
Math
.
round
(
stopRate
*
100
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_RATE
.
getCode
(),
stopRateLong
+
StrategyAndMetricsEnum
.
Metrics
.
STOP_RATE
.
getUnit
());
// 停车次数取最大
double
stopTimes
=
crossDirDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getDirType
(),
dirCode
)
&&
Objects
.
equals
(
item
.
getInOutType
(),
CrossInOutEnum
.
IN
.
getCode
()))
.
mapToDouble
(
CrossDirDataHistPO:
:
getStopTimes
)
.
max
()
.
orElse
(
0.0
);
long
stopTimesLong
=
Math
.
round
(
stopTimes
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_TIMES
.
getCode
(),
stopTimesLong
+
StrategyAndMetricsEnum
.
Metrics
.
STOP_TIMES
.
getUnit
());
// 筛选当前方向的转向数据
List
<
CrossTurnDataHistPO
>
dirTurnPOList
=
crossTurnDataHistPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getInDir
(),
dirCode
))
.
collect
(
Collectors
.
toList
());
tableContent
.
setSubList
(
buildEfficiencySublist
(
problemList
,
dirTurnPOList
,
dirCode
));
tableContent
.
setMetricsMap
(
metricsMap
);
for
(
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
content
:
tableContent
.
getSubList
())
{
if
(
content
.
getHasProblem
()
==
1
)
{
tableContent
.
setHasProblem
(
1
);
}
}
tableContentList
.
add
(
tableContent
);
}
vo
.
setTableContentList
(
tableContentList
);
if
(
CollectionUtil
.
isNotEmpty
(
problemList
))
{
problemList
.
add
(
"其他方向运行效率良好"
);
}
vo
.
setProblems
(
problemList
);
}
private
List
<
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
>
buildEfficiencySublist
(
List
<
String
>
problemList
,
List
<
CrossTurnDataHistPO
>
currentDirTurnPOList
,
Integer
dirCode
)
{
List
<
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
>
tableContentList
=
new
ArrayList
<>();
// 获取该方向的每个转向
List
<
String
>
turnTypes
=
currentDirTurnPOList
.
stream
()
.
map
(
CrossTurnDataHistPO:
:
getTurnType
)
.
distinct
()
.
collect
(
Collectors
.
toList
());
for
(
String
turnType
:
turnTypes
)
{
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
tableContent
=
new
SchemeEvaluateSchemeDetailedProblemVO
.
TableContent
();
tableContent
.
setPosition
(
TurnConvertEnum
.
getDescByCode
(
turnType
));
Map
<
String
,
String
>
metricsMap
=
new
HashMap
<>();
// 流量加总
int
flow
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToInt
(
CrossTurnDataHistPO:
:
getFlow
)
.
sum
();
tableContent
.
setFlow
(
flow
);
// 速度取平均
double
speed
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToDouble
(
CrossTurnDataHistPO:
:
getSpeed
)
.
average
()
.
orElse
(
0.0
);
long
speedLong
=
Math
.
round
(
speed
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_SPEED
.
getCode
(),
speedLong
+
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_SPEED
.
getUnit
());
// 延误取最大
int
maxDelayTime
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToInt
(
CrossTurnDataHistPO:
:
getDelayTime
)
.
max
()
.
orElse
(
0
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_DELAY
.
getCode
(),
maxDelayTime
+
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_DELAY
.
getUnit
());
// 排队长度取最大
double
maxQueueLength
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToDouble
(
CrossTurnDataHistPO:
:
getQueueLength
)
.
max
()
.
orElse
(
0.0
);
long
queueLengthLong
=
Math
.
round
(
maxQueueLength
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
MAX_QUEUE_LENGTH
.
getCode
(),
queueLengthLong
+
StrategyAndMetricsEnum
.
Metrics
.
MAX_QUEUE_LENGTH
.
getUnit
());
// 不停车通过率取平均
double
noStopRate
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToDouble
(
CrossTurnDataHistPO:
:
getNoStopRate
)
.
average
()
.
orElse
(
0.0
);
long
noStopRateLong
=
Math
.
round
(
noStopRate
*
100
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
(),
noStopRateLong
+
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getUnit
());
// 一/二/三次及以上停车通过率取最大
double
stopRate
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToDouble
(
CrossTurnDataHistPO:
:
getOneStopRate
)
.
max
()
.
orElse
(
0.0
);
long
stopRateLong
=
Math
.
round
(
stopRate
*
100
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_RATE
.
getCode
(),
stopRateLong
+
StrategyAndMetricsEnum
.
Metrics
.
STOP_RATE
.
getUnit
());
// 停车次数取最大
double
stopTimes
=
currentDirTurnPOList
.
stream
()
.
filter
(
item
->
Objects
.
equals
(
item
.
getTurnType
(),
turnType
))
.
mapToDouble
(
CrossTurnDataHistPO:
:
getStopTimes
)
.
max
()
.
orElse
(
0.0
);
long
stopTimesLong
=
Math
.
round
(
stopTimes
);
metricsMap
.
put
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_TIMES
.
getCode
(),
stopTimesLong
+
StrategyAndMetricsEnum
.
Metrics
.
STOP_TIMES
.
getUnit
());
// 计算指标是否合格
int
level
=
calcEfficiencyLevel
(
maxDelayTime
,
maxQueueLength
);
if
(
level
==
3
)
{
tableContent
.
setHasProblem
(
1
);
problemList
.
add
(
BaseEnum
.
SignalDirectionEnum
.
getNameByCode
(
dirCode
)
+
"进口"
+
TurnConvertEnum
.
getDescByCode
(
turnType
)
+
"延误较高效率较低"
);
}
else
if
(
level
==
4
)
{
tableContent
.
setHasProblem
(
1
);
problemList
.
add
(
BaseEnum
.
SignalDirectionEnum
.
getNameByCode
(
dirCode
)
+
"进口"
+
TurnConvertEnum
.
getDescByCode
(
turnType
)
+
"延误高效率低"
);
}
tableContent
.
setMetricsMap
(
metricsMap
);
tableContentList
.
add
(
tableContent
);
}
return
tableContentList
;
}
private
void
buildSecurityVO
(
List
<
CrossDataHistPO
>
crossDataHistPOList
,
private
void
buildSecurityVO
(
List
<
CrossDataHistPO
>
crossDataHistPOList
,
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
,
List
<
CrossDirDataHistPO
>
crossDirDataHistPOList
,
SchemeEvaluateSchemeDetailOverallVO
vo
,
String
crossId
,
SchemeEvaluateSchemeDetailOverallVO
vo
,
String
crossId
,
...
@@ -504,8 +747,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -504,8 +747,8 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
throw
new
RuntimeException
(
"该时段无最大排队数据"
);
throw
new
RuntimeException
(
"该时段无最大排队数据"
);
}
}
// 延误取最大
// 延误取最大
Optional
Double
delayTimeMax
=
crossDataHistPOList
.
stream
()
Optional
Int
delayTimeMax
=
crossDataHistPOList
.
stream
()
.
mapTo
Double
(
CrossDataHistPO:
:
getDelayTime
)
.
mapTo
Int
(
CrossDataHistPO:
:
getDelayTime
)
.
max
();
.
max
();
if
(
delayTimeMax
.
isPresent
())
{
if
(
delayTimeMax
.
isPresent
())
{
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
...
@@ -542,7 +785,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -542,7 +785,7 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
List
<
Integer
>
dirCodes
=
baseCrossDirInfoMapper
.
selectInDirsByCrossId
(
crossId
);
List
<
Integer
>
dirCodes
=
baseCrossDirInfoMapper
.
selectInDirsByCrossId
(
crossId
);
List
<
String
>
strategyEvaluateList
=
new
ArrayList
<>();
List
<
String
>
strategyEvaluateList
=
new
ArrayList
<>();
for
(
Integer
dirCode
:
dirCodes
)
{
for
(
Integer
dirCode
:
dirCodes
)
{
Double
maxDelayTime
=
crossDirDataHistMapper
.
selectMaxDelayTime
(
Integer
maxDelayTime
=
crossDirDataHistMapper
.
selectMaxDelayTime
(
crossId
,
dirCode
,
CrossInOutEnum
.
IN
.
getCode
(),
startTimeStamp
,
endTimeStamp
);
crossId
,
dirCode
,
CrossInOutEnum
.
IN
.
getCode
(),
startTimeStamp
,
endTimeStamp
);
Double
maxQueueLength
=
crossDirDataHistMapper
.
selectMaxQueueLength
(
Double
maxQueueLength
=
crossDirDataHistMapper
.
selectMaxQueueLength
(
crossId
,
dirCode
,
CrossInOutEnum
.
IN
.
getCode
(),
startTimeStamp
,
endTimeStamp
);
crossId
,
dirCode
,
CrossInOutEnum
.
IN
.
getCode
(),
startTimeStamp
,
endTimeStamp
);
...
@@ -559,13 +802,12 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -559,13 +802,12 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
vo
.
setStrategyEvaluateList
(
strategyEvaluateList
);
vo
.
setStrategyEvaluateList
(
strategyEvaluateList
);
}
}
private
int
calcEfficiencyLevel
(
Double
delayTime
,
Double
queueLength
)
{
private
int
calcEfficiencyLevel
(
Integer
delayTime
,
Double
queueLength
)
{
int
level
=
0
;
int
level
=
0
;
if
(
delayTime
!=
null
)
{
if
(
delayTime
!=
null
)
{
int
intDelayTime
=
(
int
)
Math
.
round
(
delayTime
);
if
(
delayTime
>=
40
&&
delayTime
<=
49
)
{
if
(
intDelayTime
>=
40
&&
intDelayTime
<=
49
)
{
level
=
3
;
level
=
3
;
}
else
if
(
intD
elayTime
>=
50
)
{
}
else
if
(
d
elayTime
>=
50
)
{
level
=
4
;
level
=
4
;
}
}
}
}
...
@@ -586,10 +828,10 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -586,10 +828,10 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
int
intStopTimesAverage
=
(
int
)
Math
.
round
(
noStopRateAverage
.
getAsDouble
()
*
100
);
int
intStopTimesAverage
=
(
int
)
Math
.
round
(
noStopRateAverage
.
getAsDouble
()
*
100
);
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
new
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
();
new
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
();
overallMetrics
.
setMetricCode
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_
THROUGH_
RATE
.
getCode
());
overallMetrics
.
setMetricCode
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getCode
());
overallMetrics
.
setMetricName
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_
THROUGH_
RATE
.
getDescription
());
overallMetrics
.
setMetricName
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getDescription
());
overallMetrics
.
setMetricValue
(
intStopTimesAverage
);
overallMetrics
.
setMetricValue
(
intStopTimesAverage
);
overallMetrics
.
setMetricUnit
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_
THROUGH_
RATE
.
getUnit
());
overallMetrics
.
setMetricUnit
(
StrategyAndMetricsEnum
.
Metrics
.
NO_STOP_RATE
.
getUnit
());
return
overallMetrics
;
return
overallMetrics
;
}
}
...
@@ -599,17 +841,16 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
...
@@ -599,17 +841,16 @@ public class SchemeEvaluateServiceImpl implements SchemeEvaluateService {
int
intStopTimesAverage
=
(
int
)
Math
.
round
(
stopTimesAverage
.
getAsDouble
());
int
intStopTimesAverage
=
(
int
)
Math
.
round
(
stopTimesAverage
.
getAsDouble
());
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
new
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
();
new
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
();
overallMetrics
.
setMetricCode
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_
COUNT
.
getCode
());
overallMetrics
.
setMetricCode
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_
TIMES
.
getCode
());
overallMetrics
.
setMetricName
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_
COUNT
.
getDescription
());
overallMetrics
.
setMetricName
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_
TIMES
.
getDescription
());
overallMetrics
.
setMetricValue
(
intStopTimesAverage
);
overallMetrics
.
setMetricValue
(
intStopTimesAverage
);
overallMetrics
.
setMetricUnit
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_
COUNT
.
getUnit
());
overallMetrics
.
setMetricUnit
(
StrategyAndMetricsEnum
.
Metrics
.
STOP_
TIMES
.
getUnit
());
return
overallMetrics
;
return
overallMetrics
;
}
}
private
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
buildDelayTimeOverallMetrics
(
private
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
buildDelayTimeOverallMetrics
(
OptionalDouble
delayTimeAverage
)
{
OptionalInt
delayTimeAverage
)
{
// 四舍五入并转换为 int 类型
int
intDelayTimeAverage
=
delayTimeAverage
.
getAsInt
();
int
intDelayTimeAverage
=
(
int
)
Math
.
round
(
delayTimeAverage
.
getAsDouble
());
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
overallMetrics
=
new
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
();
new
SchemeEvaluateSchemeDetailOverallVO
.
OverallMetrics
();
overallMetrics
.
setMetricCode
(
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_DELAY
.
getCode
());
overallMetrics
.
setMetricCode
(
StrategyAndMetricsEnum
.
Metrics
.
AVERAGE_DELAY
.
getCode
());
...
...
signal-optimize-service/src/main/java/net/wanji/opt/vo/SchemeEvaluateSchemeDetailedProblemVO.java
0 → 100644
View file @
8cc1f43e
package
net
.
wanji
.
opt
.
vo
;
import
com.fasterxml.jackson.annotation.JsonAnyGetter
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.util.List
;
import
java.util.Map
;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel
(
value
=
"SchemeEvaluateSchemeDetailedProblemVO"
,
description
=
"方案详情-详细问题"
)
public
class
SchemeEvaluateSchemeDetailedProblemVO
{
@ApiModelProperty
(
value
=
"存在问题"
)
private
List
<
String
>
problems
;
@ApiModelProperty
(
value
=
"表格数据"
)
private
List
<
TableContent
>
tableContentList
;
@NoArgsConstructor
@Data
public
static
class
TableContent
{
@ApiModelProperty
(
value
=
"位置"
)
private
String
position
;
@ApiModelProperty
(
value
=
"流量"
)
private
Integer
flow
;
@ApiModelProperty
(
value
=
"是否有问题,0否 1是"
)
private
Integer
hasProblem
=
0
;
@ApiModelProperty
(
value
=
"子列表"
)
private
List
<
TableContent
>
subList
;
// 可变指标数据
@JsonIgnore
private
Map
<
String
,
String
>
metricsMap
;
@JsonAnyGetter
public
Map
<
String
,
String
>
any
()
{
return
metricsMap
;
}
}
}
wj-common/src/main/java/net/wanji/common/enums/StrategyAndMetricsEnum.java
View file @
8cc1f43e
...
@@ -32,11 +32,11 @@ public class StrategyAndMetricsEnum {
...
@@ -32,11 +32,11 @@ public class StrategyAndMetricsEnum {
@Getter
@Getter
public
enum
Metrics
{
public
enum
Metrics
{
NO_STOP_
THROUGH_
RATE
(
"1"
,
"不停车通过率"
,
"%"
),
NO_STOP_RATE
(
"1"
,
"不停车通过率"
,
"%"
),
STOP_
THROUGH_
RATE
(
"2"
,
"一/二/三次及以上停车通过率"
,
"%"
),
STOP_RATE
(
"2"
,
"一/二/三次及以上停车通过率"
,
"%"
),
AVERAGE_DELAY
(
"3"
,
"平均延误"
,
"s"
),
AVERAGE_DELAY
(
"3"
,
"平均延误"
,
"s"
),
MAX_QUEUE_LENGTH
(
"4"
,
"最大排队长度"
,
"m"
),
MAX_QUEUE_LENGTH
(
"4"
,
"最大排队长度"
,
"m"
),
STOP_
COUNT
(
"5"
,
"停车次数"
,
"次"
),
STOP_
TIMES
(
"5"
,
"停车次数"
,
"次"
),
AVERAGE_SPEED
(
"6"
,
"平均速度"
,
"km/h"
),
AVERAGE_SPEED
(
"6"
,
"平均速度"
,
"km/h"
),
GREEN_LIGHT_UTILIZATION
(
"7"
,
"绿灯有效利用率"
,
"%"
),
GREEN_LIGHT_UTILIZATION
(
"7"
,
"绿灯有效利用率"
,
"%"
),
SATURATION
(
"8"
,
"饱和度"
,
""
),
SATURATION
(
"8"
,
"饱和度"
,
""
),
...
@@ -63,11 +63,11 @@ public class StrategyAndMetricsEnum {
...
@@ -63,11 +63,11 @@ public class StrategyAndMetricsEnum {
static
{
static
{
Map
<
Strategy
,
List
<
Metrics
>>
map
=
new
HashMap
<>();
Map
<
Strategy
,
List
<
Metrics
>>
map
=
new
HashMap
<>();
map
.
put
(
Strategy
.
EFFICIENCY
,
Arrays
.
asList
(
map
.
put
(
Strategy
.
EFFICIENCY
,
Arrays
.
asList
(
Metrics
.
NO_STOP_
THROUGH_
RATE
,
Metrics
.
NO_STOP_RATE
,
Metrics
.
STOP_
THROUGH_
RATE
,
Metrics
.
STOP_RATE
,
Metrics
.
AVERAGE_DELAY
,
Metrics
.
AVERAGE_DELAY
,
Metrics
.
MAX_QUEUE_LENGTH
,
Metrics
.
MAX_QUEUE_LENGTH
,
Metrics
.
STOP_
COUNT
,
Metrics
.
STOP_
TIMES
,
Metrics
.
AVERAGE_SPEED
Metrics
.
AVERAGE_SPEED
));
));
map
.
put
(
Strategy
.
BALANCE
,
Arrays
.
asList
(
map
.
put
(
Strategy
.
BALANCE
,
Arrays
.
asList
(
...
...
wj-databus/src/main/java/net/wanji/databus/dao/mapper/CrossDirDataHistMapper.java
View file @
8cc1f43e
...
@@ -37,7 +37,7 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> {
...
@@ -37,7 +37,7 @@ public interface CrossDirDataHistMapper extends BaseMapper<CrossDirDataHistPO> {
List
<
CrossDirDataHistPO
>
selectByCrossIdAndStartEnd
(
String
crossId
,
int
startStamp
,
int
endStamp
);
List
<
CrossDirDataHistPO
>
selectByCrossIdAndStartEnd
(
String
crossId
,
int
startStamp
,
int
endStamp
);
Double
selectMaxDelayTime
(
String
crossId
,
Integer
dirType
,
Integer
inOutType
,
int
startStamp
,
int
endStamp
);
Integer
selectMaxDelayTime
(
String
crossId
,
Integer
dirType
,
Integer
inOutType
,
int
startStamp
,
int
endStamp
);
Double
selectMaxQueueLength
(
String
crossId
,
Integer
dirType
,
Integer
inOutType
,
int
startStamp
,
int
endStamp
);
Double
selectMaxQueueLength
(
String
crossId
,
Integer
dirType
,
Integer
inOutType
,
int
startStamp
,
int
endStamp
);
...
...
wj-databus/src/main/java/net/wanji/databus/dao/mapper/CrossTurnDataHistMapper.java
View file @
8cc1f43e
...
@@ -20,7 +20,7 @@ public interface CrossTurnDataHistMapper extends BaseMapper<CrossTurnDataHistPO>
...
@@ -20,7 +20,7 @@ public interface CrossTurnDataHistMapper extends BaseMapper<CrossTurnDataHistPO>
CrossTurnDataHistPO
selectNoPark
(
String
crossId
,
Integer
dir
,
String
turn
,
long
currentSeconds
,
long
preSeconds
);
CrossTurnDataHistPO
selectNoPark
(
String
crossId
,
Integer
dir
,
String
turn
,
long
currentSeconds
,
long
preSeconds
);
List
<
CrossTurnDataHistPO
>
selectByCrossId
(
String
crossId
,
long
currentSeconds
,
long
preSeconds
);
List
<
CrossTurnDataHistPO
>
selectByCrossId
(
String
crossId
,
long
endTimeStamp
,
long
startTimeStamp
);
List
<
MetricHistDTO
>
selectMetricHistDTO
(
String
crossId
,
int
startStamp
,
int
endStamp
);
List
<
MetricHistDTO
>
selectMetricHistDTO
(
String
crossId
,
int
startStamp
,
int
endStamp
);
}
}
wj-databus/src/main/resources/mapper/CrossTurnDataHistMapper.xml
View file @
8cc1f43e
...
@@ -70,8 +70,8 @@
...
@@ -70,8 +70,8 @@
select
<include
refid=
"Base_Column_List"
/>
select
<include
refid=
"Base_Column_List"
/>
from t_cross_turn_data_hist
from t_cross_turn_data_hist
where cross_id = #{crossId}
where cross_id = #{crossId}
and batch_time
<![CDATA[ <= ]]>
#{
currentSeconds
}
and batch_time
<![CDATA[ <= ]]>
#{
endTimeStamp
}
and batch_time
<![CDATA[ >= ]]>
#{
preSeconds
}
and batch_time
<![CDATA[ >= ]]>
#{
startTimeStamp
}
</select>
</select>
<select
id=
"selectMetricHistDTO"
resultType=
"net.wanji.databus.dto.MetricHistDTO"
>
<select
id=
"selectMetricHistDTO"
resultType=
"net.wanji.databus.dto.MetricHistDTO"
>
...
...
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