fix: refs #4409 don't cache parent ids
gitea/salix/pipeline/pr-dev There was a failure building this commit Details

This commit is contained in:
Juan Ferrer 2025-02-24 18:05:21 +01:00
parent 1c77e69ae4
commit 5e630562ce
10 changed files with 128 additions and 240 deletions

View File

@ -1,22 +1,9 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyLot_refresh`(
`vTable` ENUM('buy', 'entry', 'travel'),
`vTable` ENUM('lot', 'entry', 'travel'),
`vId` INT)
BEGIN
START TRANSACTION;
-- Update cache
CREATE OR REPLACE TEMPORARY TABLE tLotOld
ENGINE = MEMORY
SELECT lotFk
FROM buyLot
WHERE
(vTable = 'buy' AND lotFk = vId)
OR (vTable = 'entry' AND entryFk = vId)
OR (vTable = 'travel' AND travelFk = vId);
CREATE OR REPLACE TEMPORARY TABLE tLotNew
CREATE OR REPLACE TEMPORARY TABLE tBuyAlive
ENGINE = MEMORY
SELECT
t.id travelFk,
@ -30,29 +17,37 @@ BEGIN
b.itemFk,
b.life,
b.quantity
FROM vn.buy b
FROM tLotStatus oo
JOIN vn.buy b ON b.lotFk = oo.lotFk
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.item i ON i.id = b.itemFk
WHERE b.quantity > 0
AND b.isAlive
AND (
(vTable = 'buy' AND b.lotFk = vId)
OR (vTable = 'entry' AND e.id = vId)
OR (vTable = 'travel' AND t.id = vId)
);
WHERE oo.isAlive;
DELETE FROM buyLot
WHERE lotFk IN (
SELECT lotFk FROM tLotOld
EXCEPT
SELECT lotFk FROM tLotNew
);
START TRANSACTION;
-- Delete excluded/deleted/dead lots
DELETE l FROM buyLot l
JOIN tLotStatus oo USING(lotFk)
WHERE oo.isExcluded OR NOT oo.isAlive;
-- Delete undead lot picks
UPDATE buyOut o
JOIN buyPick p ON p.outFk = o.outFk
JOIN tLotStatus oo ON oo.lotFk = p.lotFk
SET o.isSync = FALSE,
o.lack = o.lack + p.quantity
WHERE oo.isExcluded OR oo.isAlive;
DELETE p FROM buyPick p
JOIN tLotStatus oo USING(lotFk)
WHERE oo.isExcluded OR oo.isAlive;
-- Update alive outs
INSERT INTO buyLot (
lotFk,
entryFk,
travelFk,
isSync,
isPicked,
warehouseFk,
@ -64,8 +59,6 @@ BEGIN
)
SELECT
lotFk,
entryFk,
travelFk,
FALSE,
isReceived,
warehouseInFk,
@ -74,10 +67,8 @@ BEGIN
@dated + INTERVAL life DAY,
quantity,
NULL
FROM tLotNew
FROM tBuyAlive
ON DUPLICATE KEY UPDATE
entryFk = VALUES(entryFk),
travelFk = VALUES(travelFk),
isSync = VALUES(isSync),
isPicked = VALUES(isPicked),
warehouseFk = VALUES(warehouseFk),
@ -87,36 +78,8 @@ BEGIN
quantity = VALUES(quantity),
available = VALUES(available);
-- Remove picks from updated and removed lots
CREATE OR REPLACE TEMPORARY TABLE tLotPrune
ENGINE = MEMORY
SELECT lotFk FROM tLotNew
UNION
SELECT o.lotFk FROM tLotOld o
LEFT JOIN vn.buy b ON b.id = o.lotFk
WHERE b.lotFk IS NULL;
UPDATE buyOut o
JOIN buyPick p
ON p.outFk = o.outFk
JOIN tLotPrune pl
ON pl.lotFk = p.lotFk
SET o.isSync = FALSE,
o.lack = o.lack + p.quantity;
DELETE p FROM buyPick p
JOIN tLotPrune pl USING(lotFk);
DROP TEMPORARY TABLE
tLotOld,
tLotNew,
tLotPrune;
COMMIT;
-- Refresh outs
CALL buyOut_refreshBuy(vTable, vId);
DROP TEMPORARY TABLE tBuyAlive;
END$$
DELIMITER ;

View File

@ -1,41 +1,71 @@
DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refresh`(
`vTable` VARCHAR(255))
`vTable` VARCHAR(255),
`vId` INT,
`vSource` VARCHAR(255))
BEGIN
CREATE TEMPORARY TABLE tOutPrune
ENGINE = MEMORY
SELECT outFk FROM tOutOld
EXCEPT
SELECT outFk FROM tOutNew;
DECLARE vLotExists INT;
DELETE o FROM buyOut o JOIN tOutPrune d USING(outFk);
IF vTable = 'lot' THEN
SET vLotExists = (SELECT COUNT(*) > 0 FROM tLotStatus);
IF NOT vLotExists THEN
INSERT INTO tLotStatus
SET lotFk = vId,
isExcluded = TRUE,
isAlive = FALSE;
END IF;
END IF;
START TRANSACTION;
-- Delete excluded/deleted/dead outs
DELETE o FROM buyOut o
JOIN tLotStatus oo ON oo.lotFk = o.outFk
WHERE oo.isExcluded OR NOT oo.isAlive;
-- Delete undead out picks
UPDATE buyLot l
JOIN buyPick p ON p.lotFk = l.lotFk
JOIN tLotStatus oo ON oo.lotFk = p.outFk
SET l.isSync = FALSE,
l.available = l.available + p.quantity
WHERE oo.isExcluded OR oo.isAlive;
DELETE p FROM buyPick p
JOIN tLotStatus oo ON oo.lotFk = p.outFk
WHERE oo.isExcluded OR oo.isAlive;
-- Update alive outs
INSERT INTO buyOut (
tableName,
outFk,
source,
isSync,
warehouseFk,
dated,
itemFk,
quantity,
lack,
created,
isPicked,
isSync
isPicked
)
SELECT
vTable,
outFk,
lotFk,
vSource,
FALSE,
warehouseFk,
dated,
itemFk,
quantity,
quantity,
created,
isPicked,
FALSE
FROM tOutNew
isPicked
FROM tLotAlive
ON DUPLICATE KEY UPDATE
tableName = VALUES(tableName),
source = VALUES(source),
warehouseFk = VALUES(warehouseFk),
dated = VALUES(dated),
itemFk = VALUES(itemFk),
@ -45,24 +75,6 @@ BEGIN
isPicked = VALUES(isPicked),
isSync = VALUES(isSync);
CREATE OR REPLACE TEMPORARY TABLE tPickPrune
ENGINE = MEMORY
SELECT id FROM buyPick
WHERE outFk IN (
SELECT outFk FROM tOutDel
UNION
SELECT outFk FROM tOutNew
);
UPDATE buyLot l
JOIN buyPick p ON p.lotFk = l.lotFk
JOIN tPickPrune pp ON pp.id = p.id
SET l.isSync = FALSE,
l.available = l.available + p.quantity;
DELETE p FROM buyPick p
JOIN tPickPrune pp USING (id);
DROP TEMPORARY TABLE tPickPrune;
COMMIT;
END$$
DELIMITER ;

