功能概述 临期商品提示功能旨在帮助用户及时了解所购商品的有效期情况,避免购买到即将过期的商品,同时帮助商家减少因商品过期造成的损失。 系统设计 1.数据库设计 ```sql --商品表(products)增加有效期相关字段 ALTERTABLEproductsAD
功能概述
临期商品提示功能旨在帮助用户及时了解所购商品的有效期情况,避免购买到即将过期的商品,同时帮助商家减少因商品过期造成的损失。
系统设计
1. 数据库设计
```sql
-- 商品表(products)增加有效期相关字段
ALTER TABLE products ADD COLUMN production_date DATE COMMENT 生产日期;
ALTER TABLE products ADD COLUMN expiry_date DATE COMMENT 保质期截止日期;
ALTER TABLE products ADD COLUMN shelf_life INT COMMENT 保质期(天);
ALTER TABLE products ADD COLUMN warning_days INT DEFAULT 7 COMMENT 临期提醒天数;
-- 订单商品表(order_items)增加有效期字段(可选)
ALTER TABLE order_items ADD COLUMN expiry_date DATE COMMENT 该批次商品保质期截止日期;
```
2. 核心功能模块
商品有效期计算服务
```java
public class ExpiryWarningService {
// 计算商品是否临期
public boolean isNearExpiry(Product product) {
if (product.getExpiryDate() == null) return false;
LocalDate today = LocalDate.now();
LocalDate expiryDate = product.getExpiryDate().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
int daysLeft = ChronoUnit.DAYS.between(today, expiryDate);
return daysLeft <= product.getWarningDays();
}
// 获取商品剩余保质期天数
public int getDaysLeft(Product product) {
if (product.getExpiryDate() == null) return -1;
LocalDate today = LocalDate.now();
LocalDate expiryDate = product.getExpiryDate().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
return ChronoUnit.DAYS.between(today, expiryDate);
}
}
```
前端展示组件
```javascript
// React示例 - 商品列表中的临期提示
function ProductItem({ product }) {
const expiryService = new ExpiryWarningService();
const daysLeft = expiryService.getDaysLeft(product);
const isNearExpiry = expiryService.isNearExpiry(product);
return (
{product.name}
{isNearExpiry && (
⚠️ 临期商品:剩余{daysLeft}天
)}
保质期至: {new Date(product.expiryDate).toLocaleDateString()}
);
}
```
3. 关键业务逻辑
1. 商品上架时计算有效期
- 根据生产日期和保质期自动计算截止日期
- 验证输入的有效性(截止日期不能早于当前日期)
2. 商品搜索/筛选
- 增加临期商品筛选选项
- 按保质期排序功能
3. 购物车/结算页提示
- 在加入购物车时检查商品是否临期
- 在结算页汇总显示所有临期商品及其剩余天数
4. 商家后台管理
- 临期商品报表生成
- 自动下架即将过期商品设置
- 临期商品促销活动管理
实现细节
1. 临期判断算法
```java
public class ExpiryCalculator {
// 根据生产日期和保质期计算截止日期
public static Date calculateExpiryDate(Date productionDate, int shelfLifeDays) {
if (productionDate == null || shelfLifeDays <= 0) {
return null;
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(productionDate);
calendar.add(Calendar.DATE, shelfLifeDays);
return calendar.getTime();
}
// 检查是否临期(考虑业务时间,如每天凌晨执行检查)
public static boolean checkNearExpiry(Date expiryDate, int warningDays) {
if (expiryDate == null) return false;
Calendar today = Calendar.getInstance();
today.set(Calendar.HOUR_OF_DAY, 0);
today.set(Calendar.MINUTE, 0);
today.set(Calendar.SECOND, 0);
today.set(Calendar.MILLISECOND, 0);
Calendar expiry = Calendar.getInstance();
expiry.setTime(expiryDate);
expiry.set(Calendar.HOUR_OF_DAY, 0);
expiry.set(Calendar.MINUTE, 0);
expiry.set(Calendar.SECOND, 0);
expiry.set(Calendar.MILLISECOND, 0);
long diffInMillis = expiry.getTimeInMillis() - today.getTimeInMillis();
long diffInDays = diffInMillis / (24 * 60 * 60 * 1000);
return diffInDays <= warningDays;
}
}
```
2. 前端样式建议
```css
/* 临期商品样式 */
.expiry-warning {
color: ff4d4f;
background-color: fff1f0;
border: 1px solid ffccc7;
padding: 4px 8px;
border-radius: 4px;
display: inline-block;
margin: 4px 0;
font-size: 12px;
}
/* 正常商品保质期信息 */
.expiry-info {
color: 666;
font-size: 12px;
}
```
3. 定时任务设置(商家端)
```java
@Component
public class ExpiryWarningScheduler {
@Autowired
private ProductRepository productRepository;
@Autowired
private NotificationService notificationService;
// 每天凌晨1点执行临期商品检查
@Scheduled(cron = "0 0 1 * * ?")
public void checkNearExpiryProducts() {
LocalDate today = LocalDate.now();
List
products = productRepository.findAll();
products.forEach(product -> {
if (product.getExpiryDate() != null) {
LocalDate expiryDate = product.getExpiryDate().toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
int daysLeft = ChronoUnit.DAYS.between(today, expiryDate);
if (daysLeft <= product.getWarningDays()) {
// 发送通知给商家
notificationService.sendExpiryWarning(
product.getId(),
product.getName(),
daysLeft
);
}
}
});
}
}
```
扩展功能建议
1. 用户偏好设置:允许用户自定义临期提醒的天数阈值
2. 临期商品专区:在APP首页或分类页设置临期商品专区
3. 智能推荐:根据用户购买历史推荐可能需要的临期商品
4. 多级提醒:设置不同级别的提醒(如7天、3天、1天)
5. 批量管理工具:为商家提供批量修改临期设置的功能
测试用例
1. 正常情况测试:
- 输入有效生产日期和保质期,验证截止日期计算正确
- 验证临期判断逻辑正确
2. 边界情况测试:
- 商品当天到期是否算作临期
- 保质期为0或负数的情况处理
- 生产日期晚于当前日期的情况处理
3. 性能测试:
- 大量商品数据下的临期检查性能
- 高并发场景下的提示功能稳定性
通过以上设计和实现,小象买菜系统可以有效地为用户提供临期商品提示功能,提升用户体验的同时帮助商家优化库存管理。