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}'

问题

  1. 如果使用 SUM(F_ActualRefundAmount) 且没有处理NULL,当某条记录的 F_ActualRefundAmount 为NULL时,SUM() 会忽略它
  2. 但是,从数据验证看,所有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-012025-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元的退卡记录可能被:

  1. 重复计算:被计算了两次(一次在12月10日,一次在12月11日)
  2. 错误排除:被错误地排除在12月范围外,导致少计算了199元
  3. 时间边界问题:由于时区转换,在某个时间边界上被错误处理

可能原因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

建议

  1. 验证修复后的接口:重新测试接口,确认返回的净业绩是否为 ¥404,356.40
  2. 检查历史数据:如果有历史数据不一致,需要重新计算
  3. 统一计算逻辑:确保所有相关接口都使用相同的计算逻辑(使用实退金额,如果没有则使用退卡总金额)