Files
LabelChange-server/.trae/documents/frozen_label_rate_implementation_summary.md
2026-06-01 16:30:29 +08:00

5.6 KiB
Raw Blame History

日级报表SQL修改总结 - 冻结标签率实现

更新日期: 2026-05-16
版本: v3.0 - 冻结标签率设计
状态: 编译通过,待测试


核心问题分析

用户发现的逻辑问题

原SQL设计中存在矛盾当日换单成功数 < 当日考核通过数

这在数学上是不可能的,因为"考核通过的包裹"必定是"成功包裹"的子集。

根本原因

使用最终标签率(所有订单的完整快照)来判断考核时间,导致:

  • 时间维度混乱:统计维度不一致
  • 标签率动态变化:无法确定哪个时刻的标签率应该被采用

解决方案

引入冻结标签率概念:

  • 最早的扫描时间为分割线
  • 最早扫描时间与标签推送时间的关系确定包裹的标签率类别
  • 自动分类,避免复杂的历史快照计算

实施的核心修改

1. InterchangeUnitLabelRates CTE改进

变更:从"最终标签率"改为"冻结标签率"

原逻辑

COUNT(CASE WHEN l.Label IS NOT NULL THEN l.Id END) / COUNT(l.Id)
-- 统计所有有标签的包裹比例

新逻辑

COUNT(CASE WHEN l.Label IS NOT NULL 
       AND MIN(扫描时间) > l.LabelRetrievedAt 
       THEN l.Id END) / COUNT(l.Id)
-- 统计"在标签推送后才开始作业"的包裹比例

含义

  • 最早扫描时间 > 标签推送时间 = 标签推送早于作业开始 = 高标签率
  • 最早扫描时间 ≤ 标签推送时间 = 标签推送晚于或同时作业开始 = 低标签率

2. DailyHighLabelRateShould CTE新增

功能:统计冻结标签率 ≥ 80% 的交接单中的全部包裹数

逻辑

WHERE 冻结标签率 >= 80%

统计所有高标签率交接单中的包裹,这些包裹将按照"到仓时间16点前后分段"规则处理

3. DailyLowLabelRateShould CTE新增

功能:统计冻结标签率 < 80% 的交接单中的全部包裹数

逻辑

WHERE 冻结标签率 < 80%

统计所有低标签率交接单中的包裹,这些包裹将按照"完成即达标"规则处理

4. 最终SELECT的关键指标

考核通过总数

= 16点前高标签率通过 + 16点后高标签率通过 + 低标签率通过

24小时换单率修正

分子 = 考核通过总数(实际完成并通过考核的包裹)
分母 = 高标签率应该换单数(应该在高标签率下履约的包裹)

含义客观反映在标签率≥80%情况下的实际履约完成情况


验证场景示例

100个订单在同一交接单中

时间线

  • 最早扫描时间 = 2026-05-16 10:00:00

标签推送分布

推送时间 包裹数 与最早扫描时间的关系 属性
09:00-10:00 30 扫描时间 > 推送时间 高标签率包裹
10:00-11:00 50 扫描时间 = 推送时间 低标签率包裹
11:00-12:00 20 扫描时间 < 推送时间 低标签率包裹

冻结标签率计算

冻结标签率 = (最早扫描时间 > 标签推送时间的包裹数) / 100
          = (30个订单) / 100
          = 30% < 80%

考核规则应用(整体规则):

因为 冻结标签率 = 30% < 80%
→ 整个交接单的100个包裹都执行"完成即达标"规则
  不再按照到仓时间16点前后分段

统计数据

高标签率应该换单数 = 0因为冻结标签率<80%,没有符合条件的交接单)
低标签率应该换单数 = 100因为冻结标签率<80%这100个包裹都在此类别

关键理解

  • 冻结标签率的作用:判断整个交接单是否属于"高标签率"或"低标签率"
  • 不是分别处理高低标签率的包裹,而是整体分类
  • 30个"高标签率包裹" + 70个"低标签率包裹" = 100个都按低标签率规则处理

文件变更清单

修改的文件

  • src/DAL/Repositories/LabelReplaceRepository.cs

    • 修改 InterchangeUnitLabelRates CTE第735-765行
    • 新增 DailyHighLabelRateShould CTE第1026-1055行
    • 新增 DailyLowLabelRateShould CTE第1058-1089行
    • 修改最终SELECT的关键字段第1114-1141行
  • src/MDL/DTOs/CustomerDailyLabelStatsDto.cs

    • 修正命名空间:从 LabelReplaceServer.Models.DTOs 改为 MDL.DTOs

新增的文档

  • 📄 .trae/documents/frozen_label_rate_design.md
    • 详细的冻结标签率设计文档
    • 包含完整的业务逻辑、SQL实现、验证场景

编译验证

DAL项目编译成功

  • 无编译错误
  • 176条警告既存问题与本修改无关

CONTROLLER项目编译成功

  • 所有依赖项编译通过
  • 系统已生成最新的DLL

下一步工作

需要测试验证

  1. 冻结标签率计算准确性

    • 验证"最早完成时间"的确定
    • 验证标签推送时间的比较逻辑
  2. 考核时间的正确性

    • 16点前/后的分段规则是否正确应用
    • 完成即达标(低标签率)的场景
  3. 统计指标的合理性

    • 验证不再出现"成功数 < 考核通过数"
    • 验证24小时换单率分母的正确性
    • 验证各项汇总数据的一致性
  4. 数据对比

    • 与旧逻辑的数据对比
    • 与现场实际情况的符合度

预期改进

  • 📊 消除数据矛盾
  • 📈 更准确地反映标签供应情况
  • 实现100%的逻辑自洽性
  • 🎯 为客户提供更有说服力的数据

相关文档