You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.1 KiB
4.1 KiB
订单总金额统计功能实现文档
功能概述
实现了订单总金额统计功能,提供REST API接口用于统计所有已支付订单的总金额。
API接口
统计订单总金额
接口地址: GET /api/shop/shop-order/total
接口描述: 统计所有已支付订单的总金额
请求参数: 无
响应格式:
{
"code": 200,
"message": "操作成功",
"data": 12345.67
}
响应说明:
data
: BigDecimal类型,表示订单总金额- 只统计已支付的订单(pay_status = 1)
- 排除已删除的订单(deleted = 0)
- 使用实际付款金额(pay_price字段)进行统计
实现细节
1. 接口层 (Controller)
@Operation(summary = "统计订单总金额")
@GetMapping("/total")
public ApiResult<BigDecimal> total() {
return success(shopOrderService.total());
}
2. 服务层 (Service)
接口定义 (ShopOrderService.java
):
/**
* 统计订单总金额
*
* @return 订单总金额
*/
BigDecimal total();
实现类 (ShopOrderServiceImpl.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
):
/**
* 统计订单总金额
* 只统计已支付的订单(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();
统计规则
- 已支付订单: 只统计
pay_status = 1
的订单 - 未删除订单: 排除
deleted = 1
的订单 - 有效金额: 排除
pay_price IS NULL
的记录 - 使用实际付款: 统计
pay_price
字段而不是total_price
- 空值处理: 使用
COALESCE
函数,当没有符合条件的记录时返回 0
性能优化
- 数据库聚合: 使用SQL的SUM函数在数据库层面进行聚合计算
- 索引优化: 建议在
pay_status
和deleted
字段上创建索引 - 异常处理: 包含完整的异常处理机制,确保接口稳定性
测试用例
创建了测试类 OrderTotalTest.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秒以内");
}
使用示例
前端调用示例
// 获取订单总金额
fetch('/api/shop/shop-order/total')
.then(response => response.json())
.then(data => {
if (data.code === 200) {
console.log('订单总金额:', data.data);
}
});
cURL调用示例
curl -X GET "http://localhost:8080/api/shop/shop-order/total" \
-H "Content-Type: application/json"
注意事项
- 数据精度: 使用BigDecimal确保金额计算的精度
- 并发安全: 查询操作是只读的,天然支持并发访问
- 缓存考虑: 如果数据量很大且实时性要求不高,可以考虑添加缓存
- 权限控制: 根据业务需要可以添加相应的权限控制注解
扩展功能建议
- 按时间范围统计: 支持指定时间范围的订单金额统计
- 按商户统计: 支持按商户ID进行分组统计
- 按订单状态统计: 支持统计不同状态订单的金额
- 缓存机制: 对于大数据量场景,可以添加Redis缓存