# 日级报表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)

