Browse Source

Merge remote-tracking branch 'origin/develop' into develop

develop
zhaoxianglong 11 months ago
parent
commit
def002212b
  1. 37
      zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java
  2. 44
      zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java
  3. 44
      zc-business/src/main/java/com/zc/business/request/DcTrafficSectionDataRequest.java
  4. 31
      zc-business/src/main/java/com/zc/business/service/DcTrafficStatisticsService.java
  5. 100
      zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java
  6. 2
      zc-business/src/main/java/com/zc/business/statistics/handler/TrafficStatistics.java

37
zc-business/src/main/java/com/zc/business/controller/DcTrafficStatisticsController.java

@ -2,13 +2,13 @@ package com.zc.business.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zc.business.domain.DcTrafficMetricsData;
import com.zc.business.domain.DcTrafficSectionData;
import com.zc.business.request.DcTrafficMetricsDataRequest;
import com.zc.business.request.DcTrafficSectionDataRequest;
import com.zc.business.service.DcTrafficStatisticsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -27,6 +27,37 @@ public class DcTrafficStatisticsController {
private DcTrafficStatisticsService dcTrafficStatisticsService;
/**
* 获取当前交通截面数据
*
* @param request 请求参数封装了对于交通截面数据查询的详细要求
* @return 返回一个AjaxResult对象其中包含了查询结果如果查询成功则结果中封装了当前交通截面的数据DcTrafficSectionData类型
*/
@ApiOperation("获取当前交通截面数据")
@GetMapping("/current/sections")
public AjaxResult currentSections(DcTrafficSectionDataRequest request){
// 调用服务层方法,查询当前交通截面数据
List<DcTrafficSectionData> dcTrafficMetricsData = dcTrafficStatisticsService.currentSections(request);
// 将查询结果封装为AjaxResult对象返回
return AjaxResult.success(dcTrafficMetricsData);
}
/**
* 获取历史交通截面数据
*
* @param request 包含交通截面数据请求参数的对象
* @return 返回一个包含历史交通截面数据的AjaxResult对象
*/
@ApiOperation("获取历史交通截面数据")
@GetMapping("/history/sections")
public AjaxResult historySections(DcTrafficSectionDataRequest request){
// 调用服务层方法,获取历史交通截面的统计数据
List<DcTrafficSectionData> dcTrafficMetricsData = dcTrafficStatisticsService.historySections(request);
// 将获取到的历史交通截面数据封装成AjaxResult对象并返回
return AjaxResult.success(dcTrafficMetricsData);
}
/**
* 获取当前交通特征指数
*
@ -37,7 +68,7 @@ public class DcTrafficStatisticsController {
@GetMapping("/current/metrics")
public AjaxResult currentTrafficMetrics(DcTrafficMetricsDataRequest request){
// 调用服务层方法,获取当前交通指标数据
DcTrafficMetricsData dcTrafficMetricsData = dcTrafficStatisticsService.currentTrafficMetrics(request);
List<DcTrafficMetricsData> dcTrafficMetricsData = dcTrafficStatisticsService.currentTrafficMetrics(request);
// 将获取到的交通指标数据封装为成功的结果并返回
return AjaxResult.success(dcTrafficMetricsData);
}

44
zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java

@ -37,6 +37,7 @@ public class DeviceMessageHandler {
private final int EVENT_AI = 1;
private final int EVENT_STATE = 1;
private final int EVENTEND_STATE = 4;
private final int VISIBILITY_LEVEL = 8;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Resource
@ -113,7 +114,7 @@ public class DeviceMessageHandler {
// 气象检测器
if (IotProductEnum.WEATHER_DETECTOR.value().equals(productId)) {
weatherDetectorMessageHandle(data);
return;
return;
}
// 护栏碰撞
@ -168,8 +169,13 @@ public class DeviceMessageHandler {
dcWarning.setWarningTime(new Date(captureTime));
// 信息来源
dcWarning.setWarningSource(WarningSourceEnum.VIDEO_AI.getCode());
// 事件主类型
dcWarning.setWarningType(data.getInteger("warningType"));
//异常天气等级
if (data.getInteger("warningType") == VISIBILITY_LEVEL) {
dcWarning.setWarningLevel(data.getInteger("visibilityLevel"));
}
String warningSubclass = data.getString("warningSubclass");
// 子类型
@ -181,10 +187,10 @@ public class DeviceMessageHandler {
//方向
if (arr[2] != null) {
if (arr[2].equals("上行")) {
direction=arr[0]+" "+arr[1]+ " 菏泽方向 ";
direction = arr[0] + " " + arr[1] + " 菏泽方向 ";
}
if (arr[2].equals("下行")) {
direction=arr[0]+" "+arr[1]+ " 济南方向 ";
direction = arr[0] + " " + arr[1] + " 济南方向 ";
}
}
@ -349,7 +355,7 @@ public class DeviceMessageHandler {
* @param msg 设备消息
*/
private void oneStopDeviceMessageHandle(JSONObject msg) {
dcTrafficSectionDataService.processRealtimeOneStopMessage(msg);
dcTrafficSectionDataService.processRealtimeOneStopMessage(msg);
}
@ -445,12 +451,12 @@ public class DeviceMessageHandler {
*/
private void weatherDetectorMessageHandle(JSONObject msg) {
// DcMeteorologicalDetectorData meteorologicalDetectorData = (DcMeteorologicalDetectorData) msg.get("properties");
// DcMeteorologicalDetectorData meteorologicalDetectorData = (DcMeteorologicalDetectorData) msg.get("properties");
JSONObject jsonObject = (JSONObject) msg.get("properties");
DcMeteorologicalDetectorData meteorologicalDetectorData = jsonObject.toJavaObject(DcMeteorologicalDetectorData.class);
JSONObject jsonObjectHeaders = (JSONObject)msg.get("headers");
JSONObject jsonObjectHeaders = (JSONObject) msg.get("headers");
String parts = jsonObjectHeaders.getString("deviceName");
String[] strings = parts.split("-");
String deviceName = strings[0];
@ -474,19 +480,19 @@ public class DeviceMessageHandler {
mdDeviceData.setTimeStamp(new Date());
mdDeviceData.setCreatorUserId("自动存储");
Map<String,Object> expands = new HashMap<>();
expands.put("rainFall",meteorologicalDetectorData.getRainfall()); //雨量
expands.put("windDirection",meteorologicalDetectorData.getWindDirection()); //风向
expands.put("windSpeed",meteorologicalDetectorData.getWindSpeed()); //风速
expands.put("temperature",meteorologicalDetectorData.getTemperature()); //大气温度
expands.put("humidity",meteorologicalDetectorData.getHumidity()); //大气湿度
expands.put("airPressure",meteorologicalDetectorData.getAtmosphericPressure()); //气压
expands.put("waterThick",meteorologicalDetectorData.getWaterFilmIceSnowValue()); //水膜厚度
expands.put("wet",meteorologicalDetectorData.getWetSlipperyCoefficient()); //湿滑
expands.put("rainXingTai",meteorologicalDetectorData.getPrecipitationType()); //雨量降水形态
expands.put("visibility",meteorologicalDetectorData.getVisibility()); //能见度
expands.put("remoteRoadSurfaceTemperature",meteorologicalDetectorData.getRemoteRoadSurfaceTemperature()); //路面温度
expands.put("pathContactZhuang",meteorologicalDetectorData.getRemoteRoadSurfaceStatus()); //路面状况
Map<String, Object> expands = new HashMap<>();
expands.put("rainFall", meteorologicalDetectorData.getRainfall()); //雨量
expands.put("windDirection", meteorologicalDetectorData.getWindDirection()); //风向
expands.put("windSpeed", meteorologicalDetectorData.getWindSpeed()); //风速
expands.put("temperature", meteorologicalDetectorData.getTemperature()); //大气温度
expands.put("humidity", meteorologicalDetectorData.getHumidity()); //大气湿度
expands.put("airPressure", meteorologicalDetectorData.getAtmosphericPressure()); //气压
expands.put("waterThick", meteorologicalDetectorData.getWaterFilmIceSnowValue()); //水膜厚度
expands.put("wet", meteorologicalDetectorData.getWetSlipperyCoefficient()); //湿滑
expands.put("rainXingTai", meteorologicalDetectorData.getPrecipitationType()); //雨量降水形态
expands.put("visibility", meteorologicalDetectorData.getVisibility()); //能见度
expands.put("remoteRoadSurfaceTemperature", meteorologicalDetectorData.getRemoteRoadSurfaceTemperature()); //路面温度
expands.put("pathContactZhuang", meteorologicalDetectorData.getRemoteRoadSurfaceStatus()); //路面状况
mdDeviceData.setExpands(JSONObject.toJSONString(expands));

44
zc-business/src/main/java/com/zc/business/request/DcTrafficSectionDataRequest.java

@ -0,0 +1,44 @@
package com.zc.business.request;
import lombok.Data;
import java.util.Date;
/**
* 交通截面数据请求参数定义
* @author xiepufeng
*/
@Data
public class DcTrafficSectionDataRequest {
/**
* 道路方向
*/
private Byte direction;
/**
* 时段类型
* 1- 2- 3- 4-
*/
private Byte periodType;
/**
* 开始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 设备ID
*/
private Long deviceId;
/**
* 设备类型
*/
private Integer deviceType;
}

31
zc-business/src/main/java/com/zc/business/service/DcTrafficStatisticsService.java

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.zc.business.domain.DcTrafficMetricsData;
import com.zc.business.domain.DcTrafficSectionData;
import com.zc.business.request.DcTrafficMetricsDataRequest;
import com.zc.business.request.DcTrafficSectionDataRequest;
import java.util.List;
@ -17,22 +18,36 @@ public interface DcTrafficStatisticsService extends IService<DcTrafficSectionDat
*/
void processRealtimeOneStopMessage(JSONObject msg);
/**
* 根据提供的请求参数获取当前的交通截面数据
*
* @param request 包含获取交通截面所需的所有请求参数的对象
* @return DcTrafficSectionData 返回一个包含当前交通截面数据列表
*/
List<DcTrafficSectionData> currentSections(DcTrafficSectionDataRequest request);
/**
* 根据提供的请求参数获取历史的交通截面数据
*
* @param request 包含获取交通截面所需的所有请求参数的对象
* @return DcTrafficSectionData 返回一个包含历史交通截面数据列表
*/
List<DcTrafficSectionData> historySections(DcTrafficSectionDataRequest request);
/**
* 根据提供的请求参数获取当前的流量指标数据
* 根据提供的请求参数获取当前的交通指标数据
*
* @param request 包含获取流量指标所需的所有请求参数的对象
* @return DcTrafficMetricsData 返回一个包含当前流量指标数据的对象
* 该对象包含了关于数据中心网络流量的各种度量指标
* @param request 包含获取交通指标所需的所有请求参数的对象
* @return DcTrafficMetricsData 返回一个包含当前交通指标数据列表
*/
DcTrafficMetricsData currentTrafficMetrics(DcTrafficMetricsDataRequest request);
List<DcTrafficMetricsData> currentTrafficMetrics(DcTrafficMetricsDataRequest request);
/**
* 获取历史流量指标数据列表
* 获取历史交通指标数据列表
*
* @param request 包含获取流量指标所需的所有请求参数的对象
* @return 返回符合查询条件的历史流量指标数据列表
* @param request 包含获取交通指标所需的所有请求参数的对象
* @return 返回符合查询条件的历史交通指标数据列表
*/
List<DcTrafficMetricsData> historyTrafficMetrics(DcTrafficMetricsDataRequest request);
}

100
zc-business/src/main/java/com/zc/business/service/impl/DcTrafficStatisticsServiceImpl.java

@ -15,6 +15,7 @@ import com.zc.business.domain.DcTrafficMetricsData;
import com.zc.business.domain.DcTrafficSectionData;
import com.zc.business.enums.*;
import com.zc.business.request.DcTrafficMetricsDataRequest;
import com.zc.business.request.DcTrafficSectionDataRequest;
import com.zc.business.statistics.cache.*;
import com.zc.business.mapper.DcTrafficSectionDataMapper;
import com.zc.business.service.DcTrafficStatisticsService;
@ -87,14 +88,57 @@ public class DcTrafficStatisticsServiceImpl
}
/**
* 根据请求获取当前交通流量指标数据
* 根据提供的请求参数获取当前的交通截面数据
*
* @param request 包含获取流量指标所需的所有请求参数的对象
* @return 返回当前交通流量指标数据
* @param request 包含获取交通截面所需的所有请求参数的对象
* @return DcTrafficSectionData 返回一个包含当前交通截面数据列表
*/
@Override
public List<DcTrafficSectionData> currentSections(DcTrafficSectionDataRequest request) {
// 从Redis缓存中获取指定方向的交通路段数据列表
List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection());
return filterTrafficDataByRequest(request, dcTrafficSectionDataCaches);
}
/**
* 根据提供的请求参数获取历史的交通截面数据
*
* @param request 包含获取交通截面所需的所有请求参数的对象
* @return DcTrafficSectionData 返回一个包含历史交通截面数据列表
*/
@Override
public List<DcTrafficSectionData> historySections(DcTrafficSectionDataRequest request) {
if (request.getStartTime() == null || request.getEndTime() == null) {
throw new ServiceException("开始时间或结束时间不能为空");
}
if (request.getPeriodType() == null) {
throw new ServiceException("时段类型不能为空");
}
// 构建查询条件
LambdaQueryWrapper<DcTrafficSectionData> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.between(DcTrafficSectionData::getStatisticalDate, request.getStartTime(), request.getEndTime());
queryWrapper.eq(DcTrafficSectionData::getPeriodType, request.getPeriodType());
queryWrapper.eq(DcTrafficSectionData::getDirection, request.getDirection());
queryWrapper.eq(DcTrafficSectionData::getDeviceType, request.getDeviceType());
queryWrapper.eq(DcTrafficSectionData::getDeviceId, request.getDeviceId());
return list(queryWrapper);
}
/**
* 根据请求获取当前交通指标数据
*
* @param request 包含获取交通指标所需的所有请求参数的对象
* @return 返回当前交通指标数据
* @throws ServiceException 如果没有获取到交通数据则抛出异常
*/
@Override
public DcTrafficMetricsData currentTrafficMetrics(DcTrafficMetricsDataRequest request) {
public List<DcTrafficMetricsData> currentTrafficMetrics(DcTrafficMetricsDataRequest request) {
// 从Redis缓存中获取指定方向的交通路段数据列表
List<DcTrafficSectionData> dcTrafficSectionDataCaches = getDcTrafficSectionDataRedisCache(request.getDirection());
@ -111,15 +155,15 @@ public class DcTrafficStatisticsServiceImpl
}
// 根据收集到的交通段数据计算并返回交通指标数据
return dcTrafficMetricsDataList.get(0);
return dcTrafficMetricsDataList;
}
/**
* 计算获取指定条件下的历史交通流量指标数据
* 计算获取指定条件下的历史交通指标数据
*
* @param request 包含查询条件的请求对象包括开始时间结束时间方向周期类型和所属路段ID等信息
* @return 返回一个包含交通流量指标数据的列表
* @return 返回一个包含交通指标数据的列表
*/
@Override
public List<DcTrafficMetricsData> historyTrafficMetrics(DcTrafficMetricsDataRequest request) {
@ -277,19 +321,19 @@ public class DcTrafficStatisticsServiceImpl
}
/**
* 根据方向获取交通流量数据
* 根据方向获取交通数据
*
* @param direction 方向
* @return 单向交通流量数据
* @return 单向交通数据
*/
private Map<String, DcTrafficSectionData> getTrafficDataByDirection(Byte direction) {
return redisCache.getCacheMapValue(RedisKeyConstants.getDcDevicesTrafficStatisticsKey(direction));
}
/**
* 获取上行和下行所有交通流量数据
* 获取上行和下行所有交通数据
*
* @return 所有交通流量数据
* @return 所有交通数据
*/
private Map<String, DcTrafficSectionData> getTrafficDataForBothDirections() {
Map<String, DcTrafficSectionData> allData = new HashMap<>();
@ -354,5 +398,39 @@ public class DcTrafficStatisticsServiceImpl
.collect(Collectors.toList());
}
/**
* 根据请求过滤交通数据
*
* @param request 包含设备类型和设备ID的请求对象用于指定过滤条件
* @param dcTrafficSectionDataCaches 原始的交通数据列表
* @return 过滤后的交通数据列表仅包含与请求条件匹配的数据
*/
public List<DcTrafficSectionData> filterTrafficDataByRequest(
DcTrafficSectionDataRequest request,
List<DcTrafficSectionData> dcTrafficSectionDataCaches
) {
if (request == null) {
return dcTrafficSectionDataCaches; // 如果请求对象为空,直接返回原始交通数据列表
}
Integer deviceType = request.getDeviceType();
Long deviceId = request.getDeviceId();
if (deviceType == null && deviceId == null) {
return dcTrafficSectionDataCaches; // 如果请求中既没有设备类型也没有设备ID,返回原始数据列表
}
// 使用流对交通数据进行过滤,只返回与请求中的设备类型和设备ID匹配的数据
return dcTrafficSectionDataCaches.stream()
.filter(data -> {
boolean typeMatches = deviceType == null || data.getDeviceType().equals(deviceType); // 设备类型匹配条件
boolean idMatches = deviceId == null || data.getDeviceId().equals(deviceId); // 设备ID匹配条件
return typeMatches && idMatches; // 只有当两者都匹配时,数据才被保留
})
.collect(Collectors.toList());
}
}

2
zc-business/src/main/java/com/zc/business/statistics/handler/TrafficStatistics.java

@ -374,7 +374,7 @@ public class TrafficStatistics {
}
/**
* 计算累积大型交通
* 计算累积大型交通量数据
* 该方法用于根据给定的车道数据计算出特定类型的车辆包括公共汽车中型货车大型货车特大型货车和集装箱车的交通量总和
*
* @param laneData 包含车道交通量数据的JSONObject对象该对象应包含以下键

Loading…
Cancel
Save