From 85e2df56e1db73db0a70ef5142df16f768ed8490 Mon Sep 17 00:00:00 2001 From: Surya Paolo Date: Wed, 23 Apr 2025 01:59:45 +0200 Subject: [PATCH] - ordinamento tabella titoli - migliorata la lista degli argomenti --- src/server/controllers/articleController.js | 2 +- src/server/models/myelem.js | 1 + src/server/models/product.js | 29 +++++++-- src/server/models/t_web_statiprodotto.js | 22 +++---- src/server/modules/Macro.js | 67 +++++++++++++-------- src/server/tools/general.js | 4 +- 6 files changed, 78 insertions(+), 47 deletions(-) diff --git a/src/server/controllers/articleController.js b/src/server/controllers/articleController.js index 74772a5..1008836 100644 --- a/src/server/controllers/articleController.js +++ b/src/server/controllers/articleController.js @@ -885,7 +885,7 @@ exports.mssqlmigrateTables = async (req) => { if (options?.tutte) { // const listaTabelle = ['T_WEB_StatiProdotto']; listaTabelle = ['T_WEB_TitoliOriginali', 'T_WEB_TestateOrdini', 'T_WEB_Ordini', 'T_WEB_Disponibile', 'T_WOO_TestateOrdini', 'T_WOO_Ordini', 'T_WEB_Articoli', - 'T_WEB_Argomenti', 'T_WEB_Autori', 'T_WEB_Collane', 'T_WEB_MarchiEditoriali', 'T_WEB_StatiProdotto', 'T_WEB_TipiFormato', 'T_WEB_Tipologie', 'T_WEB_ArticoliFatturati', 'T_WEB_IdInternetFatturati', + 'T_WEB_Argomenti', 'T_WEB_ClientiInternet', 'T_WOO_Clienti', 'T_WEB_Autori', 'T_WEB_Collane', 'T_WEB_MarchiEditoriali', 'T_WEB_StatiProdotto', 'T_WEB_TipiFormato', 'T_WEB_Tipologie', 'T_WEB_ArticoliFatturati', 'T_WEB_IdInternetFatturati', 'T_WEB_Edizioni', 'T_WEB_Contratti']; } else { listaTabelle = ['T_WEB_Articoli', 'T_WEB_ArticoliFatturati']; diff --git a/src/server/models/myelem.js b/src/server/models/myelem.js index 6de9334..c037c27 100755 --- a/src/server/models/myelem.js +++ b/src/server/models/myelem.js @@ -69,6 +69,7 @@ const catalogo = new Schema( printable: { type: Boolean }, indebug: { type: Boolean }, maxnumlibri: { type: Number }, + showListaArgomenti: { type: Boolean}, first_page: IDimensioni, last_page: IDimensioni, diff --git a/src/server/models/product.js b/src/server/models/product.js index e25e0a6..174a875 100755 --- a/src/server/models/product.js +++ b/src/server/models/product.js @@ -241,9 +241,11 @@ module.exports.executeQueryTable = function (idapp, params) { module.exports.executeQueryPickup = async function (idapp, params) { - let strfind = params.search; + let strfind = tools.removeAccents(params.search.trim().toLowerCase()); - strfind = strfind.replace(/[-@]/g, ''); + // Rimuove le parole "il" e "la" e gli spazi, le @ e i tabulazioni + // per non farli influire sulla ricerca + strfind = strfind.replace(/\b(il|la|gli|le|lo|un|una)\b/g, '').replace(/[-@\t]/g, '').trim(); if (strfind === '' && !params.filter) { return []; @@ -262,7 +264,7 @@ module.exports.executeQueryPickup = async function (idapp, params) { $or: [ { 'productInfo.name': { - $regex: `(?i).*${tools.removeAccents(strfind)}.*`, // Cerca una o più parole che sono contenute + $regex: `(?i).*${strfind}.*`, // Cerca una o più parole che sono contenute $options: 'i' // Rende la ricerca case-insensitive } }, @@ -275,15 +277,31 @@ module.exports.executeQueryPickup = async function (idapp, params) { { 'productInfo.sku': strfind }, + { + $and: [ + { + 'productInfo.authors.name': { + $regex: `(?i).*${strfind.split(' ').shift()}.*`, // Cerca la prima parola + $options: 'i' // Rende la ricerca case-insensitive + } + }, + { + 'productInfo.authors.surname': { + $regex: `(?i).*${strfind.split(' ').pop()}.*`, // Cerca la seconda parola + $options: 'i' // Rende la ricerca case-insensitive + } + }, + ] + }, { 'productInfo.authors.name': { - $regex: `(?i).*${tools.removeAccents(strfind)}.*`, // Cerca una o più parole che sono contenute + $regex: `(?i).*${strfind}.*`, // Cerca una o più parole che sono contenute $options: 'i' // Rende la ricerca case-insensitive } }, { 'productInfo.authors.surname': { - $regex: `(?i)\\b${tools.removeAccents(strfind)}\\b`, // Cerca parole che iniziano con strfind, e ignora gli accenti + $regex: `(?i).*${strfind}.*`, // Cerca una o più parole che sono contenute $options: 'i' // Rende la ricerca case-insensitive } }, @@ -337,6 +355,7 @@ module.exports.executeQueryPickup = async function (idapp, params) { authors: '$productInfo.authors', idStatoProdotto: "$productInfo.idStatoProdotto", }, + arrvariazioni: "$arrvariazioni", } } ]; diff --git a/src/server/models/t_web_statiprodotto.js b/src/server/models/t_web_statiprodotto.js index d68b7f8..1e2bba5 100755 --- a/src/server/models/t_web_statiprodotto.js +++ b/src/server/models/t_web_statiprodotto.js @@ -31,27 +31,19 @@ module.exports.findAllIdApp = async function () { const myquery = [ { - $sort: { DataOra: -1 } // Prima ordina per DataOra in modo decrescente + $sort: { IdStatoProdotto: 1, DataOra: -1 } // ordina per ID e DataOra decrescente }, { $group: { - _id: "$IdStatoProdotto", // Raggruppa per IdStatoProdotto - latestRecord: { $first: "$$ROOT" } // Prendi il primo record per ogni gruppo (cioè il più recente) + _id: "$IdStatoProdotto", + IdStatoProdotto: { $first: "$IdStatoProdotto" }, + Descrizione: { $first: "$Descrizione" }, + DataOra: { $first: "$DataOra" }, + // aggiungi altri campi se servono } }, { - $lookup: { - from: 't_web_statiprodottos', - localField: '_id', // Usa _id che è l'IdStatoProdotto - foreignField: 'IdStatoProdotto', - as: 'record' - } - }, - { - $replaceRoot: { newRoot: { $arrayElemAt: ["$record", 0] } } // Estrai il primo (e unico) record dal risultato di $lookup - }, - { - $sort: { IdStatoProdotto: 1 } // Ordina per IdStatoProdotto, se necessario + $sort: { IdStatoProdotto: 1 } // opzionale, per ordinare il risultato } ]; diff --git a/src/server/modules/Macro.js b/src/server/modules/Macro.js index 8a88f8e..4e2e752 100644 --- a/src/server/modules/Macro.js +++ b/src/server/modules/Macro.js @@ -16,7 +16,9 @@ class Macro { constructor(idapp, options) { this.idapp = idapp; this.localoptions = options; - } + this.recProductExist = false; + this.queryprod = null; + } async updateLocalDbFromGM_T_Web_Articoli(params) { @@ -372,8 +374,10 @@ class Macro { elaboraProdotto(recproduct, opt); count++; - if (count % 50 === 0) - console.log(' *** IMPORTATI: ' + opt.imported + ' AGGIORNATI = ' + opt.updated + ' (su ' + numrec + ' RECORD)'); + if (count % 50 === 0) { + const percentuale = Math.round((count / numrec) * 100); + console.log(` *** RECORD ${count} - IMPORTATI: ${opt.imported} AGGIORNATI = ${opt.updated} (su ${numrec} RECORD) - Completato al ${percentuale}%`); + } //} } } @@ -397,7 +401,8 @@ class Macro { async importaCatalogo(data) { let updated = 0, imported = 0, - errors = 0; + errors = 0, + indice = 0; try { const ripopola = true; //++MODIFICARE! @@ -410,14 +415,12 @@ class Macro { for (const product of dataObjects) { await this.elaboraProdotto(product, { updated, imported, errors }); + indice++; } - console.log( - '*** IMPORTATI: ', - imported, - 'AGGIORNATI = ' + updated + ' (su ' + dataObjects.length + ' RECORD)' - ); - return { updated, imported, error }; + const percentuale = (indice / dataObjects.length * 100).toFixed(2); + console.log(`*** RECORD: ${indice} - IMPORTATI: ${imported}, AGGIORNATI = ${updated} (su ${dataObjects.length} RECORD) - Completamento: ${percentuale}%`); + return { updated, imported, errors }; } catch (e) { console.error(e.message); throw e; @@ -522,6 +525,9 @@ class Macro { ).lean(); if (risrecInfo) { + product.idProductInfo = risrecInfo._id; + this.queryprod = { idProductInfo: product.idProductInfo }; + await this.aggiornaImmagineSeNecessario(risrecInfo); await this.gestisciGasOrdine(product, risrecInfo); await this.gestisciVariazioni(product, risrecInfo, options); @@ -547,16 +553,13 @@ class Macro { recGas = await Gasordine.findOne({ idapp, name: product.gas_name }).lean(); } - let recProductExist = null; - let queryprod = { idProductInfo: product.idProductInfo }; - if (recGas) { - queryprod = { ...queryprod, idGasordine: recGas._id }; + this.queryprod = { ...this.queryprod, idGasordine: recGas._id }; } - recProductExist = await Product.findOne(queryprod).lean(); + this.recProductExist = await Product.findOne(this.queryprod).lean(); - if (!recProductExist) { + if (!this.recProductExist) { product.idGasordine = recGas ? recGas._id : null; await Product.findOneAndUpdate({ _id: product._id }, { $set: { idGasordine: product.idGasordine } }); @@ -894,20 +897,36 @@ class Macro { * Gestisce le variazioni del prodotto. */ async gestisciVariazioni(product, risrecInfo, options) { - const queryprod = { idProductInfo: risrecInfo._id }; - const recold = await Product.findOne(queryprod).lean(); + const recold = await Product.findOne(this.queryprod).lean(); const variazione = this.preparaVariazione(product); + + const myproduct = { + ...product, + ...(!product.isbn ? [{ isbn: risrecInfo.code }]: []), + ...(!product.maxbookableGASQty && risrecInfo.maxbookableGASQty ? [{ maxbookableGASQty: risrecInfo.maxbookableGASQty }]: []), + idapp: this.idapp, + arrvariazioni: [variazione], + }; let risultupdate = null; if (recold) { const arrvariazioni = this.aggiornaVariazioni(recold.arrvariazioni, variazione); - risultupdate = await Product.findOneAndUpdate(queryprod, { $set: { arrvariazioni } }); - options.updated++; - } else { - const myproduct = { ...queryprod, arrvariazioni: [variazione] }; - risultupdate = await Product.findOneAndUpdate(queryprod, { $set: myproduct }, { new: true, upsert: true }); - options.imported++; + risultupdate = await Product.updateOne(this.queryprod, { $set: { arrvariazioni } }, { new: true }); + if (risultupdate && risultupdate.modifiedCount > 0) { + options.updated++; + } + + + if (recold.isbn !== risrecInfo.code) { + product.isbn = risrecInfo.code; + } + } + if (!recold || recold.isbn !== myproduct.isbn || !recold.idapp || !this.recProductExist) { + risultupdate = await Product.updateOne(this.queryprod, { $set: myproduct }, { new: true, upsert: true }); + if (risultupdate && risultupdate.modifiedCount > 0) { + options.imported++; + } } // console.log('risultupdate', risultupdate); diff --git a/src/server/tools/general.js b/src/server/tools/general.js index cc7fc61..9f8c2f1 100755 --- a/src/server/tools/general.js +++ b/src/server/tools/general.js @@ -6158,7 +6158,7 @@ module.exports = { const aggiornatoimg = await downloader.downloadImage(productInfo.image_link, savePath, { - maxRetries: 3, + maxRetries: 1, initialDelay: 300, timeout: 15000, }).then(result => { @@ -6209,7 +6209,7 @@ module.exports = { const aggiornatoimg = await downloader.downloadImage(link, savePath, { - maxRetries: 3, + maxRetries: 1, initialDelay: 300, timeout: 15000, nomefileoriginale: true,