# 订单费用计算逻辑说明

## 问题诊断

如果商家端订单详情显示不正确，可能是以下原因：

### 1. 旧订单数据问题
在修复逻辑之前创建的订单，其 `serviceFee` 和 `merchantIncome` 字段可能是按照旧逻辑计算的，或者为默认值0。

**解决方案：**
- 需要对现有订单数据进行修复
- 或者在前端显示时进行兼容处理

### 2. 字段映射问题
检查前端是否正确读取了后端返回的字段名。

## 正确的费用计算逻辑

### 后端计算（order.service.ts）

```typescript
// 1. 计算房费
roomAmount = 每日房价总和 × 房间数

// 2. 处理优惠券
couponDiscount = 根据优惠券规则计算（基于房费）

// 3. 计算订单总额
totalAmount = roomAmount

// 4. 计算用户实付
payAmount = roomAmount - couponDiscount

// 5. 计算平台服务费（基于用户实付金额）
serviceFee = payAmount × 5%

// 6. 计算商家收入
merchantIncome = payAmount - serviceFee
```

### 费用示例

假设：
- 房费：1000元
- 优惠券：100元
- 服务费率：5%

计算结果：
- `roomAmount` = 1000元
- `couponDiscount` = 100元
- `totalAmount` = 1000元
- `payAmount` = 1000 - 100 = 900元
- `serviceFee` = 900 × 5% = 45元（基于实付金额）
- `merchantIncome` = 900 - 45 = 855元

### 验证公式

```
用户实付 = 平台收入 + 商家收入
900 = 45 + 855 ✓
```

## 前端显示

### 小程序用户端
- 房费：¥1000
- 优惠券：-¥100
- 实付金额：¥900
- **不显示服务费**

### 商家端
- 房费：¥1000
- 优惠券折扣：-¥100
- 用户实付：¥900
- 平台服务费：¥45（实付金额的5%）
- 商家收入：¥855（实付金额 - 服务费）

### 平台端
- 显示完整的费用明细，包括所有字段

## 数据修复脚本

如果需要修复旧订单数据，可以执行以下SQL：

```sql
-- 修复订单的服务费和商家收入（基于用户实付金额计算）
UPDATE orders 
SET 
  service_fee = ROUND(pay_amount * 0.05, 2),
  merchant_income = ROUND(pay_amount - ROUND(pay_amount * 0.05, 2), 2)
WHERE 
  service_fee = 0 
  OR merchant_income = 0
  OR service_fee != ROUND(pay_amount * 0.05, 2);
```

## 前端兼容处理

如果不想修复旧数据，可以在前端进行兼容处理：

### 商家端 OrderDetail.tsx

```typescript
// 计算服务费（如果后端没有返回或为0，基于实付金额计算）
const serviceFee = order.serviceFee || (Number(order.payAmount) * 0.05).toFixed(2);

// 计算商家收入（如果后端没有返回或为0）
const merchantIncome = order.merchantIncome || 
  (Number(order.payAmount) - Number(serviceFee)).toFixed(2);
```

## 测试验证

创建新订单后，检查以下内容：

1. **数据库检查**
```sql
SELECT 
  id,
  order_no,
  room_amount,
  service_fee,
  coupon_discount,
  total_amount,
  pay_amount,
  merchant_income
FROM orders 
WHERE id = 订单ID;
```

2. **验证计算**
- service_fee = pay_amount × 0.05
- pay_amount = room_amount - coupon_discount
- merchant_income = pay_amount - service_fee
- pay_amount = service_fee + merchant_income

3. **前端显示**
- 小程序：只显示房费、优惠券、实付金额
- 商家端：显示完整费用明细
- 所有金额显示正确，无NaN或undefined
