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

5.2 KiB
Raw Permalink Blame History

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. 其他相关的到货表

可以用以下查询查看可用的表:

-- 查找包含"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 中的完整SQLArrivalFormsWithDate 是如何定义的。

方案3修复验证SQL

一旦找到正确的表名修复SQL的步骤

  1. 识别正确的表结构

    • 到货表的名称
    • 日期字段名称(到货时间或到货日期)
    • 交接单号字段名称HandoverNumber或其他
  2. 调整SQL语句

    • 用实际表名替换 ArrivalFormsWithDate
    • 调整字段名称和连接条件
  3. 测试修复后的SQL

    • 先执行 SELECT 子句中的单个子查询进行测试
    • 逐步组建完整查询

详细的修复步骤

步骤1查找正确的表名

执行以下查询来发现数据库中存在的表:

-- 步骤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(示例),修复方式如下:

修改前

FROM ArrivalFormsWithDate a
INNER JOIN label_replace_requests l 
    ON l.BillOfLadingNumber = a.HandoverNumber 
    OR l.MasterPackageNumber = a.HandoverNumber

修改后

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 还是其他?

可以用以下查询检查:

-- 查看到货表的字段结构
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 待查