Browse Source

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

develop
wangsixiang 11 months ago
parent
commit
0041b01487
  1. 1
      zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java
  2. 114
      zc-business/src/main/java/com/zc/business/controller/StatusController.java
  3. 9
      zc-business/src/main/java/com/zc/business/domain/DcTrafficSectionData.java
  4. 2
      zc-business/src/main/java/com/zc/business/enums/IotProductEnum.java
  5. 2
      zc-business/src/main/java/com/zc/business/enums/IotProductPropertiesEnum.java
  6. 1
      zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java
  7. 1
      zc-business/src/main/java/com/zc/business/mapper/StatusMapper.java
  8. 2
      zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java
  9. 2
      zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java
  10. 5
      zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java
  11. 57
      zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSectionDataServiceImpl.java
  12. 3
      zc-business/src/main/java/com/zc/business/service/impl/StatusService.java
  13. 9
      zc-business/src/main/java/com/zc/business/statistics/handler/RealtimeTrafficStatistics.java
  14. 5
      zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml
  15. 3
      zc-business/src/main/resources/mapper/business/DcTrafficSectionDataMapper.xml
  16. 13
      zc-business/src/main/resources/mapper/business/StatusMapper.xml

1
zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java

@ -49,7 +49,6 @@ public class DeviceStatus {
StatusService statusService= SpringUtils.getBean(StatusService.class); StatusService statusService= SpringUtils.getBean(StatusService.class);
ExecutorService executor = Executors.newFixedThreadPool(100); ExecutorService executor = Executors.newFixedThreadPool(100);
LambdaQueryWrapper<DcDevice> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<DcDevice> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DcDevice::getUseState,1);
List<DcDevice> deviceList = deviceService.list(lambdaQueryWrapper); List<DcDevice> deviceList = deviceService.list(lambdaQueryWrapper);
List<Future<Void>> futures = new ArrayList<>(); List<Future<Void>> futures = new ArrayList<>();

114
zc-business/src/main/java/com/zc/business/controller/StatusController.java

