jianye_report.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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 = ['plf@centralchina.com', 'liutt@elab-plus.com', 'binrenzhang@qq.com']
  13. customer_mails = ['binrenzhang@qq.com']
  14. #
  15. index_type = [
  16. 'fenxianghuodian',
  17. 'liebianhuodian',
  18. 'saomadaofang',
  19. 'quanminjingjiren',
  20. 'laoyezhu',
  21. 'baobeichenggong',
  22. 'baobeidaofang'
  23. ]
  24. head_1 = ['城市', '项目名称', '浏览量', '浏览人数', '新增用户', '新增获电', '推荐用户', '分享获电', '裂变获电', '扫码到访数', '全民经纪人注册数', '报备成功数', '报备到访数']
  25. brand_id = '13'
  26. sheet_names_1 = ['当日数据', '当月数据', '上线以来所有数据']
  27. def __init__(self):
  28. self.db = MysqlDB('bi_report')
  29. def get_city_house_id(self):
  30. return self.db.select(Sql.sql_1)
  31. def get_report_customers(self, task_key):
  32. return self.db.select(Sql.sql_2, [task_key])
  33. def get_mail_title(self, type, region_name,name):
  34. """
  35. 获取邮件名称
  36. :param type:1:项目,2:集团,3:区域
  37. :param name: 项目 区域名称
  38. :return:
  39. """
  40. month_day = rpfu.get_montho_day()
  41. if type == 1:
  42. return '[{}]{}数据报表_{}'.format(month_day, region_name,name)
  43. elif type == 2:
  44. return '[{}]建业云集团数据报表_{}'.format(month_day, name)
  45. elif type == 3:
  46. return '[{}]建业云{}数据报表_{}'.format(month_day, region_name, name)
  47. def get_mail_content(self, customer_type):
  48. """
  49. 根据客户类型获取邮件正文
  50. :param customer_type:
  51. :return:
  52. """
  53. if customer_type == 2:
  54. return MailContentText.text_1
  55. else:
  56. return '本期数据报告已经准备完成,请点击附件查阅.'
  57. # 项目级别的统计
  58. def house_data_detail(self, time_range):
  59. result = self.db.select(Sql.sql_8, [time_range[0], time_range[1]])
  60. return result
  61. def user_data_volume_statistics(self, time_range, house_ids):
  62. """
  63. 用户浏览量,人数,新增获客,新增获点数据统计
  64. :param time_range:
  65. :param house_ids:
  66. :return:
  67. """
  68. # 1:总浏览量
  69. result = []
  70. data_1_1 = self.db.select(Sql.sql_3, [time_range[0], time_range[1], house_ids])
  71. number_1_1 = data_1_1[0][0]
  72. data_1_2 = self.db.select(Sql.sql_4, [time_range[0], time_range[1], house_ids])
  73. number_1_2 = data_1_2[0][0]
  74. number_1 = rpfu.add(number_1_1, number_1_2)
  75. result.append(number_1)
  76. # 2: 总浏览人数
  77. data_2 = self.db.select(Sql.sql_5, [time_range[0], time_range[1], house_ids, time_range[0], time_range[1], house_ids])
  78. number_2 = data_2[0][0]
  79. result.append(number_2)
  80. # 3:新增获客
  81. time_1 = time_range[0] + ' 00:00:00'
  82. time_2 = time_range[1] + ' 23:59:59'
  83. data_3 = self.db.select(Sql.sql_6, [time_1, time_2, house_ids, time_1, time_2, house_ids])
  84. number_3 = data_3[0][0]
  85. result.append(number_3)
  86. # 4:新增获电
  87. data_4 = self.db.select(Sql.sql_7, [time_1, time_2, house_ids, house_ids, time_1, time_2])
  88. number_4 = data_4[0][0]
  89. result.append(number_4)
  90. return result
  91. def region_house_id(self):
  92. return self.db.select(Sql.sql_11)
  93. def get_recommend_data(self, time_range):
  94. return self.db.select(Sql.sql_9, [time_range[0], time_range[1]])
  95. def get_house_id_by_brand_id(self, brand_id):
  96. result = []
  97. for x in self.get_city_house_id():
  98. if str(x[0]) == str(brand_id):
  99. result.append(x[1])
  100. return result
  101. def brand_data_of_time(self, time_range):
  102. result = []
  103. ids = self.get_house_id_by_brand_id(self.brand_id)
  104. data_1 = self.user_data_volume_statistics(time_range, ids)
  105. data_2 = []
  106. number_2 = 0
  107. for x in self.get_recommend_data(time_range):
  108. if str(x[0]) == str(self.brand_id):
  109. number_2 = x[1]
  110. data_2.append(number_2)
  111. data_3 = []
  112. for key in self.index_type:
  113. number = 0
  114. for x in self.db.select(Sql.sql_10, [time_range[0], time_range[1]]):
  115. if str(x[0]) == str(key):
  116. number = x[1]
  117. data_3.append(number)
  118. result.extend(data_1)
  119. result.extend(data_2)
  120. result.extend(data_3)
  121. return result
  122. def brand_data(self):
  123. """
  124. 集团数据总览, 表一。
  125. :return:
  126. """
  127. result = []
  128. time_rang_1 = rpfu.get_prd_day()
  129. time_rang_2 = rpfu.get_time_range_month()
  130. time_range_3 = rpfu.get_all_time_data_range()
  131. result.extend(self.brand_data_of_time(time_rang_1))
  132. result.extend(self.brand_data_of_time(time_rang_2))
  133. result.extend(self.brand_data_of_time(time_range_3))
  134. return result
  135. def house_data_of_time(self, time_range, house_ids):
  136. # brand_id, house_id, house_name, city
  137. city_info = self.get_city_house_id()
  138. data_1 = []
  139. for id in house_ids:
  140. sub = [id]
  141. sub.extend(self.user_data_volume_statistics(time_range, [id]))
  142. data_1.append(sub)
  143. data_2 = []
  144. for id in house_ids:
  145. sub = [id]
  146. number = 0
  147. for x in self.get_recommend_data(time_range):
  148. if str(id) == str(x[0]):
  149. number = x[1]
  150. sub.append(number)
  151. data_2.append(sub)
  152. data_3 = []
  153. for house_id in house_ids:
  154. sub = []
  155. for x in self.house_data_detail(time_range):
  156. # house_id, type, COUNT(DISTINCT customer_mobile)
  157. if str(house_id) == str(x[0]):
  158. sub.append(x)
  159. house_data = [house_id]
  160. for key in self.index_type:
  161. number = 0
  162. for x in sub:
  163. if str(key) == str(x[1]):
  164. number = x[2]
  165. house_data.append(number)
  166. data_3.append(house_data)
  167. result = []
  168. for id in house_ids:
  169. sub = []
  170. for x in city_info:
  171. if str(id) == str(x[1]):
  172. sub.extend([x[3], x[2]])
  173. for x in data_1:
  174. if str(id) == str(x[0]):
  175. sub.extend(x[1:])
  176. for x in data_2:
  177. if str(id) == str(x[0]):
  178. sub.extend(x[1:])
  179. for x in data_3:
  180. if str(id) == str(x[0]):
  181. sub.extend(x[1:])
  182. result.append(sub)
  183. return result
  184. def house_data(self, house_ids):
  185. time_range_1 = rpfu.get_prd_day()
  186. time_range_2 = rpfu.get_time_range_month()
  187. time_range_3 = rpfu.get_all_time_data_range()
  188. result = []
  189. result.append(self.house_data_of_time(time_range_1, house_ids))
  190. result.append(self.house_data_of_time(time_range_2, house_ids))
  191. result.append(self.house_data_of_time(time_range_3, house_ids))
  192. return result
  193. def send_mail_to_customer(self, task_key):
  194. """
  195. 统计数据推送给客户, 表二
  196. :param: task_key
  197. :return:
  198. """
  199. # 邮件发送参数
  200. # mail_title,
  201. # content,
  202. # receiver,
  203. # mail_excel,
  204. # file_name,
  205. # mail_excel_1=None,
  206. # file_name_1=None
  207. message = {}
  208. send_mail_info = []
  209. mail_util = EmailUtil()
  210. rfu = ReportFileUtils()
  211. customers = self.get_report_customers(task_key)
  212. message[0] = '客户信息获取成功'
  213. try:
  214. for customer in customers:
  215. # 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
  216. name = customer[2]
  217. customer_type = customer[1]
  218. mail = customer[3]
  219. ids = customer[6]
  220. region_name = customer[4]
  221. title = self.get_mail_title(customer_type, region_name, name)
  222. content = self.get_mail_content(customer_type)
  223. save_path = FileUtil().save_path_create()
  224. file_path = save_path + '/' + title
  225. message[11] = '邮件信息生成成功'
  226. if customer_type == 2:
  227. # 集团
  228. message['99'] = '集团'
  229. table_1 = self.brand_data()
  230. message[33] = 'brand_data'
  231. house_ids = self.get_house_id_by_brand_id(ids)
  232. message[55] = 'get_house_id_by_brand_id'
  233. table_2 = self.house_data(house_ids)
  234. message[66] = 'house_data'
  235. # data, sheet_names, title, headers, save_path
  236. content = content.format(table_1[0], table_1[1], table_1[2], table_1[3], table_1[4], table_1[5],
  237. table_1[6], table_1[7], table_1[8], table_1[9], table_1[10], table_1[11], table_1[12],table_1[13], table_1[14],
  238. table_1[15], table_1[16], table_1[17], table_1[18],
  239. table_1[19], table_1[20], table_1[21], table_1[22], table_1[23], table_1[24], table_1[25],
  240. table_1[26], table_1[27], table_1[28], table_1[29], table_1[30], table_1[31],
  241. table_1[32], table_1[33], table_1[34], table_1[35]
  242. )
  243. rfu.create_excel_file(table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], save_path)
  244. elif customer_type == 1:
  245. # 项目
  246. message[111] = '项目'
  247. table_2 = self.house_data(self.get_house_ids(ids))
  248. message[222] = 'house_data'
  249. message[99999] = table_2
  250. rfu.create_excel_file(table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], save_path)
  251. elif customer_type == 3:
  252. # 区域
  253. message[333] = '区域'
  254. table_2 = self.house_data(self.get_house_ids(ids))
  255. message[444] = 'self.house_data'
  256. rfu.create_excel_file(table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], save_path)
  257. else:
  258. pass
  259. send_mail_info.append([title, content, mail, file_path, title + '.xlsx', name])
  260. message[1] = '数据查询和excel生成完毕'
  261. break
  262. # 发送邮件
  263. send_mail_log = []
  264. for mail in send_mail_info:
  265. try:
  266. for m in self.customer_mails:
  267. result = mail_util.send_mail_by_admin(mail[0], mail[1], m, mail[3], mail[4])
  268. if result:
  269. # name, mail, report_name, push_time, send_status, status, error_message
  270. send_mail_log.append([mail[5], mail[2], mail[3], 1, 'success'])
  271. else:
  272. send_mail_log.append([mail[5], mail[2], mail[3], -1, 'fail'])
  273. except Exception as e:
  274. print(str(e))
  275. send_mail_log.append([mail[5], mail[2], mail[3], -1, str(e)])
  276. self.db.add_some(send_mail_info, Sql.sql_12)
  277. message[2] = '遇见发送完毕, 共:{}份邮件'.format(len(send_mail_info))
  278. except Exception as e:
  279. message['error'] = str(e)
  280. finally:
  281. return message
  282. def get_house_ids(self, ids_str):
  283. if str(ids_str).find(',') == -1:
  284. return [ids_str]
  285. else:
  286. return [x for x in str(ids_str).split(',')]
  287. if __name__ == '__main__':
  288. pass