# 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:接口修复前的代码逻辑问题 **接口修复前的代码**(推测): ```sql 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中的日期比较**: ```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元的退卡记录可能被: 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元的退卡记录被重复计算或错误处理。 **修复后的代码**(已修复): ```sql 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. **统一计算逻辑**:确保所有相关接口都使用相同的计算逻辑(使用实退金额,如果没有则使用退卡总金额)