111 lines
3.4 KiB
Markdown
111 lines
3.4 KiB
Markdown
![]() |
# 商品交易量排行榜定时任务
|
|||
|
|
|||
|
## 功能说明
|
|||
|
|
|||
|
本功能实现了每天12点自动查询交易量最多的100个商品并存储到Redis中的定时任务。
|
|||
|
|
|||
|
## 实现内容
|
|||
|
|
|||
|
### 1. 数据库查询
|
|||
|
- 在 `OrderItemMapper` 中添加了 `selectTopTradingProducts` 方法
|
|||
|
- 查询条件:已完成订单(status = 3)且未删除订单(delete_status = 0)
|
|||
|
- 按销售数量降序排列,取前100个商品
|
|||
|
- 统计信息包括:商品ID、商品名称、图片、总销售数量、总销售金额、订单数量
|
|||
|
|
|||
|
### 2. 服务层实现
|
|||
|
- 在 `OrderItemService` 接口中添加了 `cacheTopTradingProducts` 方法
|
|||
|
- 在 `OrderItemServiceImpl` 中实现了缓存逻辑
|
|||
|
- 将查询结果以JSON格式存储到Redis,过期时间为24小时
|
|||
|
|
|||
|
### 3. 定时任务
|
|||
|
- 创建了 `OrderScheduledTask` 定时任务类
|
|||
|
- 使用 `@Scheduled(cron = "0 0 12 * * ?")` 配置每天12点执行
|
|||
|
- 在主应用类 `DromaraApplication` 上已添加了 `@EnableScheduling` 注解
|
|||
|
|
|||
|
### 4. 控制器接口
|
|||
|
- 添加了手动触发缓存的接口:`POST /oms/order/cacheTopTradingProducts`
|
|||
|
- 添加了获取缓存数据的接口:`GET /oms/order/getTopTradingProducts`
|
|||
|
|
|||
|
## 使用方法
|
|||
|
|
|||
|
### 1. 自动执行
|
|||
|
定时任务会在每天12点自动执行,无需手动干预。
|
|||
|
|
|||
|
### 2. 手动触发
|
|||
|
如果需要立即执行缓存任务,可以调用以下接口:
|
|||
|
|
|||
|
```bash
|
|||
|
POST /oms/order/cacheTopTradingProducts?limit=100
|
|||
|
```
|
|||
|
|
|||
|
参数说明:
|
|||
|
- `limit`: 查询的商品数量,默认为100
|
|||
|
|
|||
|
### 3. 查看缓存结果
|
|||
|
可以通过以下接口查看缓存的数据:
|
|||
|
|
|||
|
```bash
|
|||
|
GET /oms/order/getTopTradingProducts
|
|||
|
GET /oms/order/getTopTradingProducts?date=2024-01-15
|
|||
|
```
|
|||
|
|
|||
|
参数说明:
|
|||
|
- `date`: 可选,指定查看某一天的缓存数据,格式为yyyy-MM-dd
|
|||
|
|
|||
|
### 4. 返回数据格式
|
|||
|
缓存的数据包含以下字段:
|
|||
|
- `product_id`: 商品ID
|
|||
|
- `product_name`: 商品名称
|
|||
|
- `pic`: 商品图片
|
|||
|
- `out_product_id`: 商品编码
|
|||
|
- `product_category_id`: 商品分类ID
|
|||
|
- `total_quantity`: 总销售数量
|
|||
|
- `total_amount`: 总销售金额
|
|||
|
- `order_count`: 订单数量
|
|||
|
|
|||
|
## 技术实现
|
|||
|
|
|||
|
### 1. SQL查询逻辑
|
|||
|
```sql
|
|||
|
SELECT
|
|||
|
oi.product_id,
|
|||
|
oi.product_name,
|
|||
|
oi.pic,
|
|||
|
oi.out_product_id,
|
|||
|
oi.product_category_id,
|
|||
|
SUM(oi.quantity) as total_quantity,
|
|||
|
SUM(oi.quantity * oi.sale_price) as total_amount,
|
|||
|
COUNT(DISTINCT o.id) as order_count
|
|||
|
FROM oms_order_item oi
|
|||
|
JOIN oms_order o ON oi.order_id = o.id
|
|||
|
WHERE o.status = 3 -- 已完成订单
|
|||
|
AND o.delete_status = 0 -- 未删除订单
|
|||
|
GROUP BY oi.product_id, oi.product_name, oi.pic, oi.out_product_id, oi.product_category_id
|
|||
|
ORDER BY total_quantity DESC
|
|||
|
LIMIT #{limit}
|
|||
|
```
|
|||
|
|
|||
|
### 2. Redis缓存
|
|||
|
- Key格式:`top_trading_products:yyyy-MM-dd`
|
|||
|
- 过期时间:24小时
|
|||
|
- 数据格式:JSON字符串
|
|||
|
|
|||
|
### 3. 异常处理
|
|||
|
- 完善的异常处理和日志记录
|
|||
|
- 手动触发接口返回详细的错误信息
|
|||
|
- 定时任务异常不会影响系统正常运行
|
|||
|
|
|||
|
## 注意事项
|
|||
|
|
|||
|
1. **数据准确性**:只统计已完成订单的商品,确保数据的准确性
|
|||
|
2. **性能考虑**:大量订单数据时,查询可能需要较长时间
|
|||
|
3. **缓存更新**:每天12点自动更新,也可手动触发
|
|||
|
4. **数据过期**:缓存数据24小时自动过期,避免数据过期问题
|
|||
|
|
|||
|
## 扩展功能
|
|||
|
|
|||
|
如需扩展功能,可以考虑:
|
|||
|
1. 按时间范围统计(如最近7天、30天)
|
|||
|
2. 按商品分类统计
|
|||
|
3. 添加更多统计维度(如销售额、利润率等)
|
|||
|
4. 支持多租户数据隔离
|