prouct pic delete sync fix

This commit is contained in:
seb
2026-08-23 01:56:03 +02:00
parent ccf7854e6c
commit 73d256e8a6
4 changed files with 64 additions and 32 deletions

View File

@@ -4,13 +4,28 @@ import { getDemoCategoryCount } from '../demo/store.js';
import { getPool } from '../db.js'; import { getPool } from '../db.js';
import { CATEGORY_TREE_CTE, categoryTreeRequest, getRootCategoryId } from './category-tree.js'; import { CATEGORY_TREE_CTE, categoryTreeRequest, getRootCategoryId } from './category-tree.js';
const LANGUAGE_ID = Number(process.env.LANGUAGE_ID) || 1;
const CATEGORY_COUNT_SQL = ` const CATEGORY_COUNT_SQL = `
${CATEGORY_TREE_CTE} ${CATEGORY_TREE_CTE}
SELECT COUNT(*) AS CategoryCount SELECT COUNT(*) AS CategoryCount
FROM dbo.tKategorie k FROM dbo.tKategorie k
WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree) LEFT JOIN dbo.tKategorieSprache ks ON ks.kKategorie = k.kKategorie AND ks.kSprache = @languageId
AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks WHERE ks.kKategorie = k.kKategorie AND ks.kShop = @kShop)) LEFT JOIN dbo.tKategoriebildPlattform kbp ON kbp.kKategorie = k.kKategorie
AND CONVERT(BIGINT, k.bRowversion) > @cursor; CROSS APPLY (
SELECT MAX(v) AS lastChanged
FROM (VALUES
(CONVERT(BIGINT, k.bRowversion)),
(CONVERT(BIGINT, ks.bRowversion)),
(CONVERT(BIGINT, kbp.bRowversion)),
((SELECT MAX(CONVERT(BIGINT, ka.bRowversion)) FROM dbo.tKategorieArtikel ka WHERE ka.kKategorie = k.kKategorie)),
((SELECT MAX(CONVERT(BIGINT, ksh.bRowversion)) FROM dbo.tKategorieShop ksh WHERE ksh.kKategorie = k.kKategorie AND (@kShop = 0 OR ksh.kShop = @kShop)))
) AS t(v)
) rv
WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree WHERE kKategorie <> @rootCategoryId)
AND k.cAktiv = 'Y'
AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks2 WHERE ks2.kKategorie = k.kKategorie AND ks2.kShop = @kShop))
AND rv.lastChanged > @cursor;
`; `;
export async function getCategoryCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) { export async function getCategoryCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) {
@@ -20,6 +35,7 @@ export async function getCategoryCount({ cursor = 0, rootCategoryId = getRootCat
const result = await categoryTreeRequest(getPool(), rootCategoryId) const result = await categoryTreeRequest(getPool(), rootCategoryId)
.input('cursor', sql.BigInt, cursor) .input('cursor', sql.BigInt, cursor)
.input('languageId', sql.Int, LANGUAGE_ID)
.query(CATEGORY_COUNT_SQL); .query(CATEGORY_COUNT_SQL);
return result.recordset[0]?.CategoryCount ?? 0; return result.recordset[0]?.CategoryCount ?? 0;
} }

View File

@@ -14,17 +14,27 @@ SELECT TOP (@limit)
k.nSort AS sort, k.nSort AS sort,
ks.cName AS name, ks.cName AS name,
b.cHash AS imgHash, b.cHash AS imgHash,
CONVERT(BIGINT, k.bRowversion) AS lastChanged rv.lastChanged
FROM dbo.tKategorie k FROM dbo.tKategorie k
INNER JOIN dbo.tKategorieSprache ks ON ks.kKategorie = k.kKategorie AND ks.kSprache = @languageId INNER JOIN dbo.tKategorieSprache ks ON ks.kKategorie = k.kKategorie AND ks.kSprache = @languageId
LEFT JOIN dbo.tKategoriebildPlattform kbp LEFT JOIN dbo.tKategoriebildPlattform kbp
ON kbp.kKategorie = k.kKategorie ON kbp.kKategorie = k.kKategorie
LEFT JOIN dbo.tBild b ON b.kBild = kbp.kBild LEFT JOIN dbo.tBild b ON b.kBild = kbp.kBild
CROSS APPLY (
SELECT MAX(v) AS lastChanged
FROM (VALUES
(CONVERT(BIGINT, k.bRowversion)),
(CONVERT(BIGINT, ks.bRowversion)),
(CONVERT(BIGINT, kbp.bRowversion)),
((SELECT MAX(CONVERT(BIGINT, ka.bRowversion)) FROM dbo.tKategorieArtikel ka WHERE ka.kKategorie = k.kKategorie)),
((SELECT MAX(CONVERT(BIGINT, ksh.bRowversion)) FROM dbo.tKategorieShop ksh WHERE ksh.kKategorie = k.kKategorie AND (@kShop = 0 OR ksh.kShop = @kShop)))
) AS t(v)
) rv
WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree WHERE kKategorie <> @rootCategoryId) WHERE k.kKategorie IN (SELECT kKategorie FROM CategoryTree WHERE kKategorie <> @rootCategoryId)
AND k.cAktiv = 'Y' AND k.cAktiv = 'Y'
AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks2 WHERE ks2.kKategorie = k.kKategorie AND ks2.kShop = @kShop)) AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks2 WHERE ks2.kKategorie = k.kKategorie AND ks2.kShop = @kShop))
AND CONVERT(BIGINT, k.bRowversion) > @cursor AND rv.lastChanged > @cursor
ORDER BY lastChanged ASC; ORDER BY rv.lastChanged ASC;
`; `;
export async function getCategoryList({ cursor = 0, limit = 20, rootCategoryId = getRootCategoryId() } = {}) { export async function getCategoryList({ cursor = 0, limit = 20, rootCategoryId = getRootCategoryId() } = {}) {

View File

@@ -4,23 +4,30 @@ import { getDemoProductCount } from '../demo/store.js';
import { getPool } from '../db.js'; import { getPool } from '../db.js';
import { CATEGORY_TREE_CTE, categoryTreeRequest, getRootCategoryId } from './category-tree.js'; import { CATEGORY_TREE_CTE, categoryTreeRequest, getRootCategoryId } from './category-tree.js';
const LANGUAGE_ID = Number(process.env.LANGUAGE_ID) || 1;
const PRODUCT_COUNT_SQL = ` const PRODUCT_COUNT_SQL = `
${CATEGORY_TREE_CTE} ${CATEGORY_TREE_CTE}
SELECT COUNT(DISTINCT a.kArtikel) AS ProductCount SELECT COUNT(DISTINCT a.kArtikel) AS ProductCount
FROM dbo.tArtikel a FROM dbo.tArtikel a
INNER JOIN dbo.tKategorieArtikel ka ON ka.kArtikel = a.kArtikel INNER JOIN dbo.tKategorieArtikel ka ON ka.kArtikel = a.kArtikel
LEFT JOIN dbo.tlagerbestand lb ON lb.kArtikel = a.kArtikel
LEFT JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId
CROSS APPLY (
SELECT MAX(v) AS lastChanged
FROM (VALUES
(CONVERT(BIGINT, a.bRowversion)),
(CONVERT(BIGINT, lb.bRowversion)),
(CONVERT(BIGINT, ab.bRowversion)),
((SELECT MAX(CONVERT(BIGINT, abp.bRowversion)) FROM dbo.tArtikelbildPlattform abp WHERE abp.kArtikel = a.kArtikel AND (@kShop = 0 OR abp.kShop = @kShop))),
((SELECT MAX(CONVERT(BIGINT, p.bRowversion)) FROM dbo.tPreis p WHERE p.kArtikel = a.kArtikel AND (@kShop = 0 OR p.kShop = @kShop))),
((SELECT MAX(CONVERT(BIGINT, sp.bRowversion)) FROM dbo.tArtikelSonderpreis sp WHERE sp.kArtikel = a.kArtikel))
) AS t(v)
) rv
WHERE a.cAktiv = 'Y' WHERE a.cAktiv = 'Y'
AND ka.kKategorie IN (SELECT kKategorie FROM CategoryTree) AND ka.kKategorie IN (SELECT kKategorie FROM CategoryTree)
AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks WHERE ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop)) AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks WHERE ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop))
AND ( AND rv.lastChanged > @cursor;
CONVERT(BIGINT, a.bRowversion) > @cursor
OR EXISTS (
SELECT 1 FROM dbo.tArtikelbildPlattform abp
WHERE abp.kArtikel = a.kArtikel
AND abp.kShop = @kShop
AND CONVERT(BIGINT, abp.bRowversion) > @cursor
)
);
`; `;
export async function getProductCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) { export async function getProductCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) {
@@ -30,6 +37,7 @@ export async function getProductCount({ cursor = 0, rootCategoryId = getRootCate
const result = await categoryTreeRequest(getPool(), rootCategoryId) const result = await categoryTreeRequest(getPool(), rootCategoryId)
.input('cursor', sql.BigInt, cursor) .input('cursor', sql.BigInt, cursor)
.input('languageId', sql.Int, LANGUAGE_ID)
.query(PRODUCT_COUNT_SQL); .query(PRODUCT_COUNT_SQL);
return result.recordset[0]?.ProductCount ?? 0; return result.recordset[0]?.ProductCount ?? 0;
} }

View File

@@ -15,12 +15,6 @@ WITH TaxRates AS (
SELECT kSteuerklasse, fSteuersatz SELECT kSteuerklasse, fSteuersatz
FROM dbo.tSteuersatz FROM dbo.tSteuersatz
WHERE kSteuerzone IN (SELECT kSteuerzone FROM dbo.tSteuerzone WHERE cName = @taxZoneName) WHERE kSteuerzone IN (SELECT kSteuerzone FROM dbo.tSteuerzone WHERE cName = @taxZoneName)
),
ImageRV AS (
SELECT kArtikel, MAX(CONVERT(BIGINT, bRowversion)) AS maxImageRV
FROM dbo.tArtikelbildPlattform
WHERE kShop = @kShop
GROUP BY kArtikel
) )
SELECT TOP (@limit) SELECT TOP (@limit)
a.kArtikel AS id, a.kArtikel AS id,
@@ -29,11 +23,7 @@ SELECT TOP (@limit)
a.fVKNetto AS netPrice, a.fVKNetto AS netPrice,
tr.fSteuersatz AS taxRate, tr.fSteuersatz AS taxRate,
a.dErstelldatum AS createdAt, a.dErstelldatum AS createdAt,
CASE rv.lastChanged,
WHEN ir.maxImageRV IS NOT NULL AND ir.maxImageRV > CONVERT(BIGINT, a.bRowversion)
THEN ir.maxImageRV
ELSE CONVERT(BIGINT, a.bRowversion)
END AS lastChanged,
( (
SELECT TOP 1 img.cHash SELECT TOP 1 img.cHash
FROM dbo.tArtikelbildPlattform abp FROM dbo.tArtikelbildPlattform abp
@@ -59,20 +49,28 @@ SELECT TOP (@limit)
ISNULL(v.fBestand, 0) AS fBestand ISNULL(v.fBestand, 0) AS fBestand
FROM dbo.tArtikel a FROM dbo.tArtikel a
INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId
LEFT JOIN dbo.tlagerbestand lb ON lb.kArtikel = a.kArtikel
LEFT JOIN TaxRates tr ON tr.kSteuerklasse = a.kSteuerklasse LEFT JOIN TaxRates tr ON tr.kSteuerklasse = a.kSteuerklasse
LEFT JOIN ImageRV ir ON ir.kArtikel = a.kArtikel
LEFT JOIN dbo.vLagerbestandProLager v ON v.kArtikel = a.kArtikel AND v.kWarenlager = @warenlagerId LEFT JOIN dbo.vLagerbestandProLager v ON v.kArtikel = a.kArtikel AND v.kWarenlager = @warenlagerId
CROSS APPLY (
SELECT MAX(val) AS lastChanged
FROM (VALUES
(CONVERT(BIGINT, a.bRowversion)),
(CONVERT(BIGINT, lb.bRowversion)),
(CONVERT(BIGINT, ab.bRowversion)),
((SELECT MAX(CONVERT(BIGINT, abp.bRowversion)) FROM dbo.tArtikelbildPlattform abp WHERE abp.kArtikel = a.kArtikel AND (@kShop = 0 OR abp.kShop = @kShop))),
((SELECT MAX(CONVERT(BIGINT, p.bRowversion)) FROM dbo.tPreis p WHERE p.kArtikel = a.kArtikel AND (@kShop = 0 OR p.kShop = @kShop))),
((SELECT MAX(CONVERT(BIGINT, sp.bRowversion)) FROM dbo.tArtikelSonderpreis sp WHERE sp.kArtikel = a.kArtikel))
) AS t(val)
) rv
WHERE a.cAktiv = 'Y' WHERE a.cAktiv = 'Y'
AND (@kShop = 0 OR EXISTS ( AND (@kShop = 0 OR EXISTS (
SELECT 1 FROM dbo.tKategorieArtikel ka SELECT 1 FROM dbo.tKategorieArtikel ka
INNER JOIN dbo.tKategorieShop ks ON ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop INNER JOIN dbo.tKategorieShop ks ON ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop
WHERE ka.kArtikel = a.kArtikel WHERE ka.kArtikel = a.kArtikel
)) ))
AND ( AND rv.lastChanged > @cursor
CONVERT(BIGINT, a.bRowversion) > @cursor ORDER BY rv.lastChanged ASC;
OR (ir.maxImageRV IS NOT NULL AND ir.maxImageRV > @cursor)
)
ORDER BY lastChanged ASC;
`; `;
function priceOverridesSql(articleIds) { function priceOverridesSql(articleIds) {