5.9 KiB
5.9 KiB
24H换单率根本修复 - 实施完成报告
日期:2026-05-16
状态:✅ 实施完成,编译成功
修改文件:src/DAL/Repositories/LabelReplaceRepository.cs
本次修复的核心改动
修改1:InterchangeUnitLabelRatesAtFirstScan CTE(第761-795行)
关键变化:
-
新增字段:
total_labeled_at_any_time- 统计交接单中"所有有标签的包裹数"
- 用途:作为后续分母计算的基数
-
调整label_rate_at_first_scan的分子:
- 保持不变:最早扫描时间之前有标签的包裹数
-
调整label_rate_at_first_scan的分母:
- 原逻辑:
COUNT(DISTINCT l.Id)→ 所有包裹数 - 新逻辑:
COUNT(DISTINCT CASE WHEN l.Label IS NOT NULL AND l.Label != '' THEN l.Id END)→ 有标签的包裹数 - 影响:标签率计算现在更精确(只基于有标签的包裹)
- 原逻辑:
示例场景(说明变化):
- 交接单有10个包裹,其中8个有标签
- 最早扫描时间之前,6个有标签
- 原计算:标签率 = 6 / 10 = 60%(错误!应该基于有标签的8个)
- 新计算:标签率 = 6 / 8 = 75%(正确!)
修改2:DailyHighLabelRateShould CTE(第1113-1131行)
关键变化:
-
统计方式从COUNT改为SUM:
- 原逻辑:
COUNT(DISTINCT CONCAT(BillOfLadingNumber, '|', MasterPackageNumber))→ 统计交接单数 - 新逻辑:
SUM(CASE WHEN label_rate_at_first_scan >= 80 THEN total_labeled_at_any_time ELSE 0 END)→ 统计有标签的包裹数
- 原逻辑:
-
简化JOIN关系:
- 移除了原来的子查询DISTINCT SELECT
- 直接使用InterchangeUnitLabelRatesAtFirstScan关联,并通过SUM+CASE聚合
示例场景(说明修复的根本问题):
- 当日到货有3个交接单,都满足作业时标签率≥80%
- 交接单1:8个有标签的包裹
- 交接单2:12个有标签的包裹
- 交接单3:10个有标签的包裹
- 原计算:应该换单数 = 3(统计交接单数)→ 分母被严重低估!
- 新计算:应该换单数 = 8 + 12 + 10 = 30(统计有标签包裹数)→ 分母正确!
为什么这个修复解决了超100%的问题
问题诊断
24H换单率超过100%(4745%等)的根本原因:分母被严重低估
- 分子:考核通过的包裹数(订单级别统计)
- 分母:应该换单的包裹数(但原来按交接单计数)
一个交接单通常有多个包裹(例如10-30个),当按交接单计数时,分母直接被缩小10-30倍,导致分子/分母比率巨大。
修复的效果
修复后:
- 分母现在正确反映"有标签的包裹数"而不是"交接单数"
- 分子分母的数量级更接近
- 24H换单率数据会更加合理(虽然仍可能>100%,但不会是4745%这样极端的值)
关键业务规则确认
24H换单率的定义
24H换单率 = 高标签率考核通过数 / 高标签率应该换单数 × 100%
其中:
- 高标签率考核通过数 = 作业时标签率≥80% 的包裹中已考核通过的数量
- 高标签率应该换单数 = 当日到货且作业时标签率≥80%的交接单中的有标签包裹数(新定义)
分母的精确定义
高标签率应该换单数 = SUM(每个作业时标签率≥80%的交接单中的有标签包裹数)
计算步骤:
1. 遍历当日到货的所有交接单
2. 对每个交接单:
a. 计算作业时标签率 = MIN(标签推送时间 < 最早扫描时间)的包裹数 / 有标签包裹总数
b. 如果≥80%:加上这个交接单的有标签包裹数
3. 求和
作业时标签率的新计算逻辑
作业时标签率 = 最早扫描时间之前有标签的包裹数 / 有标签的包裹数 × 100%
注意:分母从"所有包裹"改为"有标签的包裹"
这样计算出来的标签率更加精确和业务意义更清晰
编译验证结果
✅ dotnet build src/DAL/DAL.csproj
- 编译成功(Exit code 0)
- 生成:MDL.dll, DB.dll, DAL.dll
- 警告:仅包含依赖库的安全警告,无编译错误
下一步验证
测试1:验证分母计算逻辑
SELECT
日期,
高标签率应该换单数,
(SELECT SUM(...) 应该的包裹数) AS 预期值
FROM DailyHighLabelRateShould
WHERE 日期 = '2026-05-15'
测试2:验证分子分母对应关系
- 验证分子是否来自正确的包裹集合
- 确认分子数据来自这些包裹中完成考核的部分
测试3:手工验证
- 选择某一天的具体数据
- 手工计算分子分母
- 确认逻辑是否符合业务规则
修改摘要
| 项目 | 修改前 | 修改后 | 影响 |
|---|---|---|---|
| InterchangeUnitLabelRatesAtFirstScan - 字段 | 无total_labeled_at_any_time | 新增total_labeled_at_any_time | 用于分母计算 |
| InterchangeUnitLabelRatesAtFirstScan - 标签率分母 | COUNT(所有包裹) | COUNT(有标签的包裹) | 标签率计算更精确 |
| DailyHighLabelRateShould - 统计方式 | COUNT(交接单) | SUM(有标签包裹数) | 分母数值从单位数变为十数或百数 |
| DailyHighLabelRateShould - 结果量级 | 较小(几个交接单) | 较大(对应的包裹总数) | 24H换单率数据合理化 |
相关文件
- 修改文件:
src/DAL/Repositories/LabelReplaceRepository.cs - 修改行数:第761-795行(InterchangeUnitLabelRatesAtFirstScan)
- 修改行数:第1113-1131行(DailyHighLabelRateShould)
- 文档参考:
.trae/documents/24h_rate_final_fix_plan.md
业务逻辑验证清单
- 作业时标签率的定义和计算方式
- 分母的精确定义:有标签的包裹数而不是交接单数
- 分子分母的维度对齐
- 交接单维度 vs 包裹维度的正确使用
- 编译成功验证
实施完成日期:2026-05-16
修改作者:AI Assistant
确认状态:代码已编译、已推送