Blame view

项目文档相关/docs/店助工资计算规则梳理.md 12.8 KB
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
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
  # 店助工资计算规则梳理
  
  ## 📋 概述
  
  店助工资由以下几个部分组成:
  1. **底薪**:根据门店分类(A、B、C类)按规则计算
  2. **提成**:根据门店业绩与门店生命线的比例计算
  3. **阶段奖励**:根据进店消耗人数是否达到阶段目标
  4. **固定奖励**:手机管理费
  
  ---
  
  # 第一部分:计算规则
  
  ## 💰 工资组成规则
  
  ### 1. 底薪规则
  
  **计算规则**:根据门店分类(A、B、C类)确定底薪金额
  
  | 门店分类 | 底薪金额 |
  |---------|---------|
  | A类门店 | 3000元 |
  | B类门店 | 3100元 |
  | C类门店 | 3200元 |
  
  **重要说明**
  - 门店分类必须设置,系统不允许设置为NULL
  - 如果门店分类未设置,应在计算工资前进行校验并提示错误
  
  ---
  
  ### 2. 提成规则
  
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
35
  **计算公式**:分段阶梯提成模式,根据门店业绩与门店生命线的比例分段计算提成
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
36
  
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
37
  #### 提成前提条件
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
38
  
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
39
40
41
42
43
44
45
46
47
  - **必须达到70%**:门店业绩必须达到门店生命线的70%,否则无提成
  
  #### 提成比例规则(分段计算)
  
  | 业绩区间 | 提成比例 | 计算说明 |
  |---------|---------|---------|
  | 门店业绩 < 门店生命线 × 70% | 0% | 无提成 |
  | 门店生命线 × 70% ≤ 门店业绩 < 门店生命线 × 100% | 0.4% | 整个业绩按0.4%计算 |
  | 门店业绩 ≥ 门店生命线 × 100% | 0.4% + 0.6% | 0-100%部分(整个生命线)按0.4%,100%以上部分按0.6% |
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
48
49
50
  
  #### 提成计算示例
  
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
51
52
  **示例1:业绩在70%-100%之间**
  
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
53
54
55
56
57
  假设:
  - 门店生命线 = 100,000元
  - 门店业绩 = 85,000元
  
  计算过程:
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
58
  1. 判断比例:85,000 / 100,000 = 85%(≥ 70%,满足前提条件)
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
59
  2. 判断区间:70% ≤ 85% < 100%
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  3. 计算:整个业绩按0.4%计算
     - 提成金额:85,000元 × 0.4% = 340元
  4. 总提成金额:340元
  
  **示例2:业绩超过100%**
  
  假设:
  - 门店生命线 = 150,000元
  - 门店业绩 = 189,034.40元
  
  计算过程:
  1. 判断比例:189,034.40 / 150,000 = 126.02%(≥ 70%,满足前提条件)
  2. 判断区间:≥ 100%
  3. 分段计算:
     - 0-100%部分(整个生命线):150,000元 × 0.4% = 600元
     - 100%以上部分:(189,034.40 - 150,000)元 × 0.6% = 39,034.40元 × 0.6% = 234.21元
  4. 总提成金额:600元 + 234.21元 = 834.21元
  
  **计算公式**
  ```
  如果 业绩 < 70%:提成 = 0
  如果 70% ≤ 业绩 < 100%:提成 = 业绩 × 0.4%
  如果 业绩 ≥ 100%:提成 = 生命线 × 0.4% + (业绩 - 生命线) × 0.6%
  ```
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
84
85
86
  
  **重要说明**
  - 门店生命线必须在 `lq_md_target` 表中进行设置,如果未设置,系统应报错提示
1ac23a9d   “wangming”   feat: 优化库存管理和工资计算功能
87
88
  - 提成采用分段阶梯计算方式,不同区间按不同比例分别计算后累加
  - 前提条件:必须达到70%才有提成资格
