会员资产全景活跃会员数分析.md 6.7 KB

会员资产全景活跃会员数分析

分析日期:2025年1月
分析问题:会员资产全景里面的活跃会员数,是否包含女神卡进来


一、问题分析

1.1 活跃会员数的计算逻辑

位置LqReportService.cs 第1478行

SQL查询

SUM(CASE WHEN F_LastVisitTime IS NOT NULL AND DATEDIFF(NOW(), F_LastVisitTime) <= 30 THEN 1 ELSE 0 END) as ActiveMembers30d

计算规则

  • lq_khxx 表中统计
  • 条件:F_IsEffective = 1khlx = '3'(会员类型为会员)
  • 判断标准:F_LastVisitTime 不为空,且距离当前时间

1.2 F_LastVisitTime 的更新逻辑

位置LqKhxxService.cs 第2813-2822行

SQL查询

LEFT JOIN (
    -- 到店天数、首次到店时间、最后到店时间
    SELECT 
        xh.hy as MemberId,
        COUNT(DISTINCT DATE(xh.hksj)) as VisitDays,
        MIN(xh.hksj) as FirstVisitTime,
        MAX(xh.hksj) as LastVisitTime
    FROM lq_xh_hyhk xh
    WHERE xh.F_IsEffective = 1
    GROUP BY xh.hy
) visit ON kh.F_Id = visit.MemberId

更新逻辑(第2858行):

kh.F_LastVisitTime = visit.LastVisitTime

二、关键发现

2.1 问题确认

结论:✅ 活跃会员数包含了女神卡会员

原因分析

  1. F_LastVisitTime 的计算没有排除女神卡

    • 查询 lq_xh_hyhk(耗卡记录表)时,没有过滤女神卡
    • 条件只有:xh.F_IsEffective = 1(有效记录)
    • 没有 px != '61' 或类似的排除条件
  2. 活跃会员数的判断基于 F_LastVisitTime

    • 活跃会员数 = F_LastVisitTime IS NOT NULL AND DATEDIFF(NOW(), F_LastVisitTime) <= 30
    • 由于 F_LastVisitTime 包含了女神卡的耗卡记录,所以活跃会员数也包含了女神卡会员

2.2 对比其他统计逻辑

其他统计中排除女神卡的例子

  1. 生美/医美/科美会员判断(第2781、2795、2809行):

    AND pxmx.px != '61'  -- 排除女神卡
    
  2. 会员类型判断(第2985行):

    && pxmx.Px != "61") // 排除女神卡
    
  3. 开单升单逻辑LqKdKdjlbService.cs 多处):

    && pxmx.Px != "61"  // 排除女神卡
    

结论:在其他业务逻辑中,女神卡(品项编号 61)通常被排除,但活跃会员数的计算没有排除女神卡


三、数据影响

3.1 当前行为

  • ✅ 如果会员只有女神卡的耗卡记录,且最后耗卡时间在30天内,会被统计为活跃会员
  • ✅ 如果会员有其他品项的耗卡记录,也会被统计为活跃会员(无论是否有女神卡)

3.2 潜在问题

  1. 数据准确性

    • 女神卡通常被认为是"体验卡"或"引流卡",可能不应该计入活跃会员
    • 如果业务要求排除女神卡,当前逻辑会导致数据不准确
  2. 业务一致性

    • 其他统计(如生美/医美/科美会员)都排除了女神卡
    • 活跃会员数不排除女神卡,可能导致数据不一致

四、修复建议

4.1 如果需要排除女神卡

方案一:在 F_LastVisitTime 计算时排除女神卡

修改 LqKhxxService.cs 第2813-2822行的SQL:

