from mysql_db import MysqlDB from sql import Sql from report_public_funs_utils import ReportPublicFunsUtils as rpfu from mail_content_text import MailContentText from email_util import EmailUtil from file_util import FileUtil from report_file_utils import ReportFileUtils from collections import deque class JianYeReport(object): """ 建业报表数据处理 """ # customer_mails = ['liutt@elab-plus.com', 'binrenzhang@qq.com', 'plf@centralchina.com'] # customer_mails = ['liutt@elab-plus.com', 'binrenzhang@qq.com', 'lijm@elab-plus.com', 'xuanxc@elab-plus.com'] customer_mails = ['binrenzhang@qq.com', 'liutt@elab-plus.com'] # index_type = [ 'fenxianghuodian', 'liebianhuodian', 'saomadaofang', 'quanminjingjiren', 'laoyezhu', 'baobeichenggong', 'baobeidaofang' ] head_1 = ['区域', '城市', '项目名称', '可分派客户数', '已分派客户数', '浏览量', '浏览人数', '新增用户', '新增获电', '推荐用户', '分享获电', '裂变获电', '扫码到访数', '全民经纪人注册数', '老业主注册数', '报备成功数', '报备到访数'] brand_id = '13' head_2 = ['区域名称', '城市', '项目名称', '推荐人姓名', '推荐人手机号', '组织', '分享获电', '经纪人注册数', '报备成功数'] sheet_names_1 = ['当日数据', '当月数据', '上线以来所有数据'] def __init__(self): self.db = MysqlDB('bi_report') self.time_range_1 = rpfu.get_prd_day() self.time_range_2 = rpfu.get_time_range_month() self.time_range_3 = rpfu.get_all_time_data_range() self.pv_data_1 = self.pv_count(self.time_range_1) self.pv_data_2 = self.pv_count(self.time_range_2) self.pv_data_3 = self.pv_count(self.time_range_3) self.house_region = self.get_house_region_info() self.mail_util = EmailUtil() def get_house_region(self): return self.db.select(Sql.sql_15) def get_house_region_name(self, house_id): for x in self.house_region: if str(x[1]) in house_id: return x[3] return ' ' def get_city_house_id(self): return self.db.select(Sql.sql_1) def get_report_customers(self, task_key): return self.db.select(Sql.sql_2, [task_key]) def get_mail_title(self, type, region_name, name): """ 获取邮件名称 :param region_name: :param type:1:项目,2:集团,3:区域 :param name: 项目 区域名称 :return: """ month_day = rpfu.get_month_day() if type == 1: return ['[{}]{}数据报表_{}_项目明细'.format(month_day, region_name, name), '[{}]{}数据报表_{}_置业顾问完成情况'.format(month_day, region_name, name)] elif type == 2: return '[{}]建业云集团数据报表_{}'.format(month_day, name) elif type == 3: return '[{}]建业云{}数据报表_{}'.format(month_day, region_name, name) def get_mail_content(self, customer_type): """ 根据客户类型获取邮件正文 :param customer_type: :return: """ if customer_type == 2: return MailContentText.text_1 else: return '本期数据报告已经准备完成,请点击附件查阅.' # 项目级别的统计 def house_data_detail(self, time_range): result = self.db.select(Sql.sql_8, [time_range[0], time_range[1]]) return result def pv_count(self, time_range): """ 新的用户行为统计 :param time_range: :return: """ sql_result = self.db.select(Sql.sql_13, [time_range[0], time_range[1]]) return sql_result def user_data_volume_statistics(self, time_range, house_ids): """ 用户浏览量,人数,新增获客,新增获点数据统计 :param time_range: :param house_ids: :return: """ # 1:总浏览量 result = [] data_1_1 = self.db.select(Sql.sql_3, [time_range[0], time_range[1], house_ids]) number_1_1 = data_1_1[0][0] data_1_2 = self.db.select(Sql.sql_4, [time_range[0], time_range[1], house_ids]) number_1_2 = data_1_2[0][0] number_1 = rpfu.add(number_1_1, number_1_2) result.append(number_1) # 2: 总浏览人数 data_2 = self.db.select(Sql.sql_5, [time_range[0], time_range[1], house_ids, time_range[0], time_range[1], house_ids]) number_2 = data_2[0][0] result.append(number_2) # 3:新增获客 time_1 = time_range[0] + ' 00:00:00' time_2 = time_range[1] + ' 23:59:59' data_3 = self.db.select(Sql.sql_6, [time_1, time_2, house_ids, time_1, time_2, house_ids]) number_3 = data_3[0][0] result.append(number_3) # 4:新增获电 data_4 = self.db.select(Sql.sql_7, [time_1, time_2, house_ids, house_ids, time_1, time_2]) number_4 = data_4[0][0] result.append(number_4) return result def region_house_id(self): return self.db.select(Sql.sql_11) def get_recommend_data(self, time_range): return self.db.select(Sql.sql_9, [time_range[0], time_range[1]]) def get_house_id_by_brand_id(self, brand_id): result = [] for x in self.get_city_house_id(): if str(x[0]) == str(brand_id): result.append(x[1]) return result def get_pv_data(self, time_type): pv_data = None if time_type == 1: pv_data = self.pv_data_1 elif time_type == 2: pv_data = self.pv_data_2 elif time_type == 3: pv_data = self.pv_data_3 return pv_data def brand_pv_by_time_type(self, time_type): pv_data = self.get_pv_data(time_type) if pv_data: for x in pv_data: if str(x[0]) == self.brand_id and x[2] is not None and x[2] == '集团': return x[3:] return [0, 0, 0, 0] def get_dispatchable_mobile_qutty_brand(self, time_range): data = self.db.select(Sql.sql_20, [str(time_range[0]) + ' 00:00:00', str(time_range[1]) + ' 59:59:59']) return [data[0][2], data[0][3]] def brand_data_of_time(self, time_range, time_type): result = [] data_1 = self.brand_pv_by_time_type(time_type) data_2 = [] number_2 = 0 for x in self.get_recommend_data(time_range): if str(x[0]) == str(self.brand_id): number_2 += x[1] data_2.append(number_2) data_3 = [] sql_data_3 = self.db.select(Sql.sql_10, [time_range[0], time_range[1]]) for key in self.index_type: number = 0 for x in sql_data_3: if str(x[0]) == str(key): number = x[1] data_3.append(number) data_4 = self.get_dispatchable_mobile_qutty_brand(time_range) # 4 result.extend(data_1) # 1 result.extend(data_2) # 7 result.extend(data_3) # 2 result.extend(data_4) return result def brand_data(self): """ 集团数据总览, 表一。 :return: """ result = [] result.extend(self.brand_data_of_time(self.time_range_1, 1)) result.extend(self.brand_data_of_time(self.time_range_2, 2)) result.extend(self.brand_data_of_time(self.time_range_3, 3)) return result def get_house_pv_data(self, house_id, time_type): pv_data = self.get_pv_data(time_type) if pv_data is not None: for x in pv_data: if str(x[1]) == str(house_id) and str(x[0]) == self.brand_id: return x[3:] return [0, 0, 0, 0] def get_dispatchable_mobile_qutty_house(self, time_range, house_ids): data = self.db.select(Sql.sql_19, [str(time_range[0]) + ' 00:00:00', str(time_range[1]) + ' 59:59:59', house_ids]) return data def house_data_of_time(self, time_range, house_ids, time_type): # brand_id, house_id, house_name, city city_info = self.get_city_house_id() data_1 = [] for id in house_ids: sub = [id] sub.extend(self.get_house_pv_data(id, time_type)) data_1.append(sub) data_2 = [] recommend_data = self.get_recommend_data(time_range) for id in house_ids: sub = [id] number = 0 for x in recommend_data: if str(id) == str(x[0]): number = x[1] sub.append(number) data_2.append(sub) data_3 = [] house_data_detail = self.house_data_detail(time_range) for house_id in house_ids: sub = [] for x in house_data_detail: # house_id, type, COUNT(DISTINCT customer_mobile) if str(house_id) == str(x[0]): sub.append(x) house_data = [house_id] for key in self.index_type: number = 0 for x in sub: if str(key) == str(x[1]): number = x[2] house_data.append(number) data_3.append(house_data) data_4 = self.get_dispatchable_mobile_qutty_house(time_range, house_ids) result = [] brand_data = [] for id in house_ids: sub = [] if id == '0': sub.extend(['品牌层', '品牌层', '品牌层']) else: for x in self.house_region: if str(x[1]) == str(id): sub.append(x[3]) if len(sub) == 0: sub.append(' ') for x in city_info: if str(id) == str(x[1]): sub.extend([x[3], x[2]]) if len(sub) == 0: sub.extend(['0000', '0000']) a, b = 0, 0 for x in data_4: if str(id) == x[0]: a, b = x[2], x[3] sub.append(a) sub.append(b) for x in data_1: if str(id) == str(x[0]): sub.extend(x[1:]) for x in data_2: if str(id) == str(x[0]): sub.extend(x[1:]) for x in data_3: if str(id) == str(x[0]): sub.extend(x[1:]) if id == '0': brand_data = sub else: result.append(sub) result.sort(key=lambda obj: obj[8], reverse=True) if len(brand_data) == 17: all_dat = [brand_data] all_dat.extend(result) return all_dat return result def house_data(self, house_ids): 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), self.house_data_of_time(self.time_range_3, house_ids, 3)] return result def get_table_3(self, house_ids): day_data = self.db.select(Sql.sql_16, [self.time_range_1[0], house_ids]) month_data = self.db.select(Sql.sql_17, [self.time_range_2[1], house_ids]) all_data = self.db.select(Sql.sql_18, [self.time_range_3[1], house_ids]) return [day_data, month_data, all_data] def get_house_region_info(self): return self.db.select(Sql.sql_15) def send_mail_to_customer(self, task_key): """ 统计数据推送给客户, 表二 :param: task_key :return: """ message = {} send_mail_info = [] rfu = ReportFileUtils() customers = self.get_report_customers(task_key) send_mail_log = [] brand_table_one = None brand_table_two = None try: save_path = '/tmp' send_data = [] if task_key == 12: brand_table_one = self.brand_data() house_ids = self.get_house_id_by_brand_id('13') brand_table_two = self.house_data(house_ids) for customer in customers: name = customer[2] customer_type = customer[1] mail = customer[3] ids = customer[6] region_name = customer[4] title = self.get_mail_title(customer_type, region_name, name) content = self.get_mail_content(customer_type) try: if customer_type == 2: file_path = save_path + '/' + title + '.xls' content = self.get_brand_content(content, brand_table_one) send_data.append( [brand_table_two, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path, content, name, mail]) elif customer_type == 1: title_1, title_2 = title[0], title[1] table_2 = self.house_data(self.get_house_ids(ids)) # table_3 = self.get_table_3(self.get_house_ids(ids)) file_path = save_path + '/' + title_1 + '.xls' file_path_1 = save_path + '/' + title_2 + '.xls' send_data.append( [table_2, self.sheet_names_1, title_1, [self.head_1, self.head_1, self.head_1], file_path, content, name, mail]) # send_data.append( # [table_2, self.sheet_names_1, title_1, [self.head_1, self.head_1, self.head_1], file_path, # content, name, mail, title_2, [self.head_2, self.head_2, self.head_2], table_3, file_path_1]) elif customer_type == 3: file_path = save_path + '/' + title + '.xls' table_2 = self.house_data(self.get_house_ids(ids)) send_data.append( [table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path, content, name, mail]) else: send_mail_log.append([name, mail, title, -1, '客户类型错误{}'.format(customer_type)]) pass except Exception as e: print(str(e)) send_mail_log.append([name, mail, title, -1, '数据查询失败:{}'.format(str(e))]) message['query_data'] = 'success' for data in send_data: try: send_mai_info_sub = [] # data, sheet_names, title, headers, file_path rfu.create_excel_file(data[0], data[1], data[2], data[3], data[4]) send_mai_info_sub.extend([data[2], data[5], data[7], data[4], data[2] + '.xls', data[6]]) if len(data) == 12: rfu.create_excel_file(data[10], data[1], data[8], data[9], data[11]) send_mai_info_sub.extend([data[11], data[8] + '.xls']) send_mail_info.append(send_mai_info_sub) except Exception as e: print(e) send_mail_log.append([data[6], data[7], data[2], -1, '文件创建失败:{}'.format(str(e))]) message['file'] = 'success' for mail in send_mail_info: try: self.send_mail(mail, send_mail_log) except Exception as e: print(str(e)) message['error1'] = str(e) send_mail_log.append([mail[5], mail[2], mail[3], -1, '邮件发送失败:{}'.format(str(e))]) message['mail'] = 'success' self.db.add_some(Sql.sql_12, send_mail_log) message['log'] = 'success' except Exception as e: message['error'] = str(e) finally: return message def get_brand_content(self, content, brand_table_one): content = content.format(rpfu.get_month_day(), brand_table_one[0], brand_table_one[1], brand_table_one[2], brand_table_one[3], brand_table_one[4], brand_table_one[5], brand_table_one[6], brand_table_one[8], brand_table_one[10], brand_table_one[11], rpfu.get_month(), brand_table_one[14], brand_table_one[15], brand_table_one[16], brand_table_one[17], brand_table_one[18], brand_table_one[19], brand_table_one[20], brand_table_one[22], brand_table_one[24], brand_table_one[25], brand_table_one[28], brand_table_one[29], brand_table_one[30], brand_table_one[31], brand_table_one[32], brand_table_one[33], brand_table_one[34], brand_table_one[36], brand_table_one[38], brand_table_one[39]) return content def get_customer_info_by_id(self, customer_id): return self.db.select(Sql.sql_14, [customer_id]) def send_mail_for_customer_id(self, customer_id, new_mail=None): """ 获取指定客户的邮件信息 :param customer_id: :param new_mail: :return: """ message = {} customers = self.get_customer_info_by_id(customer_id) message['customer'] = str(customer_id) send_data = [] if customers: save_path = '/tmp' for customer in customers: try: name = customer[1] mail = customer[2] customer_type = customer[3] ids = self.get_house_ids(customer[5]) region_name = customer[4] title = self.get_mail_title(customer_type, region_name, name) content = self.get_mail_content(customer_type) if customer_type == 1: # 项目 # 项目 title_1, title_2 = title[0], title[1] table_2 = self.house_data(ids) # table_3 = self.get_table_3(ids) file_path = save_path + '/' + title_1 + '.xls' file_path_1 = save_path + '/' + title_2 + '.xls' send_data.append( [table_2, self.sheet_names_1, title_1, [self.head_1, self.head_1, self.head_1], file_path, content, name, mail]) # send_data.append( # [table_2, self.sheet_names_1, title_1, [self.head_1, self.head_1, self.head_1], file_path, # content, name, mail, title_2, [self.head_2, self.head_2, self.head_2], table_3, # file_path_1]) elif customer_type == 2: # 集团 file_path = save_path + '/' + title + '.xls' brand_table_one = self.brand_data() house_ids = self.get_house_id_by_brand_id('13') brand_table_two = self.house_data(house_ids) content = self.get_brand_content(content, brand_table_one) send_data.append( [brand_table_two, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path, content, name, mail]) elif customer_type == 3: # 区域 file_path = save_path + '/' + title + '.xls' table_2 = self.house_data(ids) send_data.append( [table_2, self.sheet_names_1, title, [self.head_1, self.head_1, self.head_1], file_path, content, name, mail]) else: message['customer_type'] = '客户类型错误' except Exception as e: message['数据查询失败'] = str(e) else: message['error'] = '客户id错误:{}'.format(customer_id) # 生成文件 rfu = ReportFileUtils() send_mail_log = [] send_mail_info = [] if len(send_data) > 0: for data in send_data: try: send_mai_info_sub = [] rfu.create_excel_file(data[0], data[1], data[2], data[3], data[4]) send_mai_info_sub.extend([data[2], data[5], data[7], data[4], data[2] + '.xls', data[6]]) if len(data) == 12: rfu.create_excel_file(data[10], data[1], data[8], data[9], data[11]) send_mai_info_sub.extend([data[11], data[8] + '.xls']) send_mail_info.append(send_mai_info_sub) except Exception as e: print(e) message['excel文件创建失败'] = str(e) send_mail_log.append([data[6], data[7], data[2], -1, '文件创建失败:{}'.format(str(e))]) else: message['excel_info'] = '需要生成excel的数据空' message['data'] = send_mail_info # 发送邮件 if len(send_data) > 0: for mail in send_mail_info: try: if new_mail: mail[2] = new_mail self.send_mail(mail, send_mail_log) else: for m in self.customer_mails: self.send_mail(m, send_mail_log) except Exception as e: print(str(e)) message['邮件发送失败'] = str(e) send_mail_log.append([mail[5], mail[2], mail[3], -1, '邮件发送失败:{}'.format(str(e))]) else: message['mail_info'] = '需要发送邮件的数据为空' # 写入日志 self.db.add_some(Sql.sql_12, send_mail_log) return message def send_mail(self, mail, send_mail_log): result = None # for m in self.customer_mails: if len(mail) == 6: result = self.mail_util.send_mail_by_admin(mail[0], mail[1], mail[2], mail[3], mail[4]) elif len(mail) == 8: result = self.mail_util.send_mail_by_admin(mail[0], mail[1], mail[2], mail[3], mail[4], mail[6], mail[7]) if result: # name, mail, report_name, push_time, send_status, status, error_message send_mail_log.append([mail[5], mail[2], mail[3], 1, 'success']) else: send_mail_log.append([mail[5], mail[2], mail[3], -1, '调用邮件接口失败:{}'.format(str(result))]) return send_mail_log def get_house_ids(self, ids_str): if str(ids_str).find(',') == -1: return [str(ids_str)] else: return [str(x) for x in str(ids_str).split(',')] if __name__ == '__main__': pass