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

51 lines
1.4 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`randomMoving`(vBufferMin INT, vBufferMax INT)
BEGIN
DECLARE vBufferOld INT DEFAULT 0;
DECLARE vBufferFk INT;
DECLARE vExpeditionFk INT;
SELECT e.id INTO vExpeditionFk
FROM srt.expedition e
LEFT JOIN srt.moving m ON m.expeditionFk = e.id
JOIN srt.buffer b ON b.id = e.bufferFk
JOIN srt.bufferType bt ON bt.id = b.typeFk
WHERE e.bufferFk BETWEEN vBufferMin AND vBufferMax
AND m.id IS NULL
AND bt.typeName = 'ACCUMULATION'
AND b.isActive
ORDER BY e.`position`, e.updated
LIMIT 1;
SELECT IFNULL(e.bufferFk,0) INTO vBufferOld
FROM srt.expedition e
WHERE e.id = vExpeditionFk;
SELECT b.id INTO vBufferFk
FROM srt.buffer b
JOIN srt.bufferFreeLength bfl ON bfl.bufferFk = b.id
JOIN srt.bufferType bt ON bt.id = b.typeFk
JOIN srt.config c
LEFT JOIN srt.moving m ON m.bufferToFk = b.id
LEFT JOIN srt.moving m2 ON m2.bufferFromFk = b.id
WHERE ISNULL(m.bufferToFk)
AND ISNULL(m2.bufferFromFk)
AND b.id BETWEEN vBufferMin AND vBufferMax
AND b.id != vBufferOld
AND b.isActive
AND bt.typeName = 'ACCUMULATION'
AND bfl.freeLength > c.freeLength * 2
ORDER BY (b.id = floor(MINUTE(util.VN_NOW())/2)) DESC
LIMIT 1;
IF vBufferFk THEN
INSERT INTO srt.moving (expeditionFk, bufferFromFk, bufferToFk)
SELECT e.id, e.bufferFk, vBufferFk
FROM srt.expedition e
WHERE e.id = vExpeditionFk;
END IF;
END$$
DELIMITER ;