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

84 lines
2.3 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `srt`.`expedition_arrived`(vExpeditionFk INT, vBufferFk INT, OUT vTypeFk INT)
BEGIN
/**
* La expedición ha entrado en un buffer, superando fc2
*
* @param vExpeditionFk Identificador de srt.expedition
* @param vBufferFk Identificador de srt.buffer
*
* @return vTypeFk Identificador de srt.bufferType
*
*/
DECLARE vComingBoxes INT;
DECLARE vHasWorkerWaiting BOOL;
DECLARE vIsRandomMoving BOOL;
DECLARE vState VARCHAR(15);
DECLARE vType VARCHAR(15);
DECLARE visBufferWhithoutBoxesCount BOOL;
IF vBufferFk = 1 THEN
SET vBufferFk = 0;
END IF;
INSERT INTO srt.expeditionLog (expeditionFk, bufferFk, `action`)
VALUES(vExpeditionFk, vBufferFk, 'ARR');
SELECT COUNT(*) INTO vComingBoxes
FROM srt.moving m
WHERE m.bufferToFk = vBufferFk
AND m.expeditionFk != vExpeditionFk;
SELECT b.hasWorkerWaiting,
c.isRandomMoving ,
(bt.typeName = 'STRAPPING') OR vBufferFk IN (c.bufferNoLabels, c.bufferTwoLabels, c.bufferDefault)
INTO vHasWorkerWaiting,
vIsRandomMoving,
visBufferWhithoutBoxesCount
FROM srt.buffer b
JOIN srt.bufferType bt ON bt.id = b.typeFk
JOIN srt.config c
WHERE b.id = vBufferFk
LIMIT 1;
SET vState = IF(srt.buffer_isFull(vBufferFk), 'FULL', 'FREE');
SET vType = IF(vHasWorkerWaiting
AND NOT vComingBoxes
AND NOT vIsRandomMoving
AND vState = 'FULL', 'UNLOADING', 'ACCUMULATION');
IF NOT visBufferWhithoutBoxesCount THEN
CALL srt.buffer_setStateType(vBufferFk,vState,vType);
END IF;
UPDATE srt.expedition e
JOIN srt.expeditionState es ON es.description = 'STORED'
SET e.bufferFk = IF(visBufferWhithoutBoxesCount,0,vBufferFk),
e.`position` = 0,
e.stateFk = es.id
WHERE e.id = vExpeditionFk;
UPDATE srt.expedition e
SET e.`position` = e.`position` + 1
WHERE e.bufferFk = vBufferFk
AND e.bufferFk > 0;
INSERT INTO srt.movingLog(expeditionFk, bufferFromFk, bufferToFk, stateFk, isColliding, movingFk, `action`)
SELECT expeditionFk, bufferFromFk, bufferToFk, stateFk, isColliding, id, 'ARRIVED'
FROM srt.moving
WHERE expeditionFk = vExpeditionFk
ORDER BY id DESC
LIMIT 1;
DELETE FROM srt.moving
WHERE expeditionFk = vExpeditionFk;
SELECT bt.id INTO vTypeFk
FROM srt.bufferType bt
JOIN srt.buffer b ON b.typeFk = bt.id
WHERE b.id = vBufferFk;
END$$
DELIMITER ;