基于Python+PyQt5+SQLite的药房管理体系实现:事故同等性与界面解耦全流程分析

[复制链接]
发表于 2026-6-23 03:53:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

弁言

随着医疗信息化向下层机构排泄,中小型药房与社区诊所对轻量化药品管理工具的需求一连增长。传统商业管理体系广泛存在摆设本钱高、功能冗余、定制难度大的题目,而基于嵌入式数据库的桌面应用方案,依附零设置、易维护、低本钱的上风,成为小型机构信息化的符合选择。
本文基于Python技能栈,联合PyQt5图形框架与SQLite嵌入式数据库,计划并实现了一套轻量级药房管理体系。体系接纳分层架构计划,重点办理了贩卖操纵数据同等性、多模块界面解耦、效期数据可视化预警等核心技能题目,具备精良的实用性与可扩展性。
一、体系团体架构与技能选型

1.1 分层架构计划

体系接纳经典的三层架构模式,实现关注点分离,提拔代码可维护性:

  • 表现层:基于PyQt5控件构建,负责用户交互与数据展示。主窗口接纳标签页式结构,整合各业务模块,通过信号/槽机制与业务层通讯,界面样式通过QSS同一管理,实现表现与逻辑分离。
  • 业务逻辑层:封装业务规则与流程控制,负责参数校验、业务编排、非常处理处罚,和谐数据层完成业务操纵,是体系的核心调治层。
  • 数据访问层:通过DatabaseManager类封装全部数据库操纵,对外提供范畴化接口,内部屏蔽SQL细节与毗连管理,接纳参数化查询保障数据安全,通过事故保障写操纵的原子性。
横向支持模块包罗工具函数库(日期处理处罚、格式校验、数值盘算)与样式管理模块,为各层提供通用本领。
1.2 技能选型与来由

技能选型选型来由Python 3.8语法简便,开发服从高,尺度库功能美满,内置sqlite3模块无需额外依靠PyQt5控件库丰富,文档美满,跨平台兼容性好,信号/槽机制得当模块化桌面开发SQLite嵌入式零设置数据库,单文件存储便于备份迁徙,支持事故与尺度SQL,适配单机应用场景PyQtChartQt官方图表组件,原生集成度高,支持多种图表范例与动画效果,满足数据可视化需求QSS样式表语法雷同CSS,可会合管理界面样式,支持差别化控件定制,便于主题调解1.3 核心业务流程

体系核心业务围绕药品全生命周期管理睁开:药品信息录入 → 库存维护 → 贩卖登记(事故性扣减库存+记载流水) → 效期监控监控预警 → 贩卖数据统计分析。全部写操纵均颠末业务校验与事故封装,确保数据完备性。
二、核心模块深度实现

2.1 事故性贩卖数据处理处罚

贩卖操纵是体系的核心写场景,涉及药品表库存更新与贩卖汗青表记载写入两个关联操纵,必须包管原子性,克制出现数据不同等。
计划思绪

