标准物质有效期提醒系统

基于Python的标准物质有效期自动提醒系统设计与实现

背景介绍

在实验室工作中,标准物质是保证分析测试结果准确性和可靠性的重要基础。然而,标准物质都有明确的有效期,一旦过期使用可能导致实验数据失准,影响实验室质量控制。传统的人工检查方式容易遗漏,特别是当管理的标准物质数量较多时,更需要一个自动化的提醒系统。

本文介绍一个基于Python开发的标准物质有效期自动提醒系统,该系统可以从Excel文件或SeaTable云表格中读取标准物质信息,自动检测即将到期的项目,并通过企业微信机器人发送提醒消息,提高实验室标准物质管理效率。

系统设计思路

总体架构

系统采用模块化设计,主要包含以下几个关键模块:

  1. 数据源模块:支持从本地Excel文件或SeaTable云表格读取数据
  2. 日期解析模块:处理多种格式的有效期日期
  3. 提醒逻辑模块:判断标准物质是否需要提醒
  4. 消息发送模块:通过企业微信机器人发送提醒消息

系统工作流程如下图所示:

数据源(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

部署步骤

  1. 安装依赖库:
pip install -r requirements.txt
  1. 修改配置文件:

    • 设置企业微信Webhook URL
    • 选择数据源(Excel或SeaTable)
    • 配置提醒天数
  2. 运行程序:

python main.py
  1. 设置定时任务(推荐每天执行一次):
    • 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

扩展与优化方向

  1. Web管理界面:开发Web界面,便于非技术人员管理标准物质
  2. 二维码标签打印:集成标签打印功能,为标准物质生成带有有效期信息的二维码标签
  3. 库存预警:增加库存数量监控,提醒库存不足的标准物质
  4. 数据分析:增加标准物质使用情况的统计分析功能
  5. 多平台通知:扩展至钉钉、飞书等更多通知平台

总结

本文介绍了一个基于Python开发的标准物质有效期自动提醒系统,该系统通过自动化检测和提醒,显著提高了实验室标准物质管理效率,减少了因物质过期导致的实验质量问题。系统的模块化设计和灵活配置也为未来功能扩展提供了良好基础。

在实际应用中,用户可以根据自身需求调整提醒天数、数据源和消息格式,实现个性化的标准物质管理方案。希望本项目能为广大实验室提供有益参考。


参考资料

  1. Python官方文档: https://docs.python.org/
  2. Pandas文档: https://pandas.pydata.org/docs/
  3. SeaTable API文档: https://seatable.github.io/seatable-scripts-cn/python/
  4. 企业微信开发文档: https://developer.work.weixin.qq.com/document/

加入我的腾讯频道【共同进步】

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟话6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值