report_push.py 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162
  1. from mysql_db import MysqlDB
  2. import datetime
  3. from itertools import groupby
  4. from xlwt_util import XlwtUtil
  5. from file_util import FileUtil
  6. from email_util import EmailUtil
  7. class ReportPush(object):
  8. """
  9. 报表推送功能实现类
  10. """
  11. pass
  12. # 1:总浏览量
  13. #
  14. # 集团部分+项目部分!!!
  15. # ----项目PV--权限项目范围内,求和
  16. # 参数:时间区间 和 项目列表
  17. sql_1_1 = """
  18. SELECT SUM(pv) AS pv1 FROM a_idfa_behavior_sum
  19. WHERE report_d >= %s and report_d <= %s AND house_id IN %s
  20. """
  21. # ----集团PV--权限项目范围内,求和
  22. # 参数:数据区间和项目列表
  23. sql_1_2 = """
  24. SELECT SUM(pv) AS pav2 FROM a_behavior_brand_mini_day
  25. WHERE report_d >= %s and report_d <= %s AND house_id IN %s
  26. """
  27. # 2:总浏览人数
  28. #
  29. # 参数,数据区间, 项目列表
  30. sql_1_3 = """
  31. SELECT
  32. count(
  33. DISTINCT IFNULL(mobile, user_id)
  34. ) as people
  35. FROM
  36. (
  37. SELECT
  38. A.user_id,
  39. B.mobile
  40. FROM
  41. a_idfa_behavior_sum A
  42. LEFT JOIN d_user B ON A.user_id = B.user_id
  43. WHERE
  44. A.report_d >= %s and A.report_d <= %s
  45. AND A.house_id IN %s
  46. UNION
  47. SELECT
  48. A.brand_user_id AS user_id,
  49. B.mobile
  50. FROM
  51. a_behavior_brand_mini_day A
  52. LEFT JOIN a_brand_app_customer B ON A.brand_user_id = B.brand_customer_id
  53. WHERE
  54. A.report_d >= %s and A.report_d <= %s
  55. AND A.house_id IN %s
  56. ) t1
  57. """
  58. # 3:新增获客
  59. sql_1_4 = """
  60. SELECT
  61. count(
  62. DISTINCT IFNULL(mobile, user_id)
  63. )
  64. FROM
  65. (
  66. SELECT
  67. user_id,
  68. mobile,
  69. created
  70. FROM
  71. d_user
  72. WHERE
  73. created >= %s
  74. AND created <= %s
  75. AND house_id IN %s
  76. AND source ='3'
  77. UNION
  78. SELECT
  79. brand_customer_id AS user_id,
  80. mobile,
  81. rlat_created
  82. FROM
  83. a_brand_app_customer_house_rlat
  84. WHERE
  85. rlat_created >= %s
  86. AND rlat_created <= %s
  87. AND rlat_house_id IN %s
  88. AND cust_house_flag ='1'
  89. ) t1
  90. """
  91. # 4:新增获电
  92. sql_1_5 = """
  93. SELECT
  94. COUNT(DISTINCT mobile)
  95. FROM
  96. (
  97. SELECT
  98. user_id,
  99. mobile,
  100. wx_phone_time AS created
  101. FROM
  102. d_user
  103. WHERE
  104. wx_phone_time >= %s
  105. AND wx_phone_time <= %s
  106. AND house_id IN %s
  107. and source = '3'
  108. UNION
  109. SELECT
  110. brand_customer_id,
  111. mobile,
  112. houdian_time AS created
  113. FROM
  114. (
  115. SELECT
  116. *,
  117. CASE
  118. WHEN rlat_created > shouquan_time THEN
  119. rlat_created
  120. ELSE
  121. shouquan_time
  122. END AS houdian_time
  123. FROM
  124. a_brand_app_customer_house_rlat
  125. WHERE
  126. mobile IS NOT NULL
  127. AND rlat_house_id IN %s
  128. AND cust_house_flag = '1'
  129. ) t1
  130. WHERE
  131. houdian_time >= %s
  132. AND houdian_time <= %s
  133. ) t1
  134. """
  135. # 5:集团小程序总浏览量(针对香港置地要命名为【CNC小程序总浏览量】)
  136. # 集团部分
  137. # 6:集团小程序总浏览人数(针对香港置地要命名为【CNC小程序总浏览人数】)
  138. #
  139. # 集团小程序整体UV(见SQL3)
  140. sql_1_6 = """
  141. SELECT
  142. COUNT(DISTINCT brand_user_id) AS UV4
  143. FROM
  144. a_behavior_brand_mini_day
  145. WHERE
  146. report_d > %s
  147. AND report_d < %s
  148. AND house_id IN %s
  149. """
  150. # 7: 集团小程序新增获客(针对香港置地要命名为【CNC小程序新增获客】)
  151. #
  152. # 权限项目范围内,集团维度的获客
  153. # 8: 集团小程序新增获电(针对香港置地要命名为【CNC小程序新增获电】)
  154. #
  155. # 权限项目范围内,集团维度的获电
  156. # 9.单项目小程序总浏览量
  157. #
  158. # 项目部分
  159. #
  160. # 10.单项目小程序总浏览人数
  161. #
  162. # 权限项目未授权部分求和+去重的授权部分(见SQL2)
  163. #
  164. # 11.单项目小程序新增获客
  165. #
  166. # 权限项目未授权部分求和+去重的授权部分(见SQL7)
  167. #
  168. # 12.单项目小程序新增获电
  169. #
  170. # 权限项目所有授权手机号去重(见SQL8)
  171. # 1.默认值/001_大麦/项目排行榜/小程序排行榜TOP_N
  172. sql_2_1 = """
  173. SELECT
  174. a.house_id,
  175. a.house_name,
  176. ifnull(SUM(a.pv), 0),
  177. SUM(a.uv),
  178. SUM(a.new_cust_num),
  179. SUM(a.wx_num)
  180. from
  181. (
  182. SELECT
  183. a.*, b.house_name,
  184. c.interested_num,
  185. d.wx_num,
  186. e.new_cust_num
  187. FROM
  188. (
  189. SELECT
  190. house_id,
  191. count(
  192. DISTINCT ifnull(user_id, idfa)
  193. ) uv,
  194. sum(session_times) session_times,
  195. sum(sum_session_time) sum_session_time,
  196. sum(pv) pv,
  197. sum(page_num) page_num
  198. FROM
  199. a_idfa_behavior_sum
  200. WHERE
  201. report_d >= %s
  202. AND report_d <= %s
  203. GROUP BY
  204. house_id
  205. ) a
  206. JOIN d_house b ON a.house_id = b.house_id
  207. LEFT JOIN (
  208. SELECT
  209. house_id,
  210. count(DISTINCT customer_id) interested_num
  211. FROM
  212. f_interested_custlist
  213. WHERE
  214. report_d >= %s
  215. AND report_d <= %s
  216. GROUP BY
  217. house_id
  218. ) c ON a.house_id = c.house_id
  219. LEFT JOIN (
  220. SELECT
  221. house_id,
  222. count(DISTINCT mobile) wx_num
  223. FROM
  224. f_customer_dynamic
  225. WHERE
  226. dynamic IN (1, 2, 4)
  227. AND report_d >= %s
  228. AND report_d <= %s
  229. GROUP BY
  230. house_id
  231. ) d ON a.house_id = d.house_id
  232. LEFT JOIN (
  233. SELECT
  234. house_id,
  235. count(DISTINCT user_id) new_cust_num
  236. FROM
  237. d_user
  238. WHERE
  239. source IN (1, 2, 3, 4, 10)
  240. AND created >= %s
  241. AND created < DATE_ADD(
  242. %s, INTERVAL 1 DAY
  243. )
  244. GROUP BY
  245. house_id
  246. ) e ON a.house_id = e.house_id)
  247. a
  248. GROUP BY
  249. a.house_id,
  250. a.house_name
  251. order by a.pv desc
  252. """
  253. # 2.默认值/006_大麦(集团)/集团项目排行榜v1.3/集团排行榜
  254. sql_2_2 = """
  255. select
  256. x.brand_id,
  257. x.house_id,
  258. x.house_name,
  259. ifnull(x.pv, 0),
  260. x.uv,
  261. x.new_cust,
  262. x.shouquan_cust
  263. from (
  264. SELECT
  265. c.pv,
  266. c.uv,
  267. a.brand_id,
  268. a.house_id,
  269. a.house_name,
  270. a.brand_name,
  271. ifnull(b.house_layout_num, 0) house_layout_num,
  272. ifnull(d.launch_time, '--') launch_time,
  273. c.new_cust,
  274. c.shouquan_cust,
  275. c.revisit_cust
  276. FROM
  277. (
  278. SELECT
  279. brand_id,
  280. ifnull(house_id, '0') house_id,
  281. sum(pv) pv,
  282. count(DISTINCT brand_user_id) uv,
  283. count(
  284. DISTINCT CASE
  285. WHEN is_new_user = 1 THEN
  286. brand_user_id
  287. END
  288. ) new_cust,
  289. count(
  290. DISTINCT CASE
  291. WHEN is_shouquan_user = 1 THEN
  292. brand_user_id
  293. END
  294. ) shouquan_cust,
  295. count(
  296. DISTINCT CASE
  297. WHEN is_new_user = 0 THEN
  298. brand_user_id
  299. END
  300. ) revisit_cust
  301. FROM
  302. a_behavior_brand_mini_day
  303. WHERE
  304. report_d >= %s
  305. AND report_d <= %s
  306. GROUP BY
  307. brand_id,
  308. ifnull(house_id, '0')
  309. ) c
  310. LEFT JOIN (
  311. SELECT
  312. house_id,
  313. count(1) house_layout_num
  314. FROM
  315. d_content_layout
  316. WHERE
  317. `status` = '1'
  318. AND house_id <> 1
  319. GROUP BY
  320. house_id
  321. UNION ALL
  322. SELECT
  323. bb.brand_id house_id,
  324. count(1) house_layout_num
  325. FROM
  326. d_content_layout aa
  327. JOIN d_house bb ON aa.house_id = bb.house_id
  328. WHERE
  329. aa.`status` = '1'
  330. AND bb. STATUS = '1'
  331. AND aa.house_id <> 1
  332. GROUP BY
  333. bb.brand_id
  334. ) b ON c.house_id = b.house_id
  335. JOIN d_house a ON a.house_id = c.house_id
  336. AND a.brand_id = c.brand_id
  337. LEFT JOIN d_house_attr d ON c.house_id = d.house_id
  338. AND c.brand_id = d.brand_id ) x
  339. """
  340. # 默认值/001_大麦/场景_用户来源渠道/用户来源渠道—明细
  341. sql_3_1 = """
  342. SELECT
  343. house_id,
  344. house_name,
  345. label_wx,
  346. COUNT(a.id) as counts
  347. FROM
  348. d_user_attr a
  349. LEFT JOIN d_scene b ON a.scene = b. CODE
  350. WHERE
  351. a.source IN (1, 2, 3, 4, 10)
  352. AND a.report_d >= %s
  353. AND a.report_d <= %s
  354. GROUP BY
  355. house_id,
  356. house_name,
  357. label_wx
  358. """
  359. # 默认值/006_大麦(集团)/场景(集团)_用户来源渠道_v1.1/用户来源渠道—明细
  360. sql_3_2 = """
  361. select
  362. brand_id,
  363. x.brand_name,
  364. house_id,
  365. house_name,
  366. label_wx,
  367. COUNT(1)
  368. from
  369. (SELECT
  370. a.scene,
  371. a.brand_id,
  372. b.*, a.share_brand_customer_id,
  373. '2' adviser_agent,
  374. a.house_id house_id,
  375. c.house_name house_name,
  376. c.brand_name
  377. FROM
  378. (
  379. SELECT
  380. scene,
  381. brand_id,
  382. share_brand_customer_id,
  383. house_id
  384. FROM
  385. d_brand_app_customer
  386. WHERE
  387. created >= %s
  388. AND created < DATE_ADD(
  389. %s, INTERVAL 1 DAY
  390. )
  391. UNION ALL
  392. SELECT
  393. scene,
  394. brand_id,
  395. share_brand_customer_id,
  396. brand_id house_id
  397. FROM
  398. d_brand_app_customer
  399. WHERE
  400. created >= %s
  401. AND created < DATE_ADD(
  402. %s, INTERVAL 1 DAY
  403. )
  404. ) a
  405. LEFT JOIN d_scene b ON a.scene = b. CODE
  406. JOIN d_house c ON a.house_id = c.house_id
  407. AND a.brand_id = c.brand_id) x
  408. group by x.brand_id, x.brand_name, x.house_id, x.house_name, x.label_wx
  409. """
  410. # 根据任务id获取推送客户信息
  411. sql_4 = """
  412. select a.task_key, a.customer_id, b.customer_type, b.name, b.mail, GROUP_CONCAT(c.house_or_brand_id) as ids
  413. from report_task_info a left join report_push_customer_info b on b.id = a.customer_id
  414. left join report_customer_authority_info c on b.id = c.customer_id
  415. where a.task_key = %s and a.status = b.status = c.status = 1
  416. group by a.task_key, a.customer_id, b.customer_type, b.name, b.mail
  417. """
  418. # 根据集团id获取项目id
  419. sql_5 = """
  420. select house_id, house_name from d_house where brand_id = %s and house_id > 300
  421. """
  422. sql_5_1 = """
  423. select house_id from d_house where brand_id in %s
  424. """
  425. sql_6 = """insert into report_push_log(name, mail, report_name, push_time, send_status, status, error_message) values(%s, %s,
  426. %s, now(), %s, 1, %s) """
  427. # 根据项目id获取集团id和名称
  428. sql_7 = """
  429. select a.brand_id, a.brand_name from d_house a where a.house_id = %s
  430. """
  431. sql_8 = """
  432. select DISTINCT a.brand_id from d_house a where a.house_id in %s
  433. """
  434. def __init__(self, db_name):
  435. self.db = MysqlDB(db_name)
  436. pass
  437. mails = ['1285211525@qq.com', 'liutt@elab-plus.com']
  438. # 线上
  439. url_online = "http://dm-api.elab-plus.cn/elab-marketing-sms//mail/sendEmailForReport"
  440. # 开发环境
  441. url_dev = "http://43.254.221.77:5555/elab-marketing-sms//mail/sendEmailForReport" # 接口地址
  442. # 测试环境
  443. url_test = "http://gatewaytest.elab-plus.com/elab-marketing-sms//mail/sendEmailForReport"
  444. url = url_dev
  445. # 消息头数据线上
  446. headers_online = {
  447. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
  448. 'Referer': url_online,
  449. }
  450. # 开发环境
  451. headers_dev = {
  452. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
  453. 'Referer': url_dev,
  454. }
  455. def report_push(self, task_key):
  456. message = {}
  457. try:
  458. report_data = self.report_data_query(task_key)
  459. message[1] = '数据查询成功:{}'.format(len(report_data))
  460. time_rang = self.get_time_range(task_key)
  461. xu = XlwtUtil()
  462. send_info = xu.create_excel(report_data, time_rang, task_key)
  463. message[2] = '报表文件生成成功'
  464. email_util = EmailUtil()
  465. title, content = self.get_title_content(task_key, time_rang)
  466. logs = []
  467. for value in send_info:
  468. log_data = []
  469. try:
  470. if value[2]:
  471. # result = email_util.send_mail_by_admin(title, content, value[1], value[2], value[3], self.url_online, self.headers_online)
  472. # if result:
  473. # log_data = [value[0], value[1], value[2], 1, 'success!!!']
  474. # else:
  475. result = email_util.send_mail_by_admin(title, content, value[1], value[2], value[3], self.url_dev, self.headers_dev)
  476. if not result:
  477. log_data = [value[0], value[1], value[2], -1, '第二次发送失败']
  478. except Exception as e:
  479. result = email_util.send_mail_by_admin(title, content, value[1], value[2], value[3], self.url_dev,
  480. self.headers_dev)
  481. if not result:
  482. log_data = [value[0], value[1], value[2], -1, str(e)]
  483. print(str(e))
  484. logs.append(log_data)
  485. message[3] = '邮件发送成功'
  486. message['data'] = send_info
  487. self.db.add_some(self.sql_6, logs)
  488. self.db.close()
  489. FileUtil.remove_files(7, xu.save_path)
  490. except Exception as e:
  491. print(str(e))
  492. message['error'] = str(e)
  493. pass
  494. finally:
  495. return message
  496. def report_push_test(self, task_key):
  497. message = {}
  498. try:
  499. report_data = self.report_data_query(task_key)
  500. message[1] = '数据查询成功:{}'.format(len(report_data))
  501. time_rang = self.get_time_range(task_key)
  502. xu = XlwtUtil()
  503. send_info = xu.create_excel(report_data, time_rang, task_key)
  504. message[2] = '报表文件生成成功'
  505. email_util = EmailUtil()
  506. title, content = self.get_title_content(task_key, time_rang)
  507. logs = []
  508. for value in send_info:
  509. log_data = []
  510. try:
  511. if value[2]:
  512. for mail in self.mails:
  513. result = email_util.send_mail_by_admin(title, content, mail, value[2], value[3], self.url_dev, self.headers_dev)
  514. if result:
  515. log_data = [value[0], value[1], value[2], 1, 'success!!!']
  516. else:
  517. result = email_util.send_mail_by_admin(title, content, mail, value[2], value[3], self.url_online, self.headers_online)
  518. if not result:
  519. log_data = [value[0], value[1], value[2], -1, '第二次发送失败']
  520. except Exception as e:
  521. log_data = [value[0], value[1], value[2], -1, str(e)]
  522. print(str(e))
  523. logs.append(log_data)
  524. message[3] = '邮件发送成功'
  525. message['data'] = send_info
  526. self.db.add_some(self.sql_6, logs)
  527. self.db.close()
  528. FileUtil.remove_files(7, xu.save_path)
  529. except Exception as e:
  530. print(str(e))
  531. message['error'] = str(e)
  532. pass
  533. finally:
  534. return message
  535. def get_title_content(self, task_key, time_range):
  536. if task_key in (1, 4):
  537. return '移动案场订阅日报[{}]'.format(time_range[0]), '本期间内【{}】至【{}】的数据报告已经准备完成。请点击附件查阅。'.format(time_range[0], time_range[1])
  538. elif task_key in (2, 3):
  539. return '移动案场订阅周报[{}]至[{}]'.format(time_range[0], time_range[1]), '本期间内【{}】至【{}】的数据报告已经准备完成。请点击附件查阅.'.format(time_range[0], time_range[1])
  540. def report_data_query(self, task_key):
  541. """
  542. 定时任务推送数据准备
  543. :param task_key:
  544. :return:
  545. """
  546. result = {}
  547. try:
  548. # 根据任务key获取需要推送的客户以及可以的权限
  549. customers = self.db.select(self.sql_4, [task_key])
  550. # a.task_key, a.customer_id, b.customer_type, b.`name`, b.mail, GROUP_CONCAT(c.house_or_brand_id)
  551. time_range = self.get_time_range(task_key)
  552. all_time_rang = self.get_time_range(9999)
  553. # 有限时间范围内的数据
  554. xcx_top_data = self.xcx_top(time_range)
  555. brand_top_data = self.brand_top(time_range)
  556. customer_channel_details_data = self.customer_channel_details(time_range)
  557. brand_customer_channel_details = self.brand_customer_channel_details(time_range)
  558. # 所有历史数据
  559. xcx_top_data_all = self.xcx_top(all_time_rang)
  560. brand_top_data_all = self.brand_top(all_time_rang)
  561. for customer in customers:
  562. customer_data = {}
  563. name = customer[3]
  564. mail = customer[4]
  565. customer_type = customer[2]
  566. house_ids = []
  567. brand_id_list = []
  568. if customer_type == 1:
  569. # 项目
  570. ids = customer[5]
  571. if str(ids).find(',') != -1:
  572. house_ids = [x for x in str(ids).split(',')]
  573. else:
  574. house_ids = [ids]
  575. brand_id_list = self.get_brand_ids_by_house_ids(house_ids)
  576. pass
  577. elif customer_type == 2:
  578. # 集团
  579. brand_ids = customer[5]
  580. if str(brand_ids).find(',') != -1:
  581. brands = [x for x in str(brand_ids).split(',')]
  582. else:
  583. brands = [brand_ids]
  584. for id in brands:
  585. house_ids.extend([x[0] for x in self.get_house_ids_by_brand_id(id)])
  586. brand_id_list = brands
  587. result_data_1 = []
  588. result_data_2 = []
  589. result_data_3 = []
  590. result_data_4 = []
  591. result_data_5 = []
  592. result_data_7 = []
  593. result_data_8 = []
  594. all_house_ids = self.get_house_ids_by_brand_ids(brand_id_list)
  595. xcx_top_data_part = self.filter_by_house_ids(xcx_top_data, all_house_ids)
  596. brand_top_data_part = self.filter_by_brand_ids(brand_top_data, brand_id_list)
  597. xcx_top_data_all_part = self.filter_by_house_ids(xcx_top_data_all, all_house_ids)
  598. brand_top_data_all_part = self.filter_by_brand_ids(brand_top_data_all, brand_id_list)
  599. # 1 数据总览 12个统计指标
  600. data_overview = self.data_overview(time_range, house_ids, xcx_top_data_part, brand_top_data_part)
  601. result_data_1.extend(data_overview)
  602. # 4:单个项目小程序数据排行榜
  603. # 排名 项目名称 总浏览量 总浏览人数 新增获客 新增获电
  604. for index, x in enumerate(xcx_top_data_part):
  605. if x[0] in house_ids:
  606. result_data_4.append([index + 1, x[1], x[2], x[3], x[4], x[5]])
  607. # 5: 集团项目数据排行榜
  608. # 排名 项目名称 总浏览量 总浏览人数 新增获客 新增获电
  609. if customer_type == 2:
  610. for index, x2 in enumerate(brand_top_data_part):
  611. if x2[1] in house_ids or x2[0] in brand_id_list:
  612. result_data_5.append([index + 1, x2[2], x2[3], x2[4], x2[5], x2[6]])
  613. pass
  614. pass
  615. elif customer_type == 1:
  616. for index, x1 in enumerate(brand_top_data_part):
  617. if x1[1] in house_ids:
  618. result_data_5.append([index + 1, x1[2], x1[3], x1[4], x1[5], x1[6]])
  619. else:
  620. pass
  621. # 2: 项目数据排行榜
  622. # 排名 项目名称 总浏览量 总浏览人数 新增获客 新增获电
  623. house_with_brand_data = self.house_with_brand(xcx_top_data_part, brand_top_data_part)
  624. for x in house_with_brand_data:
  625. if x[2] in house_ids:
  626. x.pop(1)
  627. x.pop(1)
  628. result_data_2.append(x)
  629. # 3: 项目历史累计总数
  630. # 排名 项目名称 总浏览量 总浏览人数 新增获客 新增获电
  631. if customer_type == 2:
  632. all_data_history = self.house_with_brand(xcx_top_data_all_part, brand_top_data_all_part, brand_id_list)
  633. for x in all_data_history:
  634. if x[2] in house_ids:
  635. x.pop(1)
  636. x.pop(1)
  637. result_data_3.append(x)
  638. else:
  639. all_data_history = self.house_with_brand(xcx_top_data_all_part, brand_top_data_all_part)
  640. for x in all_data_history:
  641. if x[2] in house_ids:
  642. x.pop(1)
  643. x.pop(1)
  644. result_data_3.append(x)
  645. # 7: 单个项目小程序获客来源场景分析
  646. # 项目 合计 长按识别二维码 会话 公众号菜单 公众号文章 小程序历史列表 扫一扫二维码 搜索 相册选取二维码 其他小程序 其他
  647. for x in customer_channel_details_data:
  648. if x[0] in house_ids:
  649. result_data_7.append(x)
  650. # 8: 集团项目获客来源场景分析
  651. if customer_type == 2:
  652. for x in brand_customer_channel_details:
  653. if x[2] in house_ids or x[0] in brand_id_list:
  654. result_data_8.append(x)
  655. elif customer_type == 1:
  656. for x in brand_customer_channel_details:
  657. if x[2] in house_ids:
  658. result_data_8.append(x)
  659. # 6: 项目获客来源场景分析
  660. result_data_6 = self.house_with_brand_for_share(result_data_7, result_data_8)
  661. customer_data[1] = result_data_1
  662. result_data_2.sort(key=lambda obj: obj[0])
  663. customer_data[2] = result_data_2
  664. result_data_3.sort(key=lambda obj: obj[0])
  665. customer_data[3] = result_data_3
  666. result_data_4.sort(key=lambda obj: obj[0])
  667. customer_data[4] = result_data_4
  668. result_data_5.sort(key=lambda obj: obj[0])
  669. customer_data[5] = result_data_5
  670. self.sort(result_data_6, 1)
  671. customer_data[6] = result_data_6
  672. result_data_7_format = []
  673. for x in result_data_7:
  674. house_name = x[1]
  675. ele = [house_name]
  676. data = x[2:]
  677. total = sum(data)
  678. ele.append(total)
  679. ele.extend(data)
  680. result_data_7_format.append(ele)
  681. self.sort(result_data_7_format, 1)
  682. customer_data[7] = result_data_7_format
  683. result_data_8_format = []
  684. for x in result_data_8:
  685. ele = []
  686. house_name = x[3]
  687. data = x[4:]
  688. total = sum(data)
  689. ele.append(house_name)
  690. ele.append(total)
  691. ele.extend(data)
  692. result_data_8_format.append(ele)
  693. self.sort(result_data_8_format, 1)
  694. customer_data[8] = result_data_8_format
  695. customer_data[0] = mail
  696. result[name] = customer_data
  697. # return result
  698. except Exception as e:
  699. result['error'] = str(e)
  700. pass
  701. finally:
  702. return result
  703. def sort(self, data, idnex):
  704. data.sort(key=lambda obj: obj[idnex])
  705. data.reverse()
  706. def house_with_brand_for_share(self, house_data, brand_data):
  707. house_ids = []
  708. result = []
  709. for x in house_data:
  710. if x[0] not in [a[0] for a in house_ids]:
  711. house_ids.append([x[0], x[1]])
  712. for x in brand_data:
  713. if x[2] not in [a[0] for a in house_ids]:
  714. house_ids.append([x[2], x[3]])
  715. for id in house_ids:
  716. house_id = id[0]
  717. house_name = id[1]
  718. house_result = [house_name]
  719. equal_house = self.equal_by_house_id(house_data, house_id, 0)
  720. equal_brand = self.equal_by_house_id(brand_data, house_id, 2)
  721. house_result_part = []
  722. if equal_house and equal_brand:
  723. equal_house = equal_house[2:]
  724. equal_brand = equal_brand[4:]
  725. for i in range(0, 10):
  726. house_result_part.append(self.add(equal_house[i], equal_brand[i]))
  727. elif equal_house and not equal_brand:
  728. equal_house = equal_house[2:]
  729. for i in range(0, 10):
  730. house_result_part.append(equal_house[i])
  731. elif not equal_house and equal_brand:
  732. equal_brand = equal_brand[4:]
  733. for i in range(0, 10):
  734. house_result_part.append(equal_brand[i])
  735. house_result.append(sum(house_result_part))
  736. house_result.extend(house_result_part)
  737. result.append(house_result)
  738. result.sort(key=lambda obj: obj[1])
  739. result.reverse()
  740. return result
  741. def equal_by_house_id(self, data, house_id, index):
  742. for x in data:
  743. if x[index] == house_id:
  744. return x
  745. def filter_by_brand_ids(self, data, brand_ids):
  746. result = []
  747. for x in data:
  748. if x[0] in brand_ids:
  749. result.append(x)
  750. result.sort(key=lambda obj: obj[3])
  751. result.reverse()
  752. return result
  753. def filter_by_house_ids(self, data, house_ids):
  754. result = []
  755. for x in data:
  756. if x[0] in house_ids:
  757. result.append(x)
  758. result.sort(key=lambda obj: obj[2])
  759. result.reverse()
  760. return result
  761. def data_overview(self, time_range, house_ids, xcx_top_data, brand_top_data):
  762. """
  763. 统计数据总览
  764. :param time_range:
  765. :param house_ids:
  766. :return:
  767. """
  768. result = []
  769. # 1:总浏览量
  770. data_1_1 = self.db.select(self.sql_1_1, [time_range[0], time_range[1], house_ids])
  771. number_1_1 = data_1_1[0][0]
  772. data_1_2 = self.db.select(self.sql_1_2, [time_range[0], time_range[1], house_ids])
  773. number_1_2 = data_1_2[0][0]
  774. number_1 = self.add(number_1_1, number_1_2)
  775. result.append(number_1)
  776. # 2: 总浏览人数
  777. data_2 = self.db.select(self.sql_1_3, [time_range[0], time_range[1], house_ids, time_range[0], time_range[1], house_ids])
  778. number_2 = data_2[0][0]
  779. result.append(number_2)
  780. # 3:新增获客
  781. time_1 = time_range[0] + ' 00:00:00'
  782. time_2 = time_range[1] + ' 23:59:59'
  783. data_3 = self.db.select(self.sql_1_4, [time_1, time_2, house_ids, time_1, time_2, house_ids])
  784. number_3 = data_3[0][0]
  785. result.append(number_3)
  786. # 4:新增获电
  787. data_4 = self.db.select(self.sql_1_5, [time_1, time_2, house_ids, house_ids, time_1, time_2])
  788. number_4 = data_4[0][0]
  789. result.append(number_4)
  790. xcx_top_data_part = [x for x in xcx_top_data if x[0] in house_ids]
  791. brand_top_data_part = [x for x in brand_top_data if x[1] in house_ids]
  792. # 5 6 7 8
  793. number_5 = 0
  794. number_6 = 0
  795. number_7 = 0
  796. number_8 = 0
  797. for x in brand_top_data_part:
  798. number_5 = self.add(number_5, x[3])
  799. number_6 = self.add(number_6, x[4])
  800. number_7 = self.add(number_7, x[5])
  801. number_8 = self.add(number_8, x[6])
  802. result.append(number_5)
  803. result.append(number_6)
  804. result.append(number_7)
  805. result.append(number_8)
  806. # 9 10 11 12
  807. number_9 = 0
  808. number_10 = 0
  809. number_11 = 0
  810. number_12 = 0
  811. for x in xcx_top_data_part:
  812. number_9 = self.add(number_9, x[2])
  813. number_10 = self.add(number_10, x[3])
  814. number_11 = self.add(number_11, x[4])
  815. number_12 = self.add(number_12, x[5])
  816. result.append(number_9)
  817. result.append(number_10)
  818. result.append(number_11)
  819. result.append(number_12)
  820. return result
  821. def house_with_brand(self, xcx_top_data, brand_top_data, brands=None):
  822. """
  823. 项目数据和集团数据的求和
  824. :param brands:
  825. :param xcx_top_data:
  826. :param brand_top_data:
  827. :return:
  828. """
  829. result = []
  830. house_ids = []
  831. for x in xcx_top_data:
  832. if x[0] not in house_ids:
  833. house_ids.append(x[0])
  834. for x in brand_top_data:
  835. if x[1] not in house_ids and x[1] is not None and int(x[1]) > 300:
  836. house_ids.append(x[1])
  837. for house_id in house_ids:
  838. a = []
  839. a_order = 0
  840. for index, x in enumerate(xcx_top_data):
  841. if str(house_id) == str(x[0]):
  842. a.extend(x)
  843. a_order = index + 1
  844. b = []
  845. b_order = 0
  846. for index, y in enumerate(brand_top_data):
  847. if str(house_id) == str(y[1]):
  848. b.extend(y)
  849. b_order = index + 1
  850. order = b_order if b_order > 0 else a_order
  851. if len(a) > 0 and len(b) > 0:
  852. result.append([order, b[0], a[0], a[1], self.add(a[2], b[3]), self.add(a[3], b[4]), self.add(a[4], b[5]), self.add(a[5], b[6])])
  853. elif len(a) > 0 and len(b) == 0:
  854. _a = [order, 1]
  855. for x in a:
  856. _a.append(x)
  857. result.append(_a)
  858. elif len(a) == 0 and len(b) > 0:
  859. _b = [order]
  860. _b.extend(b)
  861. result.append(_b)
  862. else:
  863. pass
  864. if brands:
  865. for index, x in enumerate(brand_top_data):
  866. if x[0] in brands and x[1] is not None and int(x[1]) == 0:
  867. _x = [index + 1]
  868. _x.extend(x)
  869. result.append(_x)
  870. result.sort(key=lambda obj: obj[3])
  871. result.reverse()
  872. return result
  873. def add(self, a=None, b=None):
  874. if a and b:
  875. return a + b
  876. elif a and not b:
  877. return a
  878. elif b and not a:
  879. return b
  880. return 0
  881. def xcx_top(self, time_range):
  882. """
  883. 获取 1.默认值/001_大麦/项目排行榜/小程序排行榜TOP_N
  884. :return:
  885. """
  886. params = []
  887. params.extend(time_range)
  888. params.extend(time_range)
  889. params.extend(time_range)
  890. params.extend(time_range)
  891. xcx_top_data = self.db.select(self.sql_2_1, params)
  892. result = []
  893. for x in xcx_top_data:
  894. result.append([n for n in x])
  895. # xcx_top_data的结果结构
  896. # 0 a.house_id, 项目id
  897. # 1 a.house_name, 项目名称
  898. # 2 SUM(a.pv), 浏览总量
  899. # 3 SUM(a.uv), 浏览人数
  900. # 4 SUM(a.new_cust_num), 新增获客
  901. # 5 SUM(a.wx_num) 授权手机号
  902. result.sort(key=lambda obj: obj[2])
  903. result.reverse()
  904. return result
  905. def brand_top(self, time_range):
  906. """
  907. 2.默认值/006_大麦(集团)/集团项目排行榜v1.3/集团排行榜
  908. :param task_key:
  909. :return:
  910. """
  911. params = [time_range[0], time_range[1]]
  912. brand_top_data = self.db.select(self.sql_2_2, params)
  913. result = []
  914. for x in brand_top_data:
  915. result.append([n for n in x])
  916. # brand_top_data结果的结构
  917. # 0 a.brand_id, 集团id
  918. # 1 a.house_id, 项目id
  919. # 2 a.house_name, 项目名称
  920. # 3 SUM(a.pv), 浏览总量
  921. # 4 SUM(a.uv), 浏览人数
  922. # 5 SUM(a.new_cust), 新增获客
  923. # 6 SUM(a.shouquan_cust) 授权手机号
  924. result.sort(key=lambda obj: obj[3])
  925. result.reverse()
  926. return result
  927. """
  928. 数据分享类别
  929. 1:长按识别二维码 2:会话 3:公众号菜单 4:公众号文章 5:小程序历史列表 6:扫一扫二维码
  930. 7:搜索 8:相册选取二维码 9:其他小程序 10:其他
  931. """
  932. share_way = {
  933. "长按识别二维码": 1,
  934. "会话": 2,
  935. "公众号菜单": 3,
  936. '公众号文章': 4,
  937. '小程序历史列表': 5,
  938. '扫一扫二维码': 6,
  939. '搜索': 7,
  940. '相册选取二维码': 8,
  941. '其他小程序': 9,
  942. '其他': 10
  943. }
  944. def customer_channel_details(self, time_range):
  945. """
  946. 1.默认值/001_大麦/场景_用户来源渠道/用户来源渠道—明细
  947. :param task_key:
  948. :return:
  949. """
  950. params = []
  951. params.extend(time_range)
  952. customer_channel_details_data = self.db.select(self.sql_3_1, params)
  953. result = []
  954. for x in customer_channel_details_data:
  955. ele = []
  956. order = self.share_way.get(x[2])
  957. if order:
  958. ele.append(x[0])
  959. ele.append(x[1])
  960. ele.append(order)
  961. ele.append(x[3])
  962. result.append(ele)
  963. result.sort(key=lambda obj: obj[0])
  964. end_data = []
  965. for key, data in groupby(result, key=lambda obj: obj[0]):
  966. others_data = []
  967. for ot in data:
  968. others_data.append([x for x in ot])
  969. lable_data = []
  970. if len(others_data) > 0:
  971. lable_data.append(others_data[0][0])
  972. lable_data.append(others_data[0][1])
  973. for i in range(1, 11):
  974. number = 0
  975. for od in others_data:
  976. if i == od[2]:
  977. number = od[3]
  978. else:
  979. pass
  980. lable_data.append(number)
  981. pass
  982. end_data.append(lable_data)
  983. # customer_channel_details_data数据结构
  984. # house_id, 项目id
  985. # house_name, 项目名称
  986. # label_wx, 分享类别
  987. # COUNT(a.id) as counts, 数量
  988. return end_data
  989. def brand_customer_channel_details(self, time_range):
  990. """
  991. 2.默认值/006_大麦(集团)/场景(集团)_用户来源渠道_v1.1/用户来源渠道—明细
  992. :param frequency:
  993. :return:
  994. """
  995. params = [time_range[0], time_range[1], time_range[0], time_range[1]]
  996. brand_customer_channel_details_data = self.db.select(self.sql_3_2, params)
  997. # brand_customer_channel_details_data数据结构
  998. # 0 brand_id, 集团id
  999. # 1 x.brand_name, 集团名称
  1000. # 2 house_id, 项目id
  1001. # 3 house_name, 项目名称
  1002. # 4 label_wx, 分享类别
  1003. # 5 COUNT(1) 数量
  1004. result = []
  1005. for x in brand_customer_channel_details_data:
  1006. ele = []
  1007. order = self.share_way.get(x[4])
  1008. if order:
  1009. ele.append(x[0])
  1010. ele.append(x[1])
  1011. ele.append(x[2])
  1012. ele.append(x[3])
  1013. ele.append(order)
  1014. ele.append(x[5])
  1015. result.append(ele)
  1016. result.sort(key=lambda obj: obj[2])
  1017. end_data = []
  1018. for key, data in groupby(result, key=lambda obj: obj[2]):
  1019. others_data = []
  1020. for ot in data:
  1021. others_data.append([x for x in ot])
  1022. lable_data = []
  1023. if len(others_data) > 0:
  1024. lable_data.extend(others_data[0][0: 4])
  1025. for i in range(1, 11):
  1026. number = 0
  1027. for od in others_data:
  1028. if i == od[4]:
  1029. number = od[5]
  1030. else:
  1031. pass
  1032. lable_data.append(number)
  1033. pass
  1034. end_data.append(lable_data)
  1035. return end_data
  1036. def push_log_recording(self, push_message):
  1037. """
  1038. 报表推送日志记录
  1039. :param push_message:
  1040. :return:
  1041. """
  1042. self.db.add_some(self.sql_6, push_message)
  1043. def get_house_ids_by_brand_id(self, brand_id):
  1044. return self.db.select(self.sql_5, [brand_id])
  1045. def get_brand_info_by_house_id(self, house_id):
  1046. """
  1047. 根据项目id或者相应的集团信息
  1048. :param house_id:
  1049. :return:
  1050. """
  1051. brand_info = self.db.select(self.sql_7, [house_id])
  1052. if len(brand_info) == 1:
  1053. return brand_info[0][0]
  1054. return
  1055. def get_brand_ids_by_house_ids(self, house_ids):
  1056. brand_ids = self.db.select(self.sql_8, [house_ids])
  1057. ids = []
  1058. for x in brand_ids:
  1059. if x and x[0]:
  1060. ids.append(x[0])
  1061. return ids
  1062. def get_house_ids_by_brand_ids(self, brand_ids):
  1063. result = []
  1064. ids = self.db.select(self.sql_5_1, [brand_ids])
  1065. for x in ids:
  1066. if x[0] not in result:
  1067. result.append(x[0])
  1068. return result
  1069. def get_time_range(self, task_key):
  1070. """
  1071. 根据定时任务id获取时间区间
  1072. 时间格式 yyyy-mm-dd
  1073. :param task_key:1: 日报,2:周报, 3:all
  1074. :return:
  1075. """
  1076. now_time = datetime.datetime.now()
  1077. pre_time = None
  1078. if task_key in (2, 3):
  1079. # 上周,上周一到上周天
  1080. pre_time = now_time + datetime.timedelta(days=-7)
  1081. now_time = now_time + datetime.timedelta(days=-1)
  1082. pass
  1083. elif task_key in (1, 4):
  1084. # 昨天
  1085. pre_time = now_time + datetime.timedelta(days=-1)
  1086. now_time = now_time + datetime.timedelta(days=-1)
  1087. pass
  1088. elif task_key in (9999, 9999):
  1089. # 不限时间
  1090. pre_time = now_time + datetime.timedelta(days=-2999)
  1091. return [pre_time.strftime('%Y-%m-%d'), now_time.strftime('%Y-%m-%d')]
  1092. if __name__ == '__main__':
  1093. rp = ReportPush('linshi')
  1094. times = rp.get_time_range(1)