如何用Python打造BI数据推送平替方案?这个低成本自动化方案值得收藏!

130 阅读5分钟

大家好,我是下次一定,一名因数据基建太烂被迫还要干数开的某电商行业菜鸟分析师,目前主要负责分析售后板块。

本项目旨在通过从MySQL数据库查询售后工单数据,并基于 T+1 数据生成邮件报告,自动推送给相关团队成员,以提升售后服务的响应速度和质量。

image.png

你是否经历过这样的时刻,好不容易公司终于愿意分BI账号到你的部门,你也做了一个非常不错的可视化看板。结果账号就只给一个,导致无账号的一线业务小伙伴根本收不到数据推送,推送机制有和没有差不多。。。

image.png

于是加一轻轻拍了拍你的肩膀说,要不你就手动转发截图吧。我寻思着就一张截图其实手动成本也还好。但随着推送内容越来越来越多,以及周末其实才是高峰期,好像不推送又影响到一线这边进行分配动作的调整。于是逐渐感觉这班是一天都上不下去了。。。

image.png

为了自己可以在周末安心睡觉,也确实考虑到事实上一线运营伙伴才是最该及时收到这份推送的人。于是我开始重新梳理需求,稍稍总结了一下目前的情况

image.png

稍稍梳理部门现状以后,我突然联想到,原本python脚本中就是有邮件推送机制的,用来通知脚本是否成功运行,这个收件人理论上可以添加很多人。如果我将数据整理成文字或者建单表格的形式加在邮件中,那没有BI账号权限的人不就能收到了?

一、背景痛点分析

  1. 权限困局:观远平台License限制导致信息孤岛,一线收不到数据推送
  2. 业务代价:需要人力手工转发邮件,会有一定的决策延迟
  3. 破局思路:通过Python建立外挂式数据管道

二、技术方案设计

关键功能

  1. 数据库查询:从MySQL数据库中提取各类售后数据,包括工单状态、未处理时间等。
  2. T+1 统计:根据查询结果统计不同时间段内的未完结工单数量(如超48小时未完结、24小时内未完结等)。
  3. 邮件推送:生成HTML格式的报告,并通过QQ邮箱自动发送,支持多个收件人。
  4. 数据过滤与分组:使用SQL语句对数据进行过滤和分组,按需求提供不同类型的售后数据统计。
  5. 定时调度:使用windows自带的任务计划程序,或者影刀

image.png

实现细节

1. 从JSON配置文件读取配置信息

配置文件 (config.json) 存储数据库连接信息、邮件服务器信息等,确保项目灵活可配置。

def load_json_config(file_path):
    """从 JSON 文件读取配置"""
    with open(file_path, 'r', encoding='utf-8') as f:
        config = json.load(f)
    return config

2. 数据库查询

通过pymysql库连接数据库,使用SQL语句查询不同类型的工单数据,包括未完结量、超时未完结量等。

sql1 = f"""
    SELECT
        COUNT(DISTINCT 对话id) AS 未完结量,
        COUNT(DISTINCT CASE WHEN elapsed_hours >= 48 THEN 对话id END) AS 超48小时未完结,
        ...
    FROM FilteredData;
"""

3. 数据处理与邮件格式化

根据SQL查询结果,生成HTML格式的报告。报告分为多个部分,分别展示不同类型的数据统计。

def format_report(data1, data2, data3):
    """格式化报告内容""" msg = f"""<h2>📢 <strong>{query_date} 工单待处理情况</strong></h2><br>
    """ msg += """<p style="font-size: 16px;"> 
    🔹请查收各直播间工单未完结量的统计信息!<br> 
    🔹<span style="color: red;">请及时处理超时工单,确保高效响应!!!</span> </p><br>""" # 处理 data1 for record in data1: msg += f"""<p style="font-size: 16px;"> 
    
    📌 <strong>全渠道未完结工单总数:{record[0]} 单</strong>;<br> 
    🔹 <span style="color: #E64B4B;">超48小时未完结:{record[1]} 单;<br> 
    🔹 <span style="color: #28A745;">24小时内未完结:{record[2]} 单;<br> 
    🔹 <span style="color: #917800;">48小时内未完结:{record[3]} 单 </p>""" 
    return msg

4. 邮件发送

使用smptlib库通过QQ邮箱发送报告邮件,支持HTML格式内容,并且能够自动根据配置发送给多个收件人。

def send_email(content): """发送邮件""" 
    msg = MIMEMultipart() msg['From'] = SENDER_EMAIL msg['To'] = ', '.join(RECEIVER_EMAIL) 
    msg['Subject'] = f"各直播间售后情况推送" 
    
    # 邮件正文内容 
    msg.attach(MIMEText(content, 'html', 'utf-8')) 
    # 使用HTML格式发送邮件 
    with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as server:
    server.login(SENDER_EMAIL, QQ_AUTH_CODE) 
    server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, msg.as_string()) 
    print("邮件发送成功!")

改进与优化

  • 异常处理:增加了日志记录和异常处理,确保程序在发生错误时能够提示并保存日志。
  • 配置文件管理:项目中的所有配置项(如数据库连接、邮件设置等)都通过JSON文件管理,方便维护和修改。

疑问点

Q:为什么是T+1,而不是实时更新

A:因为表单的api接口太贵,超出次数要额外氪金,部门无法承担这笔支出;另外,从整体的业务流程来看,当天创建的工单售后组不一定当天就能处理,以及售后问题可能会持续一段时间,所以即使 T+1 更新也是可以满足现阶段需求的

总结

  1. 通过此项目,成功实现了自动化的售后数据报告生成与推送,减少了手动操作,提高了工作效率。项目的核心功能可以根据具体业务需求进行扩展和优化。
  2. 关键是提升了幸福感,不然周末早上还要转发邮件。。。真的是开几个账号就能解决的问题演变成要写一个脚本,小部门真的好难啊