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
jinan
traffic-signal-platform
Commits
7911fafc
Commit
7911fafc
authored
Mar 27, 2025
by
黄伟铭
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增综合查询接口
parent
2291c656
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
494 additions
and
0 deletions
+494
-0
ComprehensiveQueryController.java
...erv2/comprehensivequery/ComprehensiveQueryController.java
+72
-0
ComprehensiveQueryMapper.java
...o/mapper/comprehensivequery/ComprehensiveQueryMapper.java
+13
-0
CrossEntity.java
.../net/wanji/opt/entity/comprehensivequery/CrossEntity.java
+22
-0
CrossLaneDataHistPoExtendName.java
...ity/comprehensivequery/CrossLaneDataHistPoExtendName.java
+18
-0
GreenAndCrossEntity.java
...ji/opt/entity/comprehensivequery/GreenAndCrossEntity.java
+40
-0
GreenTreeEntity.java
.../wanji/opt/entity/comprehensivequery/GreenTreeEntity.java
+28
-0
ComprehensiveQueryService.java
...rvicev2/comprehensivequery/ComprehensiveQueryService.java
+12
-0
ComprehensiveQueryServiceImpl.java
...omprehensivequery/impl/ComprehensiveQueryServiceImpl.java
+134
-0
ComprehensiveQueryMapper.xml
...es/mapper/comprehensivequery/ComprehensiveQueryMapper.xml
+155
-0
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/controllerv2/comprehensivequery/ComprehensiveQueryController.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
controllerv2
.
comprehensivequery
;
import
io.swagger.annotations.*
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.framework.rest.JsonViewObject
;
import
net.wanji.opt.entity.comprehensivequery.CrossLaneDataHistPoExtendName
;
import
net.wanji.opt.entity.comprehensivequery.GreenTreeEntity
;
import
net.wanji.opt.servicev2.comprehensivequery.ComprehensiveQueryService
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.annotation.Resource
;
import
javax.ws.rs.core.MediaType
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author huangwm
* @date 2025/03/06 18:33
*/
@Api
(
value
=
"ComprehensiveQueryController"
,
description
=
"综合查询"
,
tags
=
"综合查询"
)
@RequestMapping
(
"/ComprehensiveQuery"
)
@RestController
@Slf4j
public
class
ComprehensiveQueryController
{
@Resource
private
ComprehensiveQueryService
comprehensiveQueryService
;
@ApiOperation
(
value
=
"获取干线与路口树"
,
notes
=
"获取干线与路口树"
,
httpMethod
=
"GET"
,
response
=
JsonViewObject
.
class
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@GetMapping
(
value
=
"/getGreenAndCross"
)
@ApiImplicitParams
({
})
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
String
.
class
),
})
public
JsonViewObject
getGreenAndCross
()
{
List
<
GreenTreeEntity
>
list
=
new
ArrayList
<>();
try
{
list
=
comprehensiveQueryService
.
getGreenAndCross
();
}
catch
(
Exception
e
)
{
log
.
error
(
"综合查询-获取干线与路口树-查询失败:{}"
,
e
);
JsonViewObject
.
newInstance
().
success
(
list
);
}
return
JsonViewObject
.
newInstance
().
success
(
list
);
}
@ApiOperation
(
value
=
"获取综合查询数据"
,
notes
=
"获取综合查询数据"
,
httpMethod
=
"GET"
,
response
=
JsonViewObject
.
class
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@GetMapping
(
value
=
"/getComprehensiveQuery"
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"crossId"
,
value
=
"路口id"
,
required
=
true
,
dataType
=
"String"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"startTime"
,
value
=
"日期 格式:yyyy-MM-dd h:i:s"
,
required
=
true
,
dataType
=
"String"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"endTime"
,
value
=
"日期 格式:yyyy-MM-dd h:i:s"
,
required
=
true
,
dataType
=
"String"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"objectType"
,
value
=
"范围 0:路口级指标 1:方向级指标 2:转向级指标"
,
required
=
true
,
dataType
=
"String"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"groupType"
,
value
=
"时间粒度 0--5分钟 1--15分钟 2--30分钟 3--60分钟"
,
required
=
true
,
dataType
=
"String"
,
paramType
=
"query"
),
})
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
String
.
class
),
})
public
JsonViewObject
getComprehensiveQuery
(
String
crossId
,
String
startTime
,
String
endTime
,
String
objectType
,
String
groupType
)
{
List
<
CrossLaneDataHistPoExtendName
>
list
=
new
ArrayList
<>();
try
{
list
=
comprehensiveQueryService
.
getCrossStatusDistribution
(
crossId
,
startTime
,
endTime
,
objectType
,
groupType
);
}
catch
(
Exception
e
)
{
log
.
error
(
"综合查询-综合查询数据-查询失败:{}"
,
e
);
JsonViewObject
.
newInstance
().
success
(
list
);
}
return
JsonViewObject
.
newInstance
().
success
(
list
);
}
}
signal-optimize-service/src/main/java/net/wanji/opt/dao/mapper/comprehensivequery/ComprehensiveQueryMapper.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
dao
.
mapper
.
comprehensivequery
;
import
net.wanji.opt.entity.comprehensivequery.GreenAndCrossEntity
;
import
net.wanji.opt.po.base.CrossLaneDataHistPoExtend
;
import
java.util.List
;
import
java.util.Map
;
public
interface
ComprehensiveQueryMapper
{
List
<
GreenAndCrossEntity
>
getGreenAndCross
();
List
<
GreenAndCrossEntity
>
getCross
();
List
<
CrossLaneDataHistPoExtend
>
findCrossObjectIndex
(
Map
<
String
,
Object
>
params
);
}
signal-optimize-service/src/main/java/net/wanji/opt/entity/comprehensivequery/CrossEntity.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
entity
.
comprehensivequery
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.io.Serializable
;
@Data
@EqualsAndHashCode
(
callSuper
=
false
)
public
class
CrossEntity
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 路口ID
*/
private
String
crossId
;
/**
* 路口名称
*/
private
String
crossName
;
}
signal-optimize-service/src/main/java/net/wanji/opt/entity/comprehensivequery/CrossLaneDataHistPoExtendName.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
entity
.
comprehensivequery
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
net.wanji.opt.po.base.CrossLaneDataHistPoExtend
;
import
java.io.Serializable
;
@Data
@EqualsAndHashCode
(
callSuper
=
false
)
public
class
CrossLaneDataHistPoExtendName
extends
CrossLaneDataHistPoExtend
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 路口名称
*/
private
String
crossName
;
}
signal-optimize-service/src/main/java/net/wanji/opt/entity/comprehensivequery/GreenAndCrossEntity.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
entity
.
comprehensivequery
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.io.Serializable
;
@Data
@EqualsAndHashCode
(
callSuper
=
false
)
public
class
GreenAndCrossEntity
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 干线ID
*/
private
String
greenId
;
/**
* 干线名称
*/
private
String
greenName
;
/**
* 路口ID
*/
private
String
crossId
;
/**
* 路口名称
*/
private
String
crossName
;
/**
* 排序
*/
private
String
sort
;
}
signal-optimize-service/src/main/java/net/wanji/opt/entity/comprehensivequery/GreenTreeEntity.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
entity
.
comprehensivequery
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.io.Serializable
;
import
java.util.List
;
@Data
@EqualsAndHashCode
(
callSuper
=
false
)
public
class
GreenTreeEntity
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 干线ID
*/
private
String
greenId
;
/**
* 干线名称
*/
private
String
greenName
;
/**
* 路口数据集
*/
private
List
<
CrossEntity
>
children
;
}
signal-optimize-service/src/main/java/net/wanji/opt/servicev2/comprehensivequery/ComprehensiveQueryService.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
servicev2
.
comprehensivequery
;
import
net.wanji.opt.entity.comprehensivequery.CrossLaneDataHistPoExtendName
;
import
net.wanji.opt.entity.comprehensivequery.GreenTreeEntity
;
import
java.util.List
;
import
java.util.Map
;
public
interface
ComprehensiveQueryService
{
List
<
GreenTreeEntity
>
getGreenAndCross
();
List
<
CrossLaneDataHistPoExtendName
>
getCrossStatusDistribution
(
String
crossId
,
String
startTime
,
String
endTime
,
String
objectType
,
String
groupType
);
}
signal-optimize-service/src/main/java/net/wanji/opt/servicev2/comprehensivequery/impl/ComprehensiveQueryServiceImpl.java
0 → 100644
View file @
7911fafc
package
net
.
wanji
.
opt
.
servicev2
.
comprehensivequery
.
impl
;
import
net.wanji.common.enums.BaseEnum
;
import
net.wanji.opt.dao.mapper.comprehensivequery.ComprehensiveQueryMapper
;
import
net.wanji.opt.entity.comprehensivequery.CrossEntity
;
import
net.wanji.opt.entity.comprehensivequery.CrossLaneDataHistPoExtendName
;
import
net.wanji.opt.entity.comprehensivequery.GreenAndCrossEntity
;
import
net.wanji.opt.entity.comprehensivequery.GreenTreeEntity
;
import
net.wanji.opt.po.base.CrossLaneDataHistPoExtend
;
import
net.wanji.opt.servicev2.comprehensivequery.ComprehensiveQueryService
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
import
javax.validation.constraints.Future
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
/**
* <p>
* 综合查询
* </p>
*
* @author huangwm
* @since 2025-03-26
*/
@Service
public
class
ComprehensiveQueryServiceImpl
implements
ComprehensiveQueryService
{
@Resource
private
ComprehensiveQueryMapper
comprehensiveQueryMapper
;
@Override
public
List
<
GreenTreeEntity
>
getGreenAndCross
()
{
List
<
GreenAndCrossEntity
>
list
=
comprehensiveQueryMapper
.
getGreenAndCross
();
String
greenNameTemp
=
""
;
List
<
CrossEntity
>
crossList
=
new
ArrayList
<>();
List
<
GreenTreeEntity
>
greenList
=
new
ArrayList
<>();
GreenTreeEntity
greenTreeEntity
=
new
GreenTreeEntity
();
CrossEntity
crossEntity
=
new
CrossEntity
();
int
a
=
0
;
for
(
GreenAndCrossEntity
temp
:
list
){
// 判断干线名称是否一致
if
(!
greenNameTemp
.
equals
(
temp
.
getGreenName
())){
greenNameTemp
=
temp
.
getGreenName
();
//判断是否是空数组,第一次进入的时候是空数组,后续是有数据的数组需要把数据添加进去
if
(
greenTreeEntity
.
getGreenId
()
!=
null
){
greenTreeEntity
.
setChildren
(
crossList
);
greenList
.
add
(
greenTreeEntity
);
greenTreeEntity
=
new
GreenTreeEntity
();
greenTreeEntity
.
setGreenId
(
temp
.
getGreenId
());
greenTreeEntity
.
setGreenName
(
temp
.
getGreenName
());
crossEntity
=
new
CrossEntity
();
crossList
=
new
ArrayList
<>();
crossEntity
.
setCrossName
(
temp
.
getCrossName
());
crossEntity
.
setCrossId
(
temp
.
getCrossId
());
crossList
.
add
(
crossEntity
);
}
else
{
greenTreeEntity
.
setGreenId
(
temp
.
getGreenId
());
greenTreeEntity
.
setGreenName
(
temp
.
getGreenName
());
crossEntity
=
new
CrossEntity
();
crossList
=
new
ArrayList
<>();
crossEntity
.
setCrossName
(
temp
.
getCrossName
());
crossEntity
.
setCrossId
(
temp
.
getCrossId
());
crossList
.
add
(
crossEntity
);
}
}
else
{
crossEntity
=
new
CrossEntity
();
crossEntity
.
setCrossName
(
temp
.
getCrossName
());
crossEntity
.
setCrossId
(
temp
.
getCrossId
());
crossList
.
add
(
crossEntity
);
if
(
a
==
list
.
size
()
-
1
)
{
greenTreeEntity
.
setChildren
(
crossList
);
greenList
.
add
(
greenTreeEntity
);
}
}
a
++;
}
return
greenList
;
}
@Override
public
List
<
CrossLaneDataHistPoExtendName
>
getCrossStatusDistribution
(
String
crossId
,
String
startTime
,
String
endTime
,
String
objectType
,
String
groupType
)
{
List
<
CrossLaneDataHistPoExtendName
>
resultList
=
new
ArrayList
<>();
List
<
GreenAndCrossEntity
>
CrossList
=
comprehensiveQueryMapper
.
getCross
();
String
[]
crossIdArray
=
crossId
.
split
(
","
);
for
(
String
id
:
crossIdArray
)
{
String
crossName
=
""
;
for
(
GreenAndCrossEntity
temp
:
CrossList
){
if
(
id
.
equals
(
temp
.
getCrossId
())){
crossName
=
temp
.
getCrossName
();
}
}
Map
<
String
,
Object
>
params
=
new
HashMap
<>();
params
.
put
(
"crossId"
,
id
);
params
.
put
(
"startDate"
,
startTime
);
params
.
put
(
"endDate"
,
endTime
);
params
.
put
(
"groupType"
,
groupType
);
params
.
put
(
"objectType"
,
objectType
);
List
<
CrossLaneDataHistPoExtend
>
list
=
comprehensiveQueryMapper
.
findCrossObjectIndex
(
params
);
for
(
CrossLaneDataHistPoExtend
c
:
list
)
{
CrossLaneDataHistPoExtendName
temp
=
new
CrossLaneDataHistPoExtendName
();
temp
.
setCrossId
(
c
.
getCrossId
());
temp
.
setStartTime
(
c
.
getStartTime
());
temp
.
setDirType
(
c
.
getDirType
());
temp
.
setTurnType
(
c
.
getTurnType
());
temp
.
setFlow
(
c
.
getFlow
());
temp
.
setSpeed
(
c
.
getSpeed
());
temp
.
setMaxQueueLength
(
c
.
getMaxQueueLength
());
temp
.
setMinQueueLength
(
c
.
getMinQueueLength
());
temp
.
setAvgQueueLength
(
c
.
getAvgQueueLength
());
temp
.
setStopTimes
(
c
.
getStopTimes
());
temp
.
setDelayTime
(
c
.
getDelayTime
());
temp
.
setTrafficIndex
(
c
.
getTrafficIndex
());
temp
.
setCrossName
(
crossName
);
if
(
c
.
getDirType
()
>
0
){
temp
.
setDirTypeName
(
BaseEnum
.
SignalDirectionEnum
.
getNameByCode
(
c
.
getDirType
()));
}
if
(
c
.
getTurnType
()
>
0
){
temp
.
setTurnTypeName
(
BaseEnum
.
TurnTypeEnum
.
getNameByCode
(
c
.
getTurnType
()));
}
resultList
.
add
(
temp
);
}
}
return
resultList
;
}
}
signal-optimize-service/src/main/resources/mapper/comprehensivequery/ComprehensiveQueryMapper.xml
0 → 100644
View file @
7911fafc
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"net.wanji.opt.dao.mapper.comprehensivequery.ComprehensiveQueryMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"net.wanji.opt.entity.comprehensivequery.GreenAndCrossEntity"
>
<result
property=
"greenId"
column=
"greenId"
></result>
<result
property=
"greenName"
column=
"greenName"
></result>
<result
property=
"crossId"
column=
"crossId"
></result>
<result
property=
"crossName"
column=
"crossName"
></result>
<result
property=
"sort"
column=
"sort"
></result>
</resultMap>
<select
id=
"getGreenAndCross"
resultMap=
"BaseResultMap"
>
select a.green_id as greenId, c.name as greenName , a.cross_id as crossId , b.name as crossName ,a.sort
from t_greenwave_cross a
left join t_base_cross_info b on a.cross_id = b.id
left join t_greenwave_info c on a.green_id = c.id
where a.green_id
<![CDATA[ < ]]>
99
group by a.green_id ,a.sort
</select>
<select
id=
"getCross"
resultMap=
"BaseResultMap"
>
select id as crossId,name as crossName from t_base_cross_info t where t.is_signal = 1
</select>
<!-- 统一接口:绿波路口车道级指标趋势,支持按5分钟粒度、15分钟粒度、30分钟粒度、1小时粒度汇聚 -->
<select
id=
"findCrossObjectIndex"
resultType=
"net.wanji.opt.po.base.CrossLaneDataHistPoExtend"
>
SELECT MIN(ifnull(t.unit_time,#{startDate})) start_time,
cross_id ,
lane_no ,
dir_type ,
turn_type ,
SUM(flow) flow,
round(AVG(speed),2) speed,
MAX(queue_length) max_queue_length,
MIN(queue_length) min_queue_length,
round(AVG(queue_length)) avg_queue_length,
round(AVG(stop_times),2) stop_times,
round(AVG(delay_time),2) delay_time,
round(AVG(traffic_index),2) traffic_index,
round(AVG(sturation),4) sturation,
round(AVG(green_light_efficiency),4) green_light_efficiency,
round(AVG(vehicle_length_ratio_mean),4) vehicle_length_ratio_mean,
group_concat(service_level) service_level
FROM
(
SELECT start_time,
(case
when #{groupType}=0 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 5 ) * 5 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=1 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 15 ) * 15 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=2 then DATE_FORMAT(concat( date( start_time ), ' ', HOUR ( start_time ), ':', floor( MINUTE ( start_time ) / 30 ) * 30 ),'%Y-%m-%d %H:%i:00' )
when #{groupType}=3 then DATE_FORMAT(start_time,'%Y-%m-%d %H:00:00' )
when #{groupType}=4 then DATE_FORMAT(start_time,'%Y-%m-%d 00:00:00' )
else DATE_FORMAT(start_time,'%Y-01-01 00:00:00')
<!-- 按查询时间范围不分粒度进行聚合处理 -->
end
) unit_time,
t.cross_id,
<choose>
<!-- 路口级 -->
<when
test=
"objectType==0"
>
null as lane_no,
null as dir_type,
null as turn_type,
ifnull(service_level,'A') service_level,
traffic_index,
green_light_efficiency,
null as vehicle_length_ratio_mean,
</when>
<!-- 方向级 -->
<when
test=
"objectType==1"
>
dir_type,
null as lane_no,
null as turn_type,
null as service_level,
traffic_index,
green_light_efficiency,
null as vehicle_length_ratio_mean,
</when>
<!-- 转向级 -->
<when
test=
"objectType==2"
>
t.in_dir as dir_type,
t.turn_type,
null as lane_no,
null as service_level,
traffic_index,
green_light_efficiency,
null as vehicle_length_ratio_mean,
</when>
<otherwise>
</otherwise>
</choose>
flow,
speed,
queue_length,
stop_times,
delay_time,
sturation
<choose>
<!-- 路口级 -->
<when
test=
"objectType==0"
>
FROM t_cross_data_hist t
</when>
<!-- 方向级 -->
<when
test=
"objectType==1"
>
FROM t_cross_dir_data_hist t
</when>
<!-- 转向级 -->
<when
test=
"objectType==2"
>
FROM t_cross_turn_data_hist t
</when>
<otherwise>
</otherwise>
</choose>
where 1=1
<if
test=
"crossId!=null and crossId !=''"
>
and t.cross_id = #{crossId}
</if>
<if
test=
"startDate !=null and endDate !=null"
>
and dt >= date_format(#{startDate},'%Y%m%d') and dt
<
= date_format(#{endDate},'%Y%m%d')
AND start_time >= #{startDate} and start_time
<
#{endDate}
</if>
<choose>
<!-- 方向级 -->
<when
test=
"objectType==1"
>
and dir_type in (1,3,5,7)
</when>
<!-- 转向级 -->
<when
test=
"objectType==2"
>
and t.in_dir in (1,3,5,7)
</when>
<otherwise>
</otherwise>
</choose>
) t
<choose>
<!-- 路口级 -->
<when
test=
"objectType==0"
>
GROUP BY t.cross_id,unit_time
</when>
<!-- 方向级 -->
<when
test=
"objectType==1"
>
GROUP BY t.cross_id,t.dir_type,unit_time
</when>
<!-- 转向级 -->
<when
test=
"objectType==2"
>
GROUP BY t.cross_id,t.dir_type,t.turn_type,unit_time
</when>
<otherwise>
</otherwise>
</choose>
</select>
</mapper>
\ No newline at end of file
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