View File

@ -3,58 +3,37 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refreshBuy`
`vTable` VARCHAR(255),
`vId` INT)
BEGIN
CREATE OR REPLACE TEMPORARY TABLE tOutOld
CREATE OR REPLACE TEMPORARY TABLE tLotStatus
ENGINE = MEMORY
SELECT outFk
FROM buyOutBuy
SELECT lotFk,
b.quantity <= 0 isExcluded,
b.isAlive
FROM vn.buy b
JOIN vn.entry e ON e.id = b.entryFk
WHERE
(vTable = 'buy' AND outFk = vId)
OR (vTable = 'entry' AND entryFk = vId)
OR (vTable = 'travel' AND travelFk = vId);
(vTable = 'lot' AND b.lotFk = vId)
OR (vTable = 'entry' AND e.id = vId)
OR (vTable = 'travel' AND e.travelFk = vId);
CREATE OR REPLACE TEMPORARY TABLE tOutNew
CREATE OR REPLACE TEMPORARY TABLE tLotAlive
ENGINE = MEMORY
SELECT
t.id travelFk,
e.id entryFk,
b.lotFk outFk,
oo.lotFk,
t.warehouseOutFk warehouseFk,
ADDTIME(t.shipped, IFNULL(shipmentHour, '00:00:00')) dated,
t.isDelivered isPicked,
b.itemFk,
b.quantity,
b.created
FROM vn.buy b
FROM tLotStatus oo
JOIN vn.buy b ON b.lotFk = oo.lotFk
JOIN vn.entry e ON e.id = b.entryFk
JOIN vn.travel t ON t.id = e.travelFk
WHERE b.quantity > 0
AND b.isAlive
AND (
(vTable = 'buy' AND b.lotFk = vId)
OR (vTable = 'entry' AND e.id = vId)
OR (vTable = 'travel' AND t.id = vId)
);
WHERE oo.isAlive;
CREATE OR REPLACE TEMPORARY TABLE tOutDel
ENGINE = MEMORY
SELECT o.outFk FROM tOutOld o
LEFT JOIN vn.buy b ON b.lotFk = o.outFk
WHERE b.lotFk IS NULL;
CALL buyOut_refresh(vTable, vId, 'buy');
CALL buyLot_refresh(vTable, vId);
START TRANSACTION;
CALL buyOut_refresh('buy');
DELETE o FROM buyOutBuy o JOIN tOutPrune d USING(outFk);
INSERT INTO buyOutBuy (outFk, entryFk, travelFk)
SELECT outFk, entryFk, travelFk FROM tOutNew
ON DUPLICATE KEY UPDATE
travelFk = VALUES(travelFk),
entryFk = VALUES(entryFk);
COMMIT;
DROP TEMPORARY TABLE tOutNew, tOutOld, tOutPrune, tOutDel;
DROP TEMPORARY TABLE tLotStatus, tLotAlive;
END$$
DELIMITER ;

View File

@ -9,55 +9,34 @@ BEGIN
INTO vExpired
FROM hedera.orderConfig LIMIT 1;
CREATE OR REPLACE TEMPORARY TABLE tOutOld
CREATE OR REPLACE TEMPORARY TABLE tLotStatus
ENGINE = MEMORY
SELECT outFk
FROM buyOutOrder
SELECT lotFk,
o.confirmed OR r.created < vExpired OR r.amount <= 0 isExcluded,
TRUE isAlive
FROM hedera.orderRow r
JOIN hedera.`order` o ON o.id = r.orderFk
WHERE
(vTable = 'orderRow' AND outFk = vId)
OR (vTable = 'order' AND orderFk = vId);
(vTable = 'lot' AND r.lotFk = vId)
OR (vTable = 'order' AND o.id = vId);
CREATE OR REPLACE TEMPORARY TABLE tOutNew
CREATE OR REPLACE TEMPORARY TABLE tLotAlive
ENGINE = MEMORY
SELECT
o.id orderFk,
r.lotFk outFk,
oo.lotFk,
r.warehouseFk,
r.shipment dated,
r.itemFk,
r.amount quantity,
r.created,
FALSE isPicked
FROM hedera.orderRow r
FROM tLotStatus oo
JOIN hedera.orderRow r ON r.lotFk = oo.lotFk
JOIN hedera.`order` o ON o.id = r.orderFk
WHERE !o.confirmed
AND r.created >= vExpired
AND r.amount > 0
AND (
(vTable = 'orderRow' AND r.lotFk = vId)
OR (vTable = 'order' AND o.id = vId)
);
WHERE oo.isAlive;
CREATE OR REPLACE TEMPORARY TABLE tOutDel
ENGINE = MEMORY
SELECT o.outFk FROM tOutOld o
LEFT JOIN hedera.orderRow r ON r.lotFk = o.outFk
WHERE r.lotFk IS NULL;
CALL buyOut_refresh(vTable, vId, 'orderRow');
START TRANSACTION;
CALL buyOut_refresh('orderRow');
DELETE o FROM buyOutOrder o
JOIN tOutPrune d USING(outFk);
INSERT INTO buyOutOrder (outFk, orderFk)
SELECT outFk, orderFk FROM tOutNew
ON DUPLICATE KEY UPDATE
orderFk = VALUES(orderFk);
COMMIT;
DROP TEMPORARY TABLE tOutNew, tOutOld, tOutPrune, tOutDel;
DROP TEMPORARY TABLE tLotStatus, tLotAlive;
END$$
DELIMITER ;

View File

@ -3,59 +3,38 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `stock`.`buyOut_refreshSale
`vTable` VARCHAR(255),
`vId` INT)
BEGIN
DECLARE vPreparation INT;
DECLARE vAliveDate DATE;
SELECT id INTO vPreparation
FROM vn.alertLevel WHERE code = 'ON_PREPARATION';
SET vAliveDate = CURDATE() - INTERVAL 1 MONTH;
CREATE OR REPLACE TEMPORARY TABLE tOutOld
CREATE OR REPLACE TEMPORARY TABLE tLotStatus
ENGINE = MEMORY
SELECT outFk
FROM buyOutSale
SELECT lotFk,
s.quantity < 0 isExcluded,
t.landed >= vAliveDate isAlive
FROM vn.sale s
JOIN vn.ticket t ON t.id = s.ticketFk
WHERE
(vTable = 'sale' AND outFk = vId)
OR (vTable = 'ticket' AND ticketFk = vId);
(vTable = 'lot' AND s.lotFk = vId)
OR (vTable = 'ticket' AND t.id = vId);
CREATE OR REPLACE TEMPORARY TABLE tOutNew
CREATE OR REPLACE TEMPORARY TABLE tLotAlive
ENGINE = MEMORY
SELECT
t.id ticketFk,
s.lotFk outFk,
oo.lotFk,
t.warehouseFk,
t.shipped dated,
s.itemFk,
s.quantity,
s.created,
s.isPicked OR ts.alertLevel > vPreparation isPicked
FROM vn.sale s
s.isPicked
FROM tLotStatus oo
JOIN vn.sale s ON s.lotFk = oo.lotFk
JOIN vn.ticket t ON t.id = s.ticketFk
JOIN vn.ticketState ts ON s.ticketFk = t.id
WHERE s.quantity >= 0
AND (
(vTable = 'sale' AND s.lotFk = vId)
OR (vTable = 'ticket' AND t.id = vId)
);
WHERE oo.isAlive;
CREATE OR REPLACE TEMPORARY TABLE tOutDel
ENGINE = MEMORY
SELECT o.outFk FROM tOutOld o
LEFT JOIN vn.sale s ON s.lotFk = o.outFk
WHERE s.lotFk IS NULL;
CALL buyOut_refresh(vTable, vId, 'sale');
START TRANSACTION;
CALL buyOut_refresh('sale');
DELETE o FROM buyOutSale o
JOIN tOutPrune d USING(outFk);
INSERT INTO buyOutSale (outFk, ticketFk)
SELECT outFk, ticketFk FROM tOutNew
ON DUPLICATE KEY UPDATE
ticketFk = VALUES(ticketFk);
COMMIT;
DROP TEMPORARY TABLE tOutNew, tOutOld, tOutPrune, tOutDel;
DROP TEMPORARY TABLE tLotStatus, tLotAlive;
END$$
DELIMITER ;

View File

@ -4,11 +4,7 @@ ALTER TABLE stock.buyLot
DROP KEY source,
DROP COLUMN tableName,
CHANGE tableId lotFk int(10) unsigned NOT NULL,
ADD entryFk INT UNSIGNED NOT NULL,
CHANGE entryFk entryFk INT UNSIGNED NOT NULL AFTER lotFk,
ADD travelFk INT UNSIGNED NOT NULL,
CHANGE travelFk travelFk INT UNSIGNED NOT NULL AFTER entryFk,
CHANGE isSync isSync tinyint(4) NOT NULL AFTER travelFk,
CHANGE isSync isSync tinyint(4) NOT NULL AFTER lotFk,
DROP PRIMARY KEY,
DROP COLUMN id,
ADD PRIMARY KEY (lotFk);

View File

@ -1,7 +1,7 @@
RENAME TABLE IF EXISTS stock.outbound TO stock.buyOut;
ALTER TABLE stock.buyOut
MODIFY COLUMN tableName enum('buy','sale','orderRow') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
CHANGE tableName source enum('buy','sale','orderRow') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
CHANGE id outFk int(10) UNSIGNED NOT NULL,
DROP INDEX source,
DROP COLUMN tableId,

View File

@ -1,8 +0,0 @@
CREATE TABLE IF NOT EXISTS stock.buyOutBuy (
outFk INT UNSIGNED,
entryFk INT,
travelFk INT,
UNIQUE(outFk),
INDEX(entryFk),
INDEX(travelFk)
);

View File

@ -1,6 +0,0 @@
CREATE TABLE IF NOT EXISTS stock.buyOutOrder (
outFk INT UNSIGNED,
orderFk INT,
UNIQUE(outFk),
INDEX(orderFk)
);

View File

@ -1,6 +0,0 @@
CREATE TABLE IF NOT EXISTS stock.buyOutSale (
outFk INT UNSIGNED,
ticketFk INT,
UNIQUE(outFk),
INDEX(ticketFk)
);