首页统计

This commit is contained in:
2025-08-08 16:10:13 +08:00
parent 5b8d18d913
commit fcde865a2d
5 changed files with 277 additions and 162 deletions

View File

@@ -319,176 +319,158 @@
AND date BETWEEN #{startTime} AND #{endTime}
</select>
<select id="orderChartByDate" resultType="java.util.HashMap">
WITH RECURSIVE date_series AS (
SELECT
DATE(#{startTime}) AS date_value
UNION ALL
SELECT
DATE_ADD(date_value, INTERVAL 1 DAY) AS date_value
FROM date_series
WHERE DATE_ADD(date_value, INTERVAL 1 DAY) &lt;= DATE(#{endTime})
)
SELECT
DATE(date_series.DATE) as t,
COALESCE ( count( `order`.id ), 0 ) AS count,
COALESCE ( sum( `order`.pay_price ), 0 ) AS price
FROM
(
SELECT
DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) DAY ) AS DATE
FROM
(
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) units
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) tens
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) hundreds
WHERE
DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) DAY ) &lt;= #{endTime}
) date_series
LEFT JOIN `order` ON DATE ( `order`.create_at ) = date_series.DATE AND `order`.scenic_id = #{scenicId} AND ( `order`.STATUS = 1 OR `order`.STATUS = 2 )
GROUP BY
date_series.DATE
ORDER BY date_series.DATE
DATE(date_series.date_value) as t,
COALESCE(COUNT(`order`.id), 0) AS count,
COALESCE(SUM(`order`.pay_price), 0) AS price
FROM date_series
LEFT JOIN `order` ON DATE(`order`.create_at) = date_series.date_value
<if test="scenicId != null">
AND `order`.scenic_id = #{scenicId}
</if>
AND (`order`.STATUS = 1 OR `order`.STATUS = 2)
GROUP BY date_series.date_value
ORDER BY date_series.date_value
</select>
<select id="orderChartByHour" 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
date_series.HOUR as t,
COALESCE ( count( `order`.id ), 0 ) AS count,
COALESCE ( sum( `order`.pay_price ), 0 ) AS price
FROM
(
SELECT
DATE_FORMAT( DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) HOUR ), '%m-%d %H') AS HOUR
FROM
(
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) units
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) tens
CROSS JOIN (
SELECT
0 AS i UNION ALL
SELECT
1 UNION ALL
SELECT
2 UNION ALL
SELECT
3 UNION ALL
SELECT
4 UNION ALL
SELECT
5 UNION ALL
SELECT
6 UNION ALL
SELECT
7 UNION ALL
SELECT
8 UNION ALL
SELECT
9
) hundreds
WHERE
DATE_ADD( #{startTime}, INTERVAL ( units.i + tens.i * 10 + hundreds.i * 100 ) HOUR ) &lt;= #{endTime}
) date_series
LEFT JOIN `order` ON DATE_FORMAT( `order`.create_at, '%m-%d %H' ) = date_series.HOUR AND `order`.scenic_id = #{scenicId} AND ( `order`.STATUS = 1 OR `order`.STATUS = 2 )
GROUP BY
date_series.HOUR
ORDER BY date_series.HOUR
hour_series.HOUR as t,
COALESCE(COUNT(`order`.id), 0) AS count,
COALESCE(SUM(`order`.pay_price), 0) AS price
FROM hour_series
LEFT JOIN `order` ON DATE_FORMAT(`order`.create_at, '%m-%d %H') = hour_series.HOUR
<if test="scenicId != null">
AND `order`.scenic_id = #{scenicId}
</if>
AND (`order`.STATUS = 1 OR `order`.STATUS = 2)
GROUP BY hour_series.HOUR, hour_series.hour_time
ORDER BY hour_series.hour_time
</select>
<insert id="insertStat">
REPLACE INTO scenic_stats (scenic_id, date, cs1, v1, sv1, u1, m1, gv1, gv2, pv1, pv2, cp1, o1, o2, o3, ro2, ro3)
VALUES (#{scenicId}, #{date}, #{data.cameraShotOfMemberNum}, #{data.totalVisitorOfMemberNum}, #{data.scanCodeVisitorOfMemberNum}, #{data.uploadFaceOfMemberNum}, #{data.pushOfMemberNum}, #{data.completeVideoOfMemberNum}, #{data.completeOfVideoNum}, #{data.previewVideoOfMemberNum}, #{data.previewOfVideoNum}, #{data.clickOnPayOfMemberNum}, #{data.payOfMemberNum}, #{data.payOfOrderNum}, #{data.payOfOrderAmount}, #{data.refundOfOrderNum}, #{data.refundOfOrderAmount})
</insert>
<select id="scanCodeMemberChartByHour" 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(scan_data.member_count, 0) AS count,
COALESCE(order_data.order_count, 0) AS orderCount,
COALESCE(order_data.order_amount, 0) AS orderAmount
FROM hour_series
LEFT JOIN (
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`
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 %H')
) scan_data ON scan_data.hour_key = hour_series.HOUR
LEFT JOIN (
SELECT
DATE_FORMAT(create_at, '%m-%d %H') AS hour_key,
COUNT(id) AS order_count,
SUM(pay_price) AS order_amount
FROM `order`
WHERE (status = 1 OR status = 2)
<if test="scenicId != null">
AND scenic_id = #{scenicId}
</if>
AND create_at BETWEEN #{startTime} AND #{endTime}
GROUP BY DATE_FORMAT(create_at, '%m-%d %H')
) order_data ON order_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,
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
DATE_FORMAT(create_at, '%m-%d') AS date_key,
COUNT(id) AS order_count,
SUM(pay_price) AS order_amount
FROM `order`
WHERE (status = 1 OR status = 2)
<if test="scenicId != null">
AND scenic_id = #{scenicId}
</if>
AND create_at BETWEEN #{startTime} AND #{endTime}
GROUP BY DATE_FORMAT(create_at, '%m-%d')
) order_data ON order_data.date_key = date_series.DATE_KEY
ORDER BY date_series.date_value
</select>
</mapper>