Blame view

项目文档相关/docs/会员资产全景活跃会员数分析.md 6.7 KB
257347ad   “wangming”   feat: enhance fil...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
  # 会员资产全景活跃会员数分析
  
  **分析日期**:2025年1月  
  **分析问题**:会员资产全景里面的活跃会员数,是否包含女神卡进来
  
  ---
  
  ## 一、问题分析
  
  ### 1.1 活跃会员数的计算逻辑
  
  **位置**`LqReportService.cs` 第1478行
  
  **SQL查询**
  ```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` 不为空,且距离当前时间 <= 30天
  
  ---
  
  ### 1.2 F_LastVisitTime 的更新逻辑
  
  **位置**`LqKhxxService.cs` 第2813-2822行
  
  **SQL查询**
  ```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行):
  ```sql
  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行):
     ```sql
     AND pxmx.px != '61'  -- 排除女神卡
     ```
  
  2. **会员类型判断**(第2985行):
     ```csharp
     && pxmx.Px != "61") // 排除女神卡
     ```
  
  3. **开单升单逻辑**`LqKdKdjlbService.cs` 多处):
     ```csharp
     && pxmx.Px != "61"  // 排除女神卡
     ```
  
  **结论**:在其他业务逻辑中,女神卡(品项编号 `61`)通常被排除,但**活跃会员数的计算没有排除女神卡**
  
  ---
  
  ## 三、数据影响
  
  ### 3.1 当前行为
  
  - ✅ 如果会员只有女神卡的耗卡记录,且最后耗卡时间在30天内,会被统计为活跃会员
  - ✅ 如果会员有其他品项的耗卡记录,也会被统计为活跃会员(无论是否有女神卡)
  
  ### 3.2 潜在问题
  
  1. **数据准确性**
     - 女神卡通常被认为是"体验卡"或"引流卡",可能不应该计入活跃会员
     - 如果业务要求排除女神卡,当前逻辑会导致数据不准确
  
  2. **业务一致性**
     - 其他统计(如生美/医美/科美会员)都排除了女神卡
     - 活跃会员数不排除女神卡,可能导致数据不一致
  
  ---
  
  ## 四、修复建议
  
  ### 4.1 如果需要排除女神卡
  
  **方案一:在 F_LastVisitTime 计算时排除女神卡**
  
  修改 `LqKhxxService.cs` 第2813-2822行的SQL:
  
  ```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:
  
  ```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
  
  **查询只买了女神卡的活跃会员**
  
  ```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月  
  **分析状态**:✅ **已完成**