@ -13,10 +13,7 @@ import com.zc.business.service.impl.StatusService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -99,9 +96,8 @@ public class StatusController extends BaseController {
@ApiOperation("根据设备Id查询折线图数据") @ApiOperation("根据设备Id查询折线图数据")
@GetMapping("/deviceStatusList") @GetMapping("/deviceStatusList/{deviceId}")
public AjaxResult getDeviceStatusList(Long deviceId) { public AjaxResult getDeviceStatusList(@PathVariable Long deviceId) {
LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30); LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30);
LocalDateTime currentTime = LocalDateTime.now(); LocalDateTime currentTime = LocalDateTime.now();
@ -110,20 +106,22 @@ public class StatusController extends BaseController {
status.setTime(currentTime); status.setTime(currentTime);
status.setDeviceId(deviceId); status.setDeviceId(deviceId);
List<Status> listStatus = statusService.list(status); List<Status> listStatus = statusService.deviceStatusListById(status);
// Group by day and calculate average successRate with two decimal places // Calculate average successRate by day
Map<Integer, Integer> averageSuccessRateByDay = listStatus.stream() Map<Integer, Double> averageSuccessRateByDay = listStatus.stream()
.collect(Collectors.groupingBy(s -> s.getTime().getDayOfMonth(), .collect(Collectors.groupingBy(s -> s.getTime().getDayOfMonth(),
Collectors.collectingAndThen( Collectors.averagingDouble(s -> Double.parseDouble(s.getSuccessRate().replace("%", "")))));
Collectors.averagingDouble(s -> Double.parseDouble(s.getSuccessRate().replace("%", ""))),
avg -> Math.round(Float.parseFloat(String.format("%.2f", avg)))
)));
if (averageSuccessRateByDay.isEmpty()) { if (averageSuccessRateByDay.isEmpty()) {
return AjaxResult.success("暂无数据"); return AjaxResult.success("暂无数据");
} }
return AjaxResult.success(averageSuccessRateByDay); // Round average successRate to two decimal places
Map<Integer, Double> roundedAverageSuccessRateByDay = averageSuccessRateByDay.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> Math.round(entry.getValue() * 100.0) / 100.0));
return AjaxResult.success(roundedAverageSuccessRateByDay);
} }
//按类型划分设备 //按类型划分设备
@ -131,6 +129,92 @@ public class StatusController extends BaseController {
@GetMapping ("/type") @GetMapping ("/type")
public AjaxResult getTypeList() public AjaxResult getTypeList()
{ {
//DcDevice dcDevice = new DcDevice();
//dcDevice.setUseState(1);
//List<DcDevice> dcDeviceList = dcDeviceService.numberOfDevicesByType(dcDevice);
//HashMap<String, String> itemTypeMap = new HashMap<>();
//itemTypeMap.put("1-1", "高清网络枪型固定摄像机");
//itemTypeMap.put("1-2", "高清网络球形摄像机");
//itemTypeMap.put("1-3", "桥下高清网络球形摄像机");
//itemTypeMap.put("1-4", "360°全景摄像机");
//itemTypeMap.put("1-5", "180°全景摄像机");
//itemTypeMap.put("2-1", "门架式可变信息标志");
//itemTypeMap.put("2-3", "雨棚可变信息标志");
//itemTypeMap.put("2-4", "站前悬臂式可变信息标志");
//itemTypeMap.put("3", "气象检测器");
//itemTypeMap.put("5", "路段语音广播系统");
//itemTypeMap.put("6", "护栏碰撞预警系统");
//itemTypeMap.put("7", "毫米波雷达");
//itemTypeMap.put("8", "合流区预警系统");
//itemTypeMap.put("10", "激光疲劳唤醒");
//itemTypeMap.put("11", "一类交通量调查站");
//itemTypeMap.put("12", "智能行车诱导系统");
//itemTypeMap.put("13", "智能设备箱");
//LocalDateTime todayStart = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS);
//LocalDateTime currentTime = LocalDateTime.now();
//Status status = new Status();
//status.setStartTime(todayStart);
//status.setTime(currentTime);
//List<Status> listStatus = statusService.list(status);
////根据时间分组
//Map<Integer, List<Status>> map = listStatus.stream()
// .collect(Collectors.groupingBy(Status -> Status.getTime().getHour()));
//if(StringUtils.isEmpty(map)){
// return AjaxResult.success("暂无数据");
//}
//Map<Integer, List<Status>> ipMap = new TreeMap<>(map);
//Integer lastKey = Collections.max(ipMap.keySet());
//List<Status> lastEntry = ipMap.get(lastKey);
//Map<String, List<Status>> typeMap = lastEntry.stream().filter(iteam -> iteam.getType() != null).collect(Collectors.groupingBy(Status::getType));
//Map<String,Map<String,String>> subMap=new HashMap<>();
//Long sumUseState = 0L;
//for (Map.Entry<String, List<Status>> entrys : typeMap.entrySet()) {
// Map<String, String> maps=new HashMap<>();
// List<Status> groupItems = entrys.getValue();
// double lostRate = groupItems.stream()
// .mapToDouble(Status -> Double.parseDouble(Status.getLostRate().replace("%", ""))) // 去掉%,并转换为double
// .average().getAsDouble();
// double sucessRate = groupItems.stream()
// .mapToDouble(Status -> Double.parseDouble(Status.getSuccessRate().replace("%", ""))) // 去掉%,并转换为double
// .average().getAsDouble();
// String failRate=String.format("%.2f", (100-sucessRate))+"%";
// //丢包率
// maps.put("lostRate",String.format("%.2f", lostRate)+"%");
// //在线率
// maps.put("sucessRate",String.format("%.2f", sucessRate)+"%");
// //离线率
// maps.put("failRate",failRate);
// //已使用数量
// List<String> collect = dcDeviceList.stream().filter(item -> Objects.equals(item.getDeviceType(), entrys.getKey())).map(DcDevice::getSumAll).collect(Collectors.toList());
// String useStateNum = collect.size() > 0 ? String.valueOf(collect.get(0)) : "0";
// sumUseState += Long.valueOf(useStateNum);
// maps.put("sumUseState",useStateNum);
// //总数
// maps.put("sum",String.valueOf(groupItems.size()));
// if(itemTypeMap.get(entrys.getKey())!=null) {
// subMap.put(itemTypeMap.get(entrys.getKey()), maps);
// }
//}
//Map<String, String> maps=new HashMap<>();
//double lostRate = lastEntry.stream()
// .mapToDouble(Status -> Double.parseDouble(Status.getLostRate().replace("%", ""))) // 去掉%,并转换为double
// .average().getAsDouble();
//double sucessRate = lastEntry.stream()
// .mapToDouble(Status -> Double.parseDouble(Status.getSuccessRate().replace("%", ""))) // 去掉%,并转换为double
// .average().getAsDouble();
//String failRate=String.format("%.2f", (100-sucessRate))+"%";
////丢包率
//maps.put("lostRate",String.format("%.2f", lostRate)+"%");
////在线率
//maps.put("sucessRate",String.format("%.2f", sucessRate)+"%");
////离线率
//maps.put("failRate",failRate);
////已使用数量
//maps.put("sumUseState", String.valueOf(sumUseState));
////总数
//maps.put("sum",String.valueOf(lastEntry.size()));
//subMap.put("全部设备",maps);
List<DcDevice> dcDeviceList = dcDeviceService.numberOfDevicesByType(); List<DcDevice> dcDeviceList = dcDeviceService.numberOfDevicesByType();
HashMap<String, String> itemTypeMap = new HashMap<>(); HashMap<String, String> itemTypeMap = new HashMap<>();
itemTypeMap.put("1-1", "高清网络枪型固定摄像机"); itemTypeMap.put("1-1", "高清网络枪型固定摄像机");

9
zc-business/src/main/java/com/zc/business/domain/DcTrafficSectionData.java

@ -29,6 +29,11 @@ public class DcTrafficSectionData {
*/ */
private Integer trafficVolume; private Integer trafficVolume;
/**
* 大型车车流量
*/
private Integer largeTrafficVolume;
/** /**
* 平均速度 * 平均速度
*/ */
@ -142,10 +147,10 @@ public class DcTrafficSectionData {
} }
/** /**
* 根据设备ID上报时间方向时段类型桩号生成一个唯一ID * 根据设备ID统计时间方向时段类型桩号生成一个唯一ID
*/ */
public void generateUniqueId() { public void generateUniqueId() {
String combinedAttributes = deviceId + "_" + DateUtil.format(reportTime, "yyyyMMdd_HHmmss") + "_" + direction + "_" + periodType + "_" + stakeMark; String combinedAttributes = deviceId + "_" + DateUtil.format(statisticalDate, "yyyyMMdd_HHmmss") + "_" + direction + "_" + periodType + "_" + stakeMark;
this.id = DigestUtils.md5Hex(combinedAttributes); this.id = DigestUtils.md5Hex(combinedAttributes);
} }

2
zc-business/src/main/java/com/zc/business/enums/IotProductEnum.java

@ -22,7 +22,7 @@ public enum IotProductEnum {
// 设备箱 // 设备箱
EQUIPMENT_BOX("zc-shebeixiang-1883"), EQUIPMENT_BOX("zc-shebeixiang-1883"),
// 一站式情况调查产品 // 一类交通量调查产品
ONE_STOP_PRODUCT("zc-yzsqkdc-3131") ONE_STOP_PRODUCT("zc-yzsqkdc-3131")
; ;

2
zc-business/src/main/java/com/zc/business/enums/IotProductPropertiesEnum.java

@ -7,7 +7,7 @@ package com.zc.business.enums;
public enum IotProductPropertiesEnum { public enum IotProductPropertiesEnum {
/** /**
* 一站产品属性01 * 类交通量调查站产品属性01
*/ */
ONE_STOP_PRODUCT_01("01"), ONE_STOP_PRODUCT_01("01"),

1
zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java

@ -15,6 +15,7 @@ import java.util.List;
public interface DcDeviceMapper extends BaseMapper<DcDevice> { public interface DcDeviceMapper extends BaseMapper<DcDevice> {
List<DcDevice> selectDcDeviceList(DcDevice dcDevice); List<DcDevice> selectDcDeviceList(DcDevice dcDevice);
List<DcDevice> numberOfDevicesByType(DcDevice dcDevice);
List<DcDevice> numberOfDevicesByType(); List<DcDevice> numberOfDevicesByType();

1
zc-business/src/main/java/com/zc/business/mapper/StatusMapper.java

@ -17,5 +17,6 @@ public interface StatusMapper {
int Add(@Param("status")Status status); int Add(@Param("status")Status status);
List<Status> listStatus(@Param("status")Status status); List<Status> listStatus(@Param("status")Status status);
List<Status> deviceStatusListById(@Param("status")Status status);
} }

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

@ -330,7 +330,7 @@ public class DeviceMessageHandler {
} }
/** /**
* 站式情况调查站设备消息处理入口 * 类交通量调查站设备消息处理入口
* *
* @param msg 设备消息 * @param msg 设备消息
*/ */

2
zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java

@ -78,5 +78,7 @@ public interface IDcDeviceService extends IService<DcDevice> {
List<DcDevice> devicePileNumberQueryDevice(Map<String,Object> parameter); List<DcDevice> devicePileNumberQueryDevice(Map<String,Object> parameter);
List<DcDevice> numberOfDevicesByType(DcDevice dcDevice);
List<DcDevice> numberOfDevicesByType(); List<DcDevice> numberOfDevicesByType();
} }

5
zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java

@ -447,6 +447,11 @@ public class DcDeviceServiceImpl extends ServiceImpl<DcDeviceMapper, DcDevice> i
return dcDevices; return dcDevices;
} }
@Override
public List<DcDevice> numberOfDevicesByType(DcDevice dcDevice) {
return dcDeviceMapper.numberOfDevicesByType(dcDevice);
}
@Override @Override
public List<DcDevice> numberOfDevicesByType() { public List<DcDevice> numberOfDevicesByType() {
return dcDeviceMapper.numberOfDevicesByType(); return dcDeviceMapper.numberOfDevicesByType();

57
zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSectionDataServiceImpl.java

@ -116,7 +116,7 @@ public class DcTrafficSectionDataServiceImpl
// 检查获取的设备信息是否为空 // 检查获取的设备信息是否为空
if (oneStopDeviceMap == null || oneStopDeviceMap.get("data") == null) { if (oneStopDeviceMap == null || oneStopDeviceMap.get("data") == null) {
logger.error("获取一站设备数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); logger.error("获取一类交通量调查站设备数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value());
return; return;
} }
@ -144,7 +144,7 @@ public class DcTrafficSectionDataServiceImpl
// 检查设备ID的有效性 // 检查设备ID的有效性
if (deviceId == null || deviceId.isEmpty()) { if (deviceId == null || deviceId.isEmpty()) {
logger.error("获取一站设备id失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); logger.error("获取一类交通量调查站设备id失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value());
return; return;
} }
@ -203,7 +203,7 @@ public class DcTrafficSectionDataServiceImpl
private void processDeviceProperties(Map<String, Object> deviceProperties) { private void processDeviceProperties(Map<String, Object> deviceProperties) {
// 检查传入的设备属性映射是否为空,或者其中的"data"键对应的值是否为空 // 检查传入的设备属性映射是否为空,或者其中的"data"键对应的值是否为空
if (deviceProperties == null || deviceProperties.get("data") == null) { if (deviceProperties == null || deviceProperties.get("data") == null) {
logger.error("获取一站属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); logger.error("获取一类交通量调查站属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value());
return; return;
} }
@ -212,7 +212,7 @@ public class DcTrafficSectionDataServiceImpl
// 检查解析出的JSON对象是否包含"data"键 // 检查解析出的JSON对象是否包含"data"键
if (propertiesObject.get("data") == null) { if (propertiesObject.get("data") == null) {
logger.error("获取一站属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); logger.error("获取一类交通量调查站属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value());
return; return;
} }
@ -295,7 +295,7 @@ public class DcTrafficSectionDataServiceImpl
// 属性数据 // 属性数据
if (properties == null) { if (properties == null) {
logger.error("接收实时属性数据,属性数据不存在,请检查物联网一站设备数据是否正常"); logger.error("接收实时属性数据,属性数据不存在,请检查物联网一类交通量调查站设备数据是否正常");
return null; return null;
} }
@ -307,7 +307,7 @@ public class DcTrafficSectionDataServiceImpl
// 判断是否属性01的数据 // 判断是否属性01的数据
if (property == null) { if (property == null) {
logger.error("非属性01的数据,无法处理,请检查物联网一站设备数据是否正常"); logger.error("非属性01的数据,无法处理,请检查物联网一类交通量调查站设备数据是否正常");
return null; return null;
} }
@ -315,7 +315,7 @@ public class DcTrafficSectionDataServiceImpl
String iotDeviceId = msg.getString("deviceId"); String iotDeviceId = msg.getString("deviceId");
if (iotDeviceId == null || iotDeviceId.isEmpty()) { if (iotDeviceId == null || iotDeviceId.isEmpty()) {
logger.error("设备id为空,无法处理,请检查物联网平台一站设备数据是否正常"); logger.error("设备id为空,无法处理,请检查物联网平台一类交通量调查站设备数据是否正常");
return null; return null;
} }
@ -323,7 +323,7 @@ public class DcTrafficSectionDataServiceImpl
Long timestamp = msg.getLong("timestamp"); Long timestamp = msg.getLong("timestamp");
if (timestamp == null || timestamp == 0L) { if (timestamp == null || timestamp == 0L) {
logger.error("上报时间为空,无法处理,请检查物联网平台一站设备数据是否正常"); logger.error("上报时间为空,无法处理,请检查物联网平台一类交通量调查站设备数据是否正常");
return null; return null;
} }
@ -342,7 +342,7 @@ public class DcTrafficSectionDataServiceImpl
JSONArray lanes = property.getJSONArray("lanes"); JSONArray lanes = property.getJSONArray("lanes");
if (lanes == null || lanes.isEmpty()) { if (lanes == null || lanes.isEmpty()) {
logger.error("车道信息为空,无法处理,请检查物联网平台一站设备数据是否正常"); logger.error("车道信息为空,无法处理,请检查物联网平台一类交通量调查站设备数据是否正常");
return null; return null;
} }
@ -369,8 +369,11 @@ public class DcTrafficSectionDataServiceImpl
initializeTrafficSectionData(upwardData, dcDevice, reportTime, LaneDirection.UPWARD); initializeTrafficSectionData(upwardData, dcDevice, reportTime, LaneDirection.UPWARD);
initializeTrafficSectionData(downwardData, dcDevice, reportTime, LaneDirection.DOWNWARD); initializeTrafficSectionData(downwardData, dcDevice, reportTime, LaneDirection.DOWNWARD);
// 初始化上行和下行的车流量和累计平均速度 // 初始化上行和下行的车流量
int upwardTrafficVolume = 0, downwardTrafficVolume = 0; int upwardTrafficVolume = 0, downwardTrafficVolume = 0;
// 初始化上行和下行的累计大车流量
int upwardLargeTrafficVolume = 0, downwardLargeTrafficVolume = 0;
// 初始化上行和下行的累计平均速度
double upwardCumulativeAverageSpeed = 0.0, downwardCumulativeAverageSpeed = 0.0; double upwardCumulativeAverageSpeed = 0.0, downwardCumulativeAverageSpeed = 0.0;
// 遍历车道信息,计算上行和下行的车流量和累计平均速度 // 遍历车道信息,计算上行和下行的车流量和累计平均速度
@ -383,20 +386,23 @@ public class DcTrafficSectionDataServiceImpl
// 根据车道方向累加车流量和累计平均速度 // 根据车道方向累加车流量和累计平均速度
int totalTrafficFlow = laneData.getInteger("totalTrafficFlow"); int totalTrafficFlow = laneData.getInteger("totalTrafficFlow");
double cumulativeAverageSpeed = calculateCumulativeAverageSpeed(laneData); int cumulativeAverageSpeed = calculateCumulativeAverageSpeed(laneData);
int cumulativeLargeTrafficVolume = calculateCumulativeLargeTrafficVolume(laneData);
if (isDownward) { if (isDownward) {
downwardTrafficVolume += totalTrafficFlow; downwardTrafficVolume += totalTrafficFlow;
downwardCumulativeAverageSpeed += cumulativeAverageSpeed; downwardCumulativeAverageSpeed += cumulativeAverageSpeed;
downwardLargeTrafficVolume += cumulativeLargeTrafficVolume;
} else { } else {
upwardTrafficVolume += totalTrafficFlow; upwardTrafficVolume += totalTrafficFlow;
upwardCumulativeAverageSpeed += cumulativeAverageSpeed; upwardCumulativeAverageSpeed += cumulativeAverageSpeed;
upwardLargeTrafficVolume += cumulativeLargeTrafficVolume;
} }
} }
// 设置上行和下行的车流量和累计平均速度 // 设置上行和下行的车流量和累计平均速度
setUpTrafficSectionData(upwardData, upwardTrafficVolume, upwardCumulativeAverageSpeed); setTrafficSectionData(upwardData, upwardTrafficVolume, upwardCumulativeAverageSpeed, upwardLargeTrafficVolume);
setUpTrafficSectionData(downwardData, downwardTrafficVolume, downwardCumulativeAverageSpeed); setTrafficSectionData(downwardData, downwardTrafficVolume, downwardCumulativeAverageSpeed, downwardLargeTrafficVolume);
// 将上行和下行的交通段数据放入结果映射中 // 将上行和下行的交通段数据放入结果映射中
resultMap.put(LaneDirection.UPWARD, upwardData); resultMap.put(LaneDirection.UPWARD, upwardData);
@ -437,9 +443,11 @@ public class DcTrafficSectionDataServiceImpl
* @param data 交通路段数据对象用于存储交通路段的相关信息 * @param data 交通路段数据对象用于存储交通路段的相关信息
* @param trafficVolume 该路段的交通量单位通常为车辆数 * @param trafficVolume 该路段的交通量单位通常为车辆数
* @param cumulativeAverageSpeed 该路段的累积平均速度单位通常为千米/小时 * @param cumulativeAverageSpeed 该路段的累积平均速度单位通常为千米/小时
* @param largeTrafficVolume 大型车交通量
*/ */
private void setUpTrafficSectionData(DcTrafficSectionData data, int trafficVolume, double cumulativeAverageSpeed) { private void setTrafficSectionData(DcTrafficSectionData data, int trafficVolume, double cumulativeAverageSpeed, int largeTrafficVolume) {
data.setTrafficVolume(trafficVolume); // 设置交通量 data.setTrafficVolume(trafficVolume); // 设置交通量
data.setLargeTrafficVolume(largeTrafficVolume); // 设置大车流量
data.setAverageSpeed(0); data.setAverageSpeed(0);
if (trafficVolume != 0) { // 当交通量不为0时,计算并设置平均速度 if (trafficVolume != 0) { // 当交通量不为0时,计算并设置平均速度
data.setAverageSpeed((int) Math.round(cumulativeAverageSpeed / trafficVolume)); // 平均速度 = 累积平均速度 / 交通量 data.setAverageSpeed((int) Math.round(cumulativeAverageSpeed / trafficVolume)); // 平均速度 = 累积平均速度 / 交通量
@ -475,6 +483,27 @@ public class DcTrafficSectionDataServiceImpl
laneData.getInteger("motorcycleTrafficVolume") * laneData.getInteger("averageSpeedOfMotorcycle"); laneData.getInteger("motorcycleTrafficVolume") * laneData.getInteger("averageSpeedOfMotorcycle");
} }
/**
* 计算累积大型交通流量
* 该方法用于根据给定的车道数据计算出特定类型的车辆包括公共汽车中型货车大型货车特大型货车和集装箱车的交通量总和
*
* @param laneData 包含车道交通量数据的JSONObject对象该对象应包含以下键
* - "busTrafficVolume"公共汽车交通量
* - "mediumTruckTrafficVolume"中型货车交通量
* - "largeTruckTrafficVolume"大型货车交通量
* - "extraLargeTrucksTrafficVolume"特大型货车交通量
* - "containerTruckTrafficVolume"集装箱车交通量
* @return 返回各种类型大型车辆交通量的总和类型为int
*/
private int calculateCumulativeLargeTrafficVolume(JSONObject laneData) {
// 计算各种类型大型车辆的交通量总和
return laneData.getInteger("busTrafficVolume") +
laneData.getInteger("mediumTruckTrafficVolume") +
laneData.getInteger("largeTruckTrafficVolume") +
laneData.getInteger("extraLargeTrucksTrafficVolume") +
laneData.getInteger("containerTruckTrafficVolume");
}
/** /**
* 将缓存中的数据统计后保存至数据库 * 将缓存中的数据统计后保存至数据库
*/ */

3
zc-business/src/main/java/com/zc/business/service/impl/StatusService.java

@ -30,4 +30,7 @@ public class StatusService {
return list; return list;
} }
public List<Status> deviceStatusListById(Status status) {
return statusMapper.deviceStatusListById(status);
}
} }

9
zc-business/src/main/java/com/zc/business/statistics/handler/RealtimeTrafficStatistics.java

@ -26,14 +26,19 @@ public class RealtimeTrafficStatistics {
// 创建一个汇总统计用的对象 // 创建一个汇总统计用的对象
DcTrafficSectionData aggregatedData = new DcTrafficSectionData(); DcTrafficSectionData aggregatedData = new DcTrafficSectionData();
// 初始化车流量总和和计算平均车速所需的分子部分 // 初始化车流量总和
int trafficVolume = 0; int trafficVolume = 0;
// 初始化最大车流量
int largeTrafficVolume = 0;
// 初始化计算平均车速所需的分子部分
double numerator = 0; double numerator = 0;
// 遍历原始数据列表,累加车流量并计算平均车速 // 遍历原始数据列表,累加车流量并计算平均车速
for (DcTrafficSectionData data: dataCollection) { for (DcTrafficSectionData data: dataCollection) {
// 累加车流量 // 累加车流量
trafficVolume += data.getTrafficVolume(); trafficVolume += data.getTrafficVolume();
// 累加最大车流量
largeTrafficVolume += data.getLargeTrafficVolume();
// 计算分子部分 // 计算分子部分
numerator += data.getAverageSpeed() * data.getTrafficVolume(); numerator += data.getAverageSpeed() * data.getTrafficVolume();
} }
@ -62,6 +67,8 @@ public class RealtimeTrafficStatistics {
aggregatedData.setStatisticalDate(firstDcTrafficSectionData.getStatisticalDate(), trafficDataPeriodType); aggregatedData.setStatisticalDate(firstDcTrafficSectionData.getStatisticalDate(), trafficDataPeriodType);
// 车流量 // 车流量
aggregatedData.setTrafficVolume(trafficVolume); aggregatedData.setTrafficVolume(trafficVolume);
// 大型车车流量
aggregatedData.setLargeTrafficVolume(largeTrafficVolume);
// 更新或插入操作 // 更新或插入操作
aggregatedData.setUpdateTime(DateUtils.getNowDate()); aggregatedData.setUpdateTime(DateUtils.getNowDate());
// 生成主键 // 生成主键

5
zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml

@ -110,6 +110,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="numberOfDevicesByType" parameterType="dcDevice" resultMap="DcDevice"> <select id="numberOfDevicesByType" parameterType="dcDevice" resultMap="DcDevice">
SELECT COALESCE(child_type, device_type) AS device_type, COUNT(*) AS sumAll SELECT COALESCE(child_type, device_type) AS device_type, COUNT(*) AS sumAll
FROM dc_device FROM dc_device
<where>
<if test="useState!=null">
use_state = #{useState}
</if>
</where>
GROUP BY device_type, child_type; GROUP BY device_type, child_type;
</select> </select>

3
zc-business/src/main/resources/mapper/business/DcTrafficSectionDataMapper.xml

@ -11,6 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
( (
id, id,
traffic_volume, traffic_volume,
large_traffic_volume,
average_speed, average_speed,
device_id, device_id,
statistical_date, statistical_date,
@ -23,6 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
( (
#{id}, #{id},
#{trafficVolume}, #{trafficVolume},
#{largeTrafficVolume},
#{averageSpeed}, #{averageSpeed},
#{deviceId}, #{deviceId},
#{statisticalDate}, #{statisticalDate},
@ -32,6 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
NOW()) NOW())
ON DUPLICATE KEY UPDATE ON DUPLICATE KEY UPDATE
traffic_volume = VALUES(traffic_volume), traffic_volume = VALUES(traffic_volume),
large_traffic_volume = VALUES(large_traffic_volume),
average_speed = VALUES(average_speed), average_speed = VALUES(average_speed),
device_id = VALUES(device_id), device_id = VALUES(device_id),
statistical_date = VALUES(statistical_date), statistical_date = VALUES(statistical_date),

13
zc-business/src/main/resources/mapper/business/StatusMapper.xml

@ -109,4 +109,17 @@
</where> </where>
</select> </select>
<select id="deviceStatusListById" parameterType="com.zc.business.domain.Status" resultMap="BaseResultMap">
select s.id,s.time,s.success_rate,s.lost_rate
from status s
<where>
<if test="status.time != null">
AND s.time BETWEEN #{status.startTime,jdbcType=DATE} AND #{status.time,jdbcType=DATE}
</if>
<if test="status.deviceId != null">
AND s.device_id = #{status.deviceId}
</if>
</where>
</select>
</mapper> </mapper>

Loading…
Cancel
Save