This commit is contained in:
seb
2026-10-30 15:43:28 +01:00
parent 0fdffb864f
commit a4718d81c0
5 changed files with 32 additions and 0 deletions

View File

@@ -29,6 +29,8 @@ export const ARTICLE_LIST_COLUMNS = `
a.sku, a.sku,
at.name, at.name,
at.slug, at.slug,
ISNULL(LEN(at.[desc]), 0) AS descLength,
at.seo AS seo,
pr.net, pr.net,
t.rate AS taxRate, t.rate AS taxRate,
a.track_stock, a.track_stock,

View File

@@ -82,6 +82,16 @@ WHERE ca.category_id = @categoryId
ORDER BY w.sort ASC, w.name ASC, aws.id ASC ORDER BY w.sort ASC, w.name ASC, aws.id ASC
`; `;
export const GET_CATEGORY_ARTICLE_EANS = `
SELECT
ae.article_id AS articleId,
ae.ean
FROM articleean ae
INNER JOIN categoryarticle ca ON ca.article_id = ae.article_id
WHERE ca.category_id = @categoryId
ORDER BY ae.ean ASC
`;
export const CREATE = ` export const CREATE = `
INSERT INTO category (parent_id, sort) INSERT INTO category (parent_id, sort)
OUTPUT INSERTED.id, INSERTED.parent_id AS parentId, INSERTED.sort OUTPUT INSERTED.id, INSERTED.parent_id AS parentId, INSERTED.sort

View File

@@ -5,6 +5,7 @@ import { ARTICLE_LIST_COLUMNS, ARTICLE_LIST_JOINS } from './article.js';
const queries = translateQueries(source, 'category'); const queries = translateQueries(source, 'category');
export const { export const {
CREATE, DELETE, GET_BY_PARENT_AND_NAME, CREATE, DELETE, GET_BY_PARENT_AND_NAME,
GET_CATEGORY_ARTICLE_EANS,
GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES, GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES,
GET_NEXT_SIBLING_SORT, LIST_CHILD_IDS, GET_NEXT_SIBLING_SORT, LIST_CHILD_IDS,
LIST_CHILD_CATEGORIES, LIST_CHILD_CATEGORIES,

View File

@@ -33,6 +33,7 @@ export function sqliteQuery(sql) {
let result = quoteIdentifiers(sql) let result = quoteIdentifiers(sql)
.replace(/\bWITH\s*\(\s*(?:NOLOCK|UPDLOCK|ROWLOCK|HOLDLOCK|READPAST)(?:\s*,\s*(?:NOLOCK|UPDLOCK|ROWLOCK|HOLDLOCK|READPAST))*\s*\)/gi, '') .replace(/\bWITH\s*\(\s*(?:NOLOCK|UPDLOCK|ROWLOCK|HOLDLOCK|READPAST)(?:\s*,\s*(?:NOLOCK|UPDLOCK|ROWLOCK|HOLDLOCK|READPAST))*\s*\)/gi, '')
.replace(/\bISNULL\s*\(/gi, 'IFNULL(') .replace(/\bISNULL\s*\(/gi, 'IFNULL(')
.replace(/\bLEN\s*\(/gi, 'LENGTH(')
.replace(/\bSYSUTCDATETIME\s*\(\s*\)/gi, "strftime('%Y-%m-%dT%H:%M:%fZ', 'now')") .replace(/\bSYSUTCDATETIME\s*\(\s*\)/gi, "strftime('%Y-%m-%dT%H:%M:%fZ', 'now')")
.replace(/\bDATEDIFF_BIG\s*\(\s*second\s*,\s*'1970-01-01'\s*,\s*([^)]+?)\s*\)/gi, "CAST(strftime('%s', $1) AS INTEGER)") .replace(/\bDATEDIFF_BIG\s*\(\s*second\s*,\s*'1970-01-01'\s*,\s*([^)]+?)\s*\)/gi, "CAST(strftime('%s', $1) AS INTEGER)")
.replace(/\bCAST\s*\(([^()]+?)\s+AS\s+INT\s*\)/gi, 'CAST($1 AS INTEGER)') .replace(/\bCAST\s*\(([^()]+?)\s+AS\s+INT\s*\)/gi, 'CAST($1 AS INTEGER)')

View File

@@ -1,16 +1,19 @@
import { import {
GET_CATEGORY_ARTICLES as MSSQL_GET, GET_CATEGORY_ARTICLES as MSSQL_GET,
GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES as MSSQL_SUMMARIES, GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES as MSSQL_SUMMARIES,
GET_CATEGORY_ARTICLE_EANS as MSSQL_EANS,
} from '../../providers/mssql/queries/category.js'; } from '../../providers/mssql/queries/category.js';
import { import {
GET_CATEGORY_ARTICLES as SQLITE_GET, GET_CATEGORY_ARTICLES as SQLITE_GET,
GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES as SQLITE_SUMMARIES, GET_CATEGORY_ARTICLE_WAREHOUSE_SUMMARIES as SQLITE_SUMMARIES,
GET_CATEGORY_ARTICLE_EANS as SQLITE_EANS,
} from '../../providers/sqlite3/queries/category.js'; } from '../../providers/sqlite3/queries/category.js';
import makeRunner from '../runner.js'; import makeRunner from '../runner.js';
export default function queryCategoryArticles(provider) { export default function queryCategoryArticles(provider) {
const sql = provider?.dialect === 'sqlite3' ? SQLITE_GET : MSSQL_GET; const sql = provider?.dialect === 'sqlite3' ? SQLITE_GET : MSSQL_GET;
const sqlSummaries = provider?.dialect === 'sqlite3' ? SQLITE_SUMMARIES : MSSQL_SUMMARIES; const sqlSummaries = provider?.dialect === 'sqlite3' ? SQLITE_SUMMARIES : MSSQL_SUMMARIES;
const sqlEans = provider?.dialect === 'sqlite3' ? SQLITE_EANS : MSSQL_EANS;
return async ({ categoryId, languageId, posCustomerGroupId }, tx) => { return async ({ categoryId, languageId, posCustomerGroupId }, tx) => {
const runner = makeRunner(provider, tx); const runner = makeRunner(provider, tx);
@@ -43,6 +46,19 @@ export default function queryCategoryArticles(provider) {
}); });
} }
const eanResult = await runner.query(sqlEans, { categoryId });
const eanMap = new Map();
for (const e of eanResult.rows) {
let list = eanMap.get(e.articleId);
if (!list) {
list = [];
eanMap.set(e.articleId, list);
}
if (e.ean) {
list.push(e.ean);
}
}
return result.rows.map((row) => { return result.rows.map((row) => {
const { const {
brandId, brandId,
@@ -54,8 +70,10 @@ export default function queryCategoryArticles(provider) {
...rest ...rest
} = row; } = row;
const summaries = summaryMap.get(row.id) ?? []; const summaries = summaryMap.get(row.id) ?? [];
const eans = eanMap.get(row.id) ?? [];
return { return {
...rest, ...rest,
eans,
smallThumbW: rest.smallThumbW != null ? Number(rest.smallThumbW) : null, smallThumbW: rest.smallThumbW != null ? Number(rest.smallThumbW) : null,
smallThumbH: rest.smallThumbH != null ? Number(rest.smallThumbH) : null, smallThumbH: rest.smallThumbH != null ? Number(rest.smallThumbH) : null,
smallThumbBinary: rest.smallThumbBinary smallThumbBinary: rest.smallThumbBinary