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 ;