# 科技部总经理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元,说明还有其他因素 **进一步分析**: - 工资计算接口可能使用了不同的数据解析方式,导致部分数据未正确计算 - 建议重新计算工资,使用与科技部驾驶舱接口相同的时间范围和查询方式