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

198 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 日级报表SQL修改总结 - 冻结标签率实现
**更新日期**: 2026-05-16
**版本**: v3.0 - 冻结标签率设计
**状态**: ✅ 编译通过,待测试
---
## 核心问题分析
### 用户发现的逻辑问题
原SQL设计中存在矛盾**当日换单成功数 < 当日考核通过数**
这在数学上是不可能的因为"考核通过的包裹"必定是"成功包裹"的子集
### 根本原因
使用**最终标签率**所有订单的完整快照来判断考核时间导致
- 时间维度混乱统计维度不一致
- 标签率动态变化无法确定哪个时刻的标签率应该被采用
### 解决方案
引入**冻结标签率**概念
- **最早的扫描时间**为分割线
- 最早扫描时间与标签推送时间的关系确定包裹的标签率类别
- 自动分类避免复杂的历史快照计算
---
## 实施的核心修改
### 1. InterchangeUnitLabelRates CTE改进
**变更**"最终标签率"改为"冻结标签率"
**原逻辑**
```sql
COUNT(CASE WHEN l.Label IS NOT NULL THEN l.Id END) / COUNT(l.Id)
-- 统计所有有标签的包裹比例
```
**新逻辑**
```sql
COUNT(CASE WHEN l.Label IS NOT NULL
AND MIN(扫描时间) > l.LabelRetrievedAt
THEN l.Id END) / COUNT(l.Id)
-- 统计"在标签推送后才开始作业"的包裹比例
```
**含义**
- `最早扫描时间 > 标签推送时间` = 标签推送早于作业开始 = 高标签率
- `最早扫描时间 ≤ 标签推送时间` = 标签推送晚于或同时作业开始 = 低标签率
### 2. DailyHighLabelRateShould CTE新增
**功能**统计冻结标签率 80% 的交接单中的全部包裹数
**逻辑**
```sql
WHERE 冻结标签率 >= 80%
```
统计所有高标签率交接单中的包裹这些包裹将按照"到仓时间16点前后分段"规则处理
### 3. DailyLowLabelRateShould CTE新增
**功能**统计冻结标签率 < 80% 的交接单中的全部包裹数
**逻辑**
```sql
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%的逻辑自洽性
- 🎯 为客户提供更有说服力的数据
---
## 相关文档
- 📄 [冻结标签率设计文档](./frozen_label_rate_design.md)
- 📄 [考核时间设计分析](./assessment_time_design_analysis.md)
- 📄 [SQL逻辑错误修复](./sql_logic_error_fix.md)