基于Python的标准物质有效期自动提醒系统设计与实现
背景介绍
在实验室工作中,标准物质是保证分析测试结果准确性和可靠性的重要基础。然而,标准物质都有明确的有效期,一旦过期使用可能导致实验数据失准,影响实验室质量控制。传统的人工检查方式容易遗漏,特别是当管理的标准物质数量较多时,更需要一个自动化的提醒系统。
本文介绍一个基于Python开发的标准物质有效期自动提醒系统,该系统可以从Excel文件或SeaTable云表格中读取标准物质信息,自动检测即将到期的项目,并通过企业微信机器人发送提醒消息,提高实验室标准物质管理效率。
系统设计思路
总体架构
系统采用模块化设计,主要包含以下几个关键模块:
- 数据源模块:支持从本地Excel文件或SeaTable云表格读取数据
- 日期解析模块:处理多种格式的有效期日期
- 提醒逻辑模块:判断标准物质是否需要提醒
- 消息发送模块:通过企业微信机器人发送提醒消息
系统工作流程如下图所示:
数据源(Excel/SeaTable) → 读取标准物质信息 → 日期解析与判断 → 筛选需提醒项目 → 企业微信发送提醒
核心功能模块
1. 数据源模块
系统支持两种数据源:本地Excel文件和SeaTable云表格。用户可以通过配置文件切换数据源,实现灵活部署。
# 根据配置决定使用哪种数据源
if USE_SEATABLE:
logger.info("使用SeaTable作为数据源")
reader = SeaTableReader(SEATABLE_API_TOKEN)
reminders = reader.read_table_for_reminder(SEATABLE_WORKSPACE_ID, SEATABLE_BASE_NAME)
else:
logger.info(f"使用本地Excel作为数据源: {EXCEL_FILE_PATH}")
reminders = process_excel_file(EXCEL_FILE_PATH)
2. 智能列识别
系统能够自动识别表格中的标准物质名称列和有效期列,无需用户手动指定列名:
# 自动识别关键列
date_col = next((col for col in df.columns if any(
keyword in str(col).lower() for keyword in ['有效期', '到期', 'expiry']
)), None)
content_col = next((col for col in df.columns if any(
keyword in str(col).lower() for keyword in ['名称', '物质', '标准品', '标准物质']
)), None)
3. 增强的日期解析
为了支持多种日期格式,系统实现了一个增强的日期解析函数:
def parse_date(date_str):
"""增强的日期解析函数,处理多种格式"""
# 已经是日期对象
if isinstance(date_str, (datetime, pd.Timestamp)):
return date_str.date() if hasattr(date_str, 'date') else date_str
# 转换为字符串
date_str = str(date_str).strip()
try:
# 处理点分隔的日期 (2025.7 或 2026.10.24)
if '.' in date_str:
parts = date_str.split('.')
if len(parts) == 2: # 只有年月 (2025.7)
year, month = parts
# 使用月末日期
return pd.to_datetime(f"{year}-{month.zfill(2)}-01").date() + pd.offsets.MonthEnd(1)
elif len(parts) == 3: # 年月日 (2026.10.24)
year, month, day = parts
return pd.to_datetime(f"{year}-{month.zfill(2)}-{day.zfill(2)}").date()
# 处理其他常见格式
return pd.to_datetime(date_str).date()
except Exception as e:
logger.warning(f"无法解析日期: {date_str}, 错误: {str(e)}")
return None
4. 提醒逻辑判断
系统根据配置的提前天数,判断哪些标准物质需要提醒:
# 计算有效期剩余天数
days_remaining = (reminder_date - now.date()).days
# 使用配置的天数进行提前提醒
if 0 <= days_remaining <= REMINDER_DAYS_AHEAD:
# 需要提醒
reminder_items.append({
"sheet_name": sheet_name,
"row_index": idx + 2,
"content": content,
"reminder_date": reminder_date,
"reminder_time": reminder_time
})
5. 企业微信消息发送
系统使用企业微信机器人webhook发送提醒消息,支持单条和合并发送多条提醒:
def _send_combined_reminders(self, reminders):
"""合并发送多个提醒"""
content = f"【多个标准物质有效期提醒】\n\n"
for i, reminder in enumerate(reminders, 1):
date_str = self._format_date(reminder['reminder_date'])
days_remaining = (expiry_date - datetime.now().date()).days
if days_remaining == 0:
status_text = "今日到期"
else:
status_text = f"剩余{days_remaining}天"
# 格式化消息内容
content += f"{i}. 来源sheet:{reminder['sheet_name']},序号:第{reminder['row_index']}行\n"
content += f" 标准物质:{reminder['content']},有效期:{date_str},{status_text}\n\n"
# 发送消息
message = {
"msgtype": "text",
"text": {"content": content}
}
response = requests.post(
self.webhook_url,
json=message,
headers={'Content-Type': 'application/json'}
)
系统实现关键点
1. 多种数据源支持
系统抽象了数据源接口,无论是Excel还是SeaTable,最终都会返回统一格式的提醒项目列表,便于后续处理。
对于Excel文件:
def process_excel_file(file_path):
xls = pd.ExcelFile(file_path)
reminder_items = []
for sheet_name in xls.sheet_names:
# 读取数据并处理
df, title = read_excel_file(file_path, sheet_name=sheet_name)
# ... 处理逻辑 ...
return reminder_items
对于SeaTable:
def read_table_for_reminder(self, workspace_id=None, base_name=None):
try:
if not self.connect_to_base(base_name):
return []
tables = self.get_tables()
# ... 处理逻辑 ...
return reminder_items
except Exception as e:
logger.error(f"读取SeaTable数据时出错: {str(e)}")
return []
2. 智能过滤处理
系统会过滤掉已经过期的标准物质,只提醒即将到期但尚未过期的项目:
# 只添加未过期的记录
if expire_date > now:
content = row[content_col] if pd.notnull(row[content_col]) else "未指定内容"
reminder_items.append({
"sheet_name": sheet_name,
"row_index": idx + 2,
"content": content,
"reminder_date": reminder_date,
"reminder_time": reminder_time
})
3. 消息优化
为了避免大量消息轰炸,系统会自动合并提醒:
# 先尝试合并发送
if len(valid_reminders) <= 5: # 如果提醒数量少,合并为一条消息
return self._send_combined_reminders(valid_reminders)
else:
# 否则分别发送
results = []
for reminder in valid_reminders:
results.append(self.send_reminder(reminder))
return all(results)
4. 详细日志记录
系统实现了完整的日志记录,便于追踪问题:
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('reminder.log'),
logging.StreamHandler()
]
)
配置与部署
配置文件
系统的配置文件config.py
包含以下主要配置项:
# 企业微信webhook配置
WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key"
# Excel文件路径
EXCEL_FILE_PATH = "标准物质出入库明细表.xls"
# 标准物质提前提醒天数
REMINDER_DAYS_AHEAD = 4
# SeaTable配置
SEATABLE_API_TOKEN = "your_api_token"
SEATABLE_WORKSPACE_ID = "your_workspace_id"
SEATABLE_BASE_NAME = "your_base_name"
SEATABLE_SERVER_URL = "https://cloud.seatable.cn"
USE_SEATABLE = False # 设置为True时使用SeaTable
部署步骤
- 安装依赖库:
pip install -r requirements.txt
-
修改配置文件:
- 设置企业微信Webhook URL
- 选择数据源(Excel或SeaTable)
- 配置提醒天数
-
运行程序:
python main.py
- 设置定时任务(推荐每天执行一次):
- Linux/Mac使用crontab
- Windows使用计划任务
使用效果
系统发送的提醒消息格式如下:
【多个标准物质有效期提醒】
1. 来源sheet:化学需氧量1,序号:第15行
标准物质:化学需氧量,有效期:2025-03-30,剩余3天
2. 来源sheet:氨氮1,序号:第8行
标准物质:氨氮标准溶液,有效期:2025-03-31,剩余4天
请及时处理以上标准物质,确保实验室质量控制
发送时间: 2025-03-27 09:30:45
扩展与优化方向
- Web管理界面:开发Web界面,便于非技术人员管理标准物质
- 二维码标签打印:集成标签打印功能,为标准物质生成带有有效期信息的二维码标签
- 库存预警:增加库存数量监控,提醒库存不足的标准物质
- 数据分析:增加标准物质使用情况的统计分析功能
- 多平台通知:扩展至钉钉、飞书等更多通知平台
总结
本文介绍了一个基于Python开发的标准物质有效期自动提醒系统,该系统通过自动化检测和提醒,显著提高了实验室标准物质管理效率,减少了因物质过期导致的实验质量问题。系统的模块化设计和灵活配置也为未来功能扩展提供了良好基础。
在实际应用中,用户可以根据自身需求调整提醒天数、数据源和消息格式,实现个性化的标准物质管理方案。希望本项目能为广大实验室提供有益参考。
参考资料
- Python官方文档: https://docs.python.org/
- Pandas文档: https://pandas.pydata.org/docs/
- SeaTable API文档: https://seatable.github.io/seatable-scripts-cn/python/
- 企业微信开发文档: https://developer.work.weixin.qq.com/document/
加入我的腾讯频道【共同进步】