Files
LabelChange-server/database/migrations/002_create_sp_daily_metrics_summary.sql
2026-06-01 16:30:29 +08:00

152 lines
5.1 KiB
SQL

DROP PROCEDURE IF EXISTS sp_GetDailyMetricsSummary;
DELIMITER $$
CREATE PROCEDURE sp_GetDailyMetricsSummary(IN p_date DATE)
BEGIN
DECLARE v_date_start DATETIME;
DECLARE v_date_end DATETIME;
DECLARE v_daily_new_replace_count INT;
DECLARE v_daily_should_replace_count INT;
DECLARE v_daily_success_count INT;
DECLARE v_daily_failure_count INT;
DECLARE v_cumulative_total_replace_count INT;
DECLARE v_daily_stop_count INT;
DECLARE v_daily_label_push_count INT;
DECLARE v_daily_scan_count INT;
DECLARE v_before_noon_arrived_count INT;
DECLARE v_afternoon_arrived_count INT;
DECLARE v_before_noon_passed_count INT;
DECLARE v_afternoon_passed_count INT;
SET v_date_start = CONVERT_TZ(CONCAT(DATE(p_date), ' 00:00:00'), '-05:00', '+00:00');
SET v_date_end = CONVERT_TZ(CONCAT(DATE(p_date), ' 23:59:59'), '-05:00', '+00:00');
SET v_daily_should_replace_count = (
SELECT COUNT(DISTINCT r.Id)
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
);
SET v_daily_new_replace_count = v_daily_should_replace_count;
SET v_before_noon_arrived_count = (
SELECT COUNT(DISTINCT r.Id)
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
);
SET v_afternoon_arrived_count = (
SELECT COUNT(DISTINCT r.Id)
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
);
SET v_daily_success_count = (
SELECT COUNT(DISTINCT s.NeutralWaybillNumber)
FROM label_scan_history s
WHERE s.Result = 0
AND s.CreatedAt >= v_date_start
AND s.CreatedAt <= v_date_end
);
SET v_before_noon_passed_count = (
SELECT COUNT(DISTINCT r.Id)
FROM label_replace_requests r
INNER JOIN arrival_handover_forms ahf
ON r.BillOfLadingNumber = ahf.HandoverNumber
OR r.MasterPackageNumber = ahf.HandoverNumber
INNER JOIN label_scan_history s ON r.NeutralWaybillNumber = s.NeutralWaybillNumber
WHERE r.Label IS NOT NULL
AND DATE(ahf.ReceiptTime) = p_date
AND HOUR(ahf.ReceiptTime) < 16
AND s.Result = 0
);
SET v_afternoon_passed_count = (
SELECT COUNT(DISTINCT r.Id)
FROM label_replace_requests r
INNER JOIN arrival_handover_forms ahf
ON r.BillOfLadingNumber = ahf.HandoverNumber
OR r.MasterPackageNumber = ahf.HandoverNumber
INNER JOIN label_scan_history s ON r.NeutralWaybillNumber = s.NeutralWaybillNumber
WHERE r.Label IS NOT NULL
AND DATE(ahf.ReceiptTime) = p_date
AND HOUR(ahf.ReceiptTime) >= 16
AND s.Result = 0
);
SET v_daily_stop_count = (
SELECT COUNT(DISTINCT s.NeutralWaybillNumber)
FROM label_scan_history s
WHERE s.CreatedAt >= v_date_start
AND s.CreatedAt <= v_date_end
AND s.Description IS NOT NULL
AND (LOWER(s.Description) LIKE '%stop%' OR s.Description LIKE '%停%' OR s.Description LIKE '%冻%')
);
SET v_daily_label_push_count = (
SELECT COUNT(DISTINCT r.Id)
FROM label_replace_requests r
WHERE r.Label IS NOT NULL
AND r.CreatedAt >= v_date_start
AND r.CreatedAt <= v_date_end
);
SET v_daily_scan_count = (
SELECT COUNT(DISTINCT s.Id)
FROM label_scan_history s
WHERE s.CreatedAt >= v_date_start
AND s.CreatedAt <= v_date_end
);
SET v_cumulative_total_replace_count = (
SELECT COUNT(DISTINCT r.Id)
FROM label_replace_requests r
LEFT JOIN label_scan_history s ON r.NeutralWaybillNumber = s.NeutralWaybillNumber AND s.Result = 0
INNER JOIN arrival_handover_forms ahf
ON r.BillOfLadingNumber = ahf.HandoverNumber
OR r.MasterPackageNumber = ahf.HandoverNumber
WHERE r.Label IS NOT NULL
AND ahf.ReceiptTime IS NOT NULL
AND DATE(ahf.ReceiptTime) < p_date
AND s.Id IS NULL
);
SET v_daily_failure_count = GREATEST(0, v_daily_should_replace_count - v_daily_success_count);
SELECT
p_date AS MetricsDate,
v_daily_new_replace_count AS DailyNewReplaceCount,
v_daily_should_replace_count AS DailyShouldReplaceCount,
v_daily_success_count AS DailySuccessCount,
v_cumulative_total_replace_count AS CumulativeTotalReplaceCount,
v_daily_stop_count AS DailyStopCount,
v_daily_label_push_count AS DailyLabelPushCount,
v_daily_scan_count AS DailyScanCount,
v_before_noon_arrived_count AS BeforeNoonArrivedCount,
v_afternoon_arrived_count AS AfternoonArrivedCount,
v_before_noon_passed_count AS BeforeNoonPassedCount,
v_afternoon_passed_count AS AfternoonPassedCount,
v_daily_failure_count AS DailyFailureCount,
NOW() AS DataFetchTime;
END$$
DELIMITER ;