2beedbc2   “wangming”   修复健康师工资额外计算服务接口错误
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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
  
  ---
  
  ### 3. 阶段奖励规则
  
  **考核指标**:进店消耗人数(有消费金额的,按门店按月去重客户数)
  
  #### 奖励规则
  
  | 阶段 | 目标人数 | 奖励金额 | 说明 |
  |-----|---------|---------|------|
  | 第一阶段 | 达到目标(如:100人) | 200元/月 | 只要达到第一阶段目标即可获得 |
  | 第二阶段 | 达到目标(如:140人) | 再奖励200元/月 | 在达到第一阶段的基础上,再达到第二阶段目标 |
  | 两个阶段都达到 | - | 总计400元/月 | 第一阶段200元 + 第二阶段200元 |
  
  **奖励说明**
  - 两个阶段的奖励是累加的,不是互斥的
  - 如果只达到第二阶段但未达到第一阶段,只获得第二阶段奖励(200元)
  - 如果两个阶段都达到,获得总计400元奖励
  
  **统计规则**
  - 按门店统计(`md` 字段)
  - 只统计有消费金额的记录(消耗金额 > 0)
  - 同一个会员按月去重(`COUNT(DISTINCT hy)`),其中 `hy` 为会员ID
  - 只统计当月有效消耗记录(`F_IsEffective = 1`
  
  **重要说明**
  - 阶段目标必须在 `lq_md_target` 表中进行设置,如果未设置,系统应报错提示
  - 不同门店的阶段目标可能不同(如:川师第一阶段100人,第二阶段140人)
  
  ---
  
  ### 4. 固定奖励规则
  
  **手机管理费**:150元/月
  
  **说明**
  - 固定金额,无需计算
  - 每月固定发放
  
  ---
  
  ## 📊 完整计算公式
  
  ```
  店助月工资 = 底薪 + 提成 + 阶段奖励 + 固定奖励
  
  其中:
  - 底薪 = 根据门店分类确定(A类3000元,B类3100元,C类3200元)
  - 提成 = 门店业绩 × 提成比例(根据业绩与生命线比例确定)
  - 阶段奖励 = 根据进店消耗人数是否达到阶段目标(0/200/400元)
  - 固定奖励 = 150元(手机管理费)
  ```
  
  ---
  
  ## ⚠️ 注意事项
  
  1. **门店业绩计算**
     - 门店业绩 = 开单业绩 - 退卡业绩
     - 只统计当月有效记录(`F_IsEffective = 1`
  
  2. **进店消耗人数统计**
     - 必须使用 `COUNT(DISTINCT hy)` 去重(同一个会员按月去重)
     - 只统计有消费金额的记录(消耗金额 > 0)
     - 按门店统计(`md` 字段)
     - 只统计当月有效消耗记录(`F_IsEffective = 1`
     - 通过关联 `lq_xh_jksyj` 表判断是否有消费金额
  
  3. **阶段目标配置**
     - 不同门店的阶段目标可能不同(如:川师第一阶段100人,第二阶段140人)
     - 必须从 `lq_md_target` 表获取对应门店的目标值
     - **重要**:如果 `lq_md_target` 表中未设置阶段目标,系统应报错提示
  
  4. **提成比例判断**
     - 严格按照门店业绩与门店生命线的比例判断
     - 注意边界值:70% 和 100%
     - 提成按门店业绩的百分比计算
  
  5. **数据一致性**
     - 门店业绩的计算逻辑必须与门店总业绩统计保持一致
     - 进店消耗人数的统计逻辑必须与其他统计接口保持一致
  
  6. **数据校验要求**
     - 门店分类(`F_StoreCategory`)必须设置,不允许为NULL,未设置应报错
     - 门店生命线(`F_StoreLifeline`)必须设置,未设置应报错
     - 阶段目标(`F_AssistantHeadcountTargetStage1`、`F_AssistantHeadcountTargetStage2`)必须设置,未设置应报错
  
  ---
  
  # 第二部分:数据来源说明
  
  ## 🔍 核心数据表
  
  ### 1. `lq_mdxx` - 门店信息表
  
  **用途**:获取门店分类,用于确定店助底薪
  
  **关键字段**
  - `F_Id`:门店ID(主键)
  - `F_StoreCategory`:门店分类
    - `1` = A类门店
    - `2` = B类门店
    - `3` = C类门店
  
  **查询条件**:门店ID(`F_Id`
  
  **查询示例**
  ```sql
  SELECT F_StoreCategory FROM lq_mdxx WHERE F_Id = @StoreId
  ```
  
  **代码实现**
  - 实体类:`LqMdxxEntity.StoreCategory`(对应数据库字段 `F_StoreCategory`
  - 枚举类:`StoreCategoryEnum`(定义A、B、C类门店)
  - 在工资计算时,已从门店信息中获取 `StoreCategory` 字段(见 `LqSalaryService.cs` 第345行)
  
  ---
  
  ### 2. `lq_md_target` - 门店目标表
  
  **用途**:获取门店生命线和阶段目标
  
  **关键字段**
  - `F_StoreId`:门店ID
  - `F_Month`:月份(YYYYMM格式)
  - `F_StoreLifeline`:门店生命线(必须设置,未设置则报错)
  - `F_AssistantHeadcountTargetStage1`:店助第一阶段目标人数(必须设置,未设置则报错)
  - `F_AssistantHeadcountTargetStage2`:店助第二阶段目标人数(必须设置,未设置则报错)
  
  **查询条件**:门店ID(`F_StoreId`)+ 月份(`F_Month`,YYYYMM格式)
  
  **查询示例**
  ```sql
  SELECT 
      F_StoreLifeline,
      F_AssistantHeadcountTargetStage1,
      F_AssistantHeadcountTargetStage2
  FROM lq_md_target
  WHERE F_StoreId = @StoreId AND F_Month = @Month
  ```
  
  **重要说明**:所有目标字段都必须设置,如果未设置,系统应报错提示
  
  ---
  
  ### 3. `lq_kd_kdjlb` - 开单记录表
  
  **用途**:计算门店开单业绩
  
  **关键字段**
  - `sfyj`:实付业绩(用于计算门店开单业绩总和)
  - `Kdrq`:开单日期(用于按月过滤)
  - `F_IsEffective`:是否有效(只统计有效记录)
  
  **查询逻辑**
  - 按门店、月份汇总 `sfyj` 字段
  - 只统计有效记录(`F_IsEffective = 1`
  
  ---
  
  ### 4. `lq_hytk_hytk` - 退卡记录表
  
  **用途**:计算门店退卡业绩
  
  **关键字段**
  - `F_ActualRefundAmount`:实际退卡金额(用于计算门店退卡业绩总和)
  - `tksj`:退卡时间(用于按月过滤)
  - `md`:门店ID
  - `F_IsEffective`:是否有效(只统计有效记录)
  
  **查询逻辑**
  - 按门店、月份汇总 `F_ActualRefundAmount` 字段
  - 只统计有效记录(`F_IsEffective = 1`
  
  ---
  
  ### 5. `lq_xh_hyhk` - 耗卡记录表
  
  **用途**:统计进店消耗人数
  
  **关键字段**
  - `F_Id`:耗卡记录ID(主键)
  - `hy`:会员ID(用于去重统计)
  - `md`:门店ID(按门店统计)
  - `hksj`:耗卡时间(用于按月过滤)
  - `F_IsEffective`:是否有效(只统计有效记录)
  
  **查询逻辑**
  - 按门店、月份统计去重会员数
  - 只统计有效记录(`F_IsEffective = 1`
  - 只统计有消费金额的记录(通过关联 `lq_xh_jksyj` 表判断)
  
  ---
  
  ### 6. `lq_xh_jksyj` - 耗卡健康师业绩表
  
  **用途**:判断是否有消费金额
  
  **关键字段**
  - `glkdbh`:关联耗卡记录ID(关联 `lq_xh_hyhk.F_Id`
  - `jksyj`:健康师业绩(消耗金额)
  - `F_IsEffective`:是否有效(只统计有效记录)
  
  **查询逻辑**
  - 用于判断耗卡记录是否有消费金额(`jksyj > 0`
  - 只统计有效记录(`F_IsEffective = 1`
  
  ---
  
  ## 📝 数据查询逻辑
  
  ### 1. 门店业绩计算
  
  **计算公式**:门店业绩 = 开单业绩 - 退卡业绩
  
  **查询逻辑**
  ```sql
  -- 1. 计算门店开单业绩
  SELECT COALESCE(SUM(sfyj), 0) as BillingPerformance
  FROM lq_kd_kdjlb
  WHERE Djmd = @StoreId
    AND DATE_FORMAT(Kdrq, '%Y%m') = @Month
    AND F_IsEffective = 1
  
  -- 2. 计算门店退卡业绩
  SELECT COALESCE(SUM(F_ActualRefundAmount), 0) as RefundPerformance
  FROM lq_hytk_hytk
  WHERE md = @StoreId
    AND DATE_FORMAT(tksj, '%Y%m') = @Month
    AND F_IsEffective = 1
  
  -- 3. 计算门店实际业绩
  门店业绩 = 开单业绩 - 退卡业绩
  ```
  
  ---
  
  ### 2. 进店消耗人数统计
  
  **统计规则**:有消费金额的,按门店按月去重客户数
  
  **查询逻辑**
  ```sql
  -- 统计门店当月进店消耗人数(有消费金额的,按门店按月去重客户数)
  SELECT COUNT(DISTINCT hy) as HeadCount
  FROM lq_xh_hyhk hk
  WHERE hk.md = @StoreId
    AND DATE_FORMAT(hk.hksj, '%Y%m') = @Month
    AND hk.F_IsEffective = 1
    AND EXISTS (
      -- 确保有消费金额(通过关联消耗业绩表判断)
      SELECT 1 
      FROM lq_xh_jksyj jksyj 
      WHERE jksyj.glkdbh = hk.F_Id 
        AND jksyj.F_IsEffective = 1 
        AND jksyj.jksyj > 0
    )
  ```
  
  **说明**
  - `md`:门店ID,按门店统计
  - `hy`:会员ID,用于去重统计(同一个会员按月去重)
  - `hksj`:耗卡时间,用于按月过滤
  - `F_IsEffective = 1`:只统计有效记录
  - **重要**:只统计有消费金额的记录(消耗金额 > 0),通过关联 `lq_xh_jksyj` 表判断是否有消费金额
  
  ---
  
  ### 3. 门店分类获取
  
  **查询逻辑**
  ```sql
  -- 获取门店分类
  SELECT F_StoreCategory FROM lq_mdxx WHERE F_Id = @StoreId
  
  -- 根据门店分类确定底薪
  -- F_StoreCategory = 1 → 底薪 = 3000元
  -- F_StoreCategory = 2 → 底薪 = 3100元
  -- F_StoreCategory = 3 → 底薪 = 3200元
  ```
  
  **代码实现**
  ```csharp
  // 从门店信息中获取
  var store = await _db.Queryable<LqMdxxEntity>()
      .Where(x => x.Id == storeId)
      .FirstAsync();
  
  int? storeCategory = store.StoreCategory; // 1=A类, 2=B类, 3=C类
  
  // 根据门店分类确定店助底薪
  decimal baseSalary = storeCategory switch
  {
      1 => 3000m, // A类门店
      2 => 3100m, // B类门店
      3 => 3200m, // C类门店
      _ => throw new Exception($"门店分类未设置或无效:门店ID={storeId}")
  };
  ```
  
  ---
  
  ## 🔗 相关代码位置
  
  - **门店信息查询**`LqMdxxService.cs`
  - **门店分类枚举**`StoreCategoryEnum.cs`(`netcore/src/Modularity/Extend/NCC.Extend.Entitys/Enum/`
  - **门店实体类**`LqMdxxEntity.cs`(`F_StoreCategory` 字段)
  - **工资计算服务**`LqSalaryService.cs`(第345行获取 `StoreCategory`
  - **门店目标查询**`LqMdTargetService.cs`
  - **门店业绩统计**`LqStatisticsService.cs` / `LqDailyReportService.cs`
  - **进店消耗人数统计**`LqStatisticsService.cs` / `LqDailyReportService.cs`
  
  ---
  
  ## 📅 更新记录
  
  - 2025-01-XX:初始版本,梳理店助工资计算规则
  - 2025-01-XX:更新底薪规则,明确按A、B、C类门店分类确定底薪(A类3000元,B类3100元,C类3200元)
  - 2025-01-XX:明确A、B、C类门店来源:`lq_mdxx` 表的 `F_StoreCategory` 字段(枚举值:1=A类,2=B类,3=C类)
  - 2025-01-XX:明确数据校验要求:门店分类必须设置,`lq_md_target` 表的目标字段必须设置,未设置应报错
  - 2025-01-XX:明确进店消耗人数统计规则:有消费金额的,按门店按月去重,同一个会员按月去重
  - 2025-01-XX:明确提成计算:按门店业绩的百分比计算
  - 2025-01-XX:重新组织文档结构,分为规则部分和数据来源说明部分