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 ;