id, dept_id, company_user_id, train_camp_num, not_registered_num, registered_num,
reg_rate, finished_rate, offline_total, offline_not_part, offline_not_watched,
online_total, online_online_rate, online_playback_comple_rate,
online_incomplete_playback, online_complete_playback
INSERT INTO fs_statis_saler_watch (
dept_id, company_user_id, train_camp_num,
not_registered_num, registered_num,completed_num,interrupt_num, reg_rate,
finished_rate, offline_total, offline_not_part,
offline_not_watched, online_total, online_online_rate,
online_playback_comple_rate, online_incomplete_playback,
online_complete_playback,period_id,data_date,sop_id,send_num
) VALUES
(
#{item.deptId,jdbcType=INTEGER},
#{item.companyUserId,jdbcType=INTEGER},
#{item.trainCampNum,jdbcType=INTEGER},
#{item.notRegisteredNum,jdbcType=INTEGER},
#{item.registeredNum,jdbcType=INTEGER},
#{item.completedNum,jdbcType=INTEGER},
#{item.interruptNum,jdbcType=INTEGER},
#{item.regRate,jdbcType=FLOAT},
#{item.finishedRate,jdbcType=FLOAT},
#{item.offlineTotal,jdbcType=INTEGER},
#{item.offlineNotPart,jdbcType=INTEGER},
#{item.offlineNotWatched,jdbcType=INTEGER},
#{item.onlineTotal,jdbcType=INTEGER},
#{item.onlineOnlineRate,jdbcType=FLOAT},
#{item.onlinePlaybackCompleRate,jdbcType=FLOAT},
#{item.onlineIncompletePlayback,jdbcType=INTEGER},
#{item.onlineCompletePlayback,jdbcType=INTEGER},
#{item.periodId,jdbcType=VARCHAR},
#{item.dataDate,jdbcType=VARCHAR},
#{item.sopId,jdbcType=VARCHAR},
#{item.sendNum,jdbcType=VARCHAR}
)
ON DUPLICATE KEY UPDATE
train_camp_num = VALUES(train_camp_num),
not_registered_num = VALUES(not_registered_num),
registered_num = VALUES(registered_num),
completed_num = VALUES(completed_num),
interrupt_num = VALUES(interrupt_num),
reg_rate = VALUES(reg_rate),
finished_rate = VALUES(finished_rate),
offline_total = VALUES(offline_total),
offline_not_part = VALUES(offline_not_part),
offline_not_watched = VALUES(offline_not_watched),
online_total = VALUES(online_total),
online_online_rate = VALUES(online_online_rate),
online_playback_comple_rate = VALUES(online_playback_comple_rate),
online_incomplete_playback = VALUES(online_incomplete_playback),
online_complete_playback = VALUES(online_complete_playback)
REPLACE INTO fs_statis_saler_watch (
company_user_id,
sop_id,
period_id,
data_date,
send_num,
train_camp_num,
not_registered_num,
completed_num,
interrupt_num,
dept_id
)
SELECT
temp.company_user_id,
temp.sop_id,
temp.period_id,
temp.this_date as data_date,
COALESCE(log_stats.send_count, 0) as send_num,
COALESCE(log_stats.period_count, 0) as train_camp_num,
COALESCE(log_stats.not_register_count, 0) as not_registered_num,
COALESCE(log_stats.completed_count, 0) as completed_num,
COALESCE(log_stats.interrupt_count, 0) as interrupt_num,
temp.dept_id
FROM fs_statis_temp_param temp
LEFT JOIN (
-- 一次性统计所有指标,避免重复扫描
SELECT
company_user_id,
sop_id,
qw_user_id,
camp_period_time,
COUNT(DISTINCT log_id) as send_count,
COUNT(DISTINCT qw_external_contact_id) as period_count,
COUNT(DISTINCT CASE WHEN log_type = 3 THEN log_id END) as not_register_count,
COUNT(DISTINCT CASE WHEN log_type = 2 THEN log_id END) as completed_count,
COUNT(DISTINCT CASE WHEN (log_type = 4 or log_type = 1) THEN log_id END) as interrupt_count
FROM fs_course_watch_log
WHERE (DATE(update_time) = #{date} OR DATE(create_time) = #{date})
GROUP BY company_user_id, sop_id, qw_user_id, camp_period_time
) log_stats ON temp.company_user_id = log_stats.company_user_id
AND temp.sop_id = log_stats.sop_id
AND temp.start_time = log_stats.camp_period_time
AND temp.qw_user_id = log_stats.qw_user_id
WHERE temp.this_date IS NOT NULL
UNION ALL
-- 孤立数据处理部分保持不变,但也进行了优化
SELECT
orphan_summary.company_user_id,
orphan_summary.sop_id,
'-1' as period_id,
#{date} as data_date,
orphan_summary.send_num,
orphan_summary.train_camp_num,
orphan_summary.not_registered_num,
orphan_summary.completed_num,
orphan_summary.interrupt_num,
cu.dept_id as dept_id
FROM (
SELECT
orphan_data.company_user_id,
orphan_data.sop_id,
SUM(orphan_data.send_count) as send_num,
SUM(orphan_data.period_count) as train_camp_num,
SUM(orphan_data.not_registered_num) as not_registered_num,
SUM(orphan_data.completed_count) as completed_num,
SUM(orphan_data.interrupt_num) as interrupt_num
FROM (
SELECT
log_data.company_user_id,
log_data.sop_id,
log_data.qw_user_id,
log_data.camp_period_time,
COUNT(DISTINCT log_data.log_id) as send_count,
COUNT(DISTINCT log_data.qw_external_contact_id) as period_count,
COUNT(DISTINCT CASE WHEN log_data.log_type = 3 THEN log_data.log_id END) as not_registered_num,
COUNT(DISTINCT CASE WHEN log_data.log_type = 2 THEN log_data.log_id END) as completed_count,
COUNT(DISTINCT CASE WHEN (log_data.log_type = 4 or log_type = 1) THEN log_data.log_id END) as interrupt_num
FROM fs_course_watch_log log_data
WHERE (DATE(log_data.update_time) = #{date} OR DATE(log_data.create_time) = #{date})
GROUP BY log_data.company_user_id, log_data.sop_id, log_data.qw_user_id, log_data.camp_period_time
) orphan_data
WHERE NOT EXISTS (
SELECT 1
FROM fs_statis_temp_param temp
WHERE temp.company_user_id = orphan_data.company_user_id
AND ((temp.sop_id = orphan_data.sop_id) OR (temp.sop_id IS NULL AND orphan_data.sop_id IS NULL))
AND temp.qw_user_id = orphan_data.qw_user_id
AND ((temp.start_time = orphan_data.camp_period_time) OR (temp.start_time IS NULL AND orphan_data.camp_period_time IS NULL))
)
GROUP BY orphan_data.company_user_id, orphan_data.sop_id
) orphan_summary
LEFT JOIN company_user cu ON cu.user_id = orphan_summary.company_user_id
WHERE cu.dept_id IS NOT NULL AND cu.dept_id != 0 -- 过滤掉dept_id为NULL或0的记录