大家好,我是下次一定,一名因数据基建太烂被迫还要干数开的某电商行业菜鸟分析师,目前主要负责分析售后板块。
本项目旨在通过从MySQL数据库查询售后工单数据,并基于 T+1 数据生成邮件报告,自动推送给相关团队成员,以提升售后服务的响应速度和质量。
你是否经历过这样的时刻,好不容易公司终于愿意分BI账号到你的部门,你也做了一个非常不错的可视化看板。结果账号就只给一个,导致无账号的一线业务小伙伴根本收不到数据推送,推送机制有和没有差不多。。。
于是加一轻轻拍了拍你的肩膀说,要不你就手动转发截图吧。我寻思着就一张截图其实手动成本也还好。但随着推送内容越来越来越多,以及周末其实才是高峰期,好像不推送又影响到一线这边进行分配动作的调整。于是逐渐感觉这班是一天都上不下去了。。。
为了自己可以在周末安心睡觉,也确实考虑到事实上一线运营伙伴才是最该及时收到这份推送的人。于是我开始重新梳理需求,稍稍总结了一下目前的情况
稍稍梳理部门现状以后,我突然联想到,原本python脚本中就是有邮件推送机制的,用来通知脚本是否成功运行,这个收件人理论上可以添加很多人。如果我将数据整理成文字或者建单表格的形式加在邮件中,那没有BI账号权限的人不就能收到了?
一、背景痛点分析
- 权限困局:观远平台License限制导致信息孤岛,一线收不到数据推送
- 业务代价:需要人力手工转发邮件,会有一定的决策延迟
- 破局思路:通过Python建立外挂式数据管道
二、技术方案设计
关键功能
- 数据库查询:从MySQL数据库中提取各类售后数据,包括工单状态、未处理时间等。
- T+1 统计:根据查询结果统计不同时间段内的未完结工单数量(如超48小时未完结、24小时内未完结等)。
- 邮件推送:生成HTML格式的报告,并通过QQ邮箱自动发送,支持多个收件人。
- 数据过滤与分组:使用SQL语句对数据进行过滤和分组,按需求提供不同类型的售后数据统计。
- 定时调度:使用windows自带的任务计划程序,或者影刀
实现细节
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 更新也是可以满足现阶段需求的
总结
- 通过此项目,成功实现了自动化的售后数据报告生成与推送,减少了手动操作,提高了工作效率。项目的核心功能可以根据具体业务需求进行扩展和优化。
- 关键是提升了幸福感,不然周末早上还要转发邮件。。。真的是开几个账号就能解决的问题演变成要写一个脚本,小部门真的好难啊