fix(InvoiceOutGlobal): parallelism #900
|
@ -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'"
|
||||||
|
|||||||
: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"
|
||||||
|
|
|
@ -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) {
|
||||||
jorgep
commented
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.
alexm
commented
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;
|
||||||
|
|
Loading…
Reference in New Issue
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.