LEFT JOIN (
    -- 到店天数、首次到店时间、最后到店时间(排除女神卡)
    SELECT 
        xh.hy as MemberId,
        COUNT(DISTINCT DATE(xh.hksj)) as VisitDays,
        MIN(xh.hksj) as FirstVisitTime,
        MAX(xh.hksj) as LastVisitTime
    FROM lq_xh_hyhk xh
    WHERE xh.F_IsEffective = 1
        -- 排除女神卡的耗卡记录
        AND NOT EXISTS (
            SELECT 1 
            FROM lq_xh_pxmx pxmx 
            WHERE pxmx.glkdbh = xh.F_Id 
                AND pxmx.F_IsEffective = 1 
                AND pxmx.px = '61'
                AND (
                    -- 如果耗卡记录的所有品项都是女神卡,则排除
                    (SELECT COUNT(*) FROM lq_xh_pxmx pxmx2 WHERE pxmx2.glkdbh = xh.F_Id AND pxmx2.F_IsEffective = 1) = 
                    (SELECT COUNT(*) FROM lq_xh_pxmx pxmx3 WHERE pxmx3.glkdbh = xh.F_Id AND pxmx3.F_IsEffective = 1 AND pxmx3.px = '61')
                )
        )
    GROUP BY xh.hy
) visit ON kh.F_Id = visit.MemberId

方案二:在活跃会员数计算时排除女神卡

修改 LqReportService.cs 第1478行的SQL:

SUM(CASE 
    WHEN F_LastVisitTime IS NOT NULL 
        AND DATEDIFF(NOW(), F_LastVisitTime) <= 30 
        -- 排除只买了女神卡的会员
        AND NOT EXISTS (
            SELECT 1 
            FROM lq_kd_kdjlb kd
            INNER JOIN lq_kd_pxmx pxmx ON kd.F_Id = pxmx.glkdbh
            WHERE kd.kdhy = lq_khxx.F_Id
                AND kd.F_IsEffective = 1
                AND pxmx.F_IsEffective = 1
                AND pxmx.px != '61'
            HAVING COUNT(*) = 0
        )
    THEN 1 
    ELSE 0 
END) as ActiveMembers30d

4.2 如果不需要排除女神卡

保持现状

  • 当前逻辑认为:只要有耗卡记录(包括女神卡),且在30天内,就算活跃会员
  • 这可能是业务需求,需要与业务方确认

五、验证方法

5.1 验证SQL

查询只买了女神卡的活跃会员

-- 查询只买了女神卡且在30天内活跃的会员
SELECT 
    kh.F_Id,
    kh.Khmc,
    kh.F_LastVisitTime,
    DATEDIFF(NOW(), kh.F_LastVisitTime) as DaysSinceLastVisit
FROM lq_khxx kh
WHERE kh.F_IsEffective = 1
    AND kh.khlx = '3'
    AND kh.F_LastVisitTime IS NOT NULL
    AND DATEDIFF(NOW(), kh.F_LastVisitTime) <= 30
    -- 只买了女神卡的会员
    AND EXISTS (
        SELECT 1
        FROM lq_kd_pxmx pxmx1
        INNER JOIN lq_kd_kdjlb kd1 ON pxmx1.glkdbh = kd1.F_Id
        WHERE pxmx1.px = '61'
            AND pxmx1.F_IsEffective = 1
            AND kd1.F_IsEffective = 1
            AND kd1.Kdhy = kh.F_Id
    )
    AND NOT EXISTS (
        -- 排除那些有非女神卡品项的会员
        SELECT 1
        FROM lq_kd_pxmx pxmx2
        INNER JOIN lq_kd_kdjlb kd2 ON pxmx2.glkdbh = kd2.F_Id
        WHERE kd2.Kdhy = kh.F_Id
            AND pxmx2.F_IsEffective = 1
            AND kd2.F_IsEffective = 1
            AND pxmx2.px != '61'
    )
LIMIT 10;

六、结论

6.1 当前状态

活跃会员数包含了女神卡会员

原因

  • F_LastVisitTime 的计算没有排除女神卡的耗卡记录
  • 活跃会员数的判断基于 F_LastVisitTime,因此包含了女神卡会员

6.2 建议

  1. 与业务方确认:是否需要排除女神卡会员
  2. 如果需要排除:按照方案一或方案二进行修复
  3. 如果不需要排除:保持现状,但需要在文档中明确说明

分析完成时间:2025年1月
分析状态:✅ 已完成