功能概述
临期商品提示功能旨在帮助小象买菜系统自动识别即将过期的商品,并及时向管理员和用户发出提醒,以减少商品损耗并提升用户体验。
系统架构设计
1. 数据库设计
```sql
-- 商品表
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
barcode VARCHAR(50) UNIQUE,
category VARCHAR(50),
price DECIMAL(10,2),
unit VARCHAR(20),
production_date DATE,
expiry_date DATE,
stock INT DEFAULT 0,
warning_threshold INT DEFAULT 3, -- 提前多少天提醒
status TINYINT DEFAULT 1 -- 1:正常, 0:下架
);
-- 库存变动记录表
CREATE TABLE inventory_logs (
log_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT,
change_type ENUM(in, out, adjust), -- 入库、出库、调整
quantity INT,
operator VARCHAR(50),
change_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- 临期商品提醒记录表
CREATE TABLE expiry_warnings (
warning_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT,
expiry_date DATE,
days_remaining INT,
warning_time DATETIME DEFAULT CURRENT_TIMESTAMP,
status TINYINT DEFAULT 0, -- 0:未处理, 1:已处理
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
```
2. 核心功能模块
2.1 临期商品检测服务
```java
// Java示例代码
public class ExpiryWarningService {
@Autowired
private ProductRepository productRepository;
@Autowired
private WarningRepository warningRepository;
// 每日定时任务检查临期商品
@Scheduled(cron = "0 0 8 * * ?") // 每天早上8点执行
public void checkExpiringProducts() {
LocalDate today = LocalDate.now();
List
products = productRepository.findAllActiveProducts();
for (Product product : products) {
if (product.getExpiryDate() == null) continue;
long daysRemaining = ChronoUnit.DAYS.between(today, product.getExpiryDate());
int warningThreshold = product.getWarningThreshold() != null ?
product.getWarningThreshold() : 3; // 默认提前3天提醒
if (daysRemaining <= warningThreshold && daysRemaining >= 0) {
// 记录提醒
ExpiryWarning warning = new ExpiryWarning();
warning.setProductId(product.getProductId());
warning.setExpiryDate(product.getExpiryDate());
warning.setDaysRemaining((int)daysRemaining);
warningRepository.save(warning);
// 发送通知
sendWarningNotification(product, (int)daysRemaining);
}
}
}
private void sendWarningNotification(Product product, int daysRemaining) {
// 发送给管理员的站内信、邮件或短信
String message = String.format("商品【%s】即将过期,剩余%d天,过期日期:%s",
product.getName(), daysRemaining, product.getExpiryDate());
// 实际实现中调用消息服务
// notificationService.sendToAdmins(message);
// 如果需要,也可以通知库存管理人员
// notificationService.sendToInventoryStaff(message);
}
}
```
2.2 前端展示与操作
管理员后台临期商品管理页面
```html
临期商品管理
商品名称 |
条形码 |
剩余天数 |
过期日期 |
当前库存 |
操作 |
|---|
{{ warning.productName }} |
{{ warning.barcode }} |
{{ warning.daysRemaining }}天 |
{{ formatDate(warning.expiryDate) }} |
{{ warning.stock }} |
|
<script>
export default {
data() {
return {
warnings: []
};
},
created() {
this.fetchWarnings();
},
methods: {
fetchWarnings() {
// 调用API获取临期商品列表
api.get(/api/expiry-warnings/unhandled).then(response => {
this.warnings = response.data;
});
},
markAsHandled(warningId) {
api.post(/api/expiry-warnings/handle, { warningId }).then(() => {
this.$message.success(标记成功);
this.fetchWarnings();
});
},
formatDate(dateString) {
// 格式化日期显示
return new Date(dateString).toLocaleDateString();
},
viewProduct(productId) {
this.$router.push(`/products/${productId}`);
}
}
};
<style>
.warning-red {
color: red;
font-weight: bold;
}
.warning-yellow {
color: orange;
font-weight: bold;
}
```
2.3 用户端展示(可选)
```javascript
// 在商品详情页显示临期信息
function displayExpiryInfo(product) {
if (!product.expiryDate) return;
const today = new Date();
const expiryDate = new Date(product.expiryDate);
const daysRemaining = Math.ceil((expiryDate - today) / (1000 * 60 * 60 * 24));
const expiryInfo = document.getElementById(expiry-info);
if (daysRemaining <= 0) {
expiryInfo.innerHTML = `已过期`;
expiryInfo.style.color = red;
} else if (daysRemaining <= 3) {
expiryInfo.innerHTML = `剩余${daysRemaining}天到期`;
expiryInfo.style.color = orange;
} else {
expiryInfo.innerHTML = `保质期至: ${product.expiryDate}`;
expiryInfo.style.color = green;
}
}
```
3. 关键业务逻辑
1. 临期判断规则:
- 系统配置默认提前3天提醒
- 允许为不同商品设置不同的提醒阈值
- 考虑节假日等特殊情况的可配置性
2. 通知策略:
- 首次提醒:达到阈值时
- 后续提醒:每天提醒直至过期或处理
- 严重级别:根据剩余天数设置不同提醒方式(短信、邮件、站内信)
3. 处理流程:
- 标记为已处理:记录处理时间和处理人
- 自动下架:过期后自动将商品状态设为下架
- 库存冻结:临期商品可配置是否允许继续销售
实施步骤
1. 数据库准备:
- 添加必要的字段到商品表
- 创建提醒记录表
2. 后端开发:
- 实现临期检测服务
- 开发API接口供前端调用
- 集成通知系统
3. 前端开发:
- 管理员后台临期商品管理页面
- 商品详情页临期信息展示
- 移动端适配(如有)
4. 测试验证:
- 单元测试:检测逻辑的正确性
- 集成测试:与通知系统的集成
- 压力测试:大量商品时的性能
5. 部署上线:
- 配置定时任务
- 监控提醒功能运行情况
- 收集反馈并优化
扩展功能建议
1. 智能促销:
- 对临期商品自动生成促销活动
- 推荐系统优先展示临期商品
2. 多级提醒:
- 不同剩余天数采用不同提醒方式
- 严重临期商品自动通知更高层级管理人员
3. 数据分析:
- 统计临期商品损耗率
- 分析临期商品类别分布
- 优化采购和库存策略
4. 供应商协作:
- 自动通知供应商临期商品情况
- 供应商端查看和管理自己商品的临期情况
通过实现临期商品提示功能,小象买菜系统可以有效减少商品损耗,提升运营效率,同时增强用户信任度。