3.2 KiB
3.2 KiB
订单费用计算逻辑说明
问题诊断
如果商家端订单详情显示不正确,可能是以下原因:
1. 旧订单数据问题
在修复逻辑之前创建的订单,其 serviceFee 和 merchantIncome 字段可能是按照旧逻辑计算的,或者为默认值0。
解决方案:
- 需要对现有订单数据进行修复
- 或者在前端显示时进行兼容处理
2. 字段映射问题
检查前端是否正确读取了后端返回的字段名。
正确的费用计算逻辑
后端计算(order.service.ts)
// 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:
-- 修复订单的服务费和商家收入(基于用户实付金额计算)
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
// 计算服务费(如果后端没有返回或为0,基于实付金额计算)
const serviceFee = order.serviceFee || (Number(order.payAmount) * 0.05).toFixed(2);
// 计算商家收入(如果后端没有返回或为0)
const merchantIncome = order.merchantIncome ||
(Number(order.payAmount) - Number(serviceFee)).toFixed(2);
测试验证
创建新订单后,检查以下内容:
- 数据库检查
SELECT
id,
order_no,
room_amount,
service_fee,
coupon_discount,
total_amount,
pay_amount,
merchant_income
FROM orders
WHERE id = 订单ID;
- 验证计算
- service_fee = pay_amount × 0.05
- pay_amount = room_amount - coupon_discount
- merchant_income = pay_amount - service_fee
- pay_amount = service_fee + merchant_income
- 前端显示
- 小程序:只显示房费、优惠券、实付金额
- 商家端:显示完整费用明细
- 所有金额显示正确,无NaN或undefined