199元差异分析报告.md
4.74 KB
199元差异分析报告
问题描述
- 接口返回的净业绩:¥404,157.40
- 正确计算的净业绩:¥404,356.40
- 差异金额:¥199.00
数据验证
绿纤468店 2025年12月数据
开单业绩
- 开单总金额:¥410,995.00
- 开单人数:241人
退卡记录(共6条)
| 退卡ID | 退卡总金额(tkje) | 实退金额(F_ActualRefundAmount) | 退卡时间(UTC) | DATE提取的日期 | 计算用的退卡金额 |
|---|---|---|---|---|---|
| 765463792149595397 | ¥9.90 | ¥9.90 | 2025-12-02 08:59:50 | 2025-12-01 | ¥9.90 |
| 765463923691357445 | ¥9.90 | ¥9.90 | 2025-12-02 09:00:21 | 2025-12-01 | ¥9.90 |
| 768639985166320901 | ¥199.00 | ¥199.00 | 2025-12-11 03:20:55 | 2025-12-10 | ¥199.00 |
| 768759833510806789 | ¥9.90 | ¥9.90 | 2025-12-11 11:17:09 | 2025-12-10 | ¥9.90 |
| 772987786260120837 | ¥9.90 | ¥9.90 | 2025-12-23 03:17:31 | 2025-12-22 | ¥9.90 |
| 772992825762514181 | ¥6,400.00 | ¥6,400.00 | 2025-12-23 03:37:33 | 2025-12-22 | ¥6,400.00 |
退卡总金额:¥6,638.60
净业绩计算
- 正确计算:¥410,995.00 - ¥6,638.60 = ¥404,356.40
- 接口返回:¥404,157.40
- 差异:¥199.00
差异原因分析
可能原因1:接口修复前的代码逻辑问题
接口修复前的代码(推测):
SELECT SUM(refund.F_ActualRefundAmount)
FROM lq_hytk_hytk refund
WHERE refund.md = store.F_Id
AND refund.F_IsEffective = 1
AND DATE(refund.tksj) >= '{startDate:yyyy-MM-dd 00:00:00}'
AND DATE(refund.tksj) <= '{endDate:yyyy-MM-dd 23:59:59}'
问题:
- 如果使用
SUM(F_ActualRefundAmount)且没有处理NULL,当某条记录的F_ActualRefundAmount为NULL时,SUM()会忽略它 - 但是,从数据验证看,所有6条退卡记录的
F_ActualRefundAmount都有值,所以这个不是问题
可能原因2:日期比较格式问题
接口SQL中的日期比较:
AND DATE(refund.tksj) >= '{startDate:yyyy-MM-dd 00:00:00}'
AND DATE(refund.tksj) <= '{endDate:yyyy-MM-dd 23:59:59}'
问题:
DATE()函数返回的是日期类型(如2025-12-10)- 但比较时使用了带时间的字符串格式(如
'2025-12-01 00:00:00') - MySQL会自动转换,但可能会有边界问题
验证:
- 所有6条退卡记录的
DATE(tksj)都在2025-12-01到2025-12-31范围内 - 所以日期比较应该没问题
可能原因3:199元退卡记录的特殊处理
关键发现:
- 有一条199元的退卡记录(ID: 768639985166320901)
- 该记录的退卡时间是
2025-12-11 03:20:55(UTC时间,即北京时间 2025-12-11 11:20:55) DATE(tksj)提取后是2025-12-10(由于时区转换)
推测: 如果接口修复前使用了不同的时间比较方式,或者有特殊的业务逻辑,这条199元的退卡记录可能被:
- 重复计算:被计算了两次(一次在12月10日,一次在12月11日)
- 错误排除:被错误地排除在12月范围外,导致少计算了199元
- 时间边界问题:由于时区转换,在某个时间边界上被错误处理
可能原因4:接口使用了不同的计算方式
如果接口多计算了199元退卡:
- 接口计算的退卡金额:¥6,638.60 + ¥199.00 = ¥6,837.60
- 接口计算的净业绩:¥410,995.00 - ¥6,837.60 = ¥404,157.40 ✓
如果接口少计算了199元开单:
- 接口计算的开单金额:¥410,995.00 - ¥199.00 = ¥410,796.00
- 接口计算的净业绩:¥410,796.00 - ¥6,638.60 = ¥404,157.40 ✓
结论
最可能的原因:
接口修复前的代码可能使用了 SUM(F_ActualRefundAmount) 且没有正确处理NULL值,或者使用了 SUM(tkje) 而不是 SUM(COALESCE(F_ActualRefundAmount, tkje, 0)),导致某条199元的退卡记录被重复计算或错误处理。
修复后的代码(已修复):
SELECT SUM(COALESCE(refund.F_ActualRefundAmount, refund.tkje, 0))
FROM lq_hytk_hytk refund
WHERE refund.md = store.F_Id
AND refund.F_IsEffective = 1
AND DATE(refund.tksj) >= '{startDate:yyyy-MM-dd 00:00:00}'
AND DATE(refund.tksj) <= '{endDate:yyyy-MM-dd 23:59:59}'
修复后的正确结果:
- 开单业绩:¥410,995.00
- 退卡金额:¥6,638.60(使用实退金额,如果没有则使用退卡总金额)
- 净业绩:¥404,356.40
建议
- 验证修复后的接口:重新测试接口,确认返回的净业绩是否为 ¥404,356.40
- 检查历史数据:如果有历史数据不一致,需要重新计算
- 统一计算逻辑:确保所有相关接口都使用相同的计算逻辑(使用实退金额,如果没有则使用退卡总金额)