From 009fa7aaca253b7b489794234776a502490b51da Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Wed, 6 Aug 2025 10:07:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=80=E7=B1=BB=E4=BA=A4=E8=B0=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BA=A0=E6=AD=A3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcTrafficSurveyDataController.java | 187 ++++++++++- .../business/domain/DcTrafficSurveyData.java | 12 + .../business/domain/HikTrafficSurveyData.java | 306 ++++++++++++++++++ .../mapper/DcTrafficSurveyDataMapper.java | 3 + .../service/IDcTrafficSurveyDataService.java | 19 ++ .../impl/DcTrafficSurveyDataServiceImpl.java | 203 ++++++++++++ .../business/DcTrafficSurveyDataMapper.xml | 146 +++++---- 7 files changed, 814 insertions(+), 62 deletions(-) create mode 100644 zc-business/src/main/java/com/zc/business/domain/HikTrafficSurveyData.java diff --git a/zc-business/src/main/java/com/zc/business/controller/DcTrafficSurveyDataController.java b/zc-business/src/main/java/com/zc/business/controller/DcTrafficSurveyDataController.java index 24aaff80..410371a0 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcTrafficSurveyDataController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcTrafficSurveyDataController.java @@ -9,10 +9,14 @@ import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.util.StringUtil; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.system.domain.SysLogininfor; import com.zc.business.constant.RedisKeyConstants; @@ -42,6 +46,7 @@ import com.ruoyi.common.enums.BusinessType; import com.zc.business.service.IDcTrafficSurveyDataService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 一类交调数据Controller @@ -193,7 +198,9 @@ public class DcTrafficSurveyDataController extends BaseController } - dcTrafficSurveyDataService.batchInsert(batchData); + if (batchData.size() > 0) { + dcTrafficSurveyDataService.batchInsert(batchData); + } } @@ -322,7 +329,9 @@ public class DcTrafficSurveyDataController extends BaseController batchData.add(hezeData); batchData.add(jinanData); } - dcTrafficSurveyDataService.batchInsert(batchData); + if (batchData.size() > 0) { + dcTrafficSurveyDataService.batchInsert(batchData); + } } @@ -543,4 +552,178 @@ public class DcTrafficSurveyDataController extends BaseController return dcTrafficSurveyDataService.selectRealTimeData(dcTrafficSurveyDataQueryParams); } + @GetMapping("/insertTrafficSectionData") + public AjaxResult insertTrafficSectionData(DcTrafficSurveyData dcTrafficSurveyData) throws HttpException, IOException, ParseException { + if (StringUtil.isEmpty(dcTrafficSurveyData.getIotDeviceId()) || dcTrafficSurveyData.getStartTime() == null || dcTrafficSurveyData.getEndTime() == null){ + return AjaxResult.error("参数错误"); + } + + DcDevice dcDevice = dcTrafficSurveyDataService.selectDeviceByIotId(dcTrafficSurveyData.getIotDeviceId()); + if (dcDevice == null){ + return AjaxResult.error("未查询到一类交调站设备,请检查物联ID"); + } + String propertyId = "01"; //功能码 + + // 单位:天,步长:1小时 + DateField unit = DateField.HOUR_OF_DAY; + // 获取日期列表 + List dateRangeList = DateUtil.rangeToList(dcTrafficSurveyData.getStartTime(), dcTrafficSurveyData.getEndTime(), unit, 1); + HashMap props = new HashMap<>(); + // 将日期列表以逗号分隔并设置为查询条件的值 + props.put("paging", false); + props.put("sorts[0].order", "asc"); + props.put("sorts[0].name", "timestamp"); + List batchData = new ArrayList<>(); + for (DateTime dateTime : dateRangeList) { + DateTime hourStart = DateUtil.beginOfHour(dateTime); + DateTime hourEnd = DateUtil.endOfHour(dateTime); + + // 设置查询条件的键为“timestamp$BTW”,表示时间戳在一定范围内 + props.put("terms[0].column", "timestamp$BTW"); + ArrayList dateList = new ArrayList<>(); + // 将上一个小时的开始和结束时间添加到列表 + String startTime = DateUtil.format(hourStart, "yyyy-MM-dd HH:mm:ss"); + String endTime = DateUtil.format(hourEnd, "yyyy-MM-dd HH:mm:ss"); + dateList.add(startTime); + dateList.add(endTime); + props.put("terms[0].value", String.join(UniversalEnum.COMMA.getValue(), dateList)); + + Object data = null; + AjaxResult ajaxResult = dcDeviceController.queryDeviceProperties(dcDevice.getIotDeviceId(), propertyId, props); + try { + if (ajaxResult.get("code").equals(UniversalEnum.TWO_HUNDRED.getNumber()) && ajaxResult.containsKey("data") && ajaxResult.get("data") != null) { + data = JSON.parseObject(ajaxResult.get("data").toString()).get("data"); + } else { + continue; + } + } catch (Exception e){ + e.printStackTrace(); + continue; + } + + JSONArray dataArray = JSON.parseArray(data.toString()); + if (dataArray == null || dataArray.size() < 1){ + continue; + } + Integer hezeTotal = 0; + Integer jinanTotal = 0; + //一小时内所有的车道数据 + JSONArray lanesData = new JSONArray(); + for (Object o : dataArray) { + JSONObject jsonObject = JSON.parseObject(o.toString()); + JSONObject formatValue = JSON.parseObject(jsonObject.get("formatValue").toString()); + hezeTotal += Integer.parseInt(formatValue.get("1").toString()); + jinanTotal += Integer.parseInt(formatValue.get("3").toString()); + + //车道数据 + JSONArray lanes = formatValue.getJSONArray("lanes"); + lanesData.addAll(lanes); + } + + // 转换类型 以便使用stream + List lanesList = lanesData.toJavaList(JSONObject.class); + Map dataList = lanesList.stream() + .collect(Collectors.groupingBy( + item -> item.getString("laneNumber").substring(0, 1), // 提取 laneNumber 的第一个字符作为 key + Collectors.mapping(item -> item, + Collectors.collectingAndThen( + Collectors.toList(), + list -> { // 然后将 List 转换为 JSONArray + JSONArray jsonArray = new JSONArray(); + jsonArray.addAll(list); + return jsonArray; + } + ) + ) + )); + + //菏泽方向数据 + DcTrafficSurveyData hezeData = new DcTrafficSurveyData(); + hezeData.setIotDeviceId(dcDevice.getIotDeviceId()); + hezeData.setStakeMark(dcDevice.getStakeMark()); + hezeData.setDirection("1"); + hezeData.setTimestamp(hourStart); + hezeData.setTrafficVolume(Long.valueOf(hezeTotal)); + //济南方向数据 + DcTrafficSurveyData jinanData = new DcTrafficSurveyData(); + jinanData.setIotDeviceId(dcDevice.getIotDeviceId()); + jinanData.setStakeMark(dcDevice.getStakeMark()); + jinanData.setDirection("3"); + jinanData.setTimestamp(hourStart); + jinanData.setTrafficVolume(Long.valueOf(jinanTotal)); + //各方向车道级数据 + if (dataList != null && dataList.size() > 0){ + JSONArray hezeLanesData = dataList.get("1"); + dcTrafficSurveyDataService.formatTrafficSurveyData(hezeData,hezeLanesData); + JSONArray jinanLanesData = dataList.get("3"); + dcTrafficSurveyDataService.formatTrafficSurveyData(jinanData,jinanLanesData); + } + + batchData.add(hezeData); + batchData.add(jinanData); + } + if (batchData.size() > 0) { + dcTrafficSurveyDataService.batchInsert(batchData); + } else { + return AjaxResult.error("未查询到数据"); + } + + return AjaxResult.success("操作成功"); + } + + @PostMapping("/importTrafficSectionData") + public AjaxResult importTrafficSectionData(MultipartFile file, String iotDeviceId) throws Exception + { + if (!StringUtils.hasText(iotDeviceId)){ + return AjaxResult.error("物联ID不能为空"); + } + DcDevice dcDevice = dcTrafficSurveyDataService.selectDeviceByIotId(iotDeviceId); + if (dcDevice == null){ + return AjaxResult.error("未查询到一类交调站设备,请检查物联ID"); + } + + ExcelUtil util = new ExcelUtil(HikTrafficSurveyData.class); + List trafficSectionDataList = util.importExcel(file.getInputStream()); + + if (trafficSectionDataList.size() > 0){ + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH"); + Map>> group = trafficSectionDataList.stream().collect( + Collectors.groupingBy(item -> df.format(item.getStartTime()), + Collectors.groupingBy(HikTrafficSurveyData::getDirection))); + + List batchData = new ArrayList<>(); + + for (String hourStr : group.keySet()) { + Date parse = df.parse(hourStr); + Map> hourDataMap = group.get(hourStr); + if (hourDataMap.containsKey("上行")) { + //菏泽方向数据 + DcTrafficSurveyData hezeData = new DcTrafficSurveyData(); + hezeData.setIotDeviceId(iotDeviceId); + hezeData.setStakeMark(dcDevice.getStakeMark()); + hezeData.setDirection("1"); + hezeData.setTimestamp(parse); + dcTrafficSurveyDataService.formatTrafficSurveyData(hezeData,hourDataMap.get("上行")); + batchData.add(hezeData); + + } + if (hourDataMap.containsKey("下行")) { + //济南方向数据 + DcTrafficSurveyData jinanData = new DcTrafficSurveyData(); + jinanData.setIotDeviceId(iotDeviceId); + jinanData.setStakeMark(dcDevice.getStakeMark()); + jinanData.setDirection("3"); + jinanData.setTimestamp(parse); + dcTrafficSurveyDataService.formatTrafficSurveyData(jinanData,hourDataMap.get("下行")); + batchData.add(jinanData); + } + } + + if (batchData.size() > 0){ + dcTrafficSurveyDataService.batchInsert(batchData); +// System.out.println(batchData); + } + } + return AjaxResult.success(); + } } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcTrafficSurveyData.java b/zc-business/src/main/java/com/zc/business/domain/DcTrafficSurveyData.java index 22c08747..5728f93a 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcTrafficSurveyData.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcTrafficSurveyData.java @@ -37,6 +37,10 @@ public class DcTrafficSurveyData extends BaseEntity @Excel(name = "采集时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date timestamp; + /** 范围查询-开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** 范围查询-结束时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endTime; @@ -370,6 +374,14 @@ public class DcTrafficSurveyData extends BaseEntity this.avgSpeed = avgSpeed; } + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + public Date getEndTime() { return endTime; } diff --git a/zc-business/src/main/java/com/zc/business/domain/HikTrafficSurveyData.java b/zc-business/src/main/java/com/zc/business/domain/HikTrafficSurveyData.java new file mode 100644 index 00000000..9f632d00 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/domain/HikTrafficSurveyData.java @@ -0,0 +1,306 @@ +package com.zc.business.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +import java.util.Date; + +/** + * 海康一类交调数据导入 + * + * @author liuwenge + * @date 2025-10-29 + */ +public class HikTrafficSurveyData extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + + /** 开始时间 */ + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + /** 结束时间 */ + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + /** 车道号 */ + @Excel(name = "车道号") + private String lane; + + /** 车道方向 */ + @Excel(name = "车道方向") + private String direction; + + /** 跟车百分比 */ + @Excel(name = "跟车百分比") + private double followingPercentage; + + /** 时间占有率 */ + @Excel(name = "时间占有率") + private double timeOccupancyRate; + + /** 平均车头间距 */ + @Excel(name = "平均车头间距") + private Integer averageHeadway; + + /** 总的车流量 */ + @Excel(name = "总的车流量") + private Integer trafficVolume; + + /** 中小客车车流量 */ + @Excel(name = "中小客车车流量") + private Integer trafficNumberOfInAndSmall; + + /** 中小客车平均车速 */ + @Excel(name = "中小客车平均车速") + private Integer inAndSmallAverageVehicleSpeed; + + /** 大客车交通量 */ + @Excel(name = "大客车车流量") + private Integer busTrafficVolume; + + /** 大客车平均地点车速 */ + @Excel(name = "大客车平均车速") + private Integer averageSpeedOfBus; + + /** 小型货车交通量 */ + @Excel(name = "小型货车车流量") + private Integer trafficVolumeOfSmallTrucks; + + /** 小型货车平均地点车速 */ + @Excel(name = "小型货车平均车速") + private Integer smallTrucksAverageVehicleSpeed; + + /** 中型货车交通量 */ + @Excel(name = "中型货车车流量") + private Integer mediumTruckTrafficVolume; + + /** 中型货车平均地点车速 */ + @Excel(name = "中型货车平均车速") + private Integer averageSpeedOfMediumSizeTrucks; + + /** 大型货车交通量 */ + @Excel(name = "大型货车车流量") + private Integer largeTruckTrafficVolume; + + /** 大型货车平均地点车速 */ + @Excel(name = "大型货车平均车速") + private Integer averageSpeedOfLargeTrucks; + + /** 特大型货车车流量 */ + @Excel(name = "特大型货车车流量") + private Integer extraLargeTrucksTrafficVolume; + + /** 特大型货车平均车速 */ + @Excel(name = "特大型货车平均车速") + private Integer averageSpeedOfExtraLargeTrucks; + + /** 集装箱车交通量 */ + @Excel(name = "集装箱车车流量") + private Integer containerTruckTrafficVolume; + + /** 集装箱车平均地点车速 */ + @Excel(name = "集装箱车平均车速") + private Integer averageSpeedOfContainerTruck; + + /** 摩托车交通量 */ + @Excel(name = "摩托车车流量") + private Integer motorcycleTrafficVolume; + + /** 摩托车平均地点车速 */ + @Excel(name = "摩托车平均车速") + private Integer averageSpeedOfMotorcycle; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public String getLane() { + return lane; + } + + public void setLane(String lane) { + this.lane = lane; + } + + public String getDirection() { + return direction; + } + + public void setDirection(String direction) { + this.direction = direction; + } + + public double getFollowingPercentage() { + return followingPercentage; + } + + public void setFollowingPercentage(double followingPercentage) { + this.followingPercentage = followingPercentage; + } + + public double getTimeOccupancyRate() { + return timeOccupancyRate; + } + + public void setTimeOccupancyRate(double timeOccupancyRate) { + this.timeOccupancyRate = timeOccupancyRate; + } + + public Integer getAverageHeadway() { + return averageHeadway; + } + + public void setAverageHeadway(Integer averageHeadway) { + this.averageHeadway = averageHeadway; + } + + public Integer getTrafficVolume() { + return trafficVolume; + } + + public void setTrafficVolume(Integer trafficVolume) { + this.trafficVolume = trafficVolume; + } + + public Integer getTrafficNumberOfInAndSmall() { + return trafficNumberOfInAndSmall; + } + + public void setTrafficNumberOfInAndSmall(Integer trafficNumberOfInAndSmall) { + this.trafficNumberOfInAndSmall = trafficNumberOfInAndSmall; + } + + public Integer getInAndSmallAverageVehicleSpeed() { + return inAndSmallAverageVehicleSpeed; + } + + public void setInAndSmallAverageVehicleSpeed(Integer inAndSmallAverageVehicleSpeed) { + this.inAndSmallAverageVehicleSpeed = inAndSmallAverageVehicleSpeed; + } + + public Integer getBusTrafficVolume() { + return busTrafficVolume; + } + + public void setBusTrafficVolume(Integer busTrafficVolume) { + this.busTrafficVolume = busTrafficVolume; + } + + public Integer getAverageSpeedOfBus() { + return averageSpeedOfBus; + } + + public void setAverageSpeedOfBus(Integer averageSpeedOfBus) { + this.averageSpeedOfBus = averageSpeedOfBus; + } + + public Integer getTrafficVolumeOfSmallTrucks() { + return trafficVolumeOfSmallTrucks; + } + + public void setTrafficVolumeOfSmallTrucks(Integer trafficVolumeOfSmallTrucks) { + this.trafficVolumeOfSmallTrucks = trafficVolumeOfSmallTrucks; + } + + public Integer getSmallTrucksAverageVehicleSpeed() { + return smallTrucksAverageVehicleSpeed; + } + + public void setSmallTrucksAverageVehicleSpeed(Integer smallTrucksAverageVehicleSpeed) { + this.smallTrucksAverageVehicleSpeed = smallTrucksAverageVehicleSpeed; + } + + public Integer getMediumTruckTrafficVolume() { + return mediumTruckTrafficVolume; + } + + public void setMediumTruckTrafficVolume(Integer mediumTruckTrafficVolume) { + this.mediumTruckTrafficVolume = mediumTruckTrafficVolume; + } + + public Integer getAverageSpeedOfMediumSizeTrucks() { + return averageSpeedOfMediumSizeTrucks; + } + + public void setAverageSpeedOfMediumSizeTrucks(Integer averageSpeedOfMediumSizeTrucks) { + this.averageSpeedOfMediumSizeTrucks = averageSpeedOfMediumSizeTrucks; + } + + public Integer getLargeTruckTrafficVolume() { + return largeTruckTrafficVolume; + } + + public void setLargeTruckTrafficVolume(Integer largeTruckTrafficVolume) { + this.largeTruckTrafficVolume = largeTruckTrafficVolume; + } + + public Integer getAverageSpeedOfLargeTrucks() { + return averageSpeedOfLargeTrucks; + } + + public void setAverageSpeedOfLargeTrucks(Integer averageSpeedOfLargeTrucks) { + this.averageSpeedOfLargeTrucks = averageSpeedOfLargeTrucks; + } + + public Integer getExtraLargeTrucksTrafficVolume() { + return extraLargeTrucksTrafficVolume; + } + + public void setExtraLargeTrucksTrafficVolume(Integer extraLargeTrucksTrafficVolume) { + this.extraLargeTrucksTrafficVolume = extraLargeTrucksTrafficVolume; + } + + public Integer getAverageSpeedOfExtraLargeTrucks() { + return averageSpeedOfExtraLargeTrucks; + } + + public void setAverageSpeedOfExtraLargeTrucks(Integer averageSpeedOfExtraLargeTrucks) { + this.averageSpeedOfExtraLargeTrucks = averageSpeedOfExtraLargeTrucks; + } + + public Integer getContainerTruckTrafficVolume() { + return containerTruckTrafficVolume; + } + + public void setContainerTruckTrafficVolume(Integer containerTruckTrafficVolume) { + this.containerTruckTrafficVolume = containerTruckTrafficVolume; + } + + public Integer getAverageSpeedOfContainerTruck() { + return averageSpeedOfContainerTruck; + } + + public void setAverageSpeedOfContainerTruck(Integer averageSpeedOfContainerTruck) { + this.averageSpeedOfContainerTruck = averageSpeedOfContainerTruck; + } + + public Integer getMotorcycleTrafficVolume() { + return motorcycleTrafficVolume; + } + + public void setMotorcycleTrafficVolume(Integer motorcycleTrafficVolume) { + this.motorcycleTrafficVolume = motorcycleTrafficVolume; + } + + public Integer getAverageSpeedOfMotorcycle() { + return averageSpeedOfMotorcycle; + } + + public void setAverageSpeedOfMotorcycle(Integer averageSpeedOfMotorcycle) { + this.averageSpeedOfMotorcycle = averageSpeedOfMotorcycle; + } +} diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcTrafficSurveyDataMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcTrafficSurveyDataMapper.java index afe12783..bfa1e6f0 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcTrafficSurveyDataMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcTrafficSurveyDataMapper.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import com.zc.business.domain.*; +import org.apache.ibatis.annotations.Param; /** * 一类交调数据Mapper接口 @@ -73,4 +74,6 @@ public interface DcTrafficSurveyDataMapper List selectTrafficVolume(DcTrafficSurveyDataQueryParams dcTrafficSurveyDataQueryParams); List selectSpeed(DcTrafficSurveyDataQueryParams dcTrafficSurveyDataQueryParams); + + DcDevice selectDeviceByIotId(@Param("iotDeviceId") String iotDeviceId); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcTrafficSurveyDataService.java b/zc-business/src/main/java/com/zc/business/service/IDcTrafficSurveyDataService.java index f78dfc92..3762ab9c 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcTrafficSurveyDataService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcTrafficSurveyDataService.java @@ -8,6 +8,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcDevice; import com.zc.business.domain.DcTrafficSurveyData; import com.zc.business.domain.DcTrafficSurveyDataQueryParams; +import com.zc.business.domain.HikTrafficSurveyData; import com.zc.common.core.httpclient.exception.HttpException; /** @@ -99,8 +100,24 @@ public interface IDcTrafficSurveyDataService */ AjaxResult selectComprehensiveData(DcTrafficSurveyDataQueryParams dcTrafficSurveyDataQueryParams); + /** + * 物联 一类交调站数据处理 + * + * @param dcTrafficSurveyData 方向级数据 + * @param directionData 需要统计的数据列表 + * @return 结果 + */ DcTrafficSurveyData formatTrafficSurveyData(DcTrafficSurveyData dcTrafficSurveyData, JSONArray directionData); + /** + * 海康导入 一类交调站数据处理 + * + * @param dcTrafficSurveyData 方向级数据 + * @param directionData 需要统计的数据列表 + * @return 结果 + */ + DcTrafficSurveyData formatTrafficSurveyData(DcTrafficSurveyData dcTrafficSurveyData, List directionData); + /** * 实时数据 * @@ -108,4 +125,6 @@ public interface IDcTrafficSurveyDataService * @return 结果 */ AjaxResult selectRealTimeData(DcTrafficSurveyDataQueryParams dcTrafficSurveyDataQueryParams) throws IOException, HttpException; + + DcDevice selectDeviceByIotId(String iotDeviceId); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSurveyDataServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSurveyDataServiceImpl.java index cf63174d..1af8594a 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSurveyDataServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcTrafficSurveyDataServiceImpl.java @@ -1587,6 +1587,204 @@ public class DcTrafficSurveyDataServiceImpl implements IDcTrafficSurveyDataServi } + @Override + public DcTrafficSurveyData formatTrafficSurveyData(DcTrafficSurveyData dcTrafficSurveyData,List directionData){ + + Integer trafficVolume = 0; //总车流量 + + Integer averageHeadway = 0;//平均车头间距 + Integer averageHeadwayCount = 0;//平均车头间距统计次数 + + double followingPercentage = 0;//跟车百分比 + Integer followingPercentageCount = 0; //跟车百分比统计次数 + + double timeOccupancyRate = 0;//时间占有率 + Integer timeOccupancyRateCount = 0;//时间占有率统计次数 + + Integer trafficNumberOfInAndSmall = 0;//中小客车交通量 + Integer inAndSmallAverageVehicleSpeed = 0;//中小客车平均地点车速 + Integer inAndSmallAverageVehicleSpeedCount = 0;//中小客车平均地点车速统计次数 + + Integer busTrafficVolume = 0;//大客车交通量 + Integer averageSpeedOfBus = 0;//大客车平均地点车速 + Integer averageSpeedOfBusCount = 0;//大客车平均地点车速统计次数 + + Integer trafficVolumeOfSmallTrucks = 0;//小型货车交通量 + Integer smallTrucksAverageVehicleSpeed = 0;//小型货车平均地点车速 + Integer smallTrucksAverageVehicleSpeedCount = 0;//小型货车平均地点车速统计次数 + + Integer mediumTruckTrafficVolume = 0;//中型货车交通量 + Integer averageSpeedOfMediumSizeTrucks = 0; //中型货车平均地点车速 + Integer averageSpeedOfMediumSizeTrucksCount = 0; //中型货车平均地点车速统计次数 + + Integer largeTruckTrafficVolume = 0;//大型货车交通量 + Integer averageSpeedOfLargeTrucks = 0; //大型货车平均地点车速 + Integer averageSpeedOfLargeTrucksCount = 0; //大型货车平均地点车速统计次数 + + Integer extraLargeTrucksTrafficVolume = 0; //特大型货车交通量 + Integer averageSpeedOfExtraLargeTrucks = 0;//特大型货车平均地点车速 + Integer averageSpeedOfExtraLargeTrucksCount = 0; //特大型货车平均地点车速统计次数 + + Integer containerTruckTrafficVolume = 0;//集装箱车交通量 + Integer averageSpeedOfContainerTruck = 0;//集装箱车平均地点车速 + Integer averageSpeedOfContainerTruckCount = 0;//集装箱车平均地点车速统计次数 + + Integer motorcycleTrafficVolume = 0;//摩托车交通量 + Integer averageSpeedOfMotorcycle = 0;//摩托车平均地点车速 + Integer averageSpeedOfMotorcycleCount = 0;//摩托车平均地点车速统计次数 + + for (HikTrafficSurveyData laneData : directionData) { + if (laneData.getTrafficVolume() > 0){ + trafficVolume += laneData.getTrafficVolume(); + } + if (laneData.getAverageHeadway() > 0) { + averageHeadway += laneData.getAverageHeadway(); + averageHeadwayCount++; + } + + if (laneData.getFollowingPercentage() > 0){ + followingPercentage += laneData.getFollowingPercentage(); + followingPercentageCount++; + } + if (laneData.getTimeOccupancyRate() > 0) { + timeOccupancyRate += laneData.getTimeOccupancyRate(); + timeOccupancyRateCount++; + } + + if (laneData.getTrafficNumberOfInAndSmall() > 0) { + trafficNumberOfInAndSmall += laneData.getTrafficNumberOfInAndSmall(); + inAndSmallAverageVehicleSpeed += laneData.getInAndSmallAverageVehicleSpeed(); + inAndSmallAverageVehicleSpeedCount++; + } + if (laneData.getBusTrafficVolume() > 0) { + busTrafficVolume += laneData.getBusTrafficVolume(); + averageSpeedOfBus += laneData.getAverageSpeedOfBus(); + averageSpeedOfBusCount++; + } + if (laneData.getTrafficVolumeOfSmallTrucks() > 0) { + trafficVolumeOfSmallTrucks += laneData.getTrafficVolumeOfSmallTrucks(); + smallTrucksAverageVehicleSpeed += laneData.getSmallTrucksAverageVehicleSpeed(); + smallTrucksAverageVehicleSpeedCount++; + } + if (laneData.getMediumTruckTrafficVolume() > 0) { + mediumTruckTrafficVolume += laneData.getMediumTruckTrafficVolume(); + averageSpeedOfMediumSizeTrucks += laneData.getAverageSpeedOfMediumSizeTrucks(); + averageSpeedOfMediumSizeTrucksCount++; + } + if (laneData.getLargeTruckTrafficVolume() > 0) { + largeTruckTrafficVolume += laneData.getLargeTruckTrafficVolume(); + averageSpeedOfLargeTrucks += laneData.getAverageSpeedOfLargeTrucks(); + averageSpeedOfLargeTrucksCount++; + } + if (laneData.getExtraLargeTrucksTrafficVolume() > 0) { + extraLargeTrucksTrafficVolume += laneData.getExtraLargeTrucksTrafficVolume(); + averageSpeedOfExtraLargeTrucks += laneData.getAverageSpeedOfExtraLargeTrucks(); + averageSpeedOfExtraLargeTrucksCount++; + } + if (laneData.getContainerTruckTrafficVolume() > 0) { + containerTruckTrafficVolume += laneData.getContainerTruckTrafficVolume(); + averageSpeedOfContainerTruck += laneData.getAverageSpeedOfContainerTruck(); + averageSpeedOfContainerTruckCount++; + } + if (laneData.getMotorcycleTrafficVolume() > 0) { + motorcycleTrafficVolume += laneData.getMotorcycleTrafficVolume(); + averageSpeedOfMotorcycle += laneData.getAverageSpeedOfMotorcycle(); + averageSpeedOfMotorcycleCount++; + } + } + + Integer avgSpeed = 0; + Integer avgSpeedCount = 0; + + + //计算跟车百分比、时间占有率、车头间距、车速平均值 + if (followingPercentageCount > 0){ + followingPercentage = followingPercentage / followingPercentageCount; + } + if (timeOccupancyRateCount > 0){ + timeOccupancyRate = timeOccupancyRate / timeOccupancyRateCount; + } + + if (averageHeadwayCount > 0){ + averageHeadway = averageHeadway / averageHeadwayCount; + } + if (inAndSmallAverageVehicleSpeedCount > 0){ + inAndSmallAverageVehicleSpeed = inAndSmallAverageVehicleSpeed / inAndSmallAverageVehicleSpeedCount; + avgSpeed += inAndSmallAverageVehicleSpeed; + avgSpeedCount++; + } + if (averageSpeedOfBusCount > 0){ + averageSpeedOfBus = averageSpeedOfBus /averageSpeedOfBusCount; + avgSpeed += averageSpeedOfBus; + avgSpeedCount++; + } + if (smallTrucksAverageVehicleSpeedCount > 0){ + smallTrucksAverageVehicleSpeed = smallTrucksAverageVehicleSpeed / smallTrucksAverageVehicleSpeedCount; + avgSpeed += smallTrucksAverageVehicleSpeed; + avgSpeedCount++; + } + if (averageSpeedOfMediumSizeTrucksCount > 0){ + averageSpeedOfMediumSizeTrucks = averageSpeedOfMediumSizeTrucks / averageSpeedOfMediumSizeTrucksCount; + avgSpeed += averageSpeedOfMediumSizeTrucks; + avgSpeedCount++; + } + if (averageSpeedOfLargeTrucksCount > 0){ + averageSpeedOfLargeTrucks = averageSpeedOfLargeTrucks / averageSpeedOfLargeTrucksCount; + avgSpeed += averageSpeedOfLargeTrucks; + avgSpeedCount++; + } + if (averageSpeedOfExtraLargeTrucksCount > 0){ + averageSpeedOfExtraLargeTrucks = averageSpeedOfExtraLargeTrucks / averageSpeedOfExtraLargeTrucksCount; + avgSpeed += averageSpeedOfExtraLargeTrucks; + avgSpeedCount++; + } + if (averageSpeedOfContainerTruckCount > 0){ + averageSpeedOfContainerTruck = averageSpeedOfContainerTruck / averageSpeedOfContainerTruckCount; + avgSpeed += averageSpeedOfContainerTruck; + avgSpeedCount++; + } + if (averageSpeedOfMotorcycleCount > 0){ + averageSpeedOfMotorcycle = averageSpeedOfMotorcycle / averageSpeedOfMotorcycleCount; + avgSpeed += averageSpeedOfMotorcycle; + avgSpeedCount++; + } + + + //方向级平均车速 + if(avgSpeedCount > 0){ + avgSpeed = avgSpeed / avgSpeedCount; + } + + dcTrafficSurveyData.setTrafficVolume(trafficVolume.longValue()); + dcTrafficSurveyData.setAverageHeadway(averageHeadway); + dcTrafficSurveyData.setTrafficNumberOfInAndSmall(trafficNumberOfInAndSmall); + dcTrafficSurveyData.setInAndSmallAverageVehicleSpeed(inAndSmallAverageVehicleSpeed); + dcTrafficSurveyData.setBusTrafficVolume(busTrafficVolume); + dcTrafficSurveyData.setAverageSpeedOfBus(averageSpeedOfBus); + dcTrafficSurveyData.setTrafficVolumeOfSmallTrucks(trafficVolumeOfSmallTrucks); + dcTrafficSurveyData.setSmallTrucksAverageVehicleSpeed(smallTrucksAverageVehicleSpeed); + dcTrafficSurveyData.setMediumTruckTrafficVolume(mediumTruckTrafficVolume); + dcTrafficSurveyData.setAverageSpeedOfMediumSizeTrucks(averageSpeedOfMediumSizeTrucks); + dcTrafficSurveyData.setLargeTruckTrafficVolume(largeTruckTrafficVolume); + dcTrafficSurveyData.setAverageSpeedOfLargeTrucks(averageSpeedOfLargeTrucks); + dcTrafficSurveyData.setAverageSpeedOfExtraLargeTrucks(averageSpeedOfExtraLargeTrucks); + dcTrafficSurveyData.setExtraLargeTrucksTrafficVolume(extraLargeTrucksTrafficVolume); + dcTrafficSurveyData.setContainerTruckTrafficVolume(containerTruckTrafficVolume); + dcTrafficSurveyData.setAverageSpeedOfContainerTruck(averageSpeedOfContainerTruck); + dcTrafficSurveyData.setMotorcycleTrafficVolume(motorcycleTrafficVolume); + dcTrafficSurveyData.setAverageSpeedOfMotorcycle(averageSpeedOfMotorcycle); + dcTrafficSurveyData.setAvgSpeed(avgSpeed); + + dcTrafficSurveyData.setFollowingPercentage((int) followingPercentage); + dcTrafficSurveyData.setTimeOccupancyRate((int) timeOccupancyRate); + //海康导入数据中没有拖拉机数据, 默认0 + dcTrafficSurveyData.setTractorTrafficVolume(0); + dcTrafficSurveyData.setAverageSpeedOfTractor(0); + + return dcTrafficSurveyData; + + } + /** * 实时数据 * @@ -1683,4 +1881,9 @@ public class DcTrafficSurveyDataServiceImpl implements IDcTrafficSurveyDataServi } return AjaxResult.success(result); } + + @Override + public DcDevice selectDeviceByIotId(String iotDeviceId){ + return dcTrafficSurveyDataMapper.selectDeviceByIotId(iotDeviceId); + } } diff --git a/zc-business/src/main/resources/mapper/business/DcTrafficSurveyDataMapper.xml b/zc-business/src/main/resources/mapper/business/DcTrafficSurveyDataMapper.xml index 18d1ad74..28667b87 100644 --- a/zc-business/src/main/resources/mapper/business/DcTrafficSurveyDataMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcTrafficSurveyDataMapper.xml @@ -129,9 +129,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY time ,direction + order by time - - + + insert into dc_traffic_survey_data @@ -225,65 +228,88 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - insert into dc_traffic_survey_data - - iot_device_id, - stake_mark, - direction, - timestamp, - traffic_volume, - following_percentage, - time_occupancy_rate, - average_headway, - traffic_number_of_in_and_small, - in_and_small_average_vehicle_speed, - bus_traffic_volume, - average_speed_of_bus, - traffic_volume_of_small_trucks, - small_trucks_average_vehicle_speed, - medium_truck_traffic_volume, - average_speed_of_medium_size_trucks, - large_truck_traffic_volume, - average_speed_of_large_trucks, - average_speed_of_extra_large_trucks, - extra_large_trucks_traffic_volume, - container_truck_traffic_volume, - average_speed_of_container_truck, - motorcycle_traffic_volume, - average_speed_of_motorcycle, - tractor_traffic_volume, - average_speed_of_tractor, - - - #{dcTrafficSurveyData.iotDeviceId}, - #{dcTrafficSurveyData.stakeMark}, - #{dcTrafficSurveyData.direction}, - #{dcTrafficSurveyData.timestamp}, - #{dcTrafficSurveyData.trafficVolume}, - #{dcTrafficSurveyData.followingPercentage}, - #{dcTrafficSurveyData.timeOccupancyRate}, - #{dcTrafficSurveyData.averageHeadway}, - #{dcTrafficSurveyData.trafficNumberOfInAndSmall}, - #{dcTrafficSurveyData.inAndSmallAverageVehicleSpeed}, - #{dcTrafficSurveyData.busTrafficVolume}, - #{dcTrafficSurveyData.averageSpeedOfBus}, - #{dcTrafficSurveyData.trafficVolumeOfSmallTrucks}, - #{dcTrafficSurveyData.smallTrucksAverageVehicleSpeed}, - #{dcTrafficSurveyData.mediumTruckTrafficVolume}, - #{dcTrafficSurveyData.averageSpeedOfMediumSizeTrucks}, - #{dcTrafficSurveyData.largeTruckTrafficVolume}, - #{dcTrafficSurveyData.averageSpeedOfLargeTrucks}, - #{dcTrafficSurveyData.averageSpeedOfExtraLargeTrucks}, - #{dcTrafficSurveyData.extraLargeTrucksTrafficVolume}, - #{dcTrafficSurveyData.containerTruckTrafficVolume}, - #{dcTrafficSurveyData.averageSpeedOfContainerTruck}, - #{dcTrafficSurveyData.motorcycleTrafficVolume}, - #{dcTrafficSurveyData.averageSpeedOfMotorcycle}, - #{dcTrafficSurveyData.tractorTrafficVolume}, - #{dcTrafficSurveyData.averageSpeedOfTractor}, - + INSERT INTO dc_traffic_survey_data ( + iot_device_id, + stake_mark, + direction, + `timestamp`, + traffic_volume, + following_percentage, + time_occupancy_rate, + average_headway, + traffic_number_of_in_and_small, + in_and_small_average_vehicle_speed, + bus_traffic_volume, + average_speed_of_bus, + traffic_volume_of_small_trucks, + small_trucks_average_vehicle_speed, + medium_truck_traffic_volume, + average_speed_of_medium_size_trucks, + large_truck_traffic_volume, + average_speed_of_large_trucks, + average_speed_of_extra_large_trucks, + extra_large_trucks_traffic_volume, + container_truck_traffic_volume, + average_speed_of_container_truck, + motorcycle_traffic_volume, + average_speed_of_motorcycle, + tractor_traffic_volume, + average_speed_of_tractor + ) VALUES + + ( + #{dcTrafficSurveyData.iotDeviceId}, + #{dcTrafficSurveyData.stakeMark}, + #{dcTrafficSurveyData.direction}, + #{dcTrafficSurveyData.timestamp}, + #{dcTrafficSurveyData.trafficVolume}, + #{dcTrafficSurveyData.followingPercentage}, + #{dcTrafficSurveyData.timeOccupancyRate}, + #{dcTrafficSurveyData.averageHeadway}, + #{dcTrafficSurveyData.trafficNumberOfInAndSmall}, + #{dcTrafficSurveyData.inAndSmallAverageVehicleSpeed}, + #{dcTrafficSurveyData.busTrafficVolume}, + #{dcTrafficSurveyData.averageSpeedOfBus}, + #{dcTrafficSurveyData.trafficVolumeOfSmallTrucks}, + #{dcTrafficSurveyData.smallTrucksAverageVehicleSpeed}, + #{dcTrafficSurveyData.mediumTruckTrafficVolume}, + #{dcTrafficSurveyData.averageSpeedOfMediumSizeTrucks}, + #{dcTrafficSurveyData.largeTruckTrafficVolume}, + #{dcTrafficSurveyData.averageSpeedOfLargeTrucks}, + #{dcTrafficSurveyData.averageSpeedOfExtraLargeTrucks}, + #{dcTrafficSurveyData.extraLargeTrucksTrafficVolume}, + #{dcTrafficSurveyData.containerTruckTrafficVolume}, + #{dcTrafficSurveyData.averageSpeedOfContainerTruck}, + #{dcTrafficSurveyData.motorcycleTrafficVolume}, + #{dcTrafficSurveyData.averageSpeedOfMotorcycle}, + #{dcTrafficSurveyData.tractorTrafficVolume}, + #{dcTrafficSurveyData.averageSpeedOfTractor} + ) + ON DUPLICATE KEY UPDATE + stake_mark = VALUES(stake_mark), + traffic_volume = VALUES(traffic_volume), + following_percentage = VALUES(following_percentage), + time_occupancy_rate = VALUES(time_occupancy_rate), + average_headway = VALUES(average_headway), + traffic_number_of_in_and_small = VALUES(traffic_number_of_in_and_small), + in_and_small_average_vehicle_speed = VALUES(in_and_small_average_vehicle_speed), + bus_traffic_volume = VALUES(bus_traffic_volume), + average_speed_of_bus = VALUES(average_speed_of_bus), + traffic_volume_of_small_trucks = VALUES(traffic_volume_of_small_trucks), + small_trucks_average_vehicle_speed = VALUES(small_trucks_average_vehicle_speed), + medium_truck_traffic_volume = VALUES(medium_truck_traffic_volume), + average_speed_of_medium_size_trucks = VALUES(average_speed_of_medium_size_trucks), + large_truck_traffic_volume = VALUES(large_truck_traffic_volume), + average_speed_of_large_trucks = VALUES(average_speed_of_large_trucks), + average_speed_of_extra_large_trucks = VALUES(average_speed_of_extra_large_trucks), + extra_large_trucks_traffic_volume = VALUES(extra_large_trucks_traffic_volume), + container_truck_traffic_volume = VALUES(container_truck_traffic_volume), + average_speed_of_container_truck = VALUES(average_speed_of_container_truck), + motorcycle_traffic_volume = VALUES(motorcycle_traffic_volume), + average_speed_of_motorcycle = VALUES(average_speed_of_motorcycle), + tractor_traffic_volume = VALUES(tractor_traffic_volume), + average_speed_of_tractor = VALUES(average_speed_of_tractor)