上传源代码版本

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,246 @@
# 24H换单率异常超高的根本原因诊断与修复计划v2
**问题**修改后24H换单率仍然异常高4745%、17924%、11193%、78075%
**用户需求**明确表述24小时换单率的分子和分母分别是什么
---
## 第1阶段明确当前的计算定义
### 任务1读取SQL中24H换单率的完整计算公式
**位置**LabelReplaceRepository.cs 中的最终SELECT语句
**检查内容**
- [ ] 找到24H换单率的计算表达式
- [ ] 确认分子是什么字段/表达式
- [ ] 确认分母是什么字段/表达式
- [ ] 看看是否有其他修饰如乘以100
**目的**:得到精确的公式:`24H换单率 = ? / ? × 100%`
### 任务2逐个检查涉及的CTE
**需要检查的CTE**
1. [ ] DailyHighLabelRateAssessed高标签率考核通过数
- 检查是否有重复统计
- 检查UNION ALL是否导致了重复
2. [ ] DailyHighLabelRateShould高标签率应该换单数
- 检查修改后的逻辑是否正确
- 检查CONCAT是否导致了其他问题
3. [ ] DailyBeforeNoonPassed16点前考核通过
- 检查是否有重复的包裹被计算
4. [ ] DailyAfternoonPassed16点后考核通过
- 检查是否有重复的包裹被计算
### 任务3用SQL直接查询各CTE的结果
**执行诊断查询**
```sql
-- 查询某一天的数据分解
SELECT '日期' AS 类型, 日期 AS , 0 AS 数量
UNION ALL
SELECT 'DailyBeforeNoonPassed', CAST(16点前考核通过包裹数 AS CHAR), 16点前考核通过包裹数
UNION ALL
SELECT 'DailyAfternoonPassed', CAST(16点后考核通过包裹数 AS CHAR), 16点后考核通过包裹数
UNION ALL
SELECT 'DailyHighLabelRateShould', CAST(高标签率应该换单数 AS CHAR), 高标签率应该换单数
```
**目的**:看到每个数值,找出倍数关系
---
## 第2阶段分析数值关系
### 任务4倍数分析
**假设某一天的数据**
- 高标签率应该换单数 = 100
- 16点前考核通过 = 200
- 16点后考核通过 = 100
- 高标签率考核通过数 = 200 + 100 = 300
- 24H换单率 = 300 / 100 × 100% = 300%(已经异常)
**如果24H换单率 = 4745%**
- 可能是4745 / 100 × 100% = 4745%
- 那么分子 = 4745分母 = 100
- 这表示高标签率考核通过数 = 4745或者计算中的乘法错误
**检查点**
- [ ] 16点前考核通过包裹是否被多次计算
- [ ] 16点后考核通过包裹是否被多次计算
- [ ] 是否有UNION ALL导致的重复
- [ ] 是否有JOIN导致的笛卡尔积
### 任务5追踪单个包裹
**选择一个具体的包裹**
- [ ] 查询这个包裹在 DailyBeforeNoonPassed 中是否出现1次
- [ ] 查询这个包裹在 DailyAfternoonPassed 中是否出现1次
- [ ] 查询在 DailyHighLabelRateAssessed 中被计算了几次
- [ ] 确定重复的位置
---
## 第3阶段确定真正的问题
### 可能的原因
#### 原因ADailyBeforeNoonPassed/DailyAfternoonPassed中有重复
**症状**
- 同一个包裹在 DailyBeforeNoonPassed 中被计算多次
- 或者同一个包裹在 DailyAfternoonPassed 中被计算多次
**检查方式**
```sql
SELECT 日期, COUNT(*) as 行数
FROM DailyBeforeNoonPassed
GROUP BY 日期
-- 应该每天只有1条记录如果有多条就是问题
```
#### 原因BDailyHighLabelRateAssessed中UNION ALL导致重复
**症状**
- DailyBeforeNoonPassed 和 DailyAfternoonPassed 的数据在 UNION ALL 后没有正确汇总
- 或者 GROUP BY 日期后仍然有多行
**检查方式**
```sql
SELECT 日期, COUNT(*) as 行数
FROM DailyHighLabelRateAssessed
GROUP BY 日期
-- 应该每天只有1条记录
```
#### 原因C主SELECT中的JOIN导致笛卡尔积
**症状**
- 多个 LEFT JOIN 导致了行数增加
- 例如JOIN DailyHighLabelRateShould 和 JOIN DailyHighLabelRateAssessed 在同时时产生了交叉
**检查方式**
- 在主SELECT中加入 COUNT(*),看总记录数
- 检查是否多于预期
#### 原因DCOUNT的方式问题
**症状**
- 在外层SELECT中没有正确处理聚合
- 或者在JOIN后没有正确聚合
---
## 第4阶段修复问题
### 修复策略(取决于根本原因)
#### 如果是原因ADailyBeforeNoonPassed/DailyAfternoonPassed重复
**修复方式**
- 检查这两个CTE的 GROUP BY 是否完整
- 可能需要加入更多分组字段
- 或者改成 SELECT DISTINCT
#### 如果是原因BDailyHighLabelRateAssessed汇总错误
**修复方式**
```sql
-- 改为
DailyHighLabelRateAssessed AS (
SELECT
日期,
SUM(16点前考核通过包裹数) + SUM(16点后考核通过包裹数) AS 高标签率考核通过数
FROM (
SELECT DISTINCT 日期, 16点前考核通过包裹数, 0 AS 16点后考核通过包裹数
FROM DailyBeforeNoonPassed
UNION ALL
SELECT DISTINCT 日期, 0 AS 16点前考核通过包裹数, 16点后考核通过包裹数
FROM DailyAfternoonPassed
) t
GROUP BY 日期
)
```
#### 如果是原因CJOIN笛卡尔积
**修复方式**
- 在主SELECT中加 GROUP BY 日期
- 或者改变JOIN的方式让每个日期只有一条记录进入
#### 如果是原因DCOUNT方式问题
**修复方式**
- 确保所有字段都被正确聚合
- 如果有非聚合函数的字段,必须在 GROUP BY 中
---
## 第5阶段编写清晰的24H换单率定义
### 任务:编写规范定义
**定义模板**
```
24H换单率 的定义
================
分子 = ___________准确的字段名或计算表达式
= 来源CTE: ___________
= 含义: ___________
分母 = ___________准确的字段名或计算表达式
= 来源CTE: ___________
= 含义: ___________
计算公式 = 分子 / 分母 × 100%
业务含义:
```
**填写规则**
- [ ] 分子必须精确到SQL字段或表达式
- [ ] 分母必须精确到SQL字段或表达式
- [ ] 必须注明数据来源
- [ ] 必须解释为什么这样定义
---
## 第6阶段验证修复
### 任务:验证修复后的结果
**验证标准**
- [ ] 24H换单率 <= 100%
- [ ] 分子 <= 分母
- [ ] 每个日期的数据合理(对比业务预期)
- [ ] 能够手工验证某一天的计算结果
### 测试用例
**准备简单数据**
- 某一天100个应该换单的包裹
- 其中80个在考核期限内完成
- 预期24H换单率 = 80 / 100 × 100% = 80%
---
## 最终输出
### 清晰的表述
必须能够清楚地说出:
**"24H换单率 = ________ / ________ × 100%"**
例如:
- "24H换单率 = 高标签率考核通过数 / 高标签率应该换单数 × 100%"
- "其中高标签率考核通过数来自DailyHighLabelRateAssessed......"
- "其中高标签率应该换单数来自DailyHighLabelRateShould......"