fix(InvoiceOutGlobal): parallelism #900

Merged
alexm merged 4 commits from warmFix_invoiceOut_Global into dev 2024-11-07 09:43:19 +00:00
2 changed files with 20 additions and 23 deletions

View File

@ -13,7 +13,7 @@ const { t } = useI18n();
const invoiceOutGlobalStore = useInvoiceOutGlobalStore(); const invoiceOutGlobalStore = useInvoiceOutGlobalStore();
// invoiceOutGlobalStore state and getters // invoiceOutGlobalStore state and getters
const { initialDataLoading, formInitialData, invoicing, status } = const { initialDataLoading, formInitialData, status } =
storeToRefs(invoiceOutGlobalStore); storeToRefs(invoiceOutGlobalStore);
// invoiceOutGlobalStore actions // invoiceOutGlobalStore actions
@ -151,9 +151,8 @@ onMounted(async () => {
rounded rounded
/> />
</div> </div>
<QBtn <QBtn
v-if="!invoicing" v-if="!getStatus || getStatus === 'stopping'"
Review

El nombre getStatus no me parece correcto. Como veo que puede implicar un refactor algo tedioso vale, pero yo crearía una tarea para refactorizar la store y no tener que hacer esas cosas raras con el computed. Las stores ya son reactivas.

El nombre getStatus no me parece correcto. Como veo que puede implicar un refactor algo tedioso vale, pero yo crearía una tarea para refactorizar la store y no tener que hacer esas cosas raras con el computed. Las stores ya son reactivas.
:label="t('invoiceOut')" :label="t('invoiceOut')"
type="submit" type="submit"
color="primary" color="primary"
@ -163,7 +162,7 @@ onMounted(async () => {
dense dense
/> />
<QBtn <QBtn
v-if="invoicing" v-else
:label="t('stop')" :label="t('stop')"
color="primary" color="primary"
class="q-mt-md full-width" class="q-mt-md full-width"

View File

@ -93,7 +93,7 @@ export const useInvoiceOutGlobalStore = defineStore({
async makeInvoice(formData, clientsToInvoice) { async makeInvoice(formData, clientsToInvoice) {
this.invoicing = true; this.invoicing = true;
this.status = 'packageInvoicing'; const promises = [];
try { try {
this.printer = formData.printer; this.printer = formData.printer;
const params = { const params = {
@ -118,10 +118,11 @@ export const useInvoiceOutGlobalStore = defineStore({
); );
throw new Error("There aren't addresses to invoice"); throw new Error("There aren't addresses to invoice");
} }
this.status = 'invoicing';
for (const address of this.addresses) { for (let index = 0; index < this.parallelism; index++) {
await this.invoiceClient(address, formData); promises.push(this.invoiceClient(formData, index));
} }
await Promise.all(promises);
} catch (err) { } catch (err) {
this.handleError(err); this.handleError(err);
} }
@ -171,17 +172,14 @@ export const useInvoiceOutGlobalStore = defineStore({
} }
}, },
async invoiceClient(address, formData) { async invoiceClient(formData, index) {
const address = this.addresses[index];
if (!address || !this.status || this.status == 'stopping') {
this.status = 'stopping';
this.invoicing = false;
return;
}
try { try {
if (this.nRequests === this.parallelism || this.isInvoicing) return;
if (this.status === 'stopping') {
if (this.nRequests) return;
this.invoicing = false;
this.status = 'done';
return;
}
const params = { const params = {
clientId: address.clientId, clientId: address.clientId,
addressId: address.id, addressId: address.id,
@ -191,13 +189,11 @@ export const useInvoiceOutGlobalStore = defineStore({
serialType: formData.serialType, serialType: formData.serialType,
}; };
this.status = 'invoicing';
this.invoicing = true; this.invoicing = true;
const { data } = await axios.post('InvoiceOuts/invoiceClient', params); const { data } = await axios.post('InvoiceOuts/invoiceClient', params);
if (data) await this.makePdfAndNotify(data, address); if (data) await this.makePdfAndNotify(data, address);
this.addressIndex++;
this.isInvoicing = false; this.isInvoicing = false;
} catch (err) { } catch (err) {
if (err?.response?.status >= 400 && err?.response?.status < 500) { if (err?.response?.status >= 400 && err?.response?.status < 500) {
Review

habiamos dicho que los errores los maneje quasar, si se quiere que el usuario pueda notificar de este error (cuando se añada el btn de notificar) no tenemos que usar useNotify(). Se puede crear tarea.

habiamos dicho que los errores los maneje quasar, si se quiere que el usuario pueda notificar de este error (cuando se añada el btn de notificar) no tenemos que usar useNotify(). Se puede crear tarea.
Review

En este caso es correcto pq no se quiere que el error interrumpa el proceso

En este caso es correcto pq no se quiere que el error interrumpa el proceso
@ -205,13 +201,16 @@ export const useInvoiceOutGlobalStore = defineStore({
return; return;
} else { } else {
this.invoicing = false; this.invoicing = false;
this.status = 'done';
notify( notify(
'invoiceOut.globalInvoices.errors.criticalInvoiceError', 'invoiceOut.globalInvoices.errors.criticalInvoiceError',
'negative' 'negative'
); );
throw new Error('Critical invoicing error, process stopped'); throw new Error('Critical invoicing error, process stopped');
} }
} finally {
this.addressIndex++;
if (this.status != 'stopping')
await this.invoiceClient(formData, this.addressIndex);
} }
}, },
@ -234,7 +233,6 @@ export const useInvoiceOutGlobalStore = defineStore({
handleError(err) { handleError(err) {
this.invoicing = false; this.invoicing = false;
this.status = null;
throw err; throw err;
}, },
@ -279,7 +277,7 @@ export const useInvoiceOutGlobalStore = defineStore({
return 0; return 0;
} }
let porcentaje = (state.addressIndex / this.getNAddresses) * 100; let porcentaje = (state.addressIndex / this.getNAddresses) * 100;
return porcentaje; return porcentaje?.toFixed(2);
}, },
getAddressNumber(state) { getAddressNumber(state) {
return state.addressIndex; return state.addressIndex;