From 9e6286daeee3710096798339ee87672e05f142f2 Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Fri, 31 Oct 2025 10:04:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E9=97=B4=E5=BA=93=E9=97=A8=E6=9E=B6?= =?UTF-8?q?=E7=89=8C=E8=AF=86=E6=B5=81=E6=B0=B4=E6=95=B0=E6=8D=AE=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=88=B0=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcGantryVehiclePlateStatistics.java | 96 +++++++++ .../DcGantryVehiclePlateStatisticsMapper.java | 29 +++ .../business/mapper/OdsTollViuDataMapper.java | 7 + .../service/IOdsTollViuDataService.java | 9 + .../impl/OdsTollViuDataServiceImpl.java | 16 ++ .../TrafficGantryVehiclePlateStatistics.java | 201 ++++++++++++++++++ .../DcGantryVehiclePlateStatisticsMapper.xml | 34 +++ .../mapper/business/OdsTollViuDataMapper.xml | 14 ++ 8 files changed, 406 insertions(+) create mode 100644 zc-business/src/main/java/com/zc/business/domain/DcGantryVehiclePlateStatistics.java create mode 100644 zc-business/src/main/java/com/zc/business/mapper/DcGantryVehiclePlateStatisticsMapper.java create mode 100644 zc-business/src/main/java/com/zc/business/statistics/handler/TrafficGantryVehiclePlateStatistics.java create mode 100644 zc-business/src/main/resources/mapper/business/DcGantryVehiclePlateStatisticsMapper.xml create mode 100644 zc-business/src/main/resources/mapper/business/OdsTollViuDataMapper.xml diff --git a/zc-business/src/main/java/com/zc/business/domain/DcGantryVehiclePlateStatistics.java b/zc-business/src/main/java/com/zc/business/domain/DcGantryVehiclePlateStatistics.java new file mode 100644 index 00000000..1181b51e --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/domain/DcGantryVehiclePlateStatistics.java @@ -0,0 +1,96 @@ +package com.zc.business.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 门架牌识数据统计实体类 + * @author xiepufeng + */ +@Data +public class DcGantryVehiclePlateStatistics implements Serializable { + + /** id */ + private Long id; + + /** 门架编号 */ + private String gantryid; + + /** 统计时间 */ + private Date statisticalDate; + + /** 车流量 */ + private Integer trafficVolume; + + /** 统计粒度 + 1-年 + 2-季 + 3-月 + 4-日 + 5-时 */ + private String periodType; + + /** 创建时间 */ + private Date createTime; + + /** 修改事件 */ + private Date updateTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getGantryid() { + return gantryid; + } + + public void setGantryid(String gantryid) { + this.gantryid = gantryid; + } + + public Date getStatisticalDate() { + return statisticalDate; + } + + public void setStatisticalDate(Date statisticalDate) { + this.statisticalDate = statisticalDate; + } + + public Integer getTrafficVolume() { + return trafficVolume; + } + + public void setTrafficVolume(Integer trafficVolume) { + this.trafficVolume = trafficVolume; + } + + public String getPeriodType() { + return periodType; + } + + public void setPeriodType(String periodType) { + this.periodType = periodType; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } +} diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcGantryVehiclePlateStatisticsMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcGantryVehiclePlateStatisticsMapper.java new file mode 100644 index 00000000..972936d5 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/mapper/DcGantryVehiclePlateStatisticsMapper.java @@ -0,0 +1,29 @@ +package com.zc.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zc.business.domain.DcGantryStatisticsData; +import com.zc.business.domain.DcGantryVehiclePlateStatistics; +import com.zc.business.domain.TrafficFlowStatisticsMap; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 门架牌识统计数据Mapper + */ +@Mapper +public interface DcGantryVehiclePlateStatisticsMapper { + + /** + * 批量插入或更新门架牌识数据统计。 + * + */ + boolean batchInsertOrUpdate(List list); + + + DcGantryVehiclePlateStatistics selectStatisticsByGantryid(@Param("statisticalDate") Date statisticalDate, @Param("gantryid") String gantryid, @Param("periodType") String periodType); +} + diff --git a/zc-business/src/main/java/com/zc/business/mapper/OdsTollViuDataMapper.java b/zc-business/src/main/java/com/zc/business/mapper/OdsTollViuDataMapper.java index 132a0479..582dbb65 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/OdsTollViuDataMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/OdsTollViuDataMapper.java @@ -1,8 +1,13 @@ package com.zc.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zc.business.domain.DcGantryVehiclePlateStatistics; import com.zc.business.domain.OdsTollViuData; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; /** * 门架牌识流水数据Mapper接口 @@ -11,4 +16,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface OdsTollViuDataMapper extends BaseMapper { + + List selectHourDataList(@Param("startTime") Date startTime, @Param("endTime") Date endTime); } diff --git a/zc-business/src/main/java/com/zc/business/service/IOdsTollViuDataService.java b/zc-business/src/main/java/com/zc/business/service/IOdsTollViuDataService.java index d349f42c..ea082d86 100644 --- a/zc-business/src/main/java/com/zc/business/service/IOdsTollViuDataService.java +++ b/zc-business/src/main/java/com/zc/business/service/IOdsTollViuDataService.java @@ -1,8 +1,12 @@ package com.zc.business.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.zc.business.domain.DcGantryVehiclePlateStatistics; import com.zc.business.domain.OdsTollViuData; +import java.util.Date; +import java.util.List; + /** * 门架牌识流水数据 * @author xiepufeng @@ -13,4 +17,9 @@ public interface IOdsTollViuDataService extends IService { * 当天门架牌识流水数据统计 */ int odsTollViuDataCountNumber(); + + /** + * 查询小时门架牌识流水数据 + */ + List selectHourDataList(Date startTime, Date endTime); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/OdsTollViuDataServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/OdsTollViuDataServiceImpl.java index 0d96f54d..bb7f5be0 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/OdsTollViuDataServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/OdsTollViuDataServiceImpl.java @@ -1,17 +1,23 @@ package com.zc.business.service.impl; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.enums.DataSourceType; +import com.zc.business.domain.DcGantryVehiclePlateStatistics; import com.zc.business.domain.OdsTollViuData; import com.zc.business.enums.UniversalEnum; import com.zc.business.mapper.OdsTollViuDataMapper; import com.zc.business.service.IOdsTollViuDataService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; /** * 门架牌识流水数据 @@ -21,6 +27,8 @@ import java.time.LocalDateTime; public class OdsTollViuDataServiceImpl extends ServiceImpl implements IOdsTollViuDataService { + @Autowired + private OdsTollViuDataMapper odsTollViuDataMapper; /** * 当天门架牌识流水数据统计 * @return @@ -34,4 +42,12 @@ public class OdsTollViuDataServiceImpl extends ServiceImpl selectHourDataList(Date startTime, Date endTime){ + return odsTollViuDataMapper.selectHourDataList(startTime, endTime); + } } diff --git a/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficGantryVehiclePlateStatistics.java b/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficGantryVehiclePlateStatistics.java new file mode 100644 index 00000000..29955e7c --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/statistics/handler/TrafficGantryVehiclePlateStatistics.java @@ -0,0 +1,201 @@ +package com.zc.business.statistics.handler; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.zc.business.domain.DcGantryMetricsStatisticsData; +import com.zc.business.domain.DcGantryVehiclePlateStatistics; +import com.zc.business.domain.OdsTollViuData; +import com.zc.business.enums.TrafficDataPeriodTypeEnum; +import com.zc.business.enums.UniversalEnum; +import com.zc.business.mapper.DcGantryMetricsStatisticsDataMapper; +import com.zc.business.mapper.DcGantryVehiclePlateStatisticsMapper; +import com.zc.business.service.IDcGantryMetricsStatisticsDataService; +import com.zc.business.service.IOdsTollViuDataService; +import com.zc.business.statistics.cache.AbstractTrafficStatisticsCache; +import com.zc.business.statistics.cache.metrics.DailyGantryMetricsStatisticsCache; +import com.zc.business.statistics.cache.metrics.MonthlyGantryMetricsStatisticsCache; +import com.zc.business.statistics.cache.metrics.QuarterlyGantryMetricsStatisticsCache; +import com.zc.business.statistics.cache.metrics.YearlyGantryMetricsStatisticsCache; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +/** + * TrafficGantryPlateStatistics类用于处理门架牌识的统计数据。 + * @author xiepufeng + */ +@Component +@RestController +@RequestMapping("/statistics/trafficGantryVehiclePlateStatistics") +public class TrafficGantryVehiclePlateStatistics { + + // 日志记录器 + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private IOdsTollViuDataService odsTollViuDataService; + + @Resource + private DcGantryVehiclePlateStatisticsMapper dcGantryVehiclePlateStatisticsMapper; + + + /** + * 定义每小时第30分钟执行的任务,用于将中间库门架牌识流水 统计后保存至dc数据库。 + */ + @Scheduled(cron = "0 30 * * * ?") // 每小时的30分整点执行该任务 + public void performHourlyCleanupAndPersist() { + + + // 计算一小时前的时间点 + DateTime lastHour = DateUtil.offsetHour(new Date(), UniversalEnum.MINUS_ONE.getNumber()); + Date startTime = DateUtil.beginOfHour(lastHour); + Date endTime = DateUtil.endOfHour(lastHour); + + //前一小时的牌识统计数据 + List lastHourStatisticsList = odsTollViuDataService.selectHourDataList(startTime,endTime); + + if (lastHourStatisticsList == null || lastHourStatisticsList.isEmpty()) { + return; + } + //补充时间 类型信息 + lastHourStatisticsList.forEach(item -> { + item.setStatisticalDate(startTime); + item.setCreateTime(new Date()); + item.setPeriodType("5"); + }); + + // 批量插入小时统计数据 + dcGantryVehiclePlateStatisticsMapper.batchInsertOrUpdate(lastHourStatisticsList); + + //年、季、月、日统计数据 + List statisticsList = new ArrayList<>(); + for (DcGantryVehiclePlateStatistics hourData : lastHourStatisticsList) { + //天 + Date dayStartTime = DateUtil.beginOfDay(startTime); + DcGantryVehiclePlateStatistics dayStatistics = new DcGantryVehiclePlateStatistics(); + dayStatistics.setTrafficVolume(hourData.getTrafficVolume()); + dayStatistics.setStatisticalDate(dayStartTime); + dayStatistics.setPeriodType("4"); + dayStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(dayStatistics); + + //月 + Date monthStartTime = DateUtil.beginOfMonth(startTime); + DcGantryVehiclePlateStatistics monthStatistics = new DcGantryVehiclePlateStatistics(); + monthStatistics.setTrafficVolume(hourData.getTrafficVolume()); + monthStatistics.setStatisticalDate(monthStartTime); + monthStatistics.setPeriodType("3"); + monthStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(monthStatistics); + + //季度 + Date quarterStartTime = DateUtil.beginOfQuarter(startTime); + DcGantryVehiclePlateStatistics quarterStatistics = new DcGantryVehiclePlateStatistics(); + quarterStatistics.setTrafficVolume(hourData.getTrafficVolume()); + quarterStatistics.setStatisticalDate(quarterStartTime); + quarterStatistics.setPeriodType("2"); + quarterStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(quarterStatistics); + + //年 + Date yearStartTime = DateUtil.beginOfYear(startTime); + DcGantryVehiclePlateStatistics yearStatistics = new DcGantryVehiclePlateStatistics(); + yearStatistics.setTrafficVolume(hourData.getTrafficVolume()); + yearStatistics.setStatisticalDate(yearStartTime); + yearStatistics.setPeriodType("1"); + yearStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(yearStatistics); + } + // 批量插入年季月日统计数据 + dcGantryVehiclePlateStatisticsMapper.batchInsertOrUpdate(statisticsList); + + } + + @GetMapping("/syncData") + public void syncData(@RequestParam("startTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime, + @RequestParam("endTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime){ + Date hourStart = DateUtil.beginOfHour(startTime); + + syncHourStatistics(hourStart,endTime); + + } + + /** + * 时间范围统计门架牌识数据 + * 注: 会将该范围内的数据累加到年\季\月\日上,谨慎操作 + */ + public void syncHourStatistics(Date hourStart,Date endTime){ + + //结束递归 + while (hourStart.getTime() <= endTime.getTime()){ + Date hourEnd = DateUtil.endOfHour(hourStart); + //前一小时的牌识统计数据 + List lastHourStatisticsList = odsTollViuDataService.selectHourDataList(hourStart,hourEnd); + if (lastHourStatisticsList == null || lastHourStatisticsList.isEmpty()) { + hourStart = DateUtil.offsetHour(hourStart, 1); + continue; //跳过当前小时,继续循环 + } + //补充时间 类型信息 + Date finalHourStart = hourStart; + lastHourStatisticsList.forEach(item -> { + item.setStatisticalDate(finalHourStart); + item.setCreateTime(new Date()); + item.setPeriodType("5"); + }); + // 批量插入小时统计数据 + dcGantryVehiclePlateStatisticsMapper.batchInsertOrUpdate(lastHourStatisticsList); + + //年、季、月、日统计数据 + List statisticsList = new ArrayList<>(); + for (DcGantryVehiclePlateStatistics hourData : lastHourStatisticsList) { + //天 + Date dayStartTime = DateUtil.beginOfDay(finalHourStart); + DcGantryVehiclePlateStatistics dayStatistics = new DcGantryVehiclePlateStatistics(); + dayStatistics.setTrafficVolume(hourData.getTrafficVolume()); + dayStatistics.setStatisticalDate(dayStartTime); + dayStatistics.setPeriodType("4"); + dayStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(dayStatistics); + //月 + Date monthStartTime = DateUtil.beginOfMonth(finalHourStart); + DcGantryVehiclePlateStatistics monthStatistics = new DcGantryVehiclePlateStatistics(); + monthStatistics.setTrafficVolume(hourData.getTrafficVolume()); + monthStatistics.setStatisticalDate(monthStartTime); + monthStatistics.setPeriodType("3"); + monthStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(monthStatistics); + //季度 + Date quarterStartTime = DateUtil.beginOfQuarter(finalHourStart); + DcGantryVehiclePlateStatistics quarterStatistics = new DcGantryVehiclePlateStatistics(); + quarterStatistics.setTrafficVolume(hourData.getTrafficVolume()); + quarterStatistics.setStatisticalDate(quarterStartTime); + quarterStatistics.setPeriodType("2"); + quarterStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(quarterStatistics); + //年 + Date yearStartTime = DateUtil.beginOfYear(finalHourStart); + DcGantryVehiclePlateStatistics yearStatistics = new DcGantryVehiclePlateStatistics(); + yearStatistics.setTrafficVolume(hourData.getTrafficVolume()); + yearStatistics.setStatisticalDate(yearStartTime); + yearStatistics.setPeriodType("1"); + yearStatistics.setGantryid(hourData.getGantryid()); + statisticsList.add(yearStatistics); + } + // 批量插入年季月日统计数据 + dcGantryVehiclePlateStatisticsMapper.batchInsertOrUpdate(statisticsList); + + + hourStart = DateUtil.offsetHour(hourStart, 1); + } + } + +} diff --git a/zc-business/src/main/resources/mapper/business/DcGantryVehiclePlateStatisticsMapper.xml b/zc-business/src/main/resources/mapper/business/DcGantryVehiclePlateStatisticsMapper.xml new file mode 100644 index 00000000..5e55bffe --- /dev/null +++ b/zc-business/src/main/resources/mapper/business/DcGantryVehiclePlateStatisticsMapper.xml @@ -0,0 +1,34 @@ + + + + + + INSERT INTO dc_gantry_vehicle_plate_statistics + ( + gantryid, + statistical_date, + traffic_volume, + period_type, + create_time + ) + VALUES + + ( + #{item.gantryid}, + #{item.statisticalDate}, + #{item.trafficVolume}, + #{item.periodType}, + NOW() + ) + + ON DUPLICATE KEY UPDATE + traffic_volume = traffic_volume + VALUES(traffic_volume), + update_time = NOW() + + + diff --git a/zc-business/src/main/resources/mapper/business/OdsTollViuDataMapper.xml b/zc-business/src/main/resources/mapper/business/OdsTollViuDataMapper.xml new file mode 100644 index 00000000..f0e1240b --- /dev/null +++ b/zc-business/src/main/resources/mapper/business/OdsTollViuDataMapper.xml @@ -0,0 +1,14 @@ + + + + + + +