# 订单总金额统计功能实现文档 ## 功能概述 实现了订单总金额统计功能,提供REST API接口用于统计所有已支付订单的总金额。 ## API接口 ### 统计订单总金额 **接口地址**: `GET /api/shop/shop-order/total` **接口描述**: 统计所有已支付订单的总金额 **请求参数**: 无 **响应格式**: ```json { "code": 200, "message": "操作成功", "data": 12345.67 } ``` **响应说明**: - `data`: BigDecimal类型,表示订单总金额 - 只统计已支付的订单(pay_status = 1) - 排除已删除的订单(deleted = 0) - 使用实际付款金额(pay_price字段)进行统计 ## 实现细节 ### 1. 接口层 (Controller) ```java @Operation(summary = "统计订单总金额") @GetMapping("/total") public ApiResult total() { return success(shopOrderService.total()); } ``` ### 2. 服务层 (Service) **接口定义** (`ShopOrderService.java`): ```java /** * 统计订单总金额 * * @return 订单总金额 */ BigDecimal total(); ``` **实现类** (`ShopOrderServiceImpl.java`): ```java @Override public BigDecimal total() { try { // 使用数据库聚合查询统计订单总金额,性能更高 BigDecimal total = baseMapper.selectTotalAmount(); if (total == null) { total = BigDecimal.ZERO; } log.info("统计订单总金额完成,总金额:{}", total); return total; } catch (Exception e) { log.error("统计订单总金额失败", e); return BigDecimal.ZERO; } } ``` ### 3. 数据访问层 (Mapper) **Mapper接口** (`ShopOrderMapper.java`): ```java /** * 统计订单总金额 * 只统计已支付的订单(pay_status = 1)且未删除的订单(deleted = 0) * * @return 订单总金额 */ @Select("SELECT COALESCE(SUM(pay_price), 0) FROM shop_order WHERE pay_status = 1 AND deleted = 0 AND pay_price IS NOT NULL") BigDecimal selectTotalAmount(); ``` ## 统计规则 1. **已支付订单**: 只统计 `pay_status = 1` 的订单 2. **未删除订单**: 排除 `deleted = 1` 的订单 3. **有效金额**: 排除 `pay_price IS NULL` 的记录 4. **使用实际付款**: 统计 `pay_price` 字段而不是 `total_price` 5. **空值处理**: 使用 `COALESCE` 函数,当没有符合条件的记录时返回 0 ## 性能优化 1. **数据库聚合**: 使用SQL的SUM函数在数据库层面进行聚合计算 2. **索引优化**: 建议在 `pay_status` 和 `deleted` 字段上创建索引 3. **异常处理**: 包含完整的异常处理机制,确保接口稳定性 ## 测试用例 创建了测试类 `OrderTotalTest.java` 用于验证功能: ```java @Test void testOrderTotal() { BigDecimal total = shopOrderService.total(); assertNotNull(total, "订单总金额不应该为null"); assertTrue(total.compareTo(BigDecimal.ZERO) >= 0, "订单总金额应该大于等于0"); } @Test void testOrderTotalPerformance() { long startTime = System.currentTimeMillis(); BigDecimal total = shopOrderService.total(); long endTime = System.currentTimeMillis(); long duration = endTime - startTime; assertTrue(duration < 5000, "查询时间应该在5秒以内"); } ``` ## 使用示例 ### 前端调用示例 ```javascript // 获取订单总金额 fetch('/api/shop/shop-order/total') .then(response => response.json()) .then(data => { if (data.code === 200) { console.log('订单总金额:', data.data); } }); ``` ### cURL调用示例 ```bash curl -X GET "http://localhost:8080/api/shop/shop-order/total" \ -H "Content-Type: application/json" ``` ## 注意事项 1. **数据精度**: 使用BigDecimal确保金额计算的精度 2. **并发安全**: 查询操作是只读的,天然支持并发访问 3. **缓存考虑**: 如果数据量很大且实时性要求不高,可以考虑添加缓存 4. **权限控制**: 根据业务需要可以添加相应的权限控制注解 ## 扩展功能建议 1. **按时间范围统计**: 支持指定时间范围的订单金额统计 2. **按商户统计**: 支持按商户ID进行分组统计 3. **按订单状态统计**: 支持统计不同状态订单的金额 4. **缓存机制**: 对于大数据量场景,可以添加Redis缓存