|
@@ -14,6 +14,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
|
<result property="peakConcurrentViewers" column="peak_concurrent_viewers" />
|
|
<result property="peakConcurrentViewers" column="peak_concurrent_viewers" />
|
|
|
<result property="favouriteNum" column="favourite_num" />
|
|
<result property="favouriteNum" column="favourite_num" />
|
|
|
<result property="followNum" column="follow_num" />
|
|
<result property="followNum" column="follow_num" />
|
|
|
|
|
+ <result property="overviewBeforeLiveUv" column="overview_before_live_uv"/>
|
|
|
|
|
+ <result property="overviewTotalWatchUv" column="overview_total_watch_uv"/>
|
|
|
|
|
+ <result property="overviewOver10MinCount" column="overview_over_10_min_count"/>
|
|
|
|
|
+ <result property="overviewTotalWatchMinutes" column="overview_total_watch_minutes"/>
|
|
|
|
|
+ <result property="overviewWatchTotalSeconds" column="overview_watch_total_seconds"/>
|
|
|
|
|
+ <result property="overviewWatchUserCount" column="overview_watch_user_count"/>
|
|
|
|
|
+ <result property="overviewReplayWatchUv" column="overview_replay_watch_uv"/>
|
|
|
|
|
+ <result property="overviewReplayVisitPv" column="overview_replay_visit_pv"/>
|
|
|
|
|
+ <result property="overviewReplayOnlyCount" column="overview_replay_only_count"/>
|
|
|
|
|
+ <result property="overviewReplayTotalMinutes" column="overview_replay_total_minutes"/>
|
|
|
|
|
+ <result property="overviewReplayTotalSeconds" column="overview_replay_total_seconds"/>
|
|
|
|
|
+ <result property="overviewReplayUserCount" column="overview_replay_user_count"/>
|
|
|
|
|
+ <result property="overviewCompleteCount" column="overview_complete_count"/>
|
|
|
|
|
+ <result property="overviewSubscribeCount" column="overview_subscribe_count"/>
|
|
|
|
|
+ <result property="overviewLotteryCount" column="overview_lottery_count"/>
|
|
|
|
|
+ <result property="overviewLotteryJoinCount" column="overview_lottery_join_count"/>
|
|
|
|
|
+ <result property="overviewLotteryWinCount" column="overview_lottery_win_count"/>
|
|
|
|
|
+ <result property="overviewPaidUserCount" column="overview_paid_user_count"/>
|
|
|
|
|
+ <result property="overviewUnpaidUserCount" column="overview_unpaid_user_count"/>
|
|
|
|
|
+ <result property="overviewTotalGmv" column="overview_total_gmv"/>
|
|
|
|
|
+ <result property="overviewTotalProductQty" column="overview_total_product_qty"/>
|
|
|
</resultMap>
|
|
</resultMap>
|
|
|
|
|
|
|
|
<sql id="selectLiveDataVo">
|
|
<sql id="selectLiveDataVo">
|
|
@@ -39,6 +60,68 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
|
<include refid="selectLiveDataVo"/>
|
|
<include refid="selectLiveDataVo"/>
|
|
|
where live_id = #{liveId}
|
|
where live_id = #{liveId}
|
|
|
</select>
|
|
</select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 查询已有数据概览缓存的直播间(overview_before_live_uv 不为空表示已缓存) -->
|
|
|
|
|
+ <select id="selectLiveDataOverviewByLiveIds" resultMap="LiveDataResult">
|
|
|
|
|
+ SELECT live_id, overview_before_live_uv, overview_total_watch_uv, overview_over_10_min_count,
|
|
|
|
|
+ overview_total_watch_minutes, overview_watch_total_seconds, overview_watch_user_count,
|
|
|
|
|
+ overview_replay_watch_uv, overview_replay_visit_pv, overview_replay_only_count,
|
|
|
|
|
+ overview_replay_total_minutes, overview_replay_total_seconds, overview_replay_user_count,
|
|
|
|
|
+ overview_complete_count, overview_subscribe_count, overview_lottery_count,
|
|
|
|
|
+ overview_lottery_join_count, overview_lottery_win_count, overview_paid_user_count,
|
|
|
|
|
+ overview_unpaid_user_count, overview_total_gmv, overview_total_product_qty
|
|
|
|
|
+ FROM live_data
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND overview_before_live_uv IS NOT NULL
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 更新数据概览缓存 -->
|
|
|
|
|
+ <update id="updateLiveDataOverview" parameterType="LiveData">
|
|
|
|
|
+ UPDATE live_data SET
|
|
|
|
|
+ overview_before_live_uv = #{overviewBeforeLiveUv},
|
|
|
|
|
+ overview_total_watch_uv = #{overviewTotalWatchUv},
|
|
|
|
|
+ overview_over_10_min_count = #{overviewOver10MinCount},
|
|
|
|
|
+ overview_total_watch_minutes = #{overviewTotalWatchMinutes},
|
|
|
|
|
+ overview_watch_total_seconds = #{overviewWatchTotalSeconds},
|
|
|
|
|
+ overview_watch_user_count = #{overviewWatchUserCount},
|
|
|
|
|
+ overview_replay_watch_uv = #{overviewReplayWatchUv},
|
|
|
|
|
+ overview_replay_visit_pv = #{overviewReplayVisitPv},
|
|
|
|
|
+ overview_replay_only_count = #{overviewReplayOnlyCount},
|
|
|
|
|
+ overview_replay_total_minutes = #{overviewReplayTotalMinutes},
|
|
|
|
|
+ overview_replay_total_seconds = #{overviewReplayTotalSeconds},
|
|
|
|
|
+ overview_replay_user_count = #{overviewReplayUserCount},
|
|
|
|
|
+ overview_complete_count = #{overviewCompleteCount},
|
|
|
|
|
+ overview_subscribe_count = #{overviewSubscribeCount},
|
|
|
|
|
+ overview_lottery_count = #{overviewLotteryCount},
|
|
|
|
|
+ overview_lottery_join_count = #{overviewLotteryJoinCount},
|
|
|
|
|
+ overview_lottery_win_count = #{overviewLotteryWinCount},
|
|
|
|
|
+ overview_paid_user_count = #{overviewPaidUserCount},
|
|
|
|
|
+ overview_unpaid_user_count = #{overviewUnpaidUserCount},
|
|
|
|
|
+ overview_total_gmv = #{overviewTotalGmv},
|
|
|
|
|
+ overview_total_product_qty = #{overviewTotalProductQty}
|
|
|
|
|
+ WHERE live_id = #{liveId}
|
|
|
|
|
+ </update>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 插入数据概览缓存(仅 overview 字段,live_id 必填) -->
|
|
|
|
|
+ <insert id="insertLiveDataOverview" parameterType="LiveData">
|
|
|
|
|
+ INSERT INTO live_data (live_id, overview_before_live_uv, overview_total_watch_uv, overview_over_10_min_count,
|
|
|
|
|
+ overview_total_watch_minutes, overview_watch_total_seconds, overview_watch_user_count,
|
|
|
|
|
+ overview_replay_watch_uv, overview_replay_visit_pv, overview_replay_only_count,
|
|
|
|
|
+ overview_replay_total_minutes, overview_replay_total_seconds, overview_replay_user_count,
|
|
|
|
|
+ overview_complete_count, overview_subscribe_count, overview_lottery_count,
|
|
|
|
|
+ overview_lottery_join_count, overview_lottery_win_count, overview_paid_user_count,
|
|
|
|
|
+ overview_unpaid_user_count, overview_total_gmv, overview_total_product_qty)
|
|
|
|
|
+ VALUES (#{liveId}, #{overviewBeforeLiveUv}, #{overviewTotalWatchUv}, #{overviewOver10MinCount},
|
|
|
|
|
+ #{overviewTotalWatchMinutes}, #{overviewWatchTotalSeconds}, #{overviewWatchUserCount},
|
|
|
|
|
+ #{overviewReplayWatchUv}, #{overviewReplayVisitPv}, #{overviewReplayOnlyCount},
|
|
|
|
|
+ #{overviewReplayTotalMinutes}, #{overviewReplayTotalSeconds}, #{overviewReplayUserCount},
|
|
|
|
|
+ #{overviewCompleteCount}, #{overviewSubscribeCount}, #{overviewLotteryCount},
|
|
|
|
|
+ #{overviewLotteryJoinCount}, #{overviewLotteryWinCount}, #{overviewPaidUserCount},
|
|
|
|
|
+ #{overviewUnpaidUserCount}, #{overviewTotalGmv}, #{overviewTotalProductQty})
|
|
|
|
|
+ </insert>
|
|
|
<select id="getAllLiveIds" resultType="java.lang.Long">
|
|
<select id="getAllLiveIds" resultType="java.lang.Long">
|
|
|
SELECT B.live_id
|
|
SELECT B.live_id
|
|
|
FROM live B
|
|
FROM live B
|
|
@@ -363,6 +446,402 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
|
</foreach>
|
|
</foreach>
|
|
|
</select>
|
|
</select>
|
|
|
|
|
|
|
|
|
|
+ <!-- 直播数据统计-数据概览(12项指标) -->
|
|
|
|
|
+ <select id="selectLiveStatisticsOverview" resultType="com.fs.live.vo.LiveStatisticsOverviewVO">
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(DISTINCT lufe.user_id)
|
|
|
|
|
+ FROM live_user_first_entry lufe
|
|
|
|
|
+ INNER JOIN live l2 ON lufe.live_id = l2.live_id
|
|
|
|
|
+ WHERE lufe.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND COALESCE(lufe.first_entry_time, lufe.create_time) < l2.start_time
|
|
|
|
|
+ ), 0) AS beforeLiveUv,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_user_first_entry
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ ), 0) AS totalWatchUv,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT live_id, user_id
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ GROUP BY live_id, user_id
|
|
|
|
|
+ HAVING COALESCE(SUM(COALESCE(online_seconds,0)), 0) > 600
|
|
|
|
|
+ ) t
|
|
|
|
|
+ ), 0) AS over10MinCount,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT FLOOR(SUM(COALESCE(online_seconds, 0)) / 60)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ ), 0) AS totalWatchMinutes,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT CASE WHEN COUNT(DISTINCT user_id) > 0
|
|
|
|
|
+ THEN ROUND(SUM(COALESCE(online_seconds, 0)) / 60.0 / COUNT(DISTINCT user_id), 2)
|
|
|
|
|
+ ELSE 0 END
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ ), 0) AS avgWatchMinutes,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ ), 0) AS replayWatchUv,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ ), 0) AS replayVisitPv,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT lwu.user_id
|
|
|
|
|
+ FROM live_watch_user lwu
|
|
|
|
|
+ WHERE lwu.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND lwu.replay_flag = 1
|
|
|
|
|
+ AND NOT EXISTS (
|
|
|
|
|
+ SELECT 1 FROM live_watch_user lwu2
|
|
|
|
|
+ WHERE lwu2.live_id = lwu.live_id AND lwu2.user_id = lwu.user_id AND lwu2.live_flag = 1
|
|
|
|
|
+ )
|
|
|
|
|
+ GROUP BY lwu.live_id, lwu.user_id
|
|
|
|
|
+ ) t
|
|
|
|
|
+ ), 0) AS replayOnlyCount,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT FLOOR(SUM(COALESCE(online_seconds, 0)) / 60)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ ), 0) AS replayTotalMinutes,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT CASE WHEN COUNT(DISTINCT user_id) > 0
|
|
|
|
|
+ THEN ROUND(SUM(COALESCE(online_seconds, 0)) / 60.0 / COUNT(DISTINCT user_id), 2)
|
|
|
|
|
+ ELSE 0 END
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ ), 0) AS replayAvgMinutes,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT live_id, user_id
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ GROUP BY live_id, user_id
|
|
|
|
|
+ HAVING COALESCE(SUM(COALESCE(online_seconds,0)), 0) >= 1200
|
|
|
|
|
+ ) t
|
|
|
|
|
+ ), 0) AS completeCount,
|
|
|
|
|
+ COALESCE((
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM fs_miniprogram_sub_notify_task
|
|
|
|
|
+ WHERE task_name = '直播间预约提醒'
|
|
|
|
|
+ AND (
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" separator=" OR ">
|
|
|
|
|
+ page LIKE CONCAT('%liveId=', #{liveId}, '%')
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ )
|
|
|
|
|
+ ), 0) AS subscribeCount,
|
|
|
|
|
+ COALESCE((SELECT COUNT(*) FROM live_lottery_conf WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ ), 0) AS lotteryCount,
|
|
|
|
|
+ COALESCE((SELECT COUNT(DISTINCT user_id) FROM live_lottery_registration WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ ), 0) AS lotteryJoinCount,
|
|
|
|
|
+ COALESCE((SELECT COUNT(*) FROM live_lottery_registration WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND is_win = 1), 0) AS lotteryWinCount,
|
|
|
|
|
+ COALESCE((SELECT COUNT(DISTINCT user_id) FROM live_order WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND (is_pay = '1' OR is_pay = 1)), 0) AS paidUserCount,
|
|
|
|
|
+ COALESCE((SELECT COUNT(DISTINCT user_id) FROM live_order WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND (is_pay IS NULL OR is_pay != '1' OR (is_pay IS NOT NULL AND is_pay != 1))), 0) AS unpaidUserCount,
|
|
|
|
|
+ COALESCE((SELECT SUM(COALESCE(pay_price, 0)) FROM live_order WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND (is_pay = '1' OR is_pay = 1)), 0) AS totalGmv,
|
|
|
|
|
+ COALESCE((SELECT SUM(COALESCE(loi.num, 0)) FROM live_order_item loi
|
|
|
|
|
+ INNER JOIN live_order lo ON loi.order_id = lo.order_id
|
|
|
|
|
+ WHERE lo.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND (lo.is_pay = '1' OR lo.is_pay = 1)), 0) AS totalProductQty
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- ========== 数据概览拆分查询(每表独立查询,Java层合并) ========== -->
|
|
|
|
|
+ <!-- live_user_first_entry + live -->
|
|
|
|
|
+ <select id="selectOverviewBeforeLiveUv" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT lufe.user_id)
|
|
|
|
|
+ FROM live_user_first_entry lufe
|
|
|
|
|
+ INNER JOIN live l2 ON lufe.live_id = l2.live_id
|
|
|
|
|
+ WHERE lufe.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND COALESCE(lufe.first_entry_time, lufe.create_time) < l2.start_time
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- live_user_first_entry -->
|
|
|
|
|
+ <select id="selectOverviewTotalWatchUv" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_user_first_entry
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- live_watch_user -->
|
|
|
|
|
+ <select id="selectOverviewOver10MinCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT live_id, user_id
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ GROUP BY live_id, user_id
|
|
|
|
|
+ HAVING COALESCE(SUM(COALESCE(online_seconds,0)), 0) > 600
|
|
|
|
|
+ ) t
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewWatchTotalSeconds" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COALESCE(SUM(COALESCE(online_seconds, 0)), 0)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewWatchUserCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewReplayWatchUv" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewReplayVisitPv" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewReplayOnlyCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT lwu.user_id
|
|
|
|
|
+ FROM live_watch_user lwu
|
|
|
|
|
+ WHERE lwu.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND lwu.replay_flag = 1
|
|
|
|
|
+ AND NOT EXISTS (
|
|
|
|
|
+ SELECT 1 FROM live_watch_user lwu2
|
|
|
|
|
+ WHERE lwu2.live_id = lwu.live_id AND lwu2.user_id = lwu.user_id AND lwu2.live_flag = 1
|
|
|
|
|
+ )
|
|
|
|
|
+ GROUP BY lwu.live_id, lwu.user_id
|
|
|
|
|
+ ) t
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewReplayTotalSeconds" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COALESCE(SUM(COALESCE(online_seconds, 0)), 0)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewReplayUserCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND replay_flag = 1
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewCompleteCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT live_id, user_id
|
|
|
|
|
+ FROM live_watch_user
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ GROUP BY live_id, user_id
|
|
|
|
|
+ HAVING COALESCE(SUM(COALESCE(online_seconds,0)), 0) >= 1200
|
|
|
|
|
+ ) t
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- fs_miniprogram_sub_notify_task -->
|
|
|
|
|
+ <select id="selectOverviewSubscribeCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM fs_miniprogram_sub_notify_task
|
|
|
|
|
+ WHERE task_name = '直播间预约提醒'
|
|
|
|
|
+ AND (
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" separator=" OR ">
|
|
|
|
|
+ page LIKE CONCAT('%liveId=', #{liveId}, '%')
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ )
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- live_lottery_conf -->
|
|
|
|
|
+ <select id="selectOverviewLotteryCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM live_lottery_conf
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- live_lottery_registration -->
|
|
|
|
|
+ <select id="selectOverviewLotteryJoinCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_lottery_registration
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewLotteryWinCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(*)
|
|
|
|
|
+ FROM live_lottery_registration
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND is_win = 1
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- live_order -->
|
|
|
|
|
+ <select id="selectOverviewPaidUserCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_order
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND (is_pay = '1' OR is_pay = 1)
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewUnpaidUserCount" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COUNT(DISTINCT user_id)
|
|
|
|
|
+ FROM live_order
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND (is_pay IS NULL OR is_pay != '1' OR (is_pay IS NOT NULL AND is_pay != 1))
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <select id="selectOverviewTotalGmv" resultType="java.math.BigDecimal">
|
|
|
|
|
+ SELECT COALESCE(SUM(COALESCE(pay_price, 0)), 0)
|
|
|
|
|
+ FROM live_order
|
|
|
|
|
+ WHERE live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND (is_pay = '1' OR is_pay = 1)
|
|
|
|
|
+ </select>
|
|
|
|
|
+ <!-- live_order_item + live_order -->
|
|
|
|
|
+ <select id="selectOverviewTotalProductQty" resultType="java.lang.Long">
|
|
|
|
|
+ SELECT COALESCE(SUM(COALESCE(loi.num, 0)), 0)
|
|
|
|
|
+ FROM live_order_item loi
|
|
|
|
|
+ INNER JOIN live_order lo ON loi.order_id = lo.order_id
|
|
|
|
|
+ WHERE lo.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND (lo.is_pay = '1' OR lo.is_pay = 1)
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 直播趋势:查询进入直播间原始数据(相对时间计算用) -->
|
|
|
|
|
+ <select id="selectLiveEntryTrendRawData" resultType="java.util.HashMap">
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ l.live_id AS liveId,
|
|
|
|
|
+ l.live_name AS liveName,
|
|
|
|
|
+ l.start_time AS startTime,
|
|
|
|
|
+ COALESCE(lufe.first_entry_time, lufe.create_time) AS entryTime
|
|
|
|
|
+ FROM live_user_first_entry lufe
|
|
|
|
|
+ INNER JOIN live l ON lufe.live_id = l.live_id
|
|
|
|
|
+ WHERE lufe.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND l.start_time IS NOT NULL
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 直播间学员列表(基于 live_user_first_entry) -->
|
|
|
|
|
+ <select id="selectLiveRoomStudentList" resultType="com.fs.live.vo.LiveRoomStudentQueryVO">
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ COALESCE(u.avatar, '') AS avatar,
|
|
|
|
|
+ COALESCE(u.nick_name, u.nickname, '未知用户') AS userName,
|
|
|
|
|
+ COALESCE(l.live_name, '') AS liveName,
|
|
|
|
|
+ COALESCE(cu.user_name, '') AS salesName,
|
|
|
|
|
+ u.create_time AS userCreateTime,
|
|
|
|
|
+ COALESCE(u.phone, '') AS phone
|
|
|
|
|
+ FROM live_user_first_entry lufe
|
|
|
|
|
+ LEFT JOIN fs_user u ON lufe.user_id = u.user_id
|
|
|
|
|
+ LEFT JOIN live l ON lufe.live_id = l.live_id
|
|
|
|
|
+ LEFT JOIN company_user cu ON lufe.company_user_id = cu.user_id
|
|
|
|
|
+ <where>
|
|
|
|
|
+ <if test="param.liveIds != null and param.liveIds.size() > 0">
|
|
|
|
|
+ AND lufe.live_id IN
|
|
|
|
|
+ <foreach collection="param.liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </if>
|
|
|
|
|
+ <if test="param.firstEntryTimeBegin != null">
|
|
|
|
|
+ AND lufe.create_time >= #{param.firstEntryTimeBegin}
|
|
|
|
|
+ </if>
|
|
|
|
|
+ <if test="param.firstEntryTimeEnd != null">
|
|
|
|
|
+ AND lufe.create_time <= #{param.firstEntryTimeEnd}
|
|
|
|
|
+ </if>
|
|
|
|
|
+ </where>
|
|
|
|
|
+ ORDER BY lufe.create_time DESC
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
<!-- 查询直播间列表数据 -->
|
|
<!-- 查询直播间列表数据 -->
|
|
|
<select id="selectLiveDataListByLiveIds" resultType="com.fs.live.vo.LiveDataListVo">
|
|
<select id="selectLiveDataListByLiveIds" resultType="com.fs.live.vo.LiveDataListVo">
|
|
|
SELECT
|
|
SELECT
|
|
@@ -809,4 +1288,135 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
|
</if>
|
|
</if>
|
|
|
GROUP BY cu.company_id, c.company_name
|
|
GROUP BY cu.company_id, c.company_name
|
|
|
</select>
|
|
</select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 商品对比统计:按商品汇总 下单未支付人数、成交人数、成交金额 -->
|
|
|
|
|
+ <select id="selectProductCompareList" resultType="com.fs.live.vo.ProductCompareVO">
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ t.product_id AS productId,
|
|
|
|
|
+ COALESCE(fsp.product_name, '未知商品') AS productName,
|
|
|
|
|
+ t.unpaid_user_count AS unpaidUserCount,
|
|
|
|
|
+ t.paid_user_count AS paidUserCount,
|
|
|
|
|
+ t.total_gmv AS totalGmv
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ pid AS product_id,
|
|
|
|
|
+ COUNT(DISTINCT CASE WHEN is_paid = 0 THEN user_id END) AS unpaid_user_count,
|
|
|
|
|
+ COUNT(DISTINCT CASE WHEN is_paid = 1 THEN user_id END) AS paid_user_count,
|
|
|
|
|
+ COALESCE(SUM(CASE WHEN is_paid = 1 THEN gmv ELSE 0 END), 0) AS total_gmv
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ <!-- 来自 live_order 单商品订单 -->
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ lo.product_id AS pid,
|
|
|
|
|
+ lo.user_id AS user_id,
|
|
|
|
|
+ CASE WHEN (lo.is_pay = '1' OR lo.is_pay = 1) THEN 1 ELSE 0 END AS is_paid,
|
|
|
|
|
+ CASE WHEN (lo.is_pay = '1' OR lo.is_pay = 1) THEN COALESCE(lo.pay_price, 0) ELSE 0 END AS gmv
|
|
|
|
|
+ FROM live_order lo
|
|
|
|
|
+ WHERE lo.live_id IN
|
|
|
|
|
+ <foreach collection="param.liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND lo.product_id IS NOT NULL
|
|
|
|
|
+ <if test="param.productIds != null and param.productIds.size() > 0">
|
|
|
|
|
+ AND lo.product_id IN
|
|
|
|
|
+ <foreach collection="param.productIds" item="pid" open="(" separator="," close=")">#{pid}</foreach>
|
|
|
|
|
+ </if>
|
|
|
|
|
+ UNION ALL
|
|
|
|
|
+ <!-- 来自 live_order_item 多商品订单 -->
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ loi.product_id AS pid,
|
|
|
|
|
+ lo.user_id AS user_id,
|
|
|
|
|
+ CASE WHEN (lo.is_pay = '1' OR lo.is_pay = 1) THEN 1 ELSE 0 END AS is_paid,
|
|
|
|
|
+ CASE WHEN (lo.is_pay = '1' OR lo.is_pay = 1)
|
|
|
|
|
+ THEN COALESCE(lo.pay_price, 0) * COALESCE(loi.num, 0) / NULLIF(lo.total_num, 0)
|
|
|
|
|
+ ELSE 0 END AS gmv
|
|
|
|
|
+ FROM live_order_item loi
|
|
|
|
|
+ INNER JOIN live_order lo ON loi.order_id = lo.order_id
|
|
|
|
|
+ WHERE lo.live_id IN
|
|
|
|
|
+ <foreach collection="param.liveIds" item="liveId" open="(" separator="," close=")">#{liveId}</foreach>
|
|
|
|
|
+ AND loi.product_id IS NOT NULL
|
|
|
|
|
+ AND (lo.product_id IS NULL OR lo.product_id != loi.product_id)
|
|
|
|
|
+ <if test="param.productIds != null and param.productIds.size() > 0">
|
|
|
|
|
+ AND loi.product_id IN
|
|
|
|
|
+ <foreach collection="param.productIds" item="pid" open="(" separator="," close=")">#{pid}</foreach>
|
|
|
|
|
+ </if>
|
|
|
|
|
+ ) sub
|
|
|
|
|
+ GROUP BY pid
|
|
|
|
|
+ ) t
|
|
|
|
|
+ LEFT JOIN fs_store_product_scrm fsp ON fsp.product_id = t.product_id
|
|
|
|
|
+ ORDER BY t.total_gmv DESC
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 邀课对比-分享人选项(基于 live_user_first_entry 中存在的 company_id, company_user_id) -->
|
|
|
|
|
+ <select id="selectInviteSalesOptions" resultType="com.fs.live.vo.InviteSalesOptionVO">
|
|
|
|
|
+ SELECT DISTINCT
|
|
|
|
|
+ lufe.company_id AS companyId,
|
|
|
|
|
+ lufe.company_user_id AS companyUserId,
|
|
|
|
|
+ COALESCE(cu.user_name, '未知销售') AS salesName,
|
|
|
|
|
+ COALESCE(c.company_name, '未知公司') AS companyName
|
|
|
|
|
+ FROM live_user_first_entry lufe
|
|
|
|
|
+ LEFT JOIN company c ON lufe.company_id = c.company_id
|
|
|
|
|
+ LEFT JOIN company_user cu ON lufe.company_user_id = cu.user_id
|
|
|
|
|
+ WHERE lufe.live_id IN
|
|
|
|
|
+ <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND lufe.company_id IS NOT NULL
|
|
|
|
|
+ AND lufe.company_user_id IS NOT NULL
|
|
|
|
|
+ ORDER BY c.company_name, cu.user_name
|
|
|
|
|
+ </select>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 邀课对比统计:按销售汇总 归属公司、销售名称、邀请人数、已支付订单数、订单总金额 -->
|
|
|
|
|
+ <select id="selectInviteCompareList" resultType="com.fs.live.vo.InviteCompareVO">
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ t.company_id AS companyId,
|
|
|
|
|
+ COALESCE(c.company_name, '未知公司') AS companyName,
|
|
|
|
|
+ t.company_user_id AS companyUserId,
|
|
|
|
|
+ COALESCE(cu.user_name, '未知销售') AS salesName,
|
|
|
|
|
+ t.invite_count AS inviteCount,
|
|
|
|
|
+ COALESCE(ord.paid_order_count, 0) AS paidOrderCount,
|
|
|
|
|
+ COALESCE(ord.total_gmv, 0) AS totalGmv
|
|
|
|
|
+ FROM (
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ lufe.company_id,
|
|
|
|
|
+ lufe.company_user_id,
|
|
|
|
|
+ COUNT(DISTINCT lufe.user_id) AS invite_count
|
|
|
|
|
+ FROM live_user_first_entry lufe
|
|
|
|
|
+ WHERE lufe.live_id IN
|
|
|
|
|
+ <foreach collection="param.liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND lufe.company_id IS NOT NULL
|
|
|
|
|
+ AND lufe.company_user_id IS NOT NULL
|
|
|
|
|
+ <if test="param.companyUserIds != null and param.companyUserIds.size() > 0">
|
|
|
|
|
+ AND lufe.company_user_id IN
|
|
|
|
|
+ <foreach collection="param.companyUserIds" item="uid" open="(" separator="," close=")">
|
|
|
|
|
+ #{uid}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </if>
|
|
|
|
|
+ GROUP BY lufe.company_id, lufe.company_user_id
|
|
|
|
|
+ ) t
|
|
|
|
|
+ LEFT JOIN company c ON t.company_id = c.company_id
|
|
|
|
|
+ LEFT JOIN company_user cu ON t.company_user_id = cu.user_id
|
|
|
|
|
+ LEFT JOIN (
|
|
|
|
|
+ SELECT
|
|
|
|
|
+ lo.company_id,
|
|
|
|
|
+ lo.company_user_id,
|
|
|
|
|
+ COUNT(*) AS paid_order_count,
|
|
|
|
|
+ COALESCE(SUM(lo.pay_price), 0) AS total_gmv
|
|
|
|
|
+ FROM live_order lo
|
|
|
|
|
+ WHERE lo.live_id IN
|
|
|
|
|
+ <foreach collection="param.liveIds" item="liveId" open="(" separator="," close=")">
|
|
|
|
|
+ #{liveId}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ AND (lo.is_pay = '1' OR lo.is_pay = 1)
|
|
|
|
|
+ AND lo.company_id IS NOT NULL
|
|
|
|
|
+ AND lo.company_user_id IS NOT NULL
|
|
|
|
|
+ <if test="param.companyUserIds != null and param.companyUserIds.size() > 0">
|
|
|
|
|
+ AND lo.company_user_id IN
|
|
|
|
|
+ <foreach collection="param.companyUserIds" item="uid" open="(" separator="," close=")">
|
|
|
|
|
+ #{uid}
|
|
|
|
|
+ </foreach>
|
|
|
|
|
+ </if>
|
|
|
|
|
+ GROUP BY lo.company_id, lo.company_user_id
|
|
|
|
|
+ ) ord ON t.company_id = ord.company_id AND t.company_user_id = ord.company_user_id
|
|
|
|
|
+ ORDER BY ord.total_gmv DESC, t.invite_count DESC
|
|
|
|
|
+ </select>
|
|
|
</mapper>
|
|
</mapper>
|