功能概述
临期商品提示功能旨在帮助小象买菜系统自动识别即将过期的商品,并及时提醒管理人员和顾客,减少商品损耗并提升用户体验。
系统设计
1. 数据库设计
```sql
-- 商品表(products)增加保质期相关字段
ALTER TABLE products ADD COLUMN production_date DATE COMMENT 生产日期;
ALTER TABLE products ADD COLUMN shelf_life_days INT COMMENT 保质期天数;
ALTER TABLE products ADD COLUMN expiration_date DATE COMMENT 过期日期;
ALTER TABLE products ADD COLUMN reminder_sent TINYINT(1) DEFAULT 0 COMMENT 是否已发送提醒;
-- 库存表(inventory)增加批次管理字段
ALTER TABLE inventory ADD COLUMN batch_number VARCHAR(50) COMMENT 批次号;
ALTER TABLE inventory ADD COLUMN production_date DATE COMMENT 生产日期;
ALTER TABLE inventory ADD COLUMN expiration_date DATE COMMENT 过期日期;
```
2. 核心功能模块
2.1 临期商品计算服务
```java
public class ExpirationReminderService {
// 配置临期阈值(天)
private static final int WARNING_THRESHOLD = 7; // 提前7天提醒
/
* 检查并返回临期商品列表
* @return 临期商品信息列表
*/
public List
checkExpiringProducts() {
List expiringProducts = new ArrayList<>();
// 查询所有未过期且未提醒的商品
Date currentDate = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
calendar.add(Calendar.DAY_OF_MONTH, WARNING_THRESHOLD);
Date warningDate = calendar.getTime();
// 查询即将过期的商品(基于库存批次)
List inventoryItems = inventoryRepository.findItemsExpiringBefore(warningDate);
for (InventoryItem item : inventoryItems) {
Product product = productRepository.findById(item.getProductId());
if (product != null && !item.isReminderSent()) {
expiringProducts.add(new ExpiringProduct(
product.getId(),
product.getName(),
item.getExpirationDate(),
calculateDaysRemaining(item.getExpirationDate())
));
// 标记为已提醒
markAsReminded(item);
}
}
return expiringProducts;
}
private int calculateDaysRemaining(Date expirationDate) {
long diff = expirationDate.getTime() - new Date().getTime();
return (int) (diff / (1000 * 60 * 60 * 24));
}
private void markAsReminded(InventoryItem item) {
// 更新数据库标记
inventoryRepository.updateReminderStatus(item.getId(), true);
}
}
```
2. 定时任务配置
使用Spring的`@Scheduled`注解配置每日定时检查:
```java
@Component
public class ExpirationReminderScheduler {
@Autowired
private ExpirationReminderService reminderService;
@Autowired
private NotificationService notificationService;
// 每天凌晨1点执行检查
@Scheduled(cron = "0 0 1 * * ?")
public void checkAndNotifyExpiration() {
List expiringProducts = reminderService.checkExpiringProducts();
if (!expiringProducts.isEmpty()) {
// 发送管理员通知
notificationService.sendAdminNotification(expiringProducts);
// 可选: 发送顾客通知(如果商品在顾客购物车中)
notificationService.sendCustomerNotifications(expiringProducts);
}
}
```
3. 前端展示设计
管理员界面
- 临期商品管理页面,显示所有临期商品列表
- 按剩余天数分类展示
- 提供批量处理功能(折扣、下架等)
顾客界面
- 商品详情页显示保质期信息
- 搜索结果中标记临期商品
- 购物车中提醒临期商品
关键实现技术
1. 临期商品识别算法
```java
public class ExpirationCalculator {
public boolean isNearExpiry(Date productionDate, int shelfLifeDays, int thresholdDays) {
Date expirationDate = calculateExpirationDate(productionDate, shelfLifeDays);
long daysUntilExpiry = ChronoUnit.DAYS.between(
LocalDate.now(),
expirationDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
);
return daysUntilExpiry <= thresholdDays;
}
// 其他辅助方法...
}
```
2. 提醒方式实现
```java
public class NotificationService {
public void sendExpirationWarnings(List expiringProducts) {
// 1. 发送邮件给管理员
sendAdminEmail(expiringProducts);
// 2. 发送系统内通知给仓库人员
sendWarehouseNotification(expiringProducts);
// 3. 对于顾客可见的商品,可以添加标记
markProductsForCustomers(expiringProducts);
}
private void sendAdminEmail(List products) {
// 实现发送邮件逻辑
String subject = "临期商品提醒";
String body = generateEmailBody(products);
// emailService.send(adminEmail, subject, body);
}
// 其他方法...
}
```
用户界面设计
1. 管理员界面 - 临期商品看板
```html
临期商品提醒
商品名称 |
剩余天数 |
生产日期 |
过期日期 |
操作 |
|---|
{{product.name}} |
{{product.daysRemaining}} |
{{product.productionDate}} |
{{product.expirationDate}} |
|
```
2. 顾客端显示
```javascript
// 在商品列表和详情页显示临期信息
function displayExpirationInfo(product) {
const daysRemaining = calculateDaysRemaining(product.expirationDate);
if (daysRemaining <= 7) {
const warningElement = document.createElement(div);
warningElement.className = expiration-warning;
warningElement.textContent = `仅剩${daysRemaining}天过期!`;
productElement.appendChild(warningElement);
}
}
```
实施步骤
1. 数据库修改:添加保质期相关字段到商品和库存表
2. 后台服务开发:
- 实现临期商品计算逻辑
- 开发提醒通知服务
- 添加API接口供前端调用
3. 前端开发:
- 管理员界面添加临期商品管理页面
- 商品详情页显示保质期信息
- 购物车和订单页添加临期商品提示
4. 测试验证:
- 单元测试:验证临期计算逻辑
- 集成测试:验证提醒通知流程
- 用户测试:验证前端提示效果
5. 部署上线:
- 灰度发布:先在小范围测试
- 监控反馈:收集用户和管理员反馈
- 优化迭代:根据反馈调整提醒阈值和提示方式
注意事项
1. 时区处理:确保所有日期计算使用统一时区
2. 性能优化:对于大型库存,考虑分批处理或使用缓存
3. 提醒阈值可配置:允许管理员调整临期提醒的天数阈值
4. 多渠道提醒:支持邮件、短信、站内信等多种提醒方式
5. 数据安全:确保保质期等敏感信息的安全存储和传输
通过以上设计和实现,小象买菜系统可以有效管理临期商品,减少损耗并提升顾客满意度。