科技部总经理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 中存在的门店
    1. 1649328471923847197 - 绿纤龙城国际店(kjb = 734725628560934149,不是 734725579919590661
    2. 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元主要来自:

  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元

进一步分析

  • 工资计算接口可能使用了不同的数据解析方式,导致部分数据未正确计算
  • 建议重新计算工资,使用与科技部驾驶舱接口相同的时间范围和查询方式