jianye_report.py 23 KB

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