1. 项目概述:药品商城系统的核心价值
去年帮本地连锁药店做线上化改造时,我深刻体会到医药电商系统的特殊性。这个基于ThinkPHP的药品管理系统,不仅要满足常规电商功能,还要处理处方药审核、医保对接等医药行业特有的业务流程。系统包含后台药品进销存管理、前台H5购药商城、药师咨询模块三大核心板块,日均要处理200+处方单的电子审核流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计解析
2.1 技术栈选型考量
选择ThinkPHP6框架主要基于三个现实因素:
- 药店现有技术团队主要擅长PHP
- 框架自带的ORM和验证器完美适配药品数据校验需求
- 丰富的扩展库支持微信支付、医保接口对接
数据库采用MySQL主从架构,商品表单独做了分库处理。这里有个细节:药品基础信息表(medicine_base)与库存表(medicine_stock)必须分离,因为同一药品在不同门店的库存和价格策略可能不同。
2.2 核心数据模型设计
药品类目树的设计值得特别注意:
php复制// 三级类目结构示例
class Category extends Model
{
// 一级类目:处方药/非处方药/医疗器械...
public function parent()
{
return $this->belongsTo(Category::class);
}
// 特殊字段
protected $schema = [
'is_prescription' => 'bool', // 是否处方药
'medical_insurance' => 'bool' // 是否医保目录
];
}
处方药需要额外关联的审核流程表:
php复制class Prescription extends Model
{
const STATUS_PENDING = 0; // 待审核
const STATUS_APPROVED = 1; // 已通过
public function orders()
{
return $this->hasMany(Order::class);
}
}
3. 关键业务逻辑实现
3.1 药品库存的分布式管理
采用Redis+Lua脚本实现库存原子性操作:
lua复制-- 库存扣减脚本
local key = KEYS[1]
local change = tonumber(ARGV[1])
local current = tonumber(redis.call('GET', key))
if current >= change then
return redis.call('DECRBY', key, change)
else
return -1
end
在PHP中调用:
php复制$result = Redis::eval(
$luaScript,
1,
'stock_'.$skuId,
$purchaseQuantity
);
3.2 处方药审核流程
审核状态机设计要点:
- 用户上传处方照片后自动OCR识别关键信息
- 系统校验处方有效期和医师签名
- 药师后台二次确认用药合理性
php复制class PrescriptionService
{
public function approve($prescriptionId, $pharmacistId)
{
DB::transaction(function() use ($prescriptionId, $pharmacistId) {
$prescription = Prescription::lockForUpdate()->find($prescriptionId);
if ($prescription->status != Prescription::STATUS_PENDING) {
throw new Exception('非法状态变更');
}
$prescription->update([
'status' => Prescription::STATUS_APPROVED,
'approver_id' => $pharmacistId,
'approved_at' => now()
]);
// 触发订单状态变更
OrderService::unlockPrescriptionOrders($prescriptionId);
});
}
}
4. 特殊业务场景处理
4.1 医保支付对接方案
与地方医保平台对接的三大难点:
- 加密验签使用SM2/SM3国密算法
- 需要处理医保目录对照关系
- 结算数据需要保留5年以上
我们通过中间件处理加密
