马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
弁言
随着医疗信息化向下层机构排泄,中小型药房与社区诊所对轻量化药品管理工具的需求一连增长。传统商业管理体系广泛存在摆设本钱高、功能冗余、定制难度大的题目,而基于嵌入式数据库的桌面应用方案,依附零设置、易维护、低本钱的上风,成为小型机构信息化的符合选择。
本文基于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的事故支持,将两个更新操纵放在同一事故上下文中实验。通过上下文管理器封装数据库毗连,正常退出时自动提交事故,发生非常时自动回滚,从机制上包管数据同等性。同时在贩卖汗青表中冗余存储药品快照信息,纵然后续药品记载被删除,汗青贩卖数据仍可完备追溯。
核心实现
- def record_sale(self, sale_data):
- """
- 事务性提交销售订单
- :param sale_data: 包含drug_id, sell_quantity, sell_price, sell_amount, sell_date的字典
- :return: 执行成功返回True
- """
- with self.get_connection() as conn:
- conn.row_factory = sqlite3.Row
- cursor = conn.cursor()
-
- # 查询药品当前状态
- cursor.execute("SELECT id, stock, drug_name, spec, batch_no FROM drugs WHERE id = ?",
- (sale_data['drug_id'],))
- drug_info = cursor.fetchone()
-
- if not drug_info:
- raise ValueError("目标药品不存在")
- if drug_info['stock'] < sale_data['sell_quantity']:
- raise ValueError("库存不足,无法完成销售")
-
- # 计算库存变化
- remain_stock = drug_info['stock'] - sale_data['sell_quantity']
-
- # 更新药品主表
- cursor.execute("""
- UPDATE drugs
- SET stock = ?,
- sell_quantity = sell_quantity + ?,
- sell_amount = sell_amount + ?,
- sell_date = ?
- WHERE id = ?
- """, (remain_stock, sale_data['sell_quantity'],
- sale_data['sell_amount'], sale_data['sell_date'],
- sale_data['drug_id']))
-
- # 写入销售流水,冗余存储药品快照
- cursor.execute("""
- INSERT INTO sales_history (
- drug_id, drug_name, spec, batch_no,
- sell_quantity, sell_price, sell_amount,
- sell_date, original_stock, remaining_stock
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- """, (
- drug_info['id'], drug_info['drug_name'], drug_info['spec'], drug_info['batch_no'],
- sale_data['sell_quantity'], sale_data['sell_price'], sale_data['sell_amount'],
- sale_data['sell_date'], drug_info['stock'], remain_stock
- ))
-
- return True
复制代码 调优阐明
- 接纳参数化查询,克制SQL注入风险
- 单次事故内完成两次写操纵,镌汰毗连开销
- 流水表生存库存前后快照,满足审计与题目排查需求
2.2 基于信号/槽的模块化通讯
桌面应用中多模块数据同步是常见难点,直接跨模块调用会导致代码耦合严峻,难以维护。体系利用PyQt5的信号/槽机制,实现模块间的低耦合通讯。
计划思绪
为每个功能模块界说独立的更新信号,当某一模块实验了影响全局数据的操纵(如完成贩卖)时,仅需发射对应信号,其他关联模块监听信号并实验自身的数据革新,无需知道信号发射方的内部实现。
实现方案
- class MainWindow(QMainWindow):
- # 定义全局数据更新信号
- drug_data_changed = pyqtSignal()
- sales_data_changed = pyqtSignal()
-
- def __init__(self, db_manager, username):
- super().__init__()
- self.db_manager = db_manager
- self.username = username
-
- # 信号绑定:销售数据变更后刷新药品表与效期表
- self.sales_data_changed.connect(self.refresh_drug_table)
- self.sales_data_changed.connect(self.refresh_expiry_table)
-
- def submit_sales(self):
- # 销售提交逻辑
- if self.db_manager.record_sale(sale_data):
- # 发射数据变更信号,通知关联模块刷新
- self.sales_data_changed.emit()
- 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 |