功能概述
临期商品提示功能旨在帮助小象买菜系统自动识别即将过期的商品,及时提醒管理人员和顾客,减少商品损耗,提升用户体验。
系统设计
1. 数据库设计
```sql
-- 商品表增加保质期相关字段
ALTER TABLE products
ADD COLUMN production_date DATE COMMENT 生产日期,
ADD COLUMN shelf_life_days INT COMMENT 保质期(天),
ADD COLUMN expiration_date DATE COMMENT 过期日期,
ADD COLUMN warning_threshold INT DEFAULT 3 COMMENT 临期预警阈值(天);
-- 临期商品提醒记录表
CREATE TABLE expiration_warnings (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
product_name VARCHAR(100) NOT NULL,
current_stock INT NOT NULL,
days_remaining INT NOT NULL,
warning_level VARCHAR(20) NOT NULL COMMENT WARN/URGENT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
handled BOOLEAN DEFAULT FALSE,
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
2. 核心功能模块
2.1 临期商品计算服务
```java
public class ExpirationService {
@Autowired
private ProductRepository productRepository;
@Autowired
private ExpirationWarningRepository warningRepository;
// 每日定时任务检查临期商品
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
public void checkExpiringProducts() {
List
products = productRepository.findAll();
LocalDate today = LocalDate.now();
for (Product product : products) {
if (product.getExpirationDate() == null) {
calculateExpirationDate(product); // 如果没有过期日期,先计算
}
long daysRemaining = ChronoUnit.DAYS.between(today, product.getExpirationDate());
int threshold = product.getWarningThreshold() != null ?
product.getWarningThreshold() : 3; // 默认3天预警
if (daysRemaining <= threshold) {
String warningLevel = daysRemaining <= 0 ? "URGENT" : "WARN";
saveWarning(product, (int)daysRemaining, warningLevel);
}
}
}
private void calculateExpirationDate(Product product) {
if (product.getProductionDate() != null && product.getShelfLifeDays() != null) {
product.setExpirationDate(product.getProductionDate()
.plusDays(product.getShelfLifeDays()));
productRepository.save(product);
}
}
private void saveWarning(Product product, int daysRemaining, String warningLevel) {
ExpirationWarning warning = new ExpirationWarning();
warning.setProductId(product.getId());
warning.setProductName(product.getName());
warning.setCurrentStock(product.getStock());
warning.setDaysRemaining(daysRemaining);
warning.setWarningLevel(warningLevel);
warningRepository.save(warning);
}
}
```
2.2 预警通知服务
```java
public class NotificationService {
@Autowired
private ExpirationWarningRepository warningRepository;
@Autowired
private EmailService emailService;
@Autowired
private SmsService smsService;
// 发送临期商品预警通知
public void sendExpirationWarnings() {
List warnings = warningRepository
.findByHandledFalseOrderByDaysRemainingAsc();
for (ExpirationWarning warning : warnings) {
String message = String.format(
"【临期商品预警】%s 剩余%d天过期,当前库存%d",
warning.getProductName(),
warning.getDaysRemaining(),
warning.getCurrentStock()
);
// 发送邮件给管理员
emailService.sendToAdmins("临期商品预警", message);
// 如果是紧急预警(已过期或当天过期),发送短信
if ("URGENT".equals(warning.getWarningLevel())) {
smsService.sendToAdmins(message);
}
// 标记为已处理
warning.setHandled(true);
warningRepository.save(warning);
}
}
}
```
3. 前端展示
3.1 管理后台临期商品列表
```javascript
// Vue组件示例
export default {
data() {
return {
expiringProducts: [],
warningLevels: {
WARN: warning,
URGENT: danger
}
}
},
created() {
this.fetchExpiringProducts();
},
methods: {
fetchExpiringProducts() {
axios.get(/api/expiring-products)
.then(response => {
this.expiringProducts = response.data;
});
}
}
}
```
```html
临期商品预警
商品名称 |
剩余天数 |
当前库存 |
预警级别 |
操作 |
|---|
{{ product.name }} |
{{ product.daysRemaining }} |
{{ product.currentStock }} |
{{ product.warningLevel === URGENT ? 紧急 : 警告 }} |
|
```
3.2 顾客端临期商品标识
```javascript
// 在商品列表组件中添加临期标识
export default {
methods: {
isExpiringSoon(product) {
const today = new Date();
const expDate = new Date(product.expirationDate);
const diffTime = Math.abs(expDate - today);
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return diffDays <= (product.warningThreshold || 3);
}
}
}
```
```html
{{ product.name }}
临期特惠
¥{{ product.price }}
<style>
.expiring-tag {
position: absolute;
top: 10px;
right: 10px;
background-color: ff9800;
color: white;
padding: 2px 8px;
border-radius: 10px;
font-size: 12px;
}
```
实施步骤
1. 数据库迁移:为现有商品表添加保质期相关字段
2. 数据初始化:批量计算并填充现有商品的过期日期
3. 定时任务配置:设置每日临期商品检查任务
4. 通知系统集成:配置邮件和短信通知服务
5. 前端界面开发:实现管理后台和顾客端的临期商品展示
6. 测试验证:模拟不同场景测试功能正确性
7. 上线部署:逐步灰度发布到生产环境
扩展功能
1. 临期商品促销:自动生成临期商品折扣活动
2. 库存预警联动:当临期商品库存较多时自动触发采购预警
3. 多级预警:根据剩余天数设置不同级别的预警
4. 供应商通知:自动通知供应商处理临期商品
5. 数据分析:统计临期商品损耗率,优化采购策略
注意事项
1. 确保生产日期和保质期数据的准确性
2. 考虑时区问题,所有日期计算应统一时区
3. 预警阈值应可配置,适应不同商品类型
4. 避免频繁发送通知,设置合理的通知频率
5. 考虑系统性能,批量处理大数据量时的优化
通过实现临期商品提示功能,小象买菜系统可以有效减少商品损耗,提升运营效率,同时为顾客提供更透明的商品信息,增强用户信任。