利用SQLite的事故支持,将两个更新操纵放在同一事故上下文中实验。通过上下文管理器封装数据库毗连,正常退出时自动提交事故,发生非常时自动回滚,从机制上包管数据同等性。同时在贩卖汗青表中冗余存储药品快照信息,纵然后续药品记载被删除,汗青贩卖数据仍可完备追溯。
核心实现
  1. def record_sale(self, sale_data):
  2.     """
  3.     事务性提交销售订单
  4.     :param sale_data: 包含drug_id, sell_quantity, sell_price, sell_amount, sell_date的字典
  5.     :return: 执行成功返回True
  6.     """
  7.     with self.get_connection() as conn:
  8.         conn.row_factory = sqlite3.Row
  9.         cursor = conn.cursor()
  10.         
  11.         # 查询药品当前状态
  12.         cursor.execute("SELECT id, stock, drug_name, spec, batch_no FROM drugs WHERE id = ?",
  13.                        (sale_data['drug_id'],))
  14.         drug_info = cursor.fetchone()
  15.         
  16.         if not drug_info:
  17.             raise ValueError("目标药品不存在")
  18.         if drug_info['stock'] < sale_data['sell_quantity']:
  19.             raise ValueError("库存不足,无法完成销售")
  20.         
  21.         # 计算库存变化
  22.         remain_stock = drug_info['stock'] - sale_data['sell_quantity']
  23.         
  24.         # 更新药品主表
  25.         cursor.execute("""
  26.             UPDATE drugs
  27.             SET stock = ?,
  28.                 sell_quantity = sell_quantity + ?,
  29.                 sell_amount = sell_amount + ?,
  30.                 sell_date = ?
  31.             WHERE id = ?
  32.         """, (remain_stock, sale_data['sell_quantity'],
  33.               sale_data['sell_amount'], sale_data['sell_date'],
  34.               sale_data['drug_id']))
  35.         
  36.         # 写入销售流水,冗余存储药品快照
  37.         cursor.execute("""
  38.             INSERT INTO sales_history (
  39.                 drug_id, drug_name, spec, batch_no,
  40.                 sell_quantity, sell_price, sell_amount,
  41.                 sell_date, original_stock, remaining_stock
  42.             ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  43.         """, (
  44.             drug_info['id'], drug_info['drug_name'], drug_info['spec'], drug_info['batch_no'],
  45.             sale_data['sell_quantity'], sale_data['sell_price'], sale_data['sell_amount'],
  46.             sale_data['sell_date'], drug_info['stock'], remain_stock
  47.         ))
  48.         
  49.     return True
复制代码
调优阐明


  • 接纳参数化查询,克制SQL注入风险
  • 单次事故内完成两次写操纵,镌汰毗连开销
  • 流水表生存库存前后快照,满足审计与题目排查需求
2.2 基于信号/槽的模块化通讯

桌面应用中多模块数据同步是常见难点,直接跨模块调用会导致代码耦合严峻,难以维护。体系利用PyQt5的信号/槽机制,实现模块间的低耦合通讯。
计划思绪

为每个功能模块界说独立的更新信号,当某一模块实验了影响全局数据的操纵(如完成贩卖)时,仅需发射对应信号,其他关联模块监听信号并实验自身的数据革新,无需知道信号发射方的内部实现。
实现方案
  1. class MainWindow(QMainWindow):
  2.     # 定义全局数据更新信号
  3.     drug_data_changed = pyqtSignal()
  4.     sales_data_changed = pyqtSignal()
  5.    
  6.     def __init__(self, db_manager, username):
  7.         super().__init__()
  8.         self.db_manager = db_manager
  9.         self.username = username
  10.         
  11.         # 信号绑定:销售数据变更后刷新药品表与效期表
  12.         self.sales_data_changed.connect(self.refresh_drug_table)
  13.         self.sales_data_changed.connect(self.refresh_expiry_table)
  14.    
  15.     def submit_sales(self):
  16.         # 销售提交逻辑
  17.         if self.db_manager.record_sale(sale_data):
  18.             # 发射数据变更信号,通知关联模块刷新
  19.             self.sales_data_changed.emit()
  20.             QMessageBox.information(self, "成功", "销售登记完成")
复制代码
该方案实现了模块间的解耦,新增功能模块时只需绑定对应信号,无需修改原有业务代码,扩展性精良。
2.3 效期预警的视觉化渲染

效期管理是药房体系的高频利勤奋能,纯数字展示服从低下,通过视觉化高亮可以显着提拔信息获取服从。
计划思绪

将效期预警逻辑与表格渲染分离,工具函数负责盘算剩余天数与对应预警品级,渲染逻辑根据品级批量设置单元格样式。支持多维度筛选,可快速定位差别临期品级的药品。
关键实现

[code]def highlight_expiry_rows(table_widget, row_index, remaining_days):    """根据剩余天数为指定表格行设置预警配景致"""    color_map = {        "expired": QColor("#f8d7da"),        "urgent": QColor("#fff3cd"),        "warning": QColor("#ffe5d0"),        "normal": None    }        if remaining_days < 0:        level = "expired"    elif remaining_days
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表