0cfc43b9
“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
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
|
# 科技部总经理Cell金额差异分析
## 问题描述
**夏萍**(科技部总经理)在 **202512** 月份的Cell金额存在差异:
- **工资表中**:60994.30 元
- **科技部驾驶舱接口**(`/api/Extend/LqTechDepartmentDashboard/GetStatistics`):69838.00 元
- **差异**:8843.70 元
## 差异原因分析
### 1. 门店范围不同
#### 工资计算接口(`LqTechGeneralManagerSalaryService`)
- **数据来源**:`lq_mdxx` 表的 `kjb` 字段
- **逻辑**:通过门店的 `kjb` 字段等于科技部组织ID来确定管理的门店
- **门店数量**:16个门店
#### 科技部驾驶舱接口(`LqTechDepartmentDashboardService`)
- **数据来源**:`lq_md_target` 表的 `F_TechDepartment` 字段
- **逻辑**:通过 `lq_md_target` 表查询指定月份、指定科技部归属的门店列表
- **门店数量**:18个门店
#### 差异门店
- **只在 `lq_md_target` 中存在的门店**:
1. `1649328471923847197` - 绿纤龙城国际店(`kjb` = `734725628560934149`,不是 `734725579919590661`)
2. `766197905571710213` - 绿纤西站店(`kjb` = `null`)
这两个门店在工资计算时**不包含**,但在科技部驾驶舱接口中**包含**。
### 2. 时间范围处理差异
#### 工资计算接口
```csharp
var startDate = new DateTime(year, month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);
// 开单时间:x.Yjsj >= startDate && x.Yjsj <= endDate.AddDays(1)
// 退卡时间:x.Tksj >= startDate && x.Tksj <= endDate.AddDays(1)
```
#### 科技部驾驶舱接口
```csharp
var startDate = new DateTime(year, month, 1);
var endDate = startDate.AddMonths(1).AddDays(-1);
var endDateTime = input.StatisticsMonth == DateTime.Now.ToString("yyyyMM")
? DateTime.Now
: endDate.Date.AddHours(23).AddMinutes(59).AddSeconds(59);
// 开单时间:yjsj >= '{startDate:yyyy-MM-dd HH:mm:ss}' AND yjsj <= '{endDateTime:yyyy-MM-dd HH:mm:ss}'
// 退卡时间:x.Tksj.Value.Date >= startDate.Date && x.Tksj.Value.Date <= endDate.Date
```
**差异**:
- 工资计算接口:退卡时间使用 `endDate.AddDays(1)`(包含下个月第一天)
- 科技部驾驶舱接口:退卡时间使用 `endDate.Date`(只到当月最后一天)
### 3. 数据查询方式差异
#### 工资计算接口
- 使用 **SqlSugar ORM** 查询
- 开单Cell金额:先查询所有记录到内存,然后解析字符串 `jksyj` 字段并求和
- 退卡Cell金额:直接使用 `SumAsync` 聚合查询
#### 科技部驾驶舱接口
- 使用 **原生SQL** 查询
- 开单Cell金额:使用 `CAST(jksyj AS DECIMAL(18,2))` 在数据库层面转换并求和
- 退卡Cell金额:使用 `SumAsync` 聚合查询
## 验证结果
### 工资表中的门店明细(16个门店)
```
绿纤龙湖店: 7140.0
绿纤华润店: 5500.0
绿纤静居寺店: 37400.0
绿纤468店: 66.3
绿纤大丰店: 8888.0
绿纤明信店: 2000.0
其他门店: 0.0
合计: 60994.3
```
### 差异明细(使用lq_md_target的门店范围查询)
| 门店ID | 门店名称 | 工资表金额 | 驾驶舱金额 | 差异 |
|--------|---------|-----------|-----------|------|
| 1649328471923847173 | 绿纤静居寺店 | 37,400.00 | 46,110.00 | **+8,710.00** |
| 1649328471923847175 | 绿纤468店 | 66.30 | 0.00 | **-66.30** |
| 1649328471923847187 | 绿纤明信店 | 2,000.00 | 2,200.00 | **+200.00** |
| **合计** | | **60,994.30** | **69,838.00** | **+8,843.70** |
### 差异原因分析
#### 1. 时间范围差异(主要原因)
**工资计算接口**:
```csharp
x.Yjsj >= startDate && x.Yjsj <= endDate.AddDays(1)
// 即:yjsj >= '2025-12-01' AND yjsj <= '2026-01-01'
```
**科技部驾驶舱接口**:
```csharp
yjsj >= '{startDate:yyyy-MM-dd HH:mm:ss}' AND yjsj <= '{endDateTime:yyyy-MM-dd HH:mm:ss}'
// 即:yjsj >= '2025-12-01 00:00:00' AND yjsj <= '2025-12-31 23:59:59'
```
**关键差异**:
- 工资计算接口:包含 **2026-01-01** 的数据(跨月数据)
- 科技部驾驶舱接口:只包含 **2025-12-31** 及之前的数据
这导致工资计算接口可能包含了部分下个月的数据,而科技部驾驶舱接口严格按照当月范围。
#### 2. 数据查询方式差异
**工资计算接口**:
- 使用 SqlSugar ORM,先查询所有记录到内存
- 然后使用 `decimal.TryParse` 解析字符串 `jksyj` 字段
- 可能存在精度问题或解析失败的情况
**科技部驾驶舱接口**:
- 使用原生SQL,在数据库层面使用 `CAST(jksyj AS DECIMAL(18,2))` 转换
- 直接在数据库层面求和,精度更高
#### 3. 门店范围差异
- 工资计算接口:使用 `lq_mdxx.kjb` 字段(16个门店)
- 科技部驾驶舱接口:使用 `lq_md_target.F_TechDepartment` 字段(18个门店)
- 但额外2个门店的Cell金额为0,不影响差异
## 结论
**夏萍的Cell金额差异8843.70元主要来自:**
1. **时间范围差异**(主要原因):
- 工资计算接口包含 `endDate.AddDays(1)`(即2026-01-01的数据)
- 科技部驾驶舱接口只包含当月数据(2025-12-31及之前)
- 这导致工资计算接口可能包含了部分下个月的数据
2. **数据查询方式差异**:
- 工资计算接口使用内存解析字符串,可能存在精度问题
- 科技部驾驶舱接口使用数据库层面转换,精度更高
3. **门店范围差异**:
- 两个接口使用不同的数据源确定门店范围
- 但额外门店的Cell金额为0,不影响差异
## 建议
### 1. 统一时间范围(最重要)
- **推荐**:两个接口都使用 `endDate.Date.AddHours(23).AddMinutes(59).AddSeconds(59)`
- 确保不包含下个月的数据,严格按照当月范围计算
### 2. 统一数据查询方式
- **推荐**:工资计算接口改为使用原生SQL查询,在数据库层面转换和求和
- 确保计算精度一致,避免内存解析导致的精度问题
### 3. 统一门店范围
- **推荐**:工资计算接口改为使用 `lq_md_target` 表确定门店范围
- 这样可以确保两个接口使用相同的门店范围,便于数据核对
### 4. 数据验证结果
**2026-01-01当天的Cell金额:18,446.00元**
| 门店ID | 门店名称 | 2026-01-01 Cell金额 |
|--------|---------|-------------------|
| 1649328471923847172 | 绿纤华润店 | 198.00 |
| 1649328471923847173 | 绿纤静居寺店 | 10,360.00 |
| 1649328471923847187 | 绿纤明信店 | 7,000.00 |
| 1649328471923847192 | 绿纤凤凰山店 | 888.00 |
**分析**:
- 工资计算接口使用 `endDate.AddDays(1)`,包含了2026-01-01的数据
- 科技部驾驶舱接口只包含2025-12-31及之前的数据
- 但差异8843.70元 < 2026-01-01的18446.00元,说明还有其他因素
**进一步分析**:
- 工资计算接口可能使用了不同的数据解析方式,导致部分数据未正确计算
- 建议重新计算工资,使用与科技部驾驶舱接口相同的时间范围和查询方式
|