# 存储过程逻辑修复计划 - 修订版 ## 关键业务规则(已确认) **时间字段类型**: - ✅ `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 转换**,导致: 1. ReceiptTime 本已是 UTC-5,再转换一次就完全错了 2. 时间比较条件全部失效 3. 所有 JOIN 都返回空结果 4. 所有计数都是0 ## 修复方案 ### 关键修改点 #### 1. ReceiptTime 不需要转换 ```sql -- 错误(之前的做法) WHERE DATE(CONVERT_TZ(ahf.ReceiptTime, '+00:00', '-05:00')) = p_date -- 正确(新做法) WHERE DATE(ahf.ReceiptTime) = p_date ``` #### 2. CreatedAt 需要转换到 UTC-5 ```sql -- 需要转换 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点前到仓): ```sql -- 之前错误的做法: WHERE HOUR(CONVERT_TZ(tqa.ReceiptTime, '+00:00', '-05:00')) < 16 -- 改为(不转换,ReceiptTime已经是UTC-5) WHERE HOUR(tqa.ReceiptTime) < 16 ``` ## 新的存储过程逻辑框架 ```sql 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 - 修正所有时间比较逻辑 ### 第二步:数据库验证 ```sql -- 测试修改后的存储过程 CALL sp_GetDailyMetricsSummary('2026-04-03'); -- 验证各指标是否有数据 SELECT * FROM ( CALL sp_GetDailyMetricsSummary('2026-04-03') ) result; ``` ### 第三步:前端集成测试 启动后端,在仪表盘中查询同一日期,验证数据正确性 ## 根本问题总结 **错误原因**:对 ReceiptTime(已是 UTC-5)进行了多余的时区转换,导致时间条件全部失效,从而所有 JOIN 和 WHERE 条件都返回空结果,最终所有计数都是0。 **修复关键**:理解每个表的时间字段类型,正确地只对需要转换的字段(CreatedAt)进行转换,不转换已是目标时区的字段(ReceiptTime)。