diff --git a/src/main/java/com/ycwl/basic/clickhouse/service/StatsQueryService.java b/src/main/java/com/ycwl/basic/clickhouse/service/StatsQueryService.java index 8478a473..47b3997f 100644 --- a/src/main/java/com/ycwl/basic/clickhouse/service/StatsQueryService.java +++ b/src/main/java/com/ycwl/basic/clickhouse/service/StatsQueryService.java @@ -89,4 +89,16 @@ public interface StatsQueryService { * 返回格式: [{t: "MM-dd", count: "xxx"}, ...] */ List> scanCodeMemberChartByDate(CommonQueryReq query); + + /** + * 按小时统计访问打印样片页面人数 + * 返回格式: [{t: "MM-dd HH", count: "xxx"}, ...] + */ + List> printerFromSampleChartByHour(CommonQueryReq query); + + /** + * 按日期统计访问打印样片页面人数 + * 返回格式: [{t: "MM-dd", count: "xxx"}, ...] + */ + List> printerFromSampleChartByDate(CommonQueryReq query); } diff --git a/src/main/java/com/ycwl/basic/clickhouse/service/impl/ClickHouseStatsQueryServiceImpl.java b/src/main/java/com/ycwl/basic/clickhouse/service/impl/ClickHouseStatsQueryServiceImpl.java index 8b887300..35dd1b27 100644 --- a/src/main/java/com/ycwl/basic/clickhouse/service/impl/ClickHouseStatsQueryServiceImpl.java +++ b/src/main/java/com/ycwl/basic/clickhouse/service/impl/ClickHouseStatsQueryServiceImpl.java @@ -396,4 +396,62 @@ public class ClickHouseStatsQueryServiceImpl implements StatsQueryService { return map; }); } + + @Override + public List> printerFromSampleChartByHour(CommonQueryReq query) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT formatDateTime(toStartOfHour(s.create_time), '%m-%d %H') AS t, "); + sql.append(" uniqExact(s.member_id) AS count "); + sql.append("FROM t_stats_record r "); + sql.append("INNER JOIN t_stats s ON r.trace_id = s.trace_id "); + sql.append("WHERE r.action = 'LOAD' "); + sql.append("AND r.identifier = 'pages/printer/hello' "); + if (query.getScenicId() != null) { + sql.append("AND JSONExtractString(r.params, 'scenicId') = '").append(query.getScenicId()).append("' "); + } + if (query.getStartTime() != null) { + sql.append("AND r.create_time >= ").append(formatDateTime(query.getStartTime())).append(" "); + } + if (query.getEndTime() != null) { + sql.append("AND r.create_time <= ").append(formatDateTime(query.getEndTime())).append(" "); + } + sql.append("GROUP BY toStartOfHour(s.create_time) "); + sql.append("ORDER BY toStartOfHour(s.create_time)"); + + return getJdbcTemplate().query(sql.toString(), (rs, rowNum) -> { + HashMap map = new HashMap<>(); + map.put("t", rs.getString("t")); + map.put("count", rs.getString("count")); + return map; + }); + } + + @Override + public List> printerFromSampleChartByDate(CommonQueryReq query) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT formatDateTime(toStartOfDay(s.create_time), '%m-%d') AS t, "); + sql.append(" uniqExact(s.member_id) AS count "); + sql.append("FROM t_stats_record r "); + sql.append("INNER JOIN t_stats s ON r.trace_id = s.trace_id "); + sql.append("WHERE r.action = 'LOAD' "); + sql.append("AND r.identifier = 'pages/printer/hello' "); + if (query.getScenicId() != null) { + sql.append("AND JSONExtractString(r.params, 'scenicId') = '").append(query.getScenicId()).append("' "); + } + if (query.getStartTime() != null) { + sql.append("AND r.create_time >= ").append(formatDateTime(query.getStartTime())).append(" "); + } + if (query.getEndTime() != null) { + sql.append("AND r.create_time <= ").append(formatDateTime(query.getEndTime())).append(" "); + } + sql.append("GROUP BY toStartOfDay(s.create_time) "); + sql.append("ORDER BY toStartOfDay(s.create_time)"); + + return getJdbcTemplate().query(sql.toString(), (rs, rowNum) -> { + HashMap map = new HashMap<>(); + map.put("t", rs.getString("t")); + map.put("count", rs.getString("count")); + return map; + }); + } } diff --git a/src/main/java/com/ycwl/basic/clickhouse/service/impl/MySqlStatsQueryServiceImpl.java b/src/main/java/com/ycwl/basic/clickhouse/service/impl/MySqlStatsQueryServiceImpl.java index 8739dc3d..950c0a4a 100644 --- a/src/main/java/com/ycwl/basic/clickhouse/service/impl/MySqlStatsQueryServiceImpl.java +++ b/src/main/java/com/ycwl/basic/clickhouse/service/impl/MySqlStatsQueryServiceImpl.java @@ -98,4 +98,14 @@ public class MySqlStatsQueryServiceImpl implements StatsQueryService { public List> scanCodeMemberChartByDate(CommonQueryReq query) { return statisticsMapper.scanCodeMemberChartByDate(query); } + + @Override + public List> printerFromSampleChartByHour(CommonQueryReq query) { + return statisticsMapper.printerFromSampleChartByHour(query); + } + + @Override + public List> printerFromSampleChartByDate(CommonQueryReq query) { + return statisticsMapper.printerFromSampleChartByDate(query); + } } diff --git a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java index 8f5e0067..71bfe3c5 100644 --- a/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/StatisticsMapper.java @@ -115,6 +115,16 @@ public interface StatisticsMapper { */ List> scanCodeMemberChartByDate(CommonQueryReq query); + /** + * 按小时统计访问打印样片页面人数 + */ + List> printerFromSampleChartByHour(CommonQueryReq query); + + /** + * 按日期统计访问打印样片页面人数 + */ + List> printerFromSampleChartByDate(CommonQueryReq query); + /** * 按小时统计订单数据 */ diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java index b7775169..3d378270 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/StatisticsServiceImpl.java @@ -83,8 +83,11 @@ public class StatisticsServiceImpl implements StatisticsService { // 2. 从 MySQL 获取订单数据 List> orderData = statisticsMapper.orderChartByHourForMerge(query); - // 3. 合并数据 - return mergeChartData(statsData, orderData); + // 3. 获取打印样片页面访问数据 + List> scanTvData = statsQueryService.printerFromSampleChartByHour(query); + + // 4. 合并数据 + return mergeChartData(statsData, orderData, scanTvData); } /** @@ -97,21 +100,26 @@ public class StatisticsServiceImpl implements StatisticsService { // 2. 从 MySQL 获取订单数据 List> orderData = statisticsMapper.orderChartByDateForMerge(query); - // 3. 合并数据 - return mergeChartData(statsData, orderData); + // 3. 获取打印样片页面访问数据 + List> scanTvData = statsQueryService.printerFromSampleChartByDate(query); + + // 4. 合并数据 + return mergeChartData(statsData, orderData, scanTvData); } /** - * 合并统计数据和订单数据 + * 合并统计数据、订单数据和打印样片访问数据 * 统计数据包含: t, count * 订单数据包含: t, orderCount, orderAmount - * 合并结果: t, count, orderCount, orderAmount + * 打印样片数据包含: t, count + * 合并结果: t, count, orderCount, orderAmount, scanTvCount */ private List> mergeChartData( List> statsData, - List> orderData) { + List> orderData, + List> scanTvData) { - // 将订单数据转为 Map 以便快速查找(使用 Object 类型处理数值) + // 将订单数据转为 Map 以便快速查找 Map> orderMap = orderData.stream() .collect(Collectors.toMap( m -> String.valueOf(m.get("t")), @@ -119,9 +127,19 @@ public class StatisticsServiceImpl implements StatisticsService { (existing, replacement) -> existing )); + // 将打印样片数据转为 Map 以便快速查找 + Map> scanTvMap = scanTvData.stream() + .collect(Collectors.toMap( + m -> String.valueOf(m.get("t")), + m -> m, + (existing, replacement) -> existing + )); + // 合并数据 for (HashMap stat : statsData) { String timeKey = String.valueOf(stat.get("t")); + + // 合并订单数据 HashMap order = orderMap.get(timeKey); if (order != null) { stat.put("orderCount", String.valueOf(order.get("orderCount"))); @@ -130,6 +148,14 @@ public class StatisticsServiceImpl implements StatisticsService { stat.put("orderCount", "0"); stat.put("orderAmount", "0"); } + + // 合并打印样片访问数据 + HashMap scanTv = scanTvMap.get(timeKey); + if (scanTv != null) { + stat.put("scanTvCount", String.valueOf(scanTv.get("count"))); + } else { + stat.put("scanTvCount", "0"); + } } return statsData; diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index 3eda8aef..18e6c295 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -456,6 +456,70 @@ ) scan_data ON scan_data.date_key = date_series.DATE_KEY ORDER BY date_series.date_value + +