report_push.py 39 KB

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