功能概述
临期商品提示功能旨在帮助小象买菜系统自动识别即将过期的商品,并及时提醒商家和顾客,减少食品浪费,提升用户体验。
系统设计
1. 数据库设计
商品表(products)新增字段:
- `expiry_date` (DATE): 商品过期日期
- `warning_days` (INT): 提前提醒天数(可选,默认为系统设置)
- `last_warning_date` (DATETIME): 最后一次提醒时间
2. 核心功能模块
2.1 临期商品计算服务
```java
public class ExpiryWarningService {
// 系统配置的默认提醒天数
private final int DEFAULT_WARNING_DAYS = 3;
/
* 获取所有临期商品
* @return 临期商品列表
*/
public List
getExpiringProducts() { LocalDate today = LocalDate.now(); List allProducts = productRepository.findAll(); List expiringProducts = new ArrayList<>(); for (Product product : allProducts) { LocalDate expiryDate = product.getExpiryDate().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); int warningDays = product.getWarningDays() != null ? product.getWarningDays() : DEFAULT_WARNING_DAYS; if (expiryDate.minusDays(warningDays).isBefore(today) && expiryDate.isAfter(today)) { expiringProducts.add(product); } } return expiringProducts; } / * 更新最后提醒时间 * @param productId 商品ID */ public void updateLastWarningDate(Long productId) { Product product = productRepository.findById(productId) .orElseThrow(() -> new RuntimeException("Product not found")); product.setLastWarningDate(LocalDateTime.now()); productRepository.save(product); } } ``` 2.2 定时任务 使用Spring的`@Scheduled`注解实现每日定时检查: ```java @Component public class ExpiryWarningScheduler { @Autowired private ExpiryWarningService expiryWarningService; @Autowired private NotificationService notificationService; // 每天凌晨2点执行 @Scheduled(cron = "0 0 2 * * ?") public void checkExpiringProducts() { List expiringProducts = expiryWarningService.getExpiringProducts(); if (!expiringProducts.isEmpty()) { // 发送通知给商家 notificationService.sendExpiryWarningToMerchants(expiringProducts); // 更新最后提醒时间 expiringProducts.forEach(product -> expiryWarningService.updateLastWarningDate(product.getId())); } } } ``` 2.3 通知服务 ```java public class NotificationService { / * 发送临期商品提醒给商家 * @param products 临期商品列表 */ public void sendExpiryWarningToMerchants(List products) { // 获取所有商家ID Set merchantIds = products.stream() .map(Product::getMerchantId) .collect(Collectors.toSet()); // 按商家分组商品 Map> productsByMerchant = products.stream() .collect(Collectors.groupingBy(Product::getMerchantId)); // 发送通知(这里简化为打印日志,实际可集成短信、邮件或站内信) merchantIds.forEach(merchantId -> { List merchantProducts = productsByMerchant.get(merchantId); String message = String.format( "商家%d,以下商品即将过期:\n%s", merchantId, merchantProducts.stream() .map(p -> p.getName() + "(过期日:" + p.getExpiryDate() + ")") .collect(Collectors.joining("\n")) ); System.out.println("临期提醒: " + message); // 实际实现中调用短信/邮件API }); } / * 用户端临期商品提示(可选) */ public void showExpiryWarningToCustomers(Long productId) { // 实现用户浏览商品时的临期提示逻辑 } } ``` 3. 前端展示 3.1 商家后台临期商品列表 ```javascript // React示例组件 function ExpiryWarningList() { const [expiringProducts, setExpiringProducts] = useState([]); useEffect(() => { fetch(/api/expiry-warnings) .then(res => res.json()) .then(data => setExpiringProducts(data)); }, []); return ( 临期商品提醒 商品名称 过期日期 剩余天数 操作 {expiringProducts.map(product => ( {product.name} {formatDate(product.expiryDate)} {calculateDaysLeft(product.expiryDate)} handleDiscount(product.id)}> 设置折扣 ))}
); } ``` 3.2 用户端商品详情页提示 ```javascript function ProductDetail({ product }) { const daysLeft = calculateDaysLeft(product.expiryDate); const isExpiringSoon = daysLeft <= 7; // 7天内算临期 return ( {/* 其他商品信息 */}
{isExpiringSoon && (
⚠️ 温馨提示:此商品将于{daysLeft}天后过期
)}
); } ``` 扩展功能 1. 自动折扣设置:系统可根据临期天数自动设置折扣比例 2. 多级提醒:提前7天、3天、1天不同级别的提醒 3. 库存联动:临期商品自动调整推荐排序 4. 数据分析:统计临期商品比例,优化采购策略 5. 用户推送:向常购用户推送临期特价商品 实施步骤 1. 数据库表结构调整,添加过期日期字段 2. 开发临期商品计算服务 3. 实现定时任务调度 4. 开发商家后台展示页面 5. 集成通知系统(短信、邮件等) 6. 用户端提示功能开发 7. 测试与上线 注意事项 1. 考虑时区问题,确保日期计算准确 2. 避免重复提醒,记录最后提醒时间 3. 性能优化,对于大量商品考虑分批处理 4. 提供配置界面,允许商家自定义提醒规则 5. 考虑移动端适配,确保提醒信息清晰可见 通过实现临期商品提示功能,小象买菜系统可以有效减少食品浪费,提升商家运营效率,同时为用户提供更好的购物体验。