科技部总经理Cell金额差异分析.md
6.74 KB
科技部总经理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中存在的门店:1649328471923847197- 绿纤龙城国际店(kjb=734725628560934149,不是734725579919590661)766197905571710213- 绿纤西站店(kjb=null)
这两个门店在工资计算时不包含,但在科技部驾驶舱接口中包含。
2. 时间范围处理差异
工资计算接口
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)
科技部驾驶舱接口
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. 时间范围差异(主要原因)
工资计算接口:
x.Yjsj >= startDate && x.Yjsj <= endDate.AddDays(1)
// 即:yjsj >= '2025-12-01' AND yjsj <= '2026-01-01'
科技部驾驶舱接口:
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元主要来自:
时间范围差异(主要原因):
- 工资计算接口包含
endDate.AddDays(1)(即2026-01-01的数据) - 科技部驾驶舱接口只包含当月数据(2025-12-31及之前)
- 这导致工资计算接口可能包含了部分下个月的数据
- 工资计算接口包含
数据查询方式差异:
- 工资计算接口使用内存解析字符串,可能存在精度问题
- 科技部驾驶舱接口使用数据库层面转换,精度更高
门店范围差异:
- 两个接口使用不同的数据源确定门店范围
- 但额外门店的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元
进一步分析:
- 工资计算接口可能使用了不同的数据解析方式,导致部分数据未正确计算
- 建议重新计算工资,使用与科技部驾驶舱接口相同的时间范围和查询方式