Commit 7911fafc authored by 黄伟铭's avatar 黄伟铭

新增综合查询接口

parent 2291c656
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);
}
}
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);
}
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;
}
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;
}
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;
}
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;
}
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);
}
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;
}
}
<?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 &lt;= date_format(#{endDate},'%Y%m%d')
AND start_time >= #{startDate} and start_time &lt; #{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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment