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

196 lines
5.2 KiB
Markdown
Raw 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.

# 24H换单率验证SQL修复计划
**日期**2026-05-16
**问题**汇总统计SQL报错 - `ArrivalFormsWithDate` 表不存在
**目标**找到正确的表名修复SQL并重新验证
---
## 问题诊断
### 错误信息
```
1146 - Table 'lr01mainusa.ArrivalFormsWithDate' doesn't exist
```
### 原因分析
- `ArrivalFormsWithDate` 是在原SQL中创建的CTE公用表表达式
- 但在汇总验证SQL中我们可能没有完整包含这个CTE的定义
- 或者表名需要使用其他的到货表
---
## 修复方案
### 方案1查找正确的到货表名
需要找到以下表之一:
1. `ArrivalForms` - 原始到货表
2. `arrival_forms` - 小写版本
3. 其他相关的到货表
可以用以下查询查看可用的表:
```sql
-- 查找包含"arrival"的表
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME LIKE '%arrival%'
ORDER BY TABLE_NAME;
-- 查找包含"form"的表
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME LIKE '%form%'
ORDER BY TABLE_NAME;
```
### 方案2查看原始完整SQL中的表名
检查 `LabelReplaceRepository.cs` 中的完整SQL`ArrivalFormsWithDate` 是如何定义的。
### 方案3修复验证SQL
一旦找到正确的表名修复SQL的步骤
1. **识别正确的表结构**
- 到货表的名称
- 日期字段名称(到货时间或到货日期)
- 交接单号字段名称HandoverNumber或其他
2. **调整SQL语句**
- 用实际表名替换 `ArrivalFormsWithDate`
- 调整字段名称和连接条件
3. **测试修复后的SQL**
- 先执行 `SELECT` 子句中的单个子查询进行测试
- 逐步组建完整查询
---
## 详细的修复步骤
### 步骤1查找正确的表名
执行以下查询来发现数据库中存在的表:
```sql
-- 步骤1a查看所有表
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME NOT LIKE 'mysql%'
ORDER BY TABLE_NAME
LIMIT 50;
-- 步骤1b查看label相关的表
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME LIKE '%label%'
ORDER BY TABLE_NAME;
-- 步骤1c检查原SQL中使用的表
-- 查看 label_replace_requests 表的结构
DESC label_replace_requests;
-- 步骤1d查看是否有到货表
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND (TABLE_NAME LIKE '%arrival%'
OR TABLE_NAME LIKE '%form%'
OR TABLE_NAME LIKE '%handover%')
ORDER BY TABLE_NAME;
```
### 步骤2根据找到的表名修复SQL
假设找到的表名是 `arrival_forms`(示例),修复方式如下:
**修改前**
```sql
FROM ArrivalFormsWithDate a
INNER JOIN label_replace_requests l
ON l.BillOfLadingNumber = a.HandoverNumber
OR l.MasterPackageNumber = a.HandoverNumber
```
**修改后**
```sql
FROM arrival_forms a
INNER JOIN label_replace_requests l
ON l.BillOfLadingNumber = a.handover_number
OR l.MasterPackageNumber = a.handover_number
```
### 步骤3确认关键字段
需要确认以下字段在到货表中的实际名称:
- 到货日期/时间字段:`到货时间` 还是 `arrival_time` 还是 `arrival_date`
- 交接单号字段:`HandoverNumber` 还是 `handover_number` 还是其他?
可以用以下查询检查:
```sql
-- 查看到货表的字段结构
DESC arrival_forms; -- 或使用实际的表名
-- 或使用标准SQL查询
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'lr01mainusa'
AND TABLE_NAME = 'arrival_forms' -- 替换为实际表名
ORDER BY ORDINAL_POSITION;
```
### 步骤4调整日期条件
原SQL使用 `DATE(CONVERT_TZ(a.到货时间, '+00:00', '-05:00'))`
可能需要调整为:
- `DATE(a.arrival_time)` - 如果字段已经是UTC-5
- `DATE(CONVERT_TZ(a.arrival_time, '+00:00', '-05:00'))` - 如果需要时区转换
- `a.arrival_date` - 如果已经是日期类型
---
## 预期的修复结果
修复完成后验证SQL应该
- ✅ 能够成功执行
- ✅ 返回1行结果单行汇总
- ✅ 包含所有关键指标:分母、分子详细拆分等
- ✅ 数值合理(分母 > 0分子 ≤ 分母或接近)
---
## 备选方案
如果找不到对应的到货表,可能需要:
1. **查询原始SQL中的完整CTE**
- 打开 `LabelReplaceRepository.cs`
- 复制 `GetDailyLabelStatsChineseAsync()` 中完整的CTE定义
- 将完整的WITH...AS...CTE部分合并到验证SQL中
2. **简化验证SQL**
- 不使用 `ArrivalFormsWithDate`
- 直接从基础表(`label_replace_requests` + `arrival_forms` 或其他)重新构建
---
## 关键表和字段清单
需要在修复时确认以下信息:
| 元素 | 原始假设 | 实际值 | 确认状态 |
|------|--------|------|--------|
| 到货表 | ArrivalFormsWithDate | | 待查 |
| 到货日期字段 | 到货时间 | | 待查 |
| 交接单号字段 | HandoverNumber | | 待查 |
| 订单表 | label_replace_requests | label_replace_requests | ✓ |
| 扫描历史表 | label_scan_history | label_scan_history | ✓ |
| 扫描状态表 | OverallScanStatus | | 待查 |