如何用PHP项目搭建药店管理系统?完整实战指南
📖 目录导读
为什么选择PHP搭建药店管理系统?
药店管理系统需要处理药品进销存、GSP(药品经营质量管理规范)记录、处方药管理、会员积分等复杂业务,PHP作为服务端脚本语言,凭借其跨平台性、丰富的框架(如Laravel、ThinkPHP) 以及成熟的电商类开源项目(如ECshop、WSTMart),成为中小型药店数字化转型的首选。

根据搜索引擎综合内容,许多中小药店倾向于使用PHP+MySQL组合,原因包括:
- 成本低:LAMP/LNMP架构免费且社区资源丰富;
- 快速开发:用Laravel框架可快速实现API与后台管理;
- 合规适配:可通过插件实现处方药双签、温湿度记录等功能。
问答环节
Q:PHP搭建的药店管理系统能否满足GSP合规要求?
A:可以,通过在代码中嵌入GSP字段(如批号、有效期、验收记录),并配合角色权限控制(如药师、收银员、管理员),完全满足中国GSP标准,建议使用Laravel的Spatie权限包管理角色。
系统核心功能模块设计
一个完整的药店管理系统至少包含以下模块:
| 模块名称 | 功能说明 | 对应表名示例 |
|---|---|---|
| 药品管理 | 药品新增、批次、有效期、批准文号、库存预警 | drugs, drug_batches |
| 采购管理 | 供应商管理、采购单、入库验收 | suppliers, purchase_orders |
| 销售管理 | 收银、处方药核验、会员折扣、小票打印 | sales, prescriptions |
| 库存管理 | 实时库存、盘点、近效期提醒、报损报溢 | inventories, inventory_logs |
| GSP管理 | 温度记录、养护记录、员工培训记录 | gsp_temperature, gsp_maintenance |
| 财务管理 | 日结、月结、对账、成本核算 | accounts, daily_reports |
注意:处方药销售需强制弹窗提示“药师审核”,并记录处方编号与执业药师电子签名。
技术架构与开发环境准备
推荐技术栈
- 后端:PHP 8.1+(推荐) + Laravel 10 或 ThinkPHP 8
- 前端:Layui(管理员)、uni-app(移动端收银扫码)
- 数据库:MySQL 8.0(支持JSON字段存储药品属性)
- 缓存:Redis(用于库存扣减防超卖)
- 运行环境:Nginx/Apache + PHP-FPM
安装步骤(以Laravel为例)
composer create-project laravel/laravel pharmacy-system php artisan make:model Drug -m php artisan make:controller Api/DrugController
数据库设计与表结构示例
核心表:drugs(药品基础信息)
CREATE TABLE `drugs` ( `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `generic_name` VARCHAR(100) NOT NULL COMMENT '通用名', `trade_name` VARCHAR(100) COMMENT '商品名', `approval_number` VARCHAR(50) NOT NULL COMMENT '批准文号', `manufacturer` VARCHAR(100) COMMENT '生产厂家', `specification` VARCHAR(50) COMMENT '规格', `unit` VARCHAR(10) DEFAULT '盒' COMMENT '单位', `price_cost` DECIMAL(10,2) DEFAULT 0 COMMENT '进价', `price_sale` DECIMAL(10,2) DEFAULT 0 COMMENT '零售价', `is_prescription` TINYINT DEFAULT 0 COMMENT '是否处方药', `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键设计点
- 采用双字段库存:
inventories表记录每个批次的库存,drugs表只存总库存(通过触发器或事件更新); - 使用时间分区:销售记录按月分区,提升百万级查询性能。
问答环节
Q:如何实现近效期药品自动预警?
A:在drug_batches表添加expire_date字段,每天运行一次计划任务(Laravel Schedule):php artisan pharmacy:check-expiry,扫描距离到期≤90天的药品,推送到管理后台弹窗或邮件通知。
关键代码实现与逻辑解析
1 药品入库(事务与锁)
public function store(Request $request)
{
DB::beginTransaction();
try {
// 1. 新增药品或批次
$drug = Drug::firstOrCreate(['approval_number' => $request->approval_number]);
$batch = new DrugBatch($request->batchData);
$batch->drug_id = $drug->id;
$batch->save();
// 2. 更新库存(悲观锁防止并发)
Inventory::where('drug_id', $drug->id)
->lockForUpdate()
->increment('quantity', $request->quantity);
DB::commit();
return response()->json(['status' => 1, 'msg' => '入库成功']);
} catch (\Exception $e) {
DB::rollback();
return response()->json(['status' => 0, 'msg' => $e->getMessage()]);
}
}
2 销售处方药核验逻辑
public function sale(Request $request)
{
$drug = Drug::find($request->drug_id);
if ($drug->is_prescription && !$request->has('prescription_id')) {
return response()->json(['status' => -1, 'msg' => '处方药需录入处方编号']);
}
// 进行库存扣减、生成销售记录...
}
安全与合规性要点
- 数据加密:药品售价、会员手机号存储时使用AES-256加密;
- 权限隔离:药师只能查看处方记录,收银员不能修改药品进价;
- 日志审计:任何对药品库存的增删改都记录到
audit_logs表; - 防CSRF/XSS:Laravel自动表单Token + 输出转义。
重要合规提示:如果系统需要接入医保结算,必须遵循各地医保局接口规范,建议使用PHP的GuzzleHttp库对接医保API。
常见问题与解答(QA)
Q1:PHP开发药店管理系统,如何处理多门店数据隔离?
A:在 drugs 表增加 store_id 字段,所有查询强制加 where('store_id', auth()->user()->store_id) 条件,实现数据级权限。
Q2:系统需要对接电子发票,PHP如何实现?
A:推荐使用百望云或诺诺网API,通过Laravel的Http门面发送SOAP或RESTful请求,接收XML/JSON格式发票数据转存本地。
Q3:库存扣减时如何避免超卖?
A:使用Redis DECR原子操作+数据库乐观锁(版本号字段version),两阶段校验。
Q4:能否开源免费使用?
A:部分成熟项目如“药店管家”(基于ThinkPHP)提供开源版,但完整版需购买授权,自己搭建完全免费,仅需支付服务器成本。
总结与部署建议
用PHP搭建药店管理系统,核心在于业务逻辑的准确实现与合规性保障,推荐部署方案:
- 测试环境:本地使用XAMPP或Docker(
docker-compose up -d启动Laravel+MySQL+Redis); - 生产环境:云服务器(建议2核4G以上)+ 宝塔面板(可视化配置Nginx缓存)、CDN加速静态资源。
建议定期备份数据库(使用Laravel Backup插件),并在代码仓库(如GitLab)中保护敏感配置(.env 加入 .gitignore)。
延伸阅读:如果你想进一步了解如何将系统部署为SaaS模式(多家药店共用一套代码),可以搜索“Laravel Tenancy多商户插件”或“ThinkPHP多应用模式”。
(本文综合自PHP中文网、Laravel中国社区、CSDN药店系统实战教程,并经去重重组优化而成。)