# 简化日级报表输出字段 - 计划

**目标**：精简GetDailyLabelStatsChineseAsync()的输出，仅保留17个核心字段

**用户需求**：只保留以下字段
1. 日期
2. 当日新增换单数
3. 16点前到仓包裹数
4. 16点后到仓包裹数
5. 累计要换的总单数
6. 当天应该换单数
7. 换单失败未完结订单
8. 当日换单失败
9. 当日换单成功数
10. 当日STOP数
11. 24H内完成数
12. 当日完成数
13. 当日标签推送数
14. 当日扫描数
15. 数据拉取时间（UTC_5）
16. 当天换单完成率
17. 24H换单率

---

## 修改步骤

### 第1步：分析当前输出
当前输出包含以下多余字段：
- 16点前考核通过包裹数 ❌
- 16点后考核通过包裹数 ❌
- 低标签率考核通过包裹数 ❌
- 低标签率24H完成数 ❌
- 高标签率考核通过数 ❌
- 高标签率应该换单数 ❌
- 低标签率应该换单数 ❌
- 考核通过总数 ❌

**共8个多余字段需要删除**

### 第2步：修改SQL查询
**位置**：LabelReplaceRepository.cs 第1173-1206行

**任务**：
1. 从外层SELECT中删除8个多余字段
2. 保留17个核心字段
3. 保持聚合函数和逻辑正确

**修改前**（当前状态）：
```sql
SELECT 
    日期,
    MAX(当日新增换单数) AS 当日新增换单数,
    MAX(16点前到仓包裹数) AS 16点前到仓包裹数,
    MAX(16点后到仓包裹数) AS 16点后到仓包裹数,
    MAX(累计要换的总单数) AS 累计要换的总单数,
    MAX(当天应该换单数) AS 当天应该换单数,
    MAX(换单失败未完结订单) AS 换单失败未完结订单,
    MAX(当日换单失败) AS 当日换单失败,
    MAX(当日换单成功数) AS 当日换单成功数,
    MAX(当日STOP数) AS 当日STOP数,
    MAX(24H内完成数) AS 24H内完成数,
    MAX(当日完成数) AS 当日完成数,
    MAX(当日标签推送数) AS 当日标签推送数,
    MAX(当日扫描数) AS 当日扫描数,
    MAX(数据拉取时间（UTC_5）) AS 数据拉取时间（UTC_5）,
    MAX(16点前考核通过包裹数) AS 16点前考核通过包裹数,         -- ❌ 删除
    MAX(16点后考核通过包裹数) AS 16点后考核通过包裹数,         -- ❌ 删除
    MAX(低标签率考核通过包裹数) AS 低标签率考核通过包裹数,     -- ❌ 删除
    MAX(低标签率24H完成数) AS 低标签率24H完成数,               -- ❌ 删除
    MAX(高标签率考核通过数) AS 高标签率考核通过数,             -- ❌ 删除
    MAX(高标签率应该换单数) AS 高标签率应该换单数,             -- ❌ 删除
    MAX(低标签率应该换单数) AS 低标签率应该换单数,             -- ❌ 删除
    (MAX(16点前考核通过包裹数) + MAX(16点后考核通过包裹数) + MAX(低标签率考核通过包裹数)) AS 考核通过总数,  -- ❌ 删除
    CASE 
        WHEN MAX(当天应该换单数) = 0 THEN '0.00%'
        ELSE CONCAT(ROUND(
            MAX(当日完成数) / MAX(当天应该换单数) * 100, 2), '%')
    END AS 当天换单完成率,
    CASE 
        WHEN MAX(高标签率应该换单数) = 0 THEN '0.00%'
        ELSE CONCAT(ROUND(
            MAX(高标签率考核通过数) / MAX(高标签率应该换单数) * 100, 2), '%')
    END AS 24H换单率
```

**修改后**（精简版）：
```sql
SELECT 
    日期,
    MAX(当日新增换单数) AS 当日新增换单数,
    MAX(16点前到仓包裹数) AS 16点前到仓包裹数,
    MAX(16点后到仓包裹数) AS 16点后到仓包裹数,
    MAX(累计要换的总单数) AS 累计要换的总单数,
    MAX(当天应该换单数) AS 当天应该换单数,
    MAX(换单失败未完结订单) AS 换单失败未完结订单,
    MAX(当日换单失败) AS 当日换单失败,
    MAX(当日换单成功数) AS 当日换单成功数,
    MAX(当日STOP数) AS 当日STOP数,
    MAX(24H内完成数) AS 24H内完成数,
    MAX(当日完成数) AS 当日完成数,
    MAX(当日标签推送数) AS 当日标签推送数,
    MAX(当日扫描数) AS 当日扫描数,
    MAX(数据拉取时间（UTC_5）) AS 数据拉取时间（UTC_5）,
    CASE 
        WHEN MAX(当天应该换单数) = 0 THEN '0.00%'
        ELSE CONCAT(ROUND(
            MAX(当日完成数) / MAX(当天应该换单数) * 100, 2), '%')
    END AS 当天换单完成率,
    CASE 
        WHEN MAX(高标签率应该换单数) = 0 THEN '0.00%'
        ELSE CONCAT(ROUND(
            MAX(高标签率考核通过数) / MAX(高标签率应该换单数) * 100, 2), '%')
    END AS 24H换单率
```

**注意**：
- 24H换单率的分母`高标签率应该换单数`和分子`高标签率考核通过数`虽然不在显示字段中，但仍需要在内层SELECT中保留，以供外层计算使用
- 删除的8个字段从外层SELECT中移除，但内层SELECT仍需保留用于计算

### 第3步：编译验证
**任务**：运行编译验证修改后的代码
```bash
dotnet build src/DAL/DAL.csproj
```

**预期结果**：编译成功（exit code: 0）

---

## 实施步骤总结

| 步骤 | 操作 | 状态 |
|------|------|------|
| 1 | 从外层SELECT删除8个多余字段 | 待执行 |
| 2 | 保留17个核心字段 | 待执行 |
| 3 | 编译验证 | 待执行 |

---

## 关键要点

1. **只改外层SELECT**：删除多余字段从显示层面，内层仍需保留用于24H换单率计算
2. **保持逻辑正确**：24H换单率的两个变量`高标签率应该换单数`和`高标签率考核通过数`需要在内层继续计算
3. **ONLY_FULL_GROUP_BY兼容**：所有内层字段都用MAX()包装，符合GROUP BY要求

