3.8 KiB
3.8 KiB
存储过程逻辑修复计划 - 修订版
关键业务规则(已确认)
时间字段类型:
- ✅
arrival_handover_forms.ReceiptTime= 已经是 UTC-5 时间(美国东部时间) - ✅
label_replace_requests.CreatedAt= UTC+0 时间(需要转换到 UTC-5) - ✅
label_scan_history.CreatedAt= UTC+0 时间(需要转换到 UTC-5)
问题根因
之前的存储过程在 ReceiptTime 上进行了不必要的 CONVERT_TZ 转换,导致:
- ReceiptTime 本已是 UTC-5,再转换一次就完全错了
- 时间比较条件全部失效
- 所有 JOIN 都返回空结果
- 所有计数都是0
修复方案
关键修改点
1. ReceiptTime 不需要转换
-- 错误(之前的做法)
WHERE DATE(CONVERT_TZ(ahf.ReceiptTime, '+00:00', '-05:00')) = p_date
-- 正确(新做法)
WHERE DATE(ahf.ReceiptTime) = p_date
2. CreatedAt 需要转换到 UTC-5
-- 需要转换
WHERE DATE(CONVERT_TZ(r.CreatedAt, '+00:00', '-05:00')) = p_date
WHERE DATE(CONVERT_TZ(s.CreatedAt, '+00:00', '-05:00')) = p_date
3. 时间比较逻辑修正
对于 BeforeNoonArrivedCount(16点前到仓):
-- 之前错误的做法:
WHERE HOUR(CONVERT_TZ(tqa.ReceiptTime, '+00:00', '-05:00')) < 16
-- 改为(不转换,ReceiptTime已经是UTC-5)
WHERE HOUR(tqa.ReceiptTime) < 16
新的存储过程逻辑框架
CREATE PROCEDURE sp_GetDailyMetricsSummary(IN p_date DATE)
BEGIN
-- 不需要转换 ReceiptTime,它已经是 UTC-5
-- 1. DailyShouldReplaceCount:当日到仓的标签订单数
SELECT COUNT(DISTINCT r.Id) INTO v_daily_should_replace_count
FROM label_replace_requests r
INNER JOIN arrival_handover_forms ahf ON
(r.BillOfLadingNumber = ahf.HandoverNumber OR r.MasterPackageNumber = ahf.HandoverNumber)
WHERE r.Label IS NOT NULL
AND DATE(ahf.ReceiptTime) = p_date; -- 不转换!
-- 2. DailySuccessCount:当日扫描成功数
SELECT COUNT(DISTINCT s.NeutralWaybillNumber) INTO v_daily_success_count
FROM label_scan_history s
WHERE s.Result = 0
AND DATE(CONVERT_TZ(s.CreatedAt, '+00:00', '-05:00')) = p_date; -- 需要转换
-- 3. BeforeNoonArrivedCount:16点前到仓数
SELECT COUNT(DISTINCT r.Id) INTO v_before_noon_arrived_count
FROM label_replace_requests r
INNER JOIN arrival_handover_forms ahf ON
(r.BillOfLadingNumber = ahf.HandoverNumber OR r.MasterPackageNumber = ahf.HandoverNumber)
WHERE r.Label IS NOT NULL
AND DATE(ahf.ReceiptTime) = p_date -- 不转换!
AND HOUR(ahf.ReceiptTime) < 16; -- 不转换!
-- ... 其他指标类似修改
END
修复清单
- 移除 ReceiptTime 上的所有 CONVERT_TZ 转换
- 保留 CreatedAt 上的 CONVERT_TZ 转换(UTC+0 → UTC-5)
- 修复 HOUR() 函数调用 - 不转换 ReceiptTime
- 测试修复后的存储过程
- 验证各个指标是否返回正确的非零数据
执行步骤
第一步:修改存储过程
根据上述规则修改 sp_GetDailyMetricsSummary 存储过程,主要是:
- 移除 ReceiptTime 的 CONVERT_TZ
- 保留 CreatedAt 的 CONVERT_TZ
- 修正所有时间比较逻辑
第二步:数据库验证
-- 测试修改后的存储过程
CALL sp_GetDailyMetricsSummary('2026-04-03');
-- 验证各指标是否有数据
SELECT * FROM (
CALL sp_GetDailyMetricsSummary('2026-04-03')
) result;
第三步:前端集成测试
启动后端,在仪表盘中查询同一日期,验证数据正确性
根本问题总结
错误原因:对 ReceiptTime(已是 UTC-5)进行了多余的时区转换,导致时间条件全部失效,从而所有 JOIN 和 WHERE 条件都返回空结果,最终所有计数都是0。
修复关键:理解每个表的时间字段类型,正确地只对需要转换的字段(CreatedAt)进行转换,不转换已是目标时区的字段(ReceiptTime)。