上传源代码版本

This commit is contained in:
Im-Jenisson
2026-06-01 16:30:29 +08:00
commit b2a9b7d3c2
462 changed files with 104365 additions and 0 deletions

View File

@@ -0,0 +1,249 @@
# 24小时换单率 分子/分母 精确定义与诊断报告
**诊断完成日期**2026-05-16
**问题**24H换单率超过100%4745.83%、17924.00%、11193.10%、78075.00%
---
## 第一部分24H换单率的精确定义
### 分子Numerator高标签率考核通过数
**来源**`DailyHighLabelRateAssessed` CTE第1037-1047行
**完整计算链**
```
DailyBeforeNoonPassed第999-1015行
按照"首次成功日期"分组
统计16点前到仓 + 完成时间<=考核时间 + 高标签率(ar.考核时间 IS NOT NULL)
结果16点前考核通过包裹数
DailyAfternoonPassed第1017-1034行
按照"首次成功日期"分组
统计16点后到仓 + 完成时间<=考核时间 + 高标签率(ar.考核时间 IS NOT NULL)
结果16点后考核通过包裹数
DailyHighLabelRateAssessed第1037-1047行
UNION ALL两个表后GROUP BY 日期
SUM(16点前) + SUM(16点后) = 高标签率考核通过数
```
**精确定义**
```
分子 = 按"首次成功日期"分组的,
在24小时考核期限内完成的
且冻结标签率≥80%的交接单中的包裹总数
```
**关键特征**
-`首次成功日期`(完成时间)分组
- 包含两部分16点前到仓完成 + 16点后到仓完成
- 都要求"完成时间 <= 考核时间"
- 都要求"高标签率"(考核时间 IS NOT NULL
---
### 分母Denominator高标签率应该换单数
**来源**`DailyHighLabelRateShould` CTE第1065-1082行
**完整定义**
```sql
SELECT
DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00')) AS 日期,
COUNT(DISTINCT CONCAT(ar.BillOfLadingNumber, '|', ar.MasterPackageNumber)) AS 高标签率应该换单数
FROM ArrivalRequests ar
INNER JOIN (
SELECT DISTINCT
BillOfLadingNumber,
MasterPackageNumber
FROM InterchangeUnitLabelRates
WHERE label_rate_percent >= 80
) high_label_units ON ar.BillOfLadingNumber = high_label_units.BillOfLadingNumber
AND ar.MasterPackageNumber = high_label_units.MasterPackageNumber
GROUP BY DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00'))
```
**精确定义**
```
分母 = 按"到货日期"分组的,
冻结标签率≥80%的交接单中的全部包裹总数
```
**关键特征**
-`到货日期`(到货时间)分组
- 只要求冻结标签率≥80%,不要求已完成
- 是该日期应该履约完成的全部包裹数
---
### 完整公式
```
24H换单率 = (高标签率考核通过数 / 高标签率应该换单数) × 100%
```
---
## 第二部分:关键发现 - 维度不一致问题
### 核心问题:分子和分母的日期维度不同
| 项目 | 日期维度 | 含义 | 来源CTE |
|------|--------|------|--------|
| **分子** | 首次成功日期 | 完成的日期 | DailyHighLabelRateAssessed |
| **分母** | 到货日期 | 应该完成的日期 | DailyHighLabelRateShould |
### 导致的后果
**数学上不可能**分子和分母的日期不同步导致比率超过100%
**具体例子**
```
2026-05-15
- 应该换单数(分母)= 100个包裹到货在05-15
- 完成的包裹数(分子)= 0个因为大多数在05-16完成
- 24H换单率 = 0 / 100 = 0%
2026-05-16
- 应该换单数(分母)= 50个包裹到货在05-16
- 完成的包裹数(分子)= 130个包括05-15到货但05-16完成的100个 + 05-16到货已完成的30个
- 24H换单率 = 130 / 50 = 260% ← 超过100%
```
这正是你看到的4745%、17924%等异常值的根本原因!
---
## 第三部分:问题根源诊断
### 根本原因:业务逻辑定义与代码实现的矛盾
**业务期望**(根据用户的表述):
```
24H换单率 = (实际完成并通过考核的包裹数) / (应该履约完成的包裹数) × 100%
这是一个"期望通过率"的概念:
- 对于到货在05-15的订单期望在24H内到05-16 16:00-23:59完成
- 对于到货在05-16的订单期望在24H内到05-17 16:00-23:59完成
```
**代码实现**(当前):
```
分子:按"完成日期"分组
分母:按"到货日期"分组
导致在某一天的24H换单率 = (可能包括多天到货的完成包裹数) / (仅该天到货的包裹数)
这是数学上错误的!
```
### 为什么会出现这个错误?
**推论**
1. DailyHighLabelRateAssessed是按"首次成功日期"来汇总
2. DailyHighLabelRateShould是按"到货日期"来汇总
3. 在第1222-1223行的LEFT JOIN中
```sql
LEFT JOIN DailyHighLabelRateAssessed dhras ON t.日期 = dhras.日期
LEFT JOIN DailyHighLabelRateShould dhlrs ON t.日期 = dhlrs.日期
```
4. 虽然都用`t.日期`作为JOIN条件但这个日期实际上是不同含义的
5. 最终导致分子和分母被错误地配对
---
## 第四部分:修复建议
### 选项1修改分子为按到货日期分组推荐
**核心逻辑**
- 分母:按到货日期统计应该换单数(已正确)
- 分子:改为按到货日期统计完成数,而不是按首次成功日期
**修改步骤**
1. 修改 DailyBeforeNoonPassed改`GROUP BY DATE(CONVERT_TZ(oss.首次成功时间, '+00:00', '-05:00'))`为`GROUP BY DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00'))`
2. 修改 DailyAfternoonPassed同样修改
3. 修改 DailyHighLabelRateAssessed改`GROUP BY 日期`的含义来自哪个CTE
**计算含义**
```
某一天的24H换单率 = (该天到货的、在24H内完成的高标签率包裹) / (该天到货的、高标签率的全部包裹) × 100%
```
**优点**:符合业务逻辑,数学上正确,分子≤分母
---
### 选项2保持按完成日期分组修改分母
**修改步骤**
1. 修改 DailyHighLabelRateShould改`GROUP BY DATE(CONVERT_TZ(ar.到货时间, '+00:00', '-05:00'))`为按首次成功日期
2. 只统计已经完成的、高标签率的订单
**问题**:这样分母的含义会变,不符合"应该履约"的业务逻辑
---
## 第五部分:精确答案总结
### 用户问题:"你给我表述下24小时换单率的分子和分母分别是什么"
**当前代码中的分子**
```
分子 = 按首次成功日期分组的、在24小时考核期限内完成的高标签率包裹总数
含义:某一天完成的包裹中,有多少是高标签率且满足考核时间的
```
**当前代码中的分母**
```
分母 = 按到货日期分组的、冻结标签率≥80%的全部包裹总数
含义某一天到货的、标签率≥80%的全部包裹
```
**为什么超过100%**
```
因为分子和分母的日期维度不同!
例如某一天:
- 分母 = 该天到货的50个高标签率包裹
- 分子 = 该天完成的100个高标签率包裹来自前几天到货的
- 比率 = 100/50 = 200% ← 超过100%
```
**正确的做法**
```
分子和分母应该基于同一个日期维度:
要么都按到货日期(推荐)
要么都按完成日期
推荐按到货日期,因为这样符合"履约"的业务含义:
某一天到货的订单在24小时内完成的比例是多少
```
---
## 建议后续行动
1. **确认业务逻辑**询问用户24H换单率到底应该统计什么
- A) 某天到货的订单24小时内完成的比例推荐
- B) 某天完成的订单中,有多少满足考核要求?
2. **根据确认结果修改代码**:修改分子或分母之一,确保日期维度一致
3. **验证修复**确保修复后24H换单率≤100%
---
## 关键代码位置
- DailyBeforeNoonPassed第999-1015行
- DailyAfternoonPassed第1017-1034行
- DailyHighLabelRateAssessed第1037-1047行
- DailyHighLabelRateShould第1065-1082行
- 外层JOIN第1212-1230行