Browse Source

中间库门架牌识流水数据统计到数据库

develop
lau572 3 days ago
parent
commit
9e6286daee
  1. 96
      zc-business/src/main/java/com/zc/business/domain/DcGantryVehiclePlateStatistics.java
  2. 29
      zc-business/src/main/java/com/zc/business/mapper/DcGantryVehiclePlateStatisticsMapper.java
  3. 7
      zc-business/src/main/java/com/zc/business/mapper/OdsTollViuDataMapper.java
  4. 9
      zc-business/src/main/java/com/zc/business/service/IOdsTollViuDataService.java
  5. 16
      zc-business/src/main/java/com/zc/business/service/impl/OdsTollViuDataServiceImpl.java
  6. 201
      zc-business/src/main/java/com/zc/business/statistics/handler/TrafficGantryVehiclePlateStatistics.java
  7. 34
      zc-business/src/main/resources/mapper/business/DcGantryVehiclePlateStatisticsMapper.xml
  8. 14
      zc-business/src/main/resources/mapper/business/OdsTollViuDataMapper.xml

96
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;
}
}

29
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<DcGantryVehiclePlateStatistics> list);
DcGantryVehiclePlateStatistics selectStatisticsByGantryid(@Param("statisticalDate") Date statisticalDate, @Param("gantryid") String gantryid, @Param("periodType") String periodType);
}

7
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<OdsTollViuData> {
List<DcGantryVehiclePlateStatistics> selectHourDataList(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
}

9
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<OdsTollViuData> {
* 当天门架牌识流水数据统计
*/
int odsTollViuDataCountNumber();
/**
* 查询小时门架牌识流水数据
*/
List<DcGantryVehiclePlateStatistics> selectHourDataList(Date startTime, Date endTime);
}

16
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<OdsTollViuDataMapper, OdsTollViuData>
implements IOdsTollViuDataService {
@Autowired
private OdsTollViuDataMapper odsTollViuDataMapper;
/**
* 当天门架牌识流水数据统计
* @return
@ -34,4 +42,12 @@ public class OdsTollViuDataServiceImpl extends ServiceImpl<OdsTollViuDataMapper,
queryWrapper.between(OdsTollViuData::getPictime, startOfDay, endOfDay);
return count(queryWrapper);
}
/**
* 查询小时门架牌识流水数据
* @return
*/
@Override
public List<DcGantryVehiclePlateStatistics> selectHourDataList(Date startTime, Date endTime){
return odsTollViuDataMapper.selectHourDataList(startTime, endTime);
}
}

201
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<DcGantryVehiclePlateStatistics> 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<DcGantryVehiclePlateStatistics> 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<DcGantryVehiclePlateStatistics> 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<DcGantryVehiclePlateStatistics> 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);
}
}
}

34
zc-business/src/main/resources/mapper/business/DcGantryVehiclePlateStatisticsMapper.xml

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zc.business.mapper.DcGantryVehiclePlateStatisticsMapper">
<insert id="batchInsertOrUpdate" parameterType="list">
INSERT INTO dc_gantry_vehicle_plate_statistics
(
gantryid,
statistical_date,
traffic_volume,
period_type,
create_time
)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.gantryid},
#{item.statisticalDate},
#{item.trafficVolume},
#{item.periodType},
NOW()
)
</foreach>
ON DUPLICATE KEY UPDATE
traffic_volume = traffic_volume + VALUES(traffic_volume),
update_time = NOW()
</insert>
<select id="selectStatisticsByGantryid" resultType="com.zc.business.domain.DcGantryVehiclePlateStatistics">
select * from dc_gantry_vehicle_plate_statistics
where gantryid = #{gantryid} and statistical_date = #{statisticalDate} and period_type = #{periodType}
</select>
</mapper>

14
zc-business/src/main/resources/mapper/business/OdsTollViuDataMapper.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zc.business.mapper.OdsTollViuDataMapper">
<select id="selectHourDataList" resultType="com.zc.business.domain.DcGantryVehiclePlateStatistics">
SELECT gantryid,COUNT(DISTINCT vehicleplate_MD5) AS trafficVolume
FROM ods_toll_viu_data
WHERE pictime BETWEEN #{startTime} and #{endTime}
GROUP BY gantryid;
</select>
</mapper>
Loading…
Cancel
Save