3.4 KiB
3.4 KiB
商品交易量排行榜定时任务
功能说明
本功能实现了每天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. 手动触发
如果需要立即执行缓存任务,可以调用以下接口:
POST /oms/order/cacheTopTradingProducts?limit=100
参数说明:
limit
: 查询的商品数量,默认为100
3. 查看缓存结果
可以通过以下接口查看缓存的数据:
GET /oms/order/getTopTradingProducts
GET /oms/order/getTopTradingProducts?date=2024-01-15
参数说明:
date
: 可选,指定查看某一天的缓存数据,格式为yyyy-MM-dd
4. 返回数据格式
缓存的数据包含以下字段:
product_id
: 商品IDproduct_name
: 商品名称pic
: 商品图片out_product_id
: 商品编码product_category_id
: 商品分类IDtotal_quantity
: 总销售数量total_amount
: 总销售金额order_count
: 订单数量
技术实现
1. 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. 异常处理
- 完善的异常处理和日志记录
- 手动触发接口返回详细的错误信息
- 定时任务异常不会影响系统正常运行
注意事项
- 数据准确性:只统计已完成订单的商品,确保数据的准确性
- 性能考虑:大量订单数据时,查询可能需要较长时间
- 缓存更新:每天12点自动更新,也可手动触发
- 数据过期:缓存数据24小时自动过期,避免数据过期问题
扩展功能
如需扩展功能,可以考虑:
- 按时间范围统计(如最近7天、30天)
- 按商品分类统计
- 添加更多统计维度(如销售额、利润率等)
- 支持多租户数据隔离