diff --git a/db/routines/vn/procedures/expeditionPallet_build.sql b/db/routines/vn/procedures/expeditionPallet_build.sql index a33439061..2df73bb85 100644 --- a/db/routines/vn/procedures/expeditionPallet_build.sql +++ b/db/routines/vn/procedures/expeditionPallet_build.sql @@ -5,26 +5,22 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`expeditionPallet_buil vWorkerFk INT, OUT vPalletFk INT ) -proc: BEGIN -/** - * Builds an expedition pallet. +BEGIN +/** Construye un pallet de expediciones. * - * First, it checks if these expeditions already belong to another pallet, - * in which case it returns an error. + * Primero comprueba si esas expediciones ya pertenecen a otro pallet, + * en cuyo caso actualiza ese pallet. * - * @param vExpeditions JSON_ARRAY with this structure [exp1, exp2, exp3, ...] - * @param vArcId INT Identifier of arcRead - * @param vWorkerFk INT Identifier of worker - * @param out vPalletFk Identifier of expeditionPallet + * @param vExpeditions JSON_ARRAY con esta estructura [exp1, exp2, exp3, ...] + * @param vArcId INT Identificador de arcRead + * @param vWorkerFk INT Identificador de worker + * @param out vPalletFk Identificador de expeditionPallet */ - DECLARE vCounter INT; DECLARE vExpeditionFk INT; DECLARE vTruckFk INT; DECLARE vPrinterFk INT; DECLARE vExpeditionStateTypeFk INT; - DECLARE vFreeExpeditionCount INT; - DECLARE vExpeditionWithPallet INT; CREATE OR REPLACE TEMPORARY TABLE tExpedition ( expeditionFk INT, @@ -48,63 +44,48 @@ proc: BEGIN WHERE e.id = vExpeditionFk; END WHILE; - SELECT COUNT(expeditionFk) INTO vFreeExpeditionCount - FROM tExpedition - WHERE palletFk IS NULL; - - SELECT COUNT(expeditionFk) INTO vExpeditionWithPallet - FROM tExpedition - WHERE palletFk; - - IF vExpeditionWithPallet THEN - UPDATE arcRead - SET error = ( - SELECT GROUP_CONCAT(expeditionFk SEPARATOR ', ') - FROM tExpedition - WHERE palletFk - ) - WHERE id = vArcId; - LEAVE proc; - END IF; - - IF NOT vFreeExpeditionCount THEN - CALL util.throw ('NO_FREE_EXPEDITIONS'); - END IF; - - SELECT roadmapStopFk INTO vTruckFk + SELECT palletFk INTO vPalletFk FROM ( - SELECT rm.roadmapStopFk, count(*) n - FROM routesMonitor rm - JOIN tExpedition e ON e.routeFk = rm.routeFk - WHERE e.palletFk IS NULL - GROUP BY roadmapStopFk + SELECT palletFk, count(*) n + FROM tExpedition + WHERE palletFk > 0 + GROUP BY palletFk ORDER BY n DESC - LIMIT 1 - ) sub; + LIMIT 100 + ) sub + LIMIT 1; - IF vTruckFk IS NULL THEN - CALL util.throw ('TRUCK_NOT_AVAILABLE'); + IF vPalletFk IS NULL THEN + SELECT roadmapStopFk INTO vTruckFk + FROM ( + SELECT rm.roadmapStopFk, count(*) n + FROM routesMonitor rm + JOIN tExpedition e ON e.routeFk = rm.routeFk + GROUP BY roadmapStopFk + ORDER BY n DESC + LIMIT 1 + ) sub; + + IF vTruckFk IS NULL THEN + CALL util.throw ('TRUCK_NOT_AVAILABLE'); + END IF; + + INSERT INTO expeditionPallet SET truckFk = vTruckFk; + + SET vPalletFk = LAST_INSERT_ID(); END IF; - INSERT INTO expeditionPallet SET truckFk = vTruckFk; - - SET vPalletFk = LAST_INSERT_ID(); - INSERT INTO expeditionScan(expeditionFk, palletFk, workerFk) SELECT expeditionFk, vPalletFk, vWorkerFk FROM tExpedition - WHERE palletFk IS NULL; + ON DUPLICATE KEY UPDATE palletFk = vPalletFk, workerFk = vWorkerFk; SELECT id INTO vExpeditionStateTypeFk FROM expeditionStateType WHERE code = 'PALLETIZED'; - - INSERT INTO expeditionState(expeditionFk, typeFk) - SELECT expeditionFk, vExpeditionStateTypeFk - FROM tExpedition - WHERE palletFk IS NULL; - UPDATE arcRead SET error = NULL WHERE id = vArcId; + INSERT INTO expeditionState(expeditionFk, typeFk) + SELECT expeditionFk, vExpeditionStateTypeFk FROM tExpedition; SELECT printerFk INTO vPrinterFk FROM arcRead WHERE id = vArcId;