功能概述
临期商品提示功能旨在帮助小象买菜系统自动识别即将过期的商品,并及时提醒管理人员和用户,以减少损耗、提升用户体验并保障食品安全。
系统架构设计
1. 数据库设计
```sql
-- 商品表扩展
ALTER TABLE products ADD COLUMN production_date DATE;
ALTER TABLE products ADD COLUMN shelf_life_days INT; -- 保质期天数
ALTER TABLE products ADD COLUMN expiration_date DATE; -- 计算得出的过期日期
-- 临期商品提醒表
CREATE TABLE expiring_product_alerts (
id INT AUTO_INCREMENT PRIMARY KEY,
product_id INT NOT NULL,
alert_level TINYINT NOT NULL COMMENT 1-预警, 2-警告, 3-严重,
alert_date DATETIME DEFAULT CURRENT_TIMESTAMP,
handled BOOLEAN DEFAULT FALSE,
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
2. 核心功能模块
2.1 临期计算服务
```java
public class ExpirationCalculator {
// 计算过期日期
public static Date calculateExpirationDate(Date productionDate, int shelfLifeDays) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(productionDate);
calendar.add(Calendar.DAY_OF_YEAR, shelfLifeDays);
return calendar.getTime();
}
// 检查商品是否临期
public static boolean isExpiringSoon(Date expirationDate, int daysBeforeAlert) {
Date now = new Date();
Calendar expCal = Calendar.getInstance();
expCal.setTime(expirationDate);
expCal.add(Calendar.DAY_OF_YEAR, -daysBeforeAlert);
Date alertDate = expCal.getTime();
return now.after(alertDate) && now.before(expirationDate);
}
// 获取临期级别
public static int getAlertLevel(Date expirationDate) {
Date now = new Date();
long daysLeft = (expirationDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24);
if (daysLeft <= 1) return 3; // 严重
if (daysLeft <= 3) return 2; // 警告
if (daysLeft <= 7) return 1; // 预警
return 0; // 正常
}
}
```
2.3 定时任务实现
使用Spring的@Scheduled注解实现每日临期商品检查:
```java
@Service
public class ExpirationAlertService {
@Autowired
private ProductRepository productRepository;
@Autowired
private AlertRepository alertRepository;
// 每天凌晨1点执行检查
@Scheduled(cron = "0 0 1 * * ?")
public void checkExpiringProducts() {
List
products = productRepository.findAll();
Date now = new Date();
for (Product product : products) {
if (product.getExpirationDate() == null) continue;
int alertLevel = ExpirationCalculator.getAlertLevel(product.getExpirationDate());
if (alertLevel > 0) {
// 检查是否已存在相同级别的提醒
boolean exists = alertRepository.existsByProductIdAndAlertLevelAndHandledFalse(
product.getId(), alertLevel);
if (!exists) {
ExpiringProductAlert alert = new ExpiringProductAlert();
alert.setProductId(product.getId());
alert.setAlertLevel(alertLevel);
alertRepository.save(alert);
// 发送通知
sendNotification(product, alertLevel);
}
}
}
}
private void sendNotification(Product product, int alertLevel) {
// 实现邮件、短信或系统内通知
String message = String.format(
"商品 %s (ID: %d) 即将过期,剩余天数: %d,级别: %s",
product.getName(), product.getId(),
Duration.between(new Date().toInstant(), product.getExpirationDate().toInstant()).toDays(),
alertLevel == 1 ? "预警" : alertLevel == 2 ? "警告" : "严重"
);
// 实际项目中这里调用邮件/短信服务
System.out.println("通知: " + message);
}
}
```
2.3 前端展示
在管理后台添加临期商品看板:
```javascript
// React示例组件
function ExpiringProductsDashboard() {
const [alerts, setAlerts] = useState([]);
useEffect(() => {
fetch(/api/expiring-alerts)
.then(res => res.json())
.then(data => setAlerts(data));
}, []);
return (
临期商品提醒
{[严重, 警告, 预警].map((level, index) => (
{level}
{alerts
.filter(a => a.alertLevel === index + 1)
.map(alert => (
{alert.productName} - 剩余{alert.daysLeft}天
))}
))}
);
}
```
关键实现细节
1. 过期日期计算:
- 系统应在商品入库时自动计算过期日期(生产日期 + 保质期)
- 考虑闰年和月份天数差异
2. 多级提醒机制:
- 预警(7天前):黄色提示
- 警告(3天前):橙色提示
- 严重(1天内):红色提示 + 强制处理
3. 用户界面优化:
- 在商品列表页用颜色标签区分临期状态
- 提供一键处理功能(如折扣促销、下架等)
4. 移动端适配:
- 推送通知到管理人员手机
- 扫码快速处理临期商品
测试方案
1. 单元测试:
- 验证过期日期计算是否正确
- 测试不同天数下的提醒级别
2. 集成测试:
- 模拟商品从入库到临期的全流程
- 验证提醒是否按时触发
3. 用户验收测试:
- 确认管理人员能清晰看到临期商品
- 验证处理流程是否顺畅
扩展功能建议
1. 自动促销策略:
- 临期商品自动加入折扣专区
- 根据剩余天数动态调整折扣率
2. 供应商协作:
- 自动通知供应商即将过期商品
- 协商退货或换货流程
3. 数据分析:
- 统计各品类损耗率
- 优化采购计划减少临期商品
4. 用户端提醒:
- 告知用户所购商品保质期情况
- 提供保存建议(如冷藏/冷冻)
通过实现这一功能,小象买菜系统能够有效减少食品浪费,提升运营效率,同时增强用户对食品安全的信任。