diff --git a/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java b/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java index e307a436..2c2b54c2 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java +++ b/zc-business/src/main/java/com/zc/business/controller/DeviceStatus.java @@ -49,7 +49,6 @@ public class DeviceStatus { StatusService statusService= SpringUtils.getBean(StatusService.class); ExecutorService executor = Executors.newFixedThreadPool(100); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(DcDevice::getUseState,1); List deviceList = deviceService.list(lambdaQueryWrapper); List> futures = new ArrayList<>(); diff --git a/zc-business/src/main/java/com/zc/business/controller/StatusController.java b/zc-business/src/main/java/com/zc/business/controller/StatusController.java index ba211c23..4d2c6c49 100644 --- a/zc-business/src/main/java/com/zc/business/controller/StatusController.java +++ b/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.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.time.LocalDateTime; @@ -99,9 +96,8 @@ public class StatusController extends BaseController { @ApiOperation("根据设备Id查询折线图数据") - @GetMapping("/deviceStatusList") - public AjaxResult getDeviceStatusList(Long deviceId) { - + @GetMapping("/deviceStatusList/{deviceId}") + public AjaxResult getDeviceStatusList(@PathVariable Long deviceId) { LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30); LocalDateTime currentTime = LocalDateTime.now(); @@ -110,20 +106,22 @@ public class StatusController extends BaseController { status.setTime(currentTime); status.setDeviceId(deviceId); - List listStatus = statusService.list(status); + List listStatus = statusService.deviceStatusListById(status); - // Group by day and calculate average successRate with two decimal places - Map averageSuccessRateByDay = listStatus.stream() + // Calculate average successRate by day + Map averageSuccessRateByDay = listStatus.stream() .collect(Collectors.groupingBy(s -> s.getTime().getDayOfMonth(), - Collectors.collectingAndThen( - Collectors.averagingDouble(s -> Double.parseDouble(s.getSuccessRate().replace("%", ""))), - avg -> Math.round(Float.parseFloat(String.format("%.2f", avg))) - ))); + Collectors.averagingDouble(s -> Double.parseDouble(s.getSuccessRate().replace("%", ""))))); + if (averageSuccessRateByDay.isEmpty()) { return AjaxResult.success("暂无数据"); } - return AjaxResult.success(averageSuccessRateByDay); + // Round average successRate to two decimal places + Map 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") public AjaxResult getTypeList() { + //DcDevice dcDevice = new DcDevice(); + //dcDevice.setUseState(1); + //List dcDeviceList = dcDeviceService.numberOfDevicesByType(dcDevice); + //HashMap 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 listStatus = statusService.list(status); + ////根据时间分组 + //Map> map = listStatus.stream() + // .collect(Collectors.groupingBy(Status -> Status.getTime().getHour())); + //if(StringUtils.isEmpty(map)){ + // return AjaxResult.success("暂无数据"); + //} + //Map> ipMap = new TreeMap<>(map); + //Integer lastKey = Collections.max(ipMap.keySet()); + //List lastEntry = ipMap.get(lastKey); + //Map> typeMap = lastEntry.stream().filter(iteam -> iteam.getType() != null).collect(Collectors.groupingBy(Status::getType)); + //Map> subMap=new HashMap<>(); + //Long sumUseState = 0L; + //for (Map.Entry> entrys : typeMap.entrySet()) { + // Map maps=new HashMap<>(); + // List 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 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 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 dcDeviceList = dcDeviceService.numberOfDevicesByType(); HashMap itemTypeMap = new HashMap<>(); itemTypeMap.put("1-1", "高清网络枪型固定摄像机"); diff --git a/zc-business/src/main/java/com/zc/business/domain/DcTrafficSectionData.java b/zc-business/src/main/java/com/zc/business/domain/DcTrafficSectionData.java index 00c5efe9..3444312b 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcTrafficSectionData.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcTrafficSectionData.java @@ -29,6 +29,11 @@ public class DcTrafficSectionData { */ private Integer trafficVolume; + /** + * 大型车车流量 + */ + private Integer largeTrafficVolume; + /** * 平均速度 */ @@ -142,10 +147,10 @@ public class DcTrafficSectionData { } /** - * 根据设备ID、上报时间、方向、时段类型、桩号生成一个唯一ID + * 根据设备ID、统计时间、方向、时段类型、桩号生成一个唯一ID */ 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); } diff --git a/zc-business/src/main/java/com/zc/business/enums/IotProductEnum.java b/zc-business/src/main/java/com/zc/business/enums/IotProductEnum.java index 2499377b..5e449a50 100644 --- a/zc-business/src/main/java/com/zc/business/enums/IotProductEnum.java +++ b/zc-business/src/main/java/com/zc/business/enums/IotProductEnum.java @@ -22,7 +22,7 @@ public enum IotProductEnum { // 设备箱 EQUIPMENT_BOX("zc-shebeixiang-1883"), - // 一站式情况调查产品 + // 一类交通量调查产品 ONE_STOP_PRODUCT("zc-yzsqkdc-3131") ; diff --git a/zc-business/src/main/java/com/zc/business/enums/IotProductPropertiesEnum.java b/zc-business/src/main/java/com/zc/business/enums/IotProductPropertiesEnum.java index 73658394..27c7b214 100644 --- a/zc-business/src/main/java/com/zc/business/enums/IotProductPropertiesEnum.java +++ b/zc-business/src/main/java/com/zc/business/enums/IotProductPropertiesEnum.java @@ -7,7 +7,7 @@ package com.zc.business.enums; public enum IotProductPropertiesEnum { /** - * 一站式产品属性01 + * 一类交通量调查站产品属性01 */ ONE_STOP_PRODUCT_01("01"), diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java index 1318201f..13576c48 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java @@ -15,6 +15,7 @@ import java.util.List; public interface DcDeviceMapper extends BaseMapper { List selectDcDeviceList(DcDevice dcDevice); + List numberOfDevicesByType(DcDevice dcDevice); List numberOfDevicesByType(); diff --git a/zc-business/src/main/java/com/zc/business/mapper/StatusMapper.java b/zc-business/src/main/java/com/zc/business/mapper/StatusMapper.java index 1980b0c8..9626befa 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/StatusMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/StatusMapper.java @@ -17,5 +17,6 @@ public interface StatusMapper { int Add(@Param("status")Status status); List listStatus(@Param("status")Status status); + List deviceStatusListById(@Param("status")Status status); } diff --git a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java index 82021398..6015f22b 100644 --- a/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java +++ b/zc-business/src/main/java/com/zc/business/message/device/handler/DeviceMessageHandler.java @@ -330,7 +330,7 @@ public class DeviceMessageHandler { } /** - * 一站式情况调查站设备消息处理入口 + * 一类交通量调查站设备消息处理入口 * * @param msg 设备消息 */ diff --git a/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java b/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java index 5e401f43..5144990d 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java @@ -78,5 +78,7 @@ public interface IDcDeviceService extends IService { List devicePileNumberQueryDevice(Map parameter); + List numberOfDevicesByType(DcDevice dcDevice); + List numberOfDevicesByType(); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java index 0fb6b647..77460775 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java @@ -447,6 +447,11 @@ public class DcDeviceServiceImpl extends ServiceImpl i return dcDevices; } + @Override + public List numberOfDevicesByType(DcDevice dcDevice) { + return dcDeviceMapper.numberOfDevicesByType(dcDevice); + } + @Override public List numberOfDevicesByType() { return dcDeviceMapper.numberOfDevicesByType(); diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSectionDataServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSectionDataServiceImpl.java index a6791a4d..57b703a3 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSectionDataServiceImpl.java +++ b/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) { - logger.error("获取一站式设备数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); + logger.error("获取一类交通量调查站设备数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); return; } @@ -144,7 +144,7 @@ public class DcTrafficSectionDataServiceImpl // 检查设备ID的有效性 if (deviceId == null || deviceId.isEmpty()) { - logger.error("获取一站式设备id失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); + logger.error("获取一类交通量调查站设备id失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); return; } @@ -203,7 +203,7 @@ public class DcTrafficSectionDataServiceImpl private void processDeviceProperties(Map deviceProperties) { // 检查传入的设备属性映射是否为空,或者其中的"data"键对应的值是否为空 if (deviceProperties == null || deviceProperties.get("data") == null) { - logger.error("获取一站式属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); + logger.error("获取一类交通量调查站属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); return; } @@ -212,7 +212,7 @@ public class DcTrafficSectionDataServiceImpl // 检查解析出的JSON对象是否包含"data"键 if (propertiesObject.get("data") == null) { - logger.error("获取一站式属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); + logger.error("获取一类交通量调查站属性数据失败,产品id:{}", IotProductEnum.ONE_STOP_PRODUCT.value()); return; } @@ -295,7 +295,7 @@ public class DcTrafficSectionDataServiceImpl // 属性数据 if (properties == null) { - logger.error("接收实时属性数据,属性数据不存在,请检查物联网一站式设备数据是否正常"); + logger.error("接收实时属性数据,属性数据不存在,请检查物联网一类交通量调查站设备数据是否正常"); return null; } @@ -307,7 +307,7 @@ public class DcTrafficSectionDataServiceImpl // 判断是否属性01的数据 if (property == null) { - logger.error("非属性01的数据,无法处理,请检查物联网一站式设备数据是否正常"); + logger.error("非属性01的数据,无法处理,请检查物联网一类交通量调查站设备数据是否正常"); return null; } @@ -315,7 +315,7 @@ public class DcTrafficSectionDataServiceImpl String iotDeviceId = msg.getString("deviceId"); if (iotDeviceId == null || iotDeviceId.isEmpty()) { - logger.error("设备id为空,无法处理,请检查物联网平台一站式设备数据是否正常"); + logger.error("设备id为空,无法处理,请检查物联网平台一类交通量调查站设备数据是否正常"); return null; } @@ -323,7 +323,7 @@ public class DcTrafficSectionDataServiceImpl Long timestamp = msg.getLong("timestamp"); if (timestamp == null || timestamp == 0L) { - logger.error("上报时间为空,无法处理,请检查物联网平台一站式设备数据是否正常"); + logger.error("上报时间为空,无法处理,请检查物联网平台一类交通量调查站设备数据是否正常"); return null; } @@ -342,7 +342,7 @@ public class DcTrafficSectionDataServiceImpl JSONArray lanes = property.getJSONArray("lanes"); if (lanes == null || lanes.isEmpty()) { - logger.error("车道信息为空,无法处理,请检查物联网平台一站式设备数据是否正常"); + logger.error("车道信息为空,无法处理,请检查物联网平台一类交通量调查站设备数据是否正常"); return null; } @@ -369,8 +369,11 @@ public class DcTrafficSectionDataServiceImpl initializeTrafficSectionData(upwardData, dcDevice, reportTime, LaneDirection.UPWARD); initializeTrafficSectionData(downwardData, dcDevice, reportTime, LaneDirection.DOWNWARD); - // 初始化上行和下行的车流量和累计平均速度 + // 初始化上行和下行的车流量 int upwardTrafficVolume = 0, downwardTrafficVolume = 0; + // 初始化上行和下行的累计大车流量 + int upwardLargeTrafficVolume = 0, downwardLargeTrafficVolume = 0; + // 初始化上行和下行的累计平均速度 double upwardCumulativeAverageSpeed = 0.0, downwardCumulativeAverageSpeed = 0.0; // 遍历车道信息,计算上行和下行的车流量和累计平均速度 @@ -383,20 +386,23 @@ public class DcTrafficSectionDataServiceImpl // 根据车道方向累加车流量和累计平均速度 int totalTrafficFlow = laneData.getInteger("totalTrafficFlow"); - double cumulativeAverageSpeed = calculateCumulativeAverageSpeed(laneData); + int cumulativeAverageSpeed = calculateCumulativeAverageSpeed(laneData); + int cumulativeLargeTrafficVolume = calculateCumulativeLargeTrafficVolume(laneData); if (isDownward) { downwardTrafficVolume += totalTrafficFlow; downwardCumulativeAverageSpeed += cumulativeAverageSpeed; + downwardLargeTrafficVolume += cumulativeLargeTrafficVolume; } else { upwardTrafficVolume += totalTrafficFlow; upwardCumulativeAverageSpeed += cumulativeAverageSpeed; + upwardLargeTrafficVolume += cumulativeLargeTrafficVolume; } } // 设置上行和下行的车流量和累计平均速度 - setUpTrafficSectionData(upwardData, upwardTrafficVolume, upwardCumulativeAverageSpeed); - setUpTrafficSectionData(downwardData, downwardTrafficVolume, downwardCumulativeAverageSpeed); + setTrafficSectionData(upwardData, upwardTrafficVolume, upwardCumulativeAverageSpeed, upwardLargeTrafficVolume); + setTrafficSectionData(downwardData, downwardTrafficVolume, downwardCumulativeAverageSpeed, downwardLargeTrafficVolume); // 将上行和下行的交通段数据放入结果映射中 resultMap.put(LaneDirection.UPWARD, upwardData); @@ -437,9 +443,11 @@ public class DcTrafficSectionDataServiceImpl * @param data 交通路段数据对象,用于存储交通路段的相关信息。 * @param trafficVolume 该路段的交通量,单位通常为车辆数。 * @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.setLargeTrafficVolume(largeTrafficVolume); // 设置大车流量 data.setAverageSpeed(0); if (trafficVolume != 0) { // 当交通量不为0时,计算并设置平均速度 data.setAverageSpeed((int) Math.round(cumulativeAverageSpeed / trafficVolume)); // 平均速度 = 累积平均速度 / 交通量 @@ -475,6 +483,27 @@ public class DcTrafficSectionDataServiceImpl 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"); + } + /** * 将缓存中的数据统计后保存至数据库。 */ diff --git a/zc-business/src/main/java/com/zc/business/service/impl/StatusService.java b/zc-business/src/main/java/com/zc/business/service/impl/StatusService.java index f1e4ef64..93c42b31 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/StatusService.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/StatusService.java @@ -30,4 +30,7 @@ public class StatusService { return list; } + public List deviceStatusListById(Status status) { + return statusMapper.deviceStatusListById(status); + } } diff --git a/zc-business/src/main/java/com/zc/business/statistics/handler/RealtimeTrafficStatistics.java b/zc-business/src/main/java/com/zc/business/statistics/handler/RealtimeTrafficStatistics.java index e122cc0e..802e709e 100644 --- a/zc-business/src/main/java/com/zc/business/statistics/handler/RealtimeTrafficStatistics.java +++ b/zc-business/src/main/java/com/zc/business/statistics/handler/RealtimeTrafficStatistics.java @@ -26,14 +26,19 @@ public class RealtimeTrafficStatistics { // 创建一个汇总统计用的对象 DcTrafficSectionData aggregatedData = new DcTrafficSectionData(); - // 初始化车流量总和和计算平均车速所需的分子部分 + // 初始化车流量总和 int trafficVolume = 0; + // 初始化最大车流量 + int largeTrafficVolume = 0; + // 初始化计算平均车速所需的分子部分 double numerator = 0; // 遍历原始数据列表,累加车流量并计算平均车速 for (DcTrafficSectionData data: dataCollection) { // 累加车流量 trafficVolume += data.getTrafficVolume(); + // 累加最大车流量 + largeTrafficVolume += data.getLargeTrafficVolume(); // 计算分子部分 numerator += data.getAverageSpeed() * data.getTrafficVolume(); } @@ -62,6 +67,8 @@ public class RealtimeTrafficStatistics { aggregatedData.setStatisticalDate(firstDcTrafficSectionData.getStatisticalDate(), trafficDataPeriodType); // 车流量 aggregatedData.setTrafficVolume(trafficVolume); + // 大型车车流量 + aggregatedData.setLargeTrafficVolume(largeTrafficVolume); // 更新或插入操作 aggregatedData.setUpdateTime(DateUtils.getNowDate()); // 生成主键 diff --git a/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml b/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml index 7c2e06e7..cd5f9e41 100644 --- a/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml @@ -110,6 +110,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" diff --git a/zc-business/src/main/resources/mapper/business/DcTrafficSectionDataMapper.xml b/zc-business/src/main/resources/mapper/business/DcTrafficSectionDataMapper.xml index 1fe5c30f..f52c76d1 100644 --- a/zc-business/src/main/resources/mapper/business/DcTrafficSectionDataMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcTrafficSectionDataMapper.xml @@ -11,6 +11,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ( id, traffic_volume, + large_traffic_volume, average_speed, device_id, statistical_date, @@ -23,6 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ( #{id}, #{trafficVolume}, + #{largeTrafficVolume}, #{averageSpeed}, #{deviceId}, #{statisticalDate}, @@ -32,6 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" NOW()) ON DUPLICATE KEY UPDATE traffic_volume = VALUES(traffic_volume), + large_traffic_volume = VALUES(large_traffic_volume), average_speed = VALUES(average_speed), device_id = VALUES(device_id), statistical_date = VALUES(statistical_date), diff --git a/zc-business/src/main/resources/mapper/business/StatusMapper.xml b/zc-business/src/main/resources/mapper/business/StatusMapper.xml index 2f303a32..cc5d9b16 100644 --- a/zc-business/src/main/resources/mapper/business/StatusMapper.xml +++ b/zc-business/src/main/resources/mapper/business/StatusMapper.xml @@ -109,4 +109,17 @@ + +