# 商品交易量排行榜定时任务 ## 功能说明 本功能实现了每天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. 支持多租户数据隔离