salix/db/routines/srt/procedures/expedition_get.sql

78 lines
1.9 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`expedition_get`(vAntennaFk INT, OUT vExpeditionOutFk INT )
BEGIN
DECLARE vId INT;
DECLARE vCount INT;
DECLARE vCreatedMin DATETIME;
DECLARE vCreatedMax DATETIME;
DECLARE vSecondsScope INT DEFAULT 30;
START TRANSACTION;
SELECT count(DISTINCT lr.code) INTO vCount
FROM srt.lastRFID lr
WHERE lr.antennaFk = vAntennaFk
AND NOT isConsulted;
CASE vCount
WHEN 0 THEN
SET vExpeditionOutFk = srt.expedition_check(vCount);
WHEN 1 THEN
SELECT CAST(code AS DECIMAL(10,0)), lr.id
INTO vExpeditionOutFk, vId
FROM srt.lastRFID lr
WHERE lr.antennaFk = vAntennaFk
AND NOT isConsulted
ORDER BY lr.seenCount DESC, lr.peakRssi
LIMIT 1;
ELSE
-- Descartamos aquellas lecturas que se han producido unos segundos antes.
SELECT MIN(created), MAX(created) INTO vCreatedMin, vCreatedMax
FROM srt.lastRFID lr
WHERE lr.antennaFk = vAntennaFk
AND NOT isConsulted;
UPDATE srt.lastRFID lr
JOIN (SELECT id, code
FROM srt.lastRFID
WHERE created
BETWEEN TIMESTAMPADD(SECOND, - vSecondsScope, vCreatedMin)
AND TIMESTAMPADD(SECOND, -1, vCreatedMin)
AND isChoosed = 1#
) sub ON sub.code = lr.code AND sub.id != lr.id
SET lr.isConsulted = TRUE
WHERE lr.created BETWEEN vCreatedMin AND vCreatedMax
AND lr.antennaFk = vAntennaFk;
SELECT CAST(code AS DECIMAL(10,0)), lr.id
INTO vExpeditionOutFk, vId
FROM srt.lastRFID lr
WHERE lr.antennaFk = vAntennaFk
AND NOT isConsulted
ORDER BY lr.peakRssi DESC, lr.seenCount DESC #
LIMIT 1;
END CASE;
UPDATE srt.lastRFID
SET isChoosed = TRUE
WHERE id = vId;
UPDATE srt.lastRFID
SET isConsulted = TRUE
WHERE antennaFk = vAntennaFk
AND NOT isConsulted;
COMMIT;
INSERT INTO srt.expeditionLog (expeditionFk, bufferFk, `action`, antennaFk) VALUES(vExpeditionOutFk, 0, 'DIM', vAntennaFk);
END$$
DELIMITER ;