f891e7d4
“wangming”
1
|
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
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
# 开单升单逻辑说明文档
## 概述
升单是指已经开过会员再次消费的情况。系统会根据当前开单的品项类型和会员历史开单记录,自动判断是否为升单,并标记升单类型。
## 升单类型字段
- `F_UpgradeLifeBeauty`:升生美(再次开单时,包含生美品项的订单)
- `F_UpgradeTechBeauty`:升科美(再次开单时,包含科美品项的订单)
- `F_UpgradeMedicalBeauty`:升医美(再次开单时,包含医美品项的订单)
---
## 升单判断逻辑
### 1. 升医美(UpgradeMedicalBeauty)
**判断条件**(需同时满足):
1. ✅ **当前开单包含医美品项**
- 检查当前开单的品项明细中,是否有品项分类(`lq_xmzl.qt2`)为"医美"的记录
2. ✅ **之前有医美类型的开单记录**
- 查询该会员(`kdhy`)在**当前开单之前**的所有有效开单品项明细
- 筛选条件:
- `F_IsEffective = 1`(品项明细有效)
- `ItemCategory = "医美"`(品项分类为医美)
- `ActualPrice > 0`(实际价格大于0)
- `Px != "61"`(排除女神卡)
3. ✅ **当前开单的医美品项实付业绩 >= 1000元**
- 计算当前开单中所有医美品项的 `actualPrice` 总和
- 必须 >= 1000元
**代码位置**:`LqKdKdjlbService.cs` 第856-864行
**代码逻辑**:
```csharp
//判断升医美:当前开单包含医美品项 + 之前有医美类型的开单记录 + 实付业绩>=1000
if (hasMedicalItemInCurrentBilling && hasPreviousMedicalBilling && MedicalItemInCurrentBillingAmount >= 1000)
{
entity.UpgradeMedicalBeauty = "是";
}
else
{
entity.UpgradeMedicalBeauty = "否";
}
```
---
### 2. 升科美(UpgradeTechBeauty)
**判断条件**(需同时满足):
1. ✅ **当前开单包含科美品项**
- 检查当前开单的品项明细中,是否有品项分类为"科美"的记录
2. ✅ **之前有科美类型的开单记录**
- 查询该会员在当前开单之前的所有有效开单品项明细
- 筛选条件:
- `F_IsEffective = 1`
- `ItemCategory = "科美"`
- `ActualPrice > 0`
- `Px != "61"`(排除女神卡)
**代码位置**:`LqKdKdjlbService.cs` 第866-874行
**代码逻辑**:
```csharp
//判断升科美:当前开单包含科美品项 + 之前有科美类型的开单记录
if (hasTechItemInCurrentBilling && hasPreviousTechBilling)
{
entity.UpgradeTechBeauty = "是";
}
else
{
entity.UpgradeTechBeauty = "否";
}
```
---
### 3. 升生美(UpgradeLifeBeauty)
**判断条件**(需同时满足):
1. ✅ **当前开单包含生美品项**
- 检查当前开单的品项明细中,是否有品项分类为"生美"的记录
2. ✅ **之前有生美类型的开单记录**
- 查询该会员在当前开单之前的所有有效开单品项明细
- 筛选条件:
- `F_IsEffective = 1`
- `ItemCategory = "生美"`
- `ActualPrice > 0`
- `Px != "61"`(排除女神卡)
**代码位置**:`LqKdKdjlbService.cs` 第876-884行
**代码逻辑**:
```csharp
//判断升生美:当前开单包含生美品项 + 之前有生美类型的开单记录
if (hasLifeItemInCurrentBilling && hasPreviousLifeBilling)
{
entity.UpgradeLifeBeauty = "是";
}
else
{
entity.UpgradeLifeBeauty = "否";
}
```
---
## 关键代码位置
### 新增开单(Create方法)
- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs`
- **方法**:`Create`(第799-884行)
- **逻辑**:在创建新开单时,自动判断并设置升单类型字段
### 更新开单(Update方法)
- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs`
- **方法**:`Update`(第1190-1220行)
- **⚠️ 注意**:Update方法中的升单判断逻辑**存在Bug**(见下方说明)
### 批量处理历史数据
- **文件**:`netcore/src/Modularity/Extend/NCC.Extend/LqKdKdjlbService.cs`
- **方法**:`BatchProcessHistoricalUpgradeTypes`(第4220-4398行)
- **逻辑**:批量更新历史开单记录的升单类型字段
---
## ⚠️ 发现的Bug
### Update方法中的字段赋值错误
**位置**:`LqKdKdjlbService.cs` 第1192-1220行
**问题**:
1. **第1195行**:判断升医美,但赋值给了 `UpgradeLifeBeauty`(应该是 `UpgradeMedicalBeauty`)
2. **第1215行**:判断升生美,但赋值给了 `UpgradeMedicalBeauty`(应该是 `UpgradeLifeBeauty`)
**错误代码**:
```csharp
// 第1192-1200行:判断升医美,但赋值错误
var isMedicalProject = hasMedicalItemInCurrentBilling && await _db.Queryable<LqKdPxmxEntity>()...
if (isMedicalProject && MedicalItemInCurrentBillingAmount >= 1000)
{
entity.UpgradeLifeBeauty = "是"; // ❌ 错误:应该是 UpgradeMedicalBeauty
}
// 第1212-1220行:判断升生美,但赋值错误
var isLifeProject = hasLifeItemInCurrentBilling && await _db.Queryable<LqKdPxmxEntity>()...
if (isLifeProject)
{
entity.UpgradeMedicalBeauty = "是"; // ❌ 错误:应该是 UpgradeLifeBeauty
}
```
**正确代码应该是**:
```csharp
// 升医美
if (isMedicalProject && MedicalItemInCurrentBillingAmount >= 1000)
{
entity.UpgradeMedicalBeauty = "是"; // ✅ 正确
}
// 升生美
if (isLifeProject)
{
entity.UpgradeLifeBeauty = "是"; // ✅ 正确
}
```
---
## 数据来源说明
### 品项分类获取
- **表**:`lq_xmzl`(项目资料表)
- **字段**:`qt2`(品项分类:生美/科美/医美)
- **关联**:通过 `lq_kd_pxmx.px = lq_xmzl.F_Id` 关联
### 历史开单记录查询
- **表**:`lq_kd_pxmx`(开单品项明细表)
- **筛选条件**:
- `MemberId = 当前会员ID`
- `F_IsEffective = 1`(有效)
- `ItemCategory = 对应类型`(生美/科美/医美)
- `ActualPrice > 0`(实际价格大于0)
- `Px != "61"`(排除女神卡)
- `Glkdbh != 当前开单ID`(排除当前开单本身,仅查询历史记录)
---
## 升单判断流程图
### 升医美流程
```
开始
↓
当前开单是否包含医美品项?
↓ 是
之前是否有医美类型的开单记录?
↓ 是
当前开单医美品项实付业绩 >= 1000元?
↓ 是
标记为:升医美 = "是"
↓
结束
```
### 升科美流程
```
开始
↓
当前开单是否包含科美品项?
↓ 是
之前是否有科美类型的开单记录?
↓ 是
标记为:升科美 = "是"
↓
结束
```
### 升生美流程
```
开始
↓
当前开单是否包含生美品项?
↓ 是
之前是否有生美类型的开单记录?
↓ 是
标记为:升生美 = "是"
↓
结束
```
---
## 注意事项
1. **升单判断是独立的**:一个开单可以同时标记为升医美、升科美、升生美(如果同时满足条件)
2. **时间顺序很重要**:判断"之前是否有开单记录"时,是基于开单日期(`kdrq`)来判断的,必须是当前开单日期之前的记录
3. **排除女神卡**:所有升单判断都排除品项ID为"61"的女神卡
4. **有效记录**:只统计有效的开单记录和品项明细(`F_IsEffective = 1`)
5. **医美升单特殊要求**:升医美除了需要满足前两个条件外,还需要当前开单的医美品项实付业绩 >= 1000元
---
## 修复建议
建议修复 `Update` 方法中的字段赋值错误,确保:
- 升医美 → 赋值给 `UpgradeMedicalBeauty`
- 升科美 → 赋值给 `UpgradeTechBeauty`
- 升生美 → 赋值给 `UpgradeLifeBeauty`
|