# 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 | ？ | 待查 |

