
一、家庭药品管理系统核心模块搭建
家庭药品管理系统需实现'药品录入、状态监测、智能提醒、用药指导'的核心功能。通过轻量化设计,打造适配家庭场景的便捷管理工具。

1.1 药品信息管理模块:让药品'有迹可循'
传统家庭药品常因'名称不清、分类混乱'导致误用风险。该模块通过'智能识别 + 分类存储 + 精准查询',实现药品信息的规范化管理:
@Service
@Slf4j
public class MedicineInfoService {
@Autowired
private MedicineRepository medicineRepo;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private ImageRecognitionService imageService;
@Autowired
private MedicineDictionaryService dictService;
// 缓存 Key 设计(按家庭隔离,提升访问效率)
private static final String FAMILY_MEDICINE_KEY = "medicine:family:";
// 家庭药品列表(7 天有效期)
private static final String MEDICINE_CATEGORY_KEY = "medicine:category:";
// 分类药品缓存
private ;
{
List<Medicine> medicines = medicineRepo.findByFamilyId(familyId);
(medicines.isEmpty()) {
log.info(, familyId);
;
}
FAMILY_MEDICINE_KEY + familyId;
redisTemplate.opsForValue().set(cacheKey, medicines, , TimeUnit.DAYS);
Map<String, List<Medicine>> categoryMap = medicines.stream()
.collect(Collectors.groupingBy(Medicine::getCategory));
categoryMap.forEach((category, meds) -> {
redisTemplate.opsForValue().set(
MEDICINE_CATEGORY_KEY + familyId + + category,
meds, , TimeUnit.DAYS);
});
log.info(, familyId, medicines.size());
}
MedicineResult {
(request.getFamilyId() == ) {
MedicineResult.fail();
}
();
medicine.setMedicineId(generateMedicineId(request.getFamilyId()));
medicine.setFamilyId(request.getFamilyId());
medicine.setAddTime(LocalDateTime.now());
medicine.setStatus(MedicineStatus.STORED);
(StringUtils.isNotBlank(request.getBarcode())) {
dictService.getMedicineByBarcode(request.getBarcode());
(recognizedInfo != ) {
fillMedicineFromDict(medicine, recognizedInfo);
}
} (request.getImageData() != ) {
imageService.recognizeMedicineImage(request.getImageData());
(ocrResult.isSuccess()) {
fillMedicineFromOcr(medicine, ocrResult);
}
}
(StringUtils.isNotBlank(request.getName())) {
medicine.setName(request.getName());
}
(request.getProductionDate() != ) {
medicine.setProductionDate(request.getProductionDate());
}
(request.getExpiryDate() != ) {
medicine.setExpiryDate(request.getExpiryDate());
}
medicine.setStorageLocation(request.getStorageLocation());
medicine.setDosage(request.getDosage());
medicine.setNote(request.getNote());
(StringUtils.isBlank(medicine.getName())) {
MedicineResult.fail();
}
(medicine.getExpiryDate() == ) {
MedicineResult.fail();
}
medicineRepo.save(medicine);
updateMedicineCache(medicine);
log.info(, request.getFamilyId(), medicine.getName());
MedicineResult.success(medicine);
}
MedicineQueryResult {
request.getFamilyId();
FAMILY_MEDICINE_KEY + familyId;
List<Medicine> medicines = (List<Medicine>) redisTemplate.opsForValue().get(cacheKey);
(medicines == ) {
medicines = medicineRepo.findByFamilyId(familyId);
redisTemplate.opsForValue().set(cacheKey, medicines, , TimeUnit.DAYS);
}
List<Medicine> filtered = filterMedicines(medicines, request);
Map<String, Long> categoryStats = filtered.stream()
.collect(Collectors.groupingBy(Medicine::getCategory, Collectors.counting()));
();
result.setFamilyId(familyId);
result.setTotalCount(filtered.size());
result.setCategoryStats(categoryStats);
result.setMedicines(filtered);
result.setExpiringCount(() filtered.stream()
.filter(::isExpiringSoon).count());
result.setExpiredCount(() filtered.stream()
.filter(::isExpired).count());
result;
}
{
(medicine.getExpiryDate() == ) ;
LocalDate.now();
!medicine.getExpiryDate().isBefore(today)
&& medicine.getExpiryDate().isBefore(today.plusDays());
}
{
medicine.getExpiryDate() !=
&& medicine.getExpiryDate().isBefore(LocalDate.now());
}
}


