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的记录