refactor(statistics): 切换数据查询服务并优化扫码统计功能

- 将 BrokerBiz 和 OrderBiz 中的数据查询从 StatisticsMapper 切换到 StatsQueryService
- 更新 StatisticsServiceImpl 使用 StatsQueryService 进行数据查询
- 添加订单数据合并功能到扫码统计图表中
- 重构扫码统计查询逻辑以支持统计数据和订单数据的合并显示
- 新增按小时和按日期统计订单数据的查询方法
- 优化 SQL 查询以分离统计数据和订单数据的查询逻辑
This commit is contained in:
2026-01-12 18:30:27 +08:00
parent 3bd658cc1f
commit f8c6604a8a
6 changed files with 165 additions and 50 deletions

View File

@@ -386,11 +386,11 @@
</insert>
<select id="scanCodeMemberChartByHour" resultType="java.util.HashMap">
WITH RECURSIVE hour_series AS (
SELECT
SELECT
#{startTime} AS hour_time,
DATE_FORMAT(#{startTime}, '%m-%d %H') AS HOUR
UNION ALL
SELECT
SELECT
DATE_ADD(hour_time, INTERVAL 1 HOUR) AS hour_time,
DATE_FORMAT(DATE_ADD(hour_time, INTERVAL 1 HOUR), '%m-%d %H') AS HOUR
FROM hour_series
@@ -398,18 +398,16 @@
)
SELECT
hour_series.HOUR as t,
COALESCE(scan_data.member_count, 0) AS count,
COALESCE(order_data.order_count, 0) AS orderCount,
COALESCE(order_data.order_amount, 0) AS orderAmount
COALESCE(scan_data.member_count, 0) AS count
FROM hour_series
LEFT JOIN (
SELECT
SELECT
DATE_FORMAT(s.create_time, '%m-%d %H') AS hour_key,
COUNT(DISTINCT s.member_id) AS member_count
FROM `t_stats_record` r
LEFT JOIN `t_stats` s ON r.trace_id = s.trace_id
WHERE r.trace_id IN (
SELECT trace_id FROM `t_stats_record`
SELECT trace_id FROM `t_stats_record`
WHERE action = 'ENTER_SCENIC'
<if test="scenicId != null">
AND `identifier` = #{scenicId}
@@ -420,8 +418,63 @@
AND s.create_time BETWEEN #{startTime} AND #{endTime}
GROUP BY DATE_FORMAT(s.create_time, '%m-%d %H')
) scan_data ON scan_data.hour_key = hour_series.HOUR
ORDER BY hour_series.hour_time
</select>
<select id="scanCodeMemberChartByDate" resultType="java.util.HashMap">
WITH RECURSIVE date_series AS (
SELECT
DATE(#{startTime}) AS date_value,
DATE_FORMAT(#{startTime}, '%m-%d') AS DATE_KEY
UNION ALL
SELECT
DATE_ADD(date_value, INTERVAL 1 DAY) AS date_value,
DATE_FORMAT(DATE_ADD(date_value, INTERVAL 1 DAY), '%m-%d') AS DATE_KEY
FROM date_series
WHERE DATE_ADD(date_value, INTERVAL 1 DAY) &lt;= DATE(#{endTime})
)
SELECT
date_series.DATE_KEY as t,
COALESCE(scan_data.member_count, 0) AS count
FROM date_series
LEFT JOIN (
SELECT
SELECT
DATE_FORMAT(s.create_time, '%m-%d') AS date_key,
COUNT(DISTINCT s.member_id) AS member_count
FROM `t_stats_record` r
LEFT JOIN `t_stats` s ON r.trace_id = s.trace_id
WHERE r.trace_id IN (
SELECT trace_id FROM `t_stats_record`
WHERE action = 'ENTER_SCENIC'
<if test="scenicId != null">
AND `identifier` = #{scenicId}
</if>
)
AND r.action = 'LAUNCH'
AND JSON_EXTRACT(`params`, '$.scene') IN (1047, 1048, 1049)
AND s.create_time BETWEEN #{startTime} AND #{endTime}
GROUP BY DATE_FORMAT(s.create_time, '%m-%d')
) scan_data ON scan_data.date_key = date_series.DATE_KEY
ORDER BY date_series.date_value
</select>
<select id="orderChartByHourForMerge" resultType="java.util.HashMap">
WITH RECURSIVE hour_series AS (
SELECT
#{startTime} AS hour_time,
DATE_FORMAT(#{startTime}, '%m-%d %H') AS HOUR
UNION ALL
SELECT
DATE_ADD(hour_time, INTERVAL 1 HOUR) AS hour_time,
DATE_FORMAT(DATE_ADD(hour_time, INTERVAL 1 HOUR), '%m-%d %H') AS HOUR
FROM hour_series
WHERE DATE_ADD(hour_time, INTERVAL 1 HOUR) &lt;= #{endTime}
)
SELECT
hour_series.HOUR as t,
COALESCE(order_data.order_count, 0) AS orderCount,
COALESCE(order_data.order_amount, 0) AS orderAmount
FROM hour_series
LEFT JOIN (
SELECT
DATE_FORMAT(create_at, '%m-%d %H') AS hour_key,
COUNT(id) AS order_count,
SUM(pay_price) AS order_amount
@@ -435,13 +488,13 @@
) order_data ON order_data.hour_key = hour_series.HOUR
ORDER BY hour_series.hour_time
</select>
<select id="scanCodeMemberChartByDate" resultType="java.util.HashMap">
<select id="orderChartByDateForMerge" resultType="java.util.HashMap">
WITH RECURSIVE date_series AS (
SELECT
SELECT
DATE(#{startTime}) AS date_value,
DATE_FORMAT(#{startTime}, '%m-%d') AS DATE_KEY
UNION ALL
SELECT
SELECT
DATE_ADD(date_value, INTERVAL 1 DAY) AS date_value,
DATE_FORMAT(DATE_ADD(date_value, INTERVAL 1 DAY), '%m-%d') AS DATE_KEY
FROM date_series
@@ -449,30 +502,11 @@
)
SELECT
date_series.DATE_KEY as t,
COALESCE(scan_data.member_count, 0) AS count,
COALESCE(order_data.order_count, 0) AS orderCount,
COALESCE(order_data.order_amount, 0) AS orderAmount
FROM date_series
LEFT JOIN (
SELECT
DATE_FORMAT(s.create_time, '%m-%d') AS date_key,
COUNT(DISTINCT s.member_id) AS member_count
FROM `t_stats_record` r
LEFT JOIN `t_stats` s ON r.trace_id = s.trace_id
WHERE r.trace_id IN (
SELECT trace_id FROM `t_stats_record`
WHERE action = 'ENTER_SCENIC'
<if test="scenicId != null">
AND `identifier` = #{scenicId}
</if>
)
AND r.action = 'LAUNCH'
AND JSON_EXTRACT(`params`, '$.scene') IN (1047, 1048, 1049)
AND s.create_time BETWEEN #{startTime} AND #{endTime}
GROUP BY DATE_FORMAT(s.create_time, '%m-%d')
) scan_data ON scan_data.date_key = date_series.DATE_KEY
LEFT JOIN (
SELECT
SELECT
DATE_FORMAT(create_at, '%m-%d') AS date_key,
COUNT(id) AS order_count,
SUM(pay_price) AS order_amount