Files
mp-java/docs/BSZX_ORDER_TOTAL_IMPLEMENTATION.md
2025-08-04 07:09:01 +08:00

188 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 百色中学订单总金额统计功能实现文档
## 功能概述
参考ShopOrderController的total方法完善了BszxOrderController中的订单总金额统计功能提供REST API接口用于统计百色中学所有捐款记录的总金额。
## API接口
### 统计订单总金额
**接口地址**: `GET /api/bszx/bszx-order/total`
**接口描述**: 统计百色中学所有捐款记录的总金额
**请求参数**: 无
**响应格式**:
```json
{
"code": 200,
"message": "操作成功",
"data": 12345.67
}
```
**响应说明**:
- `data`: BigDecimal类型表示捐款总金额
- 统计所有捐款记录bszx_pay表中的price字段
- 使用COALESCE函数处理空值确保返回值不为null
## 实现细节
### 1. 接口层 (Controller)
**文件**: `BszxOrderController.java`
```java
@Operation(summary = "统计订单总金额")
@GetMapping("/total")
public ApiResult<BigDecimal> total() {
try {
BigDecimal totalAmount = bszxPayService.total();
return success(totalAmount);
} catch (Exception e) {
// 异常时返回0保持接口稳定性
return success(BigDecimal.ZERO);
}
}
```
### 2. 服务层 (Service)
**接口定义** (`BszxPayService.java`):
```java
/**
* 统计捐款总金额
*
* @return 捐款总金额
*/
BigDecimal total();
```
**实现类** (`BszxPayServiceImpl.java`):
```java
@Override
public BigDecimal total() {
try {
// 使用数据库聚合查询统计捐款总金额,性能更高
LambdaQueryWrapper<BszxPay> wrapper = new LambdaQueryWrapper<>();
BigDecimal total = baseMapper.selectSumMoney(wrapper);
if (total == null) {
total = BigDecimal.ZERO;
}
return total;
} catch (Exception e) {
// 异常时返回0确保接口稳定性
return BigDecimal.ZERO;
}
}
```
### 3. 数据访问层 (Mapper)
**Mapper接口** (`BszxPayMapper.java`):
```java
BigDecimal selectSumMoney(@Param("ew") Wrapper<?> wrapper);
```
**XML映射** (`BszxPayMapper.xml`):
```xml
<!-- 统计金额总和 -->
<select id="selectSumMoney" resultType="java.math.BigDecimal">
SELECT COALESCE(SUM(price), 0) as total_money
FROM bszx_pay
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
```
## 与ShopOrderController的对比
| 特性 | ShopOrderController | BszxOrderController |
|------|-------------------|-------------------|
| 统计字段 | pay_price | price |
| 过滤条件 | pay_status = 1 AND deleted = 0 | 无特殊过滤 |
| 数据表 | shop_order | bszx_pay |
| 业务场景 | 商城已支付订单 | 百色中学捐款记录 |
| 异常处理 | ✓ | ✓ |
| 空值处理 | ✓ | ✓ |
## 统计规则
1. **全量统计**: 统计bszx_pay表中所有记录的price字段总和
2. **空值处理**: 使用COALESCE函数当没有记录时返回0
3. **异常处理**: 包含完整的异常处理机制,确保接口稳定性
4. **性能优化**: 使用数据库聚合查询,在数据库层面进行计算
## 性能优化
1. **数据库聚合**: 使用SQL的SUM函数在数据库层面进行聚合计算
2. **复用现有方法**: 复用了已有的selectSumMoney方法避免重复开发
3. **异常处理**: 包含完整的异常处理机制,确保接口稳定性
4. **索引建议**: 如果数据量大建议在price字段上创建索引
## 测试用例
创建了测试类 `BszxOrderTotalTest.java` 用于验证功能:
```java
@Test
void testBszxOrderTotal() {
BigDecimal total = bszxPayService.total();
assertNotNull(total, "百色中学订单总金额不应该为null");
assertTrue(total.compareTo(BigDecimal.ZERO) >= 0, "百色中学订单总金额应该大于等于0");
}
@Test
void testBszxOrderTotalPerformance() {
long startTime = System.currentTimeMillis();
BigDecimal total = bszxPayService.total();
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
assertTrue(duration < 5000, "查询时间应该在5秒以内");
}
```
## 使用示例
### 前端调用示例
```javascript
// 获取百色中学订单总金额
fetch('/api/bszx/bszx-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/bszx/bszx-order/total" \
-H "Content-Type: application/json"
```
## 注意事项
1. **数据精度**: 使用BigDecimal确保金额计算的精度
2. **并发安全**: 查询操作是只读的,天然支持并发访问
3. **业务逻辑**: 与商城订单不同,百色中学捐款记录不需要过滤支付状态
4. **扩展性**: 可以通过传入不同的查询条件实现更复杂的统计需求
## 扩展功能建议
1. **按时间范围统计**: 支持指定时间范围的捐款金额统计
2. **按项目统计**: 支持按form_id进行分组统计
3. **按用户统计**: 支持统计不同用户的捐款总额
4. **缓存机制**: 对于大数据量场景可以添加Redis缓存
5. **权限控制**: 根据业务需要可以添加相应的权限控制注解