上传源代码版本

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,195 @@
# 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 | | 待查 |