jianye_report.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. from mysql_db import MysqlDB
  2. from sql import Sql
  3. from report_public_funs_utils import ReportPublicFunsUtils as rpfu
  4. from mail_content_text import MailContentText
  5. from email_util import EmailUtil
  6. from file_util import FileUtil
  7. from report_file_utils import ReportFileUtils
  8. class JianYeReport(object):
  9. """
  10. 建业报表数据处理
  11. """
  12. # customer_mails = ['liutt@elab-plus.com', 'binrenzhang@qq.com', 'plf@centralchina.com']
  13. customer_mails = ['liutt@elab-plus.com', 'binrenzhang@qq.com', 'zhuyl@elab-plus.com', 'lijm@elab-plus.com', 'xuanxc@elab-plus.com']
  14. #
  15. index_type = [
  16. 'fenxianghuodian',
  17. 'liebianhuodian',
  18. 'saomadaofang',
  19. 'quanminjingjiren',
  20. 'laoyezhu',
  21. 'baobeichenggong',
  22. 'baobeidaofang'
  23. ]
  24. head_1 = ['城市', '项目名称', '浏览量', '浏览人数', '新增用户', '新增获电', '推荐用户', '分享获电', '裂变获电',
  25. '扫码到访数', '全民经纪人注册数', '老业主注册数', '报备成功数', '报备到访数']
  26. brand_id = '13'
  27. sheet_names_1 = ['当日数据', '当月数据', '上线以来所有数据']
  28. def __init__(self):
  29. self.db = MysqlDB('bi_report')
  30. time_range_1 = rpfu.get_prd_day()
  31. time_range_2 = rpfu.get_time_range_month()
  32. time_range_3 = rpfu.get_all_time_data_range()
  33. self.pv_data_1 = self.pv_count(time_range_1)
  34. self.pv_data_2 = self.pv_count(time_range_2)
  35. self.pv_data_3 = self.pv_count(time_range_3)
  36. def get_city_house_id(self):
  37. return self.db.select(Sql.sql_1)
  38. def get_report_customers(self, task_key):
  39. return self.db.select(Sql.sql_2, [task_key])
  40. def get_mail_title(self, type, region_name, name):
  41. """
  42. 获取邮件名称
  43. :param region_name:
  44. :param type:1:项目,2:集团,3:区域
  45. :param name: 项目 区域名称
  46. :return:
  47. """
  48. month_day = rpfu.get_montho_day()
  49. if type == 1:
  50. return '[{}]{}数据报表_{}'.format(month_day, region_name, name)
  51. elif type == 2:
  52. return '[{}]建业云集团数据报表_{}'.format(month_day, name)
  53. elif type == 3:
  54. return '[{}]建业云{}数据报表_{}'.format(month_day, region_name, name)
  55. def get_mail_content(self, customer_type):
  56. """
  57. 根据客户类型获取邮件正文
  58. :param customer_type:
  59. :return:
  60. """
  61. if customer_type == 2:
  62. return MailContentText.text_1
  63. else:
  64. return '本期数据报告已经准备完成,请点击附件查阅.'
  65. # 项目级别的统计
  66. def house_data_detail(self, time_range):
  67. result = self.db.select(Sql.sql_8, [time_range[0], time_range[1]])
  68. return result
  69. def pv_count(self, time_range):
  70. """
  71. 新的用户行为统计
  72. :param time_range:
  73. :return:
  74. """
  75. sql_result = self.db.select(Sql.sql_13, [time_range[0], time_range[1]])
  76. return sql_result
  77. def user_data_volume_statistics(self, time_range, house_ids):
  78. """
  79. 用户浏览量,人数,新增获客,新增获点数据统计
  80. :param time_range:
  81. :param house_ids:
  82. :return:
  83. """
  84. # 1:总浏览量
  85. result = []
  86. data_1_1 = self.db.select(Sql.sql_3, [time_range[0], time_range[1], house_ids])
  87. number_1_1 = data_1_1[0][0]
  88. data_1_2 = self.db.select(Sql.sql_4, [time_range[0], time_range[1], house_ids])
  89. number_1_2 = data_1_2[0][0]
  90. number_1 = rpfu.add(number_1_1, number_1_2)
  91. result.append(number_1)
  92. # 2: 总浏览人数
  93. data_2 = self.db.select(Sql.sql_5,
  94. [time_range[0], time_range[1], house_ids, time_range[0], time_range[1], house_ids])
  95. number_2 = data_2[0][0]
  96. result.append(number_2)
  97. # 3:新增获客
  98. time_1 = time_range[0] + ' 00:00:00'
  99. time_2 = time_range[1] + ' 23:59:59'
  100. data_3 = self.db.select(Sql.sql_6, [time_1, time_2, house_ids, time_1, time_2, house_ids])
  101. number_3 = data_3[0][0]
  102. result.append(number_3)
  103. # 4:新增获电
  104. data_4 = self.db.select(Sql.sql_7, [time_1, time_2, house_ids, house_ids, time_1, time_2])
  105. number_4 = data_4[0][0]
  106. result.append(number_4)
  107. return result
  108. def region_house_id(self):
  109. return self.db.select(Sql.sql_11)
  110. def get_recommend_data(self, time_range):
  111. return self.db.select(Sql.sql_9, [time_range[0], time_range[1]])
  112. def get_house_id_by_brand_id(self, brand_id):
  113. result = []
  114. for x in self.get_city_house_id():
  115. if str(x[0]) == str(brand_id) and x[1] is not None and len(x[1]) > 4:
  116. result.append(x[1])
  117. return result
  118. def get_pv_data(self, time_type):
  119. pv_data = None
  120. if time_type == 1:
  121. pv_data = self.pv_data_1
  122. elif time_type == 2:
  123. pv_data = self.pv_data_2
  124. elif time_type == 3:
  125. pv_data = self.pv_data_3
  126. return pv_data
  127. def brand_pv_by_time_type(self, time_type):
  128. pv_data = self.get_pv_data(time_type)
  129. if pv_data:
  130. for x in pv_data:
  131. if str(x[0]) == self.brand_id and x[2] is not None and x[2] == '集团':
  132. return x[3:]
  133. return [0, 0, 0, 0]
  134. def brand_data_of_time(self, time_range, time_type):
  135. result = []
  136. data_1 = self.brand_pv_by_time_type(time_type)
  137. data_2 = []
  138. number_2 = 0
  139. for x in self.get_recommend_data(time_range):
  140. if str(x[0]) == str(self.brand_id):
  141. number_2 += x[1]
  142. data_2.append(number_2)
  143. data_3 = []
  144. sql_data_3 = self.db.select(Sql.sql_10, [time_range[0], time_range[1]])
  145. for key in self.index_type:
  146. number = 0
  147. for x in sql_data_3:
  148. if str(x[0]) == str(key):
  149. number = x[1]
  150. data_3.append(number)
  151. result.extend(data_1)
  152. result.extend(data_2)
  153. result.extend(data_3)
  154. return result
  155. def brand_data(self):
  156. """
  157. 集团数据总览, 表一。
  158. :return:
  159. """
  160. result = []
  161. time_rang_1 = rpfu.get_prd_day()
  162. time_rang_2 = rpfu.get_time_range_month()
  163. time_range_3 = rpfu.get_all_time_data_range()
  164. result.extend(self.brand_data_of_time(time_rang_1, 1))
  165. result.extend(self.brand_data_of_time(time_rang_2, 2))
  166. result.extend(self.brand_data_of_time(time_range_3, 3))
  167. return result
  168. def get_house_pv_data(self, house_id, time_type):
  169. pv_data = self.get_pv_data(time_type)
  170. if pv_data is not None:
  171. for x in pv_data:
  172. if str(x[1]) == str(house_id):
  173. return x[3:]
  174. return [0, 0, 0, 0]
  175. def house_data_of_time(self, time_range, house_ids, time_type):
  176. # brand_id, house_id, house_name, city
  177. city_info = self.get_city_house_id()
  178. data_1 = []
  179. for id in house_ids:
  180. sub = [id]
  181. sub.extend(self.get_house_pv_data(id, time_type))
  182. data_1.append(sub)
  183. data_2 = []
  184. for id in house_ids:
  185. sub = [id]
  186. number = 0
  187. for x in self.get_recommend_data(time_range):
  188. if str(id) == str(x[0]):
  189. number = x[1]
  190. sub.append(number)
  191. data_2.append(sub)
  192. data_3 = []
  193. for house_id in house_ids:
  194. sub = []
  195. for x in self.house_data_detail(time_range):
  196. # house_id, type, COUNT(DISTINCT customer_mobile)
  197. if str(house_id) == str(x[0]):
  198. sub.append(x)
  199. house_data = [house_id]
  200. for key in self.index_type:
  201. number = 0
  202. for x in sub:
  203. if str(key) == str(x[1]):
  204. number = x[2]
  205. house_data.append(number)
  206. data_3.append(house_data)
  207. result = []
  208. for id in house_ids:
  209. sub = []
  210. for x in city_info:
  211. if str(id) == str(x[1]):
  212. sub.extend([x[3], x[2]])
  213. if len(sub) == 0:
  214. sub.extend(['0000', '0000'])
  215. for x in data_1:
  216. if str(id) == str(x[0]):
  217. sub.extend(x[1:])
  218. for x in data_2:
  219. if str(id) == str(x[0]):
  220. sub.extend(x[1:])
  221. for x in data_3:
  222. if str(id) == str(x[0]):
  223. sub.extend(x[1:])
  224. result.append(sub)
  225. result.sort(key=lambda obj: obj[5], reverse=True)
  226. return result
  227. def house_data(self, house_ids):
  228. time_range_1 = rpfu.get_prd_day()
  229. time_range_2 = rpfu.get_time_range_month()
  230. time_range_3 = rpfu.get_all_time_data_range()
  231. result = [self.house_data_of_time(time_range_1, house_ids, 1), self.house_data_of_time(time_range_2, house_ids, 2),
  232. self.house_data_of_time(time_range_3, house_ids, 3)]
  233. return result
  234. def get_house_region_info(self):
  235. return self.db.select(Sql.sql_15)
  236. def send_mail_to_customer(self, task_key):
  237. """
  238. 统计数据推送给客户, 表二
  239. :param: task_key
  240. :return:
  241. """
  242. # 邮件发送参数
  243. # mail_title,
  244. # content,
  245. # receiver,
  246. # mail_excel,
  247. # file_name,
  248. # mail_excel_1=None,
  249. # file_name_1=None
  250. message = {}
  251. send_mail_info = []
  252. mail_util = EmailUtil()
  253. rfu = ReportFileUtils()
  254. customers = self.get_report_customers(task_key)
  255. message[0] = '客户信息获取成功'
  256. send_mail_log = []
  257. brand_table_one = None
  258. brand_table_two = None
  259. try:
  260. save_path = FileUtil().save_path_create()
  261. send_data = []
  262. # 查询数据
  263. if task_key == 12:
  264. # 集团信息计算一次发送给多个人
  265. brand_table_one = self.brand_data()
  266. message['brand'] = 'success'
  267. house_ids = self.get_house_id_by_brand_id('13')
  268. brand_table_two = self.house_data(house_ids)
  269. message['house'] = 'success'
  270. # 总浏览量:xx ,总浏览人数:xx
  271. #
  272. # 新增获客: xx, 新增获电:xx
  273. #
  274. # 推荐用户数:xx,分享获电:xx,裂变获电:xx
  275. #
  276. # 全民经纪人注册数:xx
  277. #
  278. # 报备成功数:xx,报备到访数:xx
  279. for customer in customers:
  280. # a.task_key, b.customer_type, b.name, b.mail, b.house_or_region, a.customer_id, GROUP_CONCAT(c.house_or_brand_id) as ids
  281. name = customer[2]
  282. customer_type = customer[1]
  283. mail = customer[3]
  284. ids = customer[6]
  285. region_name = customer[4]
  286. title = self.get_mail_title(customer_type, region_name, name)
  287. content = self.get_mail_content(customer_type)
  288. file_path = save_path + '/' + title + '.xls'
  289. try:
  290. if customer_type == 2:
  291. # 集团
  292. content = self.get_brand_content(content, brand_table_one)
  293. send_data.append(
  294. [brand_table_two, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1],
  295. file_path, content, name, mail])
  296. # rfu.create_excel_file(table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path)
  297. elif customer_type == 1:
  298. # 项目
  299. table_2 = self.house_data(self.get_house_ids(ids))
  300. send_data.append(
  301. [table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path,
  302. content, name, mail])
  303. # rfu.create_excel_file(table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path)
  304. elif customer_type == 3:
  305. # 区域
  306. table_2 = self.house_data(self.get_house_ids(ids))
  307. send_data.append(
  308. [table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path,
  309. content, name, mail])
  310. # rfu.create_excel_file(table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path)
  311. else:
  312. send_mail_log.append([name, mail, title, -1, '客户类型错误{}'.format(customer_type)])
  313. pass
  314. except Exception as e:
  315. print(str(e))
  316. # # name, mail, report_name, push_time, send_status, status, error_message
  317. send_mail_log.append([name, mail, title, -1, '数据查询失败:{}'.format(str(e))])
  318. message['query_data'] = 'success'
  319. # 生成文件
  320. for data in send_data:
  321. try:
  322. rfu.create_excel_file(data[0], data[1], data[2], data[3], data[4])
  323. # [title, content, mail, file_path, title + '.xlsx', name]
  324. send_mail_info.append([data[2], data[5], data[7], data[4], data[2] + '.xls', data[6]])
  325. except Exception as e:
  326. print(e)
  327. send_mail_log.append([data[6], data[7], data[2], -1, '文件创建失败:{}'.format(str(e))])
  328. message['file'] = 'success'
  329. # 发送邮件
  330. for mail in send_mail_info:
  331. try:
  332. # for m in self.customer_mails:
  333. result = mail_util.send_mail_by_admin(mail[0], mail[1], mail[2], mail[3], mail[4])
  334. if result:
  335. # name, mail, report_name, push_time, send_status, status, error_message
  336. send_mail_log.append([mail[5], mail[2], mail[3], 1, 'success'])
  337. else:
  338. send_mail_log.append([mail[5], mail[2], mail[3], -1, 'fail'])
  339. except Exception as e:
  340. print(str(e))
  341. message['error1'] = str(e)
  342. send_mail_log.append([mail[5], mail[2], mail[3], -1, '邮件发送失败:{}'.format(str(e))])
  343. message['mail'] = 'success'
  344. # 写入日志
  345. self.db.add_some(Sql.sql_12, send_mail_log)
  346. message['log'] = 'success'
  347. except Exception as e:
  348. message['error'] = str(e)
  349. finally:
  350. return message
  351. def get_brand_content(self, content, brand_table_one):
  352. content = content.format(rpfu.get_montho_day(),
  353. brand_table_one[0], brand_table_one[1], brand_table_one[2], brand_table_one[3],
  354. brand_table_one[4], brand_table_one[5],
  355. brand_table_one[6], brand_table_one[8], brand_table_one[10], brand_table_one[11],
  356. rpfu.get_month(),
  357. brand_table_one[12], brand_table_one[13], brand_table_one[14], brand_table_one[15],
  358. brand_table_one[16],
  359. brand_table_one[17],
  360. brand_table_one[18], brand_table_one[20], brand_table_one[22], brand_table_one[23],
  361. brand_table_one[24], brand_table_one[25], brand_table_one[26], brand_table_one[27],
  362. brand_table_one[28],
  363. brand_table_one[29],
  364. brand_table_one[30], brand_table_one[32], brand_table_one[34], brand_table_one[35]
  365. )
  366. return content
  367. def get_customer_info_by_id(self, customer_id):
  368. return self.db.select(Sql.sql_14, [customer_id])
  369. def send_mail_for_customer_id(self, customer_id, new_mail=None):
  370. """
  371. 获取指定客户的邮件信息
  372. :param customer_id:
  373. :param new_mail:
  374. :return:
  375. """
  376. message = {}
  377. customers = self.get_customer_info_by_id(customer_id)
  378. message['customer'] = str(customer_id)
  379. send_data = []
  380. if customers:
  381. for customer in customers:
  382. try:
  383. save_path = FileUtil().save_path_create()
  384. name = customer[1]
  385. mail = customer[2]
  386. customer_type = customer[3]
  387. ids = self.get_house_ids(customer[5])
  388. region_name = customer[4]
  389. title = self.get_mail_title(customer_type, region_name, name)
  390. content = self.get_mail_content(customer_type)
  391. file_path = save_path + '/' + title + '.xls'
  392. if customer_type == 1:
  393. # 项目
  394. table_2 = self.house_data(ids)
  395. send_data.append(
  396. [table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path,
  397. content, name, mail])
  398. elif customer_type == 2:
  399. # 集团
  400. brand_table_one = self.brand_data()
  401. house_ids = self.get_house_id_by_brand_id('13')
  402. brand_table_two = self.house_data(house_ids)
  403. content = self.get_brand_content(content, brand_table_one)
  404. send_data.append(
  405. [brand_table_two, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1],
  406. file_path, content, name, mail])
  407. elif customer_type == 3:
  408. # 区域
  409. table_2 = self.house_data(ids)
  410. send_data.append(
  411. [table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path,
  412. content, name, mail])
  413. else:
  414. message['customer_type'] = '客户类型错误'
  415. except Exception as e:
  416. message['数据查询失败'] = str(e)
  417. else:
  418. message['error'] = '客户id错误:{}'.format(customer_id)
  419. # 生成文件
  420. rfu = ReportFileUtils()
  421. send_mail_log = []
  422. send_mail_info = []
  423. if len(send_data) > 0:
  424. for data in send_data:
  425. try:
  426. rfu.create_excel_file(data[0], data[1], data[2], data[3], data[4])
  427. send_mail_info.append([data[2], data[5], data[7], data[4], data[2] + '.xls', data[6]])
  428. except Exception as e:
  429. print(e)
  430. message['excel文件创建失败'] = str(e)
  431. send_mail_log.append([data[6], data[7], data[2], -1, '文件创建失败:{}'.format(str(e))])
  432. else:
  433. message['excel_info'] = '需要生成excel的数据空'
  434. # 发送邮件
  435. mail_util = EmailUtil()
  436. if len(send_data) > 0:
  437. for mail in send_mail_info:
  438. try:
  439. if new_mail:
  440. result = mail_util.send_mail_by_admin(mail[0], mail[1], new_mail, mail[3], mail[4])
  441. if result:
  442. # name, mail, report_name, push_time, send_status, status, error_message
  443. send_mail_log.append([mail[5], mail[2], mail[3], 1, 'success'])
  444. else:
  445. send_mail_log.append([mail[5], mail[2], mail[3], -1, 'fail'])
  446. else:
  447. for m in self.customer_mails:
  448. result = mail_util.send_mail_by_admin(mail[0], mail[1], m, mail[3], mail[4])
  449. if result:
  450. # name, mail, report_name, push_time, send_status, status, error_message
  451. send_mail_log.append([mail[5], mail[2], mail[3], 1, 'success'])
  452. else:
  453. send_mail_log.append([mail[5], mail[2], mail[3], -1, 'fail'])
  454. except Exception as e:
  455. print(str(e))
  456. message['邮件发送失败'] = str(e)
  457. send_mail_log.append([mail[5], mail[2], mail[3], -1, '邮件发送失败:{}'.format(str(e))])
  458. else:
  459. message['mail_info'] = '需要发送邮件的数据为空'
  460. # 写入日志
  461. self.db.add_some(Sql.sql_12, send_mail_log)
  462. return message
  463. def get_house_ids(self, ids_str):
  464. if str(ids_str).find(',') == -1:
  465. return [ids_str]
  466. else:
  467. return [x for x in str(ids_str).split(',')]
  468. if __name__ == '__main__':
  469. pass