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

75 lines
2.0 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`moving_next`()
BEGIN
DECLARE vExpeditionFk INT;
DECLARE vMovingFk INT;
DECLARE vSecondsFromLastRFIDReading INT;
CALL srt.randomMoving_Launch();
CALL srt.moving_GroupOut();
CALL srt.moving_CollidingSet();
SELECT TIME_TO_SEC((TIMEDIFF(util.VN_NOW(),MAX(lr.created))))
INTO vSecondsFromLastRFIDReading
FROM srt.lastRFID lr;
SELECT m.id INTO vMovingFk
FROM srt.moving m
JOIN srt.expedition e ON e.id = m.expeditionFk
JOIN srt.movingState ms ON ms.id = m.stateFk
JOIN srt.buffer b ON b.id = m.bufferToFk
JOIN srt.buffer b2 ON b2.id = m.bufferFromFk
JOIN srt.bufferType bt ON bt.id = b.typeFk
JOIN srt.bufferState bs ON bs.id = b.stateFk
JOIN srt.config c
WHERE NOT ms.isInterfering
AND NOT m.isColliding
AND (c.isEnteringBlocked = FALSE OR m.bufferFromFk > 0)
AND (e.`position` = 1 OR m.bufferFromFk = 0)
AND (vSecondsFromLastRFIDReading > c.enteringSecondsReserve OR m.bufferFromFk = 0)
AND (bs.description != 'FULL' OR m.bufferFromFk = 0)
ORDER BY (m.bufferFromFk = 0) DESC,
m.bufferFromFk DESC
LIMIT 1;
SELECT m.expeditionFk
INTO vExpeditionFk
FROM moving m
WHERE m.id = vMovingFk;
IF vExpeditionFk THEN
SELECT m.expeditionFk,
m.bufferFromFk,
m.bufferToFk
FROM moving m
WHERE m.id = vMovingFk;
UPDATE expedition e
JOIN expeditionState es ON es.description = 'MOVING'
SET e.stateFk = es.id
WHERE e.id = vExpeditionFk;
UPDATE srt.moving m
JOIN srt.movingState ms ON ms.description = 'MOVING'
SET m.stateFk = ms.id
WHERE m.id = vMovingFk;
INSERT INTO srt.movingLog(expeditionFk, bufferFromFk, bufferToFk, stateFk, isColliding, movingFk, `action`)
SELECT expeditionFk, bufferFromFk, bufferToFk, stateFk, isColliding, id, 'NEXT'
FROM srt.moving
WHERE id = vMovingFk;
ELSE
SELECT 0 expeditionFk, 0 bufferFromFk, 0 bufferToFk;
END IF;
END$$
DELIMITER ;