会员资产全景活跃会员数分析.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 = 1且khlx = '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 问题确认
结论:✅ 活跃会员数包含了女神卡会员
原因分析:
F_LastVisitTime 的计算没有排除女神卡
- 查询
lq_xh_hyhk(耗卡记录表)时,没有过滤女神卡 - 条件只有:
xh.F_IsEffective = 1(有效记录) - 没有
px != '61'或类似的排除条件
- 查询
活跃会员数的判断基于 F_LastVisitTime
- 活跃会员数 =
F_LastVisitTime IS NOT NULL AND DATEDIFF(NOW(), F_LastVisitTime) <= 30 - 由于
F_LastVisitTime包含了女神卡的耗卡记录,所以活跃会员数也包含了女神卡会员
- 活跃会员数 =
2.2 对比其他统计逻辑
其他统计中排除女神卡的例子:
生美/医美/科美会员判断(第2781、2795、2809行):
AND pxmx.px != '61' -- 排除女神卡会员类型判断(第2985行):
&& pxmx.Px != "61") // 排除女神卡开单升单逻辑(
LqKdKdjlbService.cs多处):&& pxmx.Px != "61" // 排除女神卡
结论:在其他业务逻辑中,女神卡(品项编号 61)通常被排除,但活跃会员数的计算没有排除女神卡。
三、数据影响
3.1 当前行为
- ✅ 如果会员只有女神卡的耗卡记录,且最后耗卡时间在30天内,会被统计为活跃会员
- ✅ 如果会员有其他品项的耗卡记录,也会被统计为活跃会员(无论是否有女神卡)
3.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 建议
- 与业务方确认:是否需要排除女神卡会员
- 如果需要排除:按照方案一或方案二进行修复
- 如果不需要排除:保持现状,但需要在文档中明确说明
分析完成时间:2025年1月
分析状态:✅ 已完成