1. 项目概述
医疗用品销售商城网站是一个典型的B2C电子商务平台,采用SpringBoot+Vue的前后端分离架构。这类系统在疫情期间需求激增,不仅需要处理常规商品交易,还需满足医疗器械销售的特殊合规要求。我在2020年参与过类似项目,发现医疗电商相比普通电商在资质审核、处方药管理和物流配送等方面存在显著差异。
2. 技术架构设计
2.1 后端技术选型
SpringBoot 2.7 + MyBatis-Plus组合是经过验证的稳定方案。特别说明几个关键配置:
- 多数据源配置:医疗资质信息需要单独数据库存储
java复制@Configuration
@MapperScan(basePackages = "com.medical.mapper.auth", sqlSessionTemplateRef = "authSqlSessionTemplate")
public class AuthDataSourceConfig {
// 资质认证专用数据源
}
- 审计日志拦截器:满足医疗器械销售合规要求
java复制public class MedicalAuditInterceptor implements HandlerInterceptor {
// 记录药品操作日志
}
2.2 前端技术方案
Vue3 + Element Plus的组合在管理端表现优异,但移动端需额外注意:
- 药品详情页必须包含:
- 批准文号显眼位置展示
- 处方药警示标识
- 适应症折叠面板
- 特殊交互实现:
vue复制<template>
<el-dialog title="处方上传" :visible.sync="showPrescription">
<uploader :accept="'image/*'" :max-size="5"/>
</el-dialog>
</template>
3. 核心业务实现
3.1 医疗资质管理
这是区别于普通电商的核心模块,实现要点:
- 三级审核流程:
- 机器校验营业执照
- 人工审核医疗器械经营许可证
- 定期复审机制
- 数据库设计关键字段:
sql复制CREATE TABLE `medical_cert` (
`cert_id` varchar(32) NOT NULL COMMENT 'SHA256(营业执照号+医疗器械证号)',
`drug_operation_license` varchar(100) DEFAULT NULL COMMENT '药品经营许可证',
`medical_device_filing` varchar(100) DEFAULT NULL COMMENT '医疗器械备案',
`gsp_cert` tinyint(1) DEFAULT '0' COMMENT '是否通过GSP认证'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3.2 处方药销售流程
特殊业务逻辑处理:
java复制public class PrescriptionService {
@Transactional
public Result submitOrder(OrderDTO dto) {
if(dto.getIsRxDrug()) {
// 处方药校验逻辑
if(!prescriptionValidator.check(dto.getPrescriptionId())){
throw new MedicalException("处方单未通过审核");
}
// 记录处方关联
prescriptionLogMapper.insert(...);
}
// 常规订单处理
}
}
4. 特殊功能实现
4.1 医保对接方案
与地方医保系统对接的实践经验:
- 加密方案选择:
- 使用SM4国密算法加密传输数据
- 每个交易生成唯一会话密钥
- 对账文件处理示例:
python复制def process_medical_insurance(file):
with open(file, 'r', encoding='gbk') as f:
reader = csv.DictReader(f)
for row in reader:
# 医保特殊字段处理
medical_no = row['医保编号'].strip()
if not validate_medical_no(medical_no):
continue
# 入库逻辑...
4.2 冷链物流集成
医疗器械的温度监控实现:
- 温控设备数据接入方案:
javascript复制// WebSocket接收温度数据
const ws = new WebSocket('wss://temp-monitor.com');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if(data.temperature > 8) {
triggerAlert(data.shipmentId);
}
};
- 数据库温度记录表设计:
sql复制CREATE TABLE `shipment_temperature` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`shipment_no` varchar(32) NOT NULL,
`record_time` datetime NOT NULL,
`temp_value` decimal(3,1) NOT NULL,
`device_id` varchar(20) NOT NULL,
`location` point DEFAULT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `idx_location` (`location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5. 安全与合规要点
5.1 数据安全措施
医疗数据保护的特殊要求:
- 敏感信息加密存储方案:
java复制public class MedicalDataEncryptor {
private static final String KEY_ALGORITHM = "AES";
private static final String CIPHER_ALGORITHM = "AES/GCM/NoPadding";
public String encryptMedicalRecord(String data) {
// GCM模式加密实现
}
}
- 审计日志必须包含:
- 操作人员ID
- 操作时间戳
- 修改前/后值
- 操作IP地址
5.2 合规性检查
自动化的合规检查脚本示例:
python复制def check_medical_compliance(product):
errors = []
if product['category'] == '三类医疗器械':
if not product['license_no']:
errors.append('三类器械必须填写注册证号')
if not product['sterilization']:
errors.append('必须注明灭菌方式')
# 其他检查项...
return errors
6. 性能优化实践
6.1 药品目录缓存
医疗商品缓存的特殊处理:
java复制@Cacheable(value = "medicalItems", key = "#root.args[0]",
unless = "#result == null || #result.requiresPrescription")
public MedicalItem getItemById(Long id) {
// 处方药不缓存
}
6.2 高并发订单处理
医疗订单的优先队列实现:
java复制@Bean
public Queue medicalOrderQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10);
return new Queue("medical.orders", true, false, false, args);
}
// 优先级设置示例
message.getMessageProperties().setPriority(
order.getIsEmergency() ? 9 :
order.getIsRxDrug() ? 5 : 1
);
7. 部署注意事项
医疗系统的特殊部署要求:
- 等保三级合规配置:
- 日志留存6个月以上
- 数据库审计功能开启
- 加密传输强制启用
- 容器化部署示例:
dockerfile复制# 医疗镜像特殊配置
FROM openjdk:11-jdk
RUN addgroup --system --gid 1001 medgroup && \
adduser --system --uid 1001 --ingroup medgroup meduser
USER meduser
COPY --chown=meduser:medgroup target/medical.jar /app/
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/actuator/health
8. 测试重点领域
医疗电商特有的测试场景:
- 处方药流程测试用例:
gherkin复制Scenario: 处方药购买流程
Given 用户未上传处方
When 用户尝试购买阿莫西林胶囊
Then 系统应阻止结算并提示上传处方
And 页面应显示附近药房链接
- 资质过期监控测试:
java复制@Test
public void testCertExpireAlert() {
// 模拟资质即将过期
MedicalCert cert = createTestCert(LocalDate.now().plusDays(10));
certService.checkExpiration();
// 验证预警邮件发送
verify(emailService).sendAlert(any());
}
9. 运维监控要点
医疗系统特有的监控指标:
- 关键监控面板配置:
- 处方审核平均时长
- 冷链异常报警次数
- 资质过期预警数量
- 医保对账失败率
- Prometheus特殊指标示例:
yaml复制- name: medical_prescription_verify
help: "处方审核状态统计"
type: histogram
labels:
- drug_type
- verify_result
10. 项目经验总结
在开发医疗电商系统时,有三个关键经验值得分享:
- 资质审核的异步处理:
java复制@Async("certAuditExecutor")
public void asyncAuditCert(CertSubmitDTO dto) {
// 耗时审核操作
auditService.fullAudit(dto);
// 短信通知结果
smsService.sendAuditResult(dto.getUserId());
}
- 药品图片审核的特殊处理:
- 必须遮挡包装上的400电话
- 批准文号需要清晰可辨
- 适应症文字需完整展示
- 与普通电商的主要差异点:
| 功能点 | 普通电商 | 医疗电商 |
|---|---|---|
| 商品上架 | 自主发布 | 需要资质审核 |
| 支付方式 | 常规支付 | 支持医保结算 |
| 物流要求 | 普通快递 | 部分需要冷链 |
| 退货政策 | 7天无理由 | 药品特殊不退政策 |