FsStatisSalerWatchMapper.xml 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.fs.statis.mapper.FsStatisSalerWatchMapper"> <!-- 请替换为你的Mapper接口的完整路径 -->
  4. <!-- 结果映射 -->
  5. <resultMap id="BaseResultMap" type="com.fs.statis.domain.FsStatisSalerWatch"> <!-- 请替换为你的Entity的完整路径 -->
  6. <id column="id" property="id" jdbcType="INTEGER"/>
  7. <result column="dept_id" property="deptId" jdbcType="INTEGER"/>
  8. <result column="company_user_id" property="companyUserId" jdbcType="INTEGER"/>
  9. <result column="train_camp_num" property="trainCampNum" jdbcType="INTEGER"/>
  10. <result column="not_registered_num" property="notRegisteredNum" jdbcType="INTEGER"/>
  11. <result column="registered_num" property="registeredNum" jdbcType="INTEGER"/>
  12. <result column="reg_rate" property="regRate" jdbcType="FLOAT"/>
  13. <result column="finished_rate" property="finishedRate" jdbcType="FLOAT"/>
  14. <result column="offline_total" property="offlineTotal" jdbcType="INTEGER"/>
  15. <result column="offline_not_part" property="offlineNotPart" jdbcType="INTEGER"/> <!-- 对应修正后的 offlineNotPart -->
  16. <result column="offline_not_watched" property="offlineNotWatched" jdbcType="INTEGER"/>
  17. <result column="online_total" property="onlineTotal" jdbcType="INTEGER"/>
  18. <result column="online_online_rate" property="onlineOnlineRate" jdbcType="FLOAT"/>
  19. <result column="online_playback_comple_rate" property="onlinePlaybackCompleRate" jdbcType="FLOAT"/>
  20. <result column="online_incomplete_playback" property="onlineIncompletePlayback" jdbcType="INTEGER"/>
  21. <result column="online_complete_playback" property="onlineCompletePlayback" jdbcType="INTEGER"/>
  22. </resultMap>
  23. <!-- 通用查询结果列 -->
  24. <sql id="Base_Column_List">
  25. id, dept_id, company_user_id, train_camp_num, not_registered_num, registered_num,
  26. reg_rate, finished_rate, offline_total, offline_not_part, offline_not_watched,
  27. online_total, online_online_rate, online_playback_comple_rate,
  28. online_incomplete_playback, online_complete_playback
  29. </sql>
  30. <select id="queryList" resultType="com.fs.statis.domain.FsStatisSalerWatch">
  31. SELECT
  32. company_user_id,
  33. ANY_VALUE(dept_id) as dept_id,
  34. SUM(train_camp_num) as train_camp_num,
  35. SUM(not_registered_num) as not_registered_num,
  36. SUM(registered_num) as registered_num,
  37. SUM(completed_num) as completed_num,
  38. SUM(interrupt_num) as interrupt_num,
  39. SUM(offline_total) as offline_total,
  40. SUM(offline_not_part) as offline_not_part,
  41. SUM(offline_not_watched) as offline_not_watched,
  42. SUM(online_total) as online_total,
  43. SUM(online_incomplete_playback) as online_incomplete_playback,
  44. SUM(online_complete_playback) as online_complete_playback,
  45. sum(send_num) as send_num,
  46. sum(qw_repeat_num) as qw_repeat_num,
  47. sum(user_repeat_num) as user_repeat_num,
  48. CASE WHEN SUM(send_num) > 0
  49. THEN ROUND(SUM(registered_num) * 1.0 / SUM(train_camp_num), 4)
  50. ELSE 0 END as reg_rate,
  51. CASE WHEN SUM(send_num) > 0
  52. THEN ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4)
  53. ELSE 0 END as finished_rate
  54. FROM fs_statis_saler_watch
  55. <where>
  56. <if test="userIds != null and userIds.size() > 0">
  57. AND company_user_id IN
  58. <foreach collection="userIds" open="(" close=")" separator="," item="item">
  59. ${item}
  60. </foreach>
  61. </if>
  62. <if test="periodList != null and periodList.size() > 0">
  63. AND period_id IN
  64. <foreach collection="periodList" open="(" close=")" separator="," item="item">
  65. #{item}
  66. </foreach>
  67. </if>
  68. <if test="startDate != null and endDate != null">
  69. AND data_date BETWEEN #{startDate} AND #{endDate}
  70. </if>
  71. <choose>
  72. <when test="includeSend0 != null and includeSend0">
  73. AND send_num = 0
  74. </when>
  75. <otherwise>
  76. AND send_num != 0
  77. </otherwise>
  78. </choose>
  79. </where>
  80. GROUP BY company_user_id
  81. </select>
  82. <select id="queryPeriodList" resultType="com.fs.statis.domain.FsStatisSalerWatch">
  83. SELECT
  84. period_id,
  85. any_value(sop_id) as sop_id,
  86. SUM(train_camp_num) as train_camp_num,
  87. SUM(not_registered_num) as not_registered_num,
  88. SUM(registered_num) as registered_num,
  89. SUM(completed_num) as completed_num,
  90. SUM(interrupt_num) as interrupt_num,
  91. SUM(offline_total) as offline_total,
  92. SUM(offline_not_part) as offline_not_part,
  93. SUM(offline_not_watched) as offline_not_watched,
  94. SUM(online_total) as online_total,
  95. SUM(online_incomplete_playback) as online_incomplete_playback,
  96. SUM(online_complete_playback) as online_complete_playback,
  97. sum(send_num) as send_num,
  98. sum(qw_repeat_num) as qw_repeat_num,
  99. sum(user_repeat_num) as user_repeat_num,
  100. CASE WHEN SUM(send_num) > 0
  101. THEN ROUND(SUM(registered_num) * 1.0 / SUM(send_num), 4)
  102. ELSE 0 END as reg_rate,
  103. CASE WHEN SUM(send_num) > 0
  104. THEN ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4)
  105. ELSE 0 END as finished_rate,
  106. CASE WHEN SUM(online_total) > 0
  107. THEN ROUND(SUM(online_complete_playback) * 1.0 / SUM(online_total), 4)
  108. ELSE 0 END as online_online_rate,
  109. CASE WHEN SUM(online_total) > 0
  110. THEN ROUND(SUM(online_complete_playback) * 1.0 / SUM(online_total), 4)
  111. ELSE 0 END as online_playback_comple_rate
  112. FROM fs_statis_saler_watch
  113. <where>
  114. <if test="userIds != null and userIds.size() > 0">
  115. AND company_user_id IN
  116. <foreach collection="userIds" open="(" close=")" separator="," item="item">
  117. ${item}
  118. </foreach>
  119. </if>
  120. <if test="periodList != null and periodList.size() > 0">
  121. AND period_id IN
  122. <foreach collection="periodList" open="(" close=")" separator="," item="item">
  123. #{item}
  124. </foreach>
  125. </if>
  126. <if test="startDate != null and endDate != null">
  127. AND data_date BETWEEN #{startDate} AND #{endDate}
  128. </if>
  129. <choose>
  130. <when test="includeSend0 != null and includeSend0">
  131. AND send_num = 0
  132. </when>
  133. <otherwise>
  134. AND send_num != 0
  135. </otherwise>
  136. </choose>
  137. </where>
  138. GROUP BY period_id,sop_id
  139. </select>
  140. <select id="queryTodayList" resultType="com.fs.statis.domain.FsStatisSalerWatch">
  141. SELECT
  142. data_date,
  143. SUM(train_camp_num) as train_camp_num,
  144. SUM(not_registered_num) as not_registered_num,
  145. SUM(registered_num) as registered_num,
  146. SUM(completed_num) as completed_num,
  147. SUM(interrupt_num) as interrupt_num,
  148. SUM(offline_total) as offline_total,
  149. SUM(offline_not_part) as offline_not_part,
  150. SUM(offline_not_watched) as offline_not_watched,
  151. SUM(online_total) as online_total,
  152. SUM(online_incomplete_playback) as online_incomplete_playback,
  153. SUM(online_complete_playback) as online_complete_playback,
  154. sum(send_num) as send_num,
  155. CASE WHEN SUM(send_num) > 0
  156. THEN ROUND(SUM(registered_num) * 1.0 / SUM(send_num), 4)
  157. ELSE 0 END as reg_rate,
  158. CASE WHEN SUM(send_num) > 0
  159. THEN ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4)
  160. ELSE 0 END as finished_rate
  161. FROM fs_statis_saler_watch
  162. <where>
  163. <if test="userIds != null and userIds.size() > 0">
  164. AND company_user_id IN
  165. <foreach collection="userIds" open="(" close=")" separator="," item="item">
  166. ${item}
  167. </foreach>
  168. </if>
  169. <if test="periodList != null and periodList.size() > 0">
  170. AND period_id IN
  171. <foreach collection="periodList" open="(" close=")" separator="," item="item">
  172. #{item}
  173. </foreach>
  174. </if>
  175. <if test="startDate != null and endDate != null">
  176. AND data_date BETWEEN #{startDate} AND #{endDate}
  177. </if>
  178. <choose>
  179. <when test="includeSend0 != null and includeSend0">
  180. AND send_num = 0
  181. </when>
  182. <otherwise>
  183. AND send_num != 0
  184. </otherwise>
  185. </choose>
  186. </where>
  187. GROUP BY data_date
  188. order by data_date desc
  189. </select>
  190. <select id="queryListExport" resultType="com.fs.statis.domain.FsStatisSalerWatch">
  191. SELECT
  192. concat(u.user_name,'_',u.nick_name) as company_user_name,
  193. ANY_VALUE(concat(dept.dept_id,'_',dept.dept_name)) as dept_name,
  194. SUM(watch.train_camp_num) as train_camp_num,
  195. SUM(watch.not_registered_num) as not_registered_num,
  196. SUM(watch.registered_num) as registered_num,
  197. SUM(watch.completed_num) as completed_num,
  198. SUM(watch.interrupt_num) as interrupt_num,
  199. SUM(watch.offline_total) as offline_total,
  200. SUM(watch.offline_not_part) as offline_not_part,
  201. SUM(watch.offline_not_watched) as offline_not_watched,
  202. SUM(watch.online_total) as online_total,
  203. SUM(watch.online_incomplete_playback) as online_incomplete_playback,
  204. SUM(watch.online_complete_playback) as online_complete_playback,
  205. sum(watch.send_num) as send_num,
  206. sum(watch.qw_repeat_num) as qw_repeat_num,
  207. sum(watch.user_repeat_num) as user_repeat_num,
  208. CASE WHEN SUM(watch.send_num) > 0
  209. THEN ROUND(SUM(watch.registered_num) * 1.0 / SUM(watch.train_camp_num), 4)
  210. ELSE 0 END as reg_rate,
  211. CASE WHEN SUM(watch.send_num) > 0
  212. THEN ROUND(SUM(watch.completed_num) * 1.0 / SUM(watch.send_num), 4)
  213. ELSE 0 END as finished_rate
  214. FROM fs_statis_saler_watch watch
  215. LEFT JOIN company_dept dept
  216. on dept.del_flag=0 and watch.dept_id=dept.dept_id
  217. LEFT JOIN company_user u
  218. on u.del_flag=0 and watch.company_user_id=u.user_id
  219. <where>
  220. <if test="userIds != null and userIds.size() > 0">
  221. AND watch.company_user_id IN
  222. <foreach collection="userIds" open="(" close=")" separator="," item="item">
  223. ${item}
  224. </foreach>
  225. </if>
  226. <if test="periodList != null and periodList.size() > 0">
  227. AND watch.period_id IN
  228. <foreach collection="periodList" open="(" close=")" separator="," item="item">
  229. #{item}
  230. </foreach>
  231. </if>
  232. <if test="startDate != null and endDate != null">
  233. AND watch.data_date BETWEEN #{startDate} AND #{endDate}
  234. </if>
  235. <choose>
  236. <when test="includeSend0 != null and includeSend0">
  237. AND watch.send_num = 0
  238. </when>
  239. <otherwise>
  240. AND watch.send_num != 0
  241. </otherwise>
  242. </choose>
  243. </where>
  244. GROUP BY watch.company_user_id
  245. </select>
  246. <select id="generateSopData" resultType="com.fs.statis.domain.FsStatisSalerWatch">
  247. INSERT INTO fs_statis_saler_watch (
  248. company_user_id,
  249. sop_id,
  250. period_id,
  251. data_date,
  252. qw_repeat_num,
  253. user_repeat_num,
  254. dept_id
  255. )
  256. SELECT
  257. p.company_user_id as company_user_id,
  258. p.sop_id as sop_id,
  259. p.period_id as period_id,
  260. #{date} as data_date,
  261. -- 企微重粉统计
  262. ifnull(sum(u.qw_repeat),0) AS qw_repeat_num,
  263. -- 小程序(看课)重粉统计
  264. ifnull(sum(u.user_repeat),0) AS user_repeat_num,
  265. p.dept_id
  266. FROM fs_statis_temp_param p
  267. LEFT JOIN fs_statis_temp_fsuser fu ON p.period_id = fu.period_id
  268. AND p.qw_user_id = fu.qw_user_id
  269. LEFT JOIN fs_user u ON fu.fs_user_id = u.user_id
  270. WHERE p.company_user_id IS NOT NULL
  271. AND p.sop_id IS NOT NULL
  272. AND p.period_id IS NOT NULL
  273. GROUP BY
  274. p.sop_id,
  275. p.period_id,
  276. p.company_user_id
  277. ON DUPLICATE key update
  278. qw_repeat_num = VALUES(qw_repeat_num),
  279. user_repeat_num = VALUES(user_repeat_num)
  280. </select>
  281. <select id="querySopRepeatData" resultType="com.fs.statis.domain.FsStatisTempFsuser">
  282. SELECT DISTINCT
  283. suli_filtered.user_logs_id as period_id,
  284. suli_filtered.fs_user_id as fs_user_id,
  285. suli_filtered.qw_user_id as qw_user_id
  286. FROM (
  287. SELECT
  288. suli_ct.user_logs_id,
  289. suli_ct.fs_user_id,
  290. suli_ct.qw_user_id,
  291. suli_ct.sop_id
  292. FROM
  293. sop_user_logs_info suli_ct
  294. WHERE
  295. suli_ct.create_time = #{date}
  296. AND suli_ct.fs_user_id IS NOT NULL
  297. AND suli_ct.fs_user_id != 0
  298. and suli_ct.qw_user_id is not null
  299. UNION ALL
  300. SELECT
  301. suli_ut.user_logs_id,
  302. suli_ut.fs_user_id,
  303. suli_ut.qw_user_id,
  304. suli_ut.sop_id
  305. FROM
  306. sop_user_logs_info suli_ut
  307. WHERE
  308. suli_ut.update_time = #{date}
  309. AND suli_ut.fs_user_id IS NOT NULL
  310. AND suli_ut.fs_user_id != 0
  311. AND suli_ut.create_time != #{date}
  312. and suli_ut.qw_user_id is not null
  313. ) suli_filtered
  314. INNER JOIN
  315. fs_statis_temp_param fstp
  316. ON fstp.period_id = suli_filtered.user_logs_id
  317. AND fstp.sop_id = suli_filtered.sop_id
  318. </select>
  319. <select id="queryPeriodListExport" resultType="com.fs.statis.domain.FsStatisSopWatch">
  320. SELECT
  321. period_id,
  322. SUM(train_camp_num) as train_camp_num,
  323. SUM(not_registered_num) as not_registered_num,
  324. SUM(registered_num) as registered_num,
  325. SUM(completed_num) as completed_num,
  326. SUM(interrupt_num) as interrupt_num,
  327. SUM(offline_total) as offline_total,
  328. SUM(offline_not_part) as offline_not_part,
  329. SUM(offline_not_watched) as offline_not_watched,
  330. SUM(online_total) as online_total,
  331. SUM(online_incomplete_playback) as online_incomplete_playback,
  332. SUM(online_complete_playback) as online_complete_playback,
  333. sum(send_num) as send_num,
  334. sum(qw_repeat_num) as qw_repeat_num,
  335. sum(user_repeat_num) as user_repeat_num,
  336. CASE WHEN SUM(send_num) > 0
  337. THEN ROUND(SUM(registered_num) * 1.0 / SUM(send_num), 4)
  338. ELSE 0 END as reg_rate,
  339. CASE WHEN SUM(send_num) > 0
  340. THEN ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4)
  341. ELSE 0 END as finished_rate
  342. FROM fs_statis_saler_watch
  343. <where>
  344. <if test="userIds != null and userIds.size() > 0">
  345. AND company_user_id IN
  346. <foreach collection="userIds" open="(" close=")" separator="," item="item">
  347. ${item}
  348. </foreach>
  349. </if>
  350. <if test="periodList != null and periodList.size() > 0">
  351. AND period_id IN
  352. <foreach collection="periodList" open="(" close=")" separator="," item="item">
  353. #{item}
  354. </foreach>
  355. </if>
  356. <if test="startDate != null and endDate != null">
  357. AND data_date BETWEEN #{startDate} AND #{endDate}
  358. </if>
  359. <choose>
  360. <when test="includeSend0 != null and includeSend0">
  361. AND send_num = 0
  362. </when>
  363. <otherwise>
  364. AND send_num != 0
  365. </otherwise>
  366. </choose>
  367. </where>
  368. GROUP BY period_id,sop_id
  369. </select>
  370. <select id="queryEveryDayListExport" resultType="com.fs.statis.domain.FsStatisEveryDayWatch">
  371. SELECT
  372. data_date,
  373. SUM(train_camp_num) as train_camp_num,
  374. SUM(not_registered_num) as not_registered_num,
  375. SUM(registered_num) as registered_num,
  376. SUM(completed_num) as completed_num,
  377. SUM(interrupt_num) as interrupt_num,
  378. SUM(offline_total) as offline_total,
  379. SUM(offline_not_part) as offline_not_part,
  380. SUM(offline_not_watched) as offline_not_watched,
  381. SUM(online_total) as online_total,
  382. SUM(online_incomplete_playback) as online_incomplete_playback,
  383. SUM(online_complete_playback) as online_complete_playback,
  384. sum(send_num) as send_num,
  385. CASE WHEN SUM(send_num) > 0
  386. THEN ROUND(SUM(registered_num) * 1.0 / SUM(send_num), 4)
  387. ELSE 0 END as reg_rate,
  388. CASE WHEN SUM(send_num) > 0
  389. THEN ROUND(SUM(completed_num) * 1.0 / SUM(send_num), 4)
  390. ELSE 0 END as finished_rate
  391. FROM fs_statis_saler_watch
  392. <where>
  393. <if test="userIds != null and userIds.size() > 0">
  394. AND company_user_id IN
  395. <foreach collection="userIds" open="(" close=")" separator="," item="item">
  396. ${item}
  397. </foreach>
  398. </if>
  399. <if test="periodList != null and periodList.size() > 0">
  400. AND period_id IN
  401. <foreach collection="periodList" open="(" close=")" separator="," item="item">
  402. #{item}
  403. </foreach>
  404. </if>
  405. <if test="startDate != null and endDate != null">
  406. AND data_date BETWEEN #{startDate} AND #{endDate}
  407. </if>
  408. <choose>
  409. <when test="includeSend0 != null and includeSend0">
  410. AND send_num = 0
  411. </when>
  412. <otherwise>
  413. AND send_num != 0
  414. </otherwise>
  415. </choose>
  416. </where>
  417. GROUP BY data_date
  418. order by data_date desc
  419. </select>
  420. <insert id="batchSave">
  421. INSERT INTO fs_statis_saler_watch (
  422. dept_id, company_user_id, train_camp_num,
  423. not_registered_num, registered_num,completed_num,interrupt_num, reg_rate,
  424. finished_rate, offline_total, offline_not_part,
  425. offline_not_watched, online_total, online_online_rate,
  426. online_playback_comple_rate, online_incomplete_playback,
  427. online_complete_playback,period_id,data_date,sop_id,send_num
  428. ) VALUES
  429. <foreach collection="list" item="item" separator=",">
  430. (
  431. #{item.deptId,jdbcType=INTEGER},
  432. #{item.companyUserId,jdbcType=INTEGER},
  433. #{item.trainCampNum,jdbcType=INTEGER},
  434. #{item.notRegisteredNum,jdbcType=INTEGER},
  435. #{item.registeredNum,jdbcType=INTEGER},
  436. #{item.completedNum,jdbcType=INTEGER},
  437. #{item.interruptNum,jdbcType=INTEGER},
  438. #{item.regRate,jdbcType=FLOAT},
  439. #{item.finishedRate,jdbcType=FLOAT},
  440. #{item.offlineTotal,jdbcType=INTEGER},
  441. #{item.offlineNotPart,jdbcType=INTEGER},
  442. #{item.offlineNotWatched,jdbcType=INTEGER},
  443. #{item.onlineTotal,jdbcType=INTEGER},
  444. #{item.onlineOnlineRate,jdbcType=FLOAT},
  445. #{item.onlinePlaybackCompleRate,jdbcType=FLOAT},
  446. #{item.onlineIncompletePlayback,jdbcType=INTEGER},
  447. #{item.onlineCompletePlayback,jdbcType=INTEGER},
  448. #{item.periodId,jdbcType=VARCHAR},
  449. #{item.dataDate,jdbcType=VARCHAR},
  450. #{item.sopId,jdbcType=VARCHAR},
  451. #{item.sendNum,jdbcType=VARCHAR}
  452. )
  453. </foreach>
  454. ON DUPLICATE KEY UPDATE
  455. train_camp_num = VALUES(train_camp_num),
  456. not_registered_num = VALUES(not_registered_num),
  457. registered_num = VALUES(registered_num),
  458. completed_num = VALUES(completed_num),
  459. interrupt_num = VALUES(interrupt_num),
  460. reg_rate = VALUES(reg_rate),
  461. finished_rate = VALUES(finished_rate),
  462. offline_total = VALUES(offline_total),
  463. offline_not_part = VALUES(offline_not_part),
  464. offline_not_watched = VALUES(offline_not_watched),
  465. online_total = VALUES(online_total),
  466. online_online_rate = VALUES(online_online_rate),
  467. online_playback_comple_rate = VALUES(online_playback_comple_rate),
  468. online_incomplete_playback = VALUES(online_incomplete_playback),
  469. online_complete_playback = VALUES(online_complete_playback)
  470. </insert>
  471. <insert id="generateData">
  472. REPLACE INTO fs_statis_saler_watch (
  473. company_user_id,
  474. sop_id,
  475. period_id,
  476. data_date,
  477. send_num,
  478. train_camp_num,
  479. not_registered_num,
  480. completed_num,
  481. interrupt_num,
  482. dept_id
  483. )
  484. SELECT
  485. temp.company_user_id,
  486. temp.sop_id,
  487. temp.period_id,
  488. temp.this_date as data_date,
  489. COALESCE(log_stats.send_count, 0) as send_num,
  490. COALESCE(log_stats.period_count, 0) as train_camp_num,
  491. COALESCE(log_stats.not_register_count, 0) as not_registered_num,
  492. COALESCE(log_stats.completed_count, 0) as completed_num,
  493. COALESCE(log_stats.interrupt_count, 0) as interrupt_num,
  494. temp.dept_id
  495. FROM fs_statis_temp_param temp
  496. LEFT JOIN (
  497. -- 一次性统计所有指标,避免重复扫描
  498. SELECT
  499. company_user_id,
  500. sop_id,
  501. qw_user_id,
  502. camp_period_time,
  503. COUNT(DISTINCT log_id) as send_count,
  504. COUNT(DISTINCT qw_external_contact_id) as period_count,
  505. COUNT(DISTINCT CASE WHEN log_type = 3 THEN log_id END) as not_register_count,
  506. COUNT(DISTINCT CASE WHEN log_type = 2 THEN log_id END) as completed_count,
  507. COUNT(DISTINCT CASE WHEN (log_type = 4 or log_type = 1) THEN log_id END) as interrupt_count
  508. FROM fs_course_watch_log
  509. WHERE (DATE(update_time) = #{date} OR DATE(create_time) = #{date})
  510. GROUP BY company_user_id, sop_id, qw_user_id, camp_period_time
  511. ) log_stats ON temp.company_user_id = log_stats.company_user_id
  512. AND temp.sop_id = log_stats.sop_id
  513. AND temp.start_time = log_stats.camp_period_time
  514. AND temp.qw_user_id = log_stats.qw_user_id
  515. WHERE temp.this_date IS NOT NULL
  516. UNION ALL
  517. -- 孤立数据处理部分保持不变,但也进行了优化
  518. SELECT
  519. orphan_summary.company_user_id,
  520. orphan_summary.sop_id,
  521. '-1' as period_id,
  522. #{date} as data_date,
  523. orphan_summary.send_num,
  524. orphan_summary.train_camp_num,
  525. orphan_summary.not_registered_num,
  526. orphan_summary.completed_num,
  527. orphan_summary.interrupt_num,
  528. cu.dept_id as dept_id
  529. FROM (
  530. SELECT
  531. orphan_data.company_user_id,
  532. orphan_data.sop_id,
  533. SUM(orphan_data.send_count) as send_num,
  534. SUM(orphan_data.period_count) as train_camp_num,
  535. SUM(orphan_data.not_registered_num) as not_registered_num,
  536. SUM(orphan_data.completed_count) as completed_num,
  537. SUM(orphan_data.interrupt_num) as interrupt_num
  538. FROM (
  539. SELECT
  540. log_data.company_user_id,
  541. log_data.sop_id,
  542. log_data.qw_user_id,
  543. log_data.camp_period_time,
  544. COUNT(DISTINCT log_data.log_id) as send_count,
  545. COUNT(DISTINCT log_data.qw_external_contact_id) as period_count,
  546. COUNT(DISTINCT CASE WHEN log_data.log_type = 3 THEN log_data.log_id END) as not_registered_num,
  547. COUNT(DISTINCT CASE WHEN log_data.log_type = 2 THEN log_data.log_id END) as completed_count,
  548. COUNT(DISTINCT CASE WHEN (log_data.log_type = 4 or log_type = 1) THEN log_data.log_id END) as interrupt_num
  549. FROM fs_course_watch_log log_data
  550. WHERE (DATE(log_data.update_time) = #{date} OR DATE(log_data.create_time) = #{date})
  551. GROUP BY log_data.company_user_id, log_data.sop_id, log_data.qw_user_id, log_data.camp_period_time
  552. ) orphan_data
  553. WHERE NOT EXISTS (
  554. SELECT 1
  555. FROM fs_statis_temp_param temp
  556. WHERE temp.company_user_id = orphan_data.company_user_id
  557. AND ((temp.sop_id = orphan_data.sop_id) OR (temp.sop_id IS NULL AND orphan_data.sop_id IS NULL))
  558. AND temp.qw_user_id = orphan_data.qw_user_id
  559. AND ((temp.start_time = orphan_data.camp_period_time) OR (temp.start_time IS NULL AND orphan_data.camp_period_time IS NULL))
  560. )
  561. GROUP BY orphan_data.company_user_id, orphan_data.sop_id
  562. ) orphan_summary
  563. LEFT JOIN company_user cu ON cu.user_id = orphan_summary.company_user_id
  564. WHERE cu.dept_id IS NOT NULL AND cu.dept_id != 0 -- 过滤掉dept_id为NULL或0的记录
  565. </insert>
  566. </mapper>