fix(InvoiceOutGlobal): parallelism #900
|
@ -13,7 +13,7 @@ const { t } = useI18n();
|
|||
const invoiceOutGlobalStore = useInvoiceOutGlobalStore();
|
||||
|
||||
// invoiceOutGlobalStore state and getters
|
||||
const { initialDataLoading, formInitialData, invoicing, status } =
|
||||
const { initialDataLoading, formInitialData, status } =
|
||||
storeToRefs(invoiceOutGlobalStore);
|
||||
|
||||
// invoiceOutGlobalStore actions
|
||||
|
@ -151,9 +151,8 @@ onMounted(async () => {
|
|||
rounded
|
||||
/>
|
||||
</div>
|
||||
|
||||
<QBtn
|
||||
v-if="!invoicing"
|
||||
v-if="!getStatus || getStatus === 'stopping'"
|
||||
|
||||
:label="t('invoiceOut')"
|
||||
type="submit"
|
||||
color="primary"
|
||||
|
@ -163,7 +162,7 @@ onMounted(async () => {
|
|||
dense
|
||||
/>
|
||||
<QBtn
|
||||
v-if="invoicing"
|
||||
v-else
|
||||
:label="t('stop')"
|
||||
color="primary"
|
||||
class="q-mt-md full-width"
|
||||
|
|
|
@ -93,7 +93,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
|
||||
async makeInvoice(formData, clientsToInvoice) {
|
||||
this.invoicing = true;
|
||||
this.status = 'packageInvoicing';
|
||||
const promises = [];
|
||||
try {
|
||||
this.printer = formData.printer;
|
||||
const params = {
|
||||
|
@ -118,10 +118,11 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
);
|
||||
throw new Error("There aren't addresses to invoice");
|
||||
}
|
||||
|
||||
for (const address of this.addresses) {
|
||||
await this.invoiceClient(address, formData);
|
||||
this.status = 'invoicing';
|
||||
for (let index = 0; index < this.parallelism; index++) {
|
||||
promises.push(this.invoiceClient(formData, index));
|
||||
}
|
||||
await Promise.all(promises);
|
||||
} catch (err) {
|
||||
this.handleError(err);
|
||||
}
|
||||
|
@ -171,17 +172,14 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
}
|
||||
},
|
||||
|
||||
async invoiceClient(address, formData) {
|
||||
try {
|
||||
if (this.nRequests === this.parallelism || this.isInvoicing) return;
|
||||
|
||||
if (this.status === 'stopping') {
|
||||
if (this.nRequests) return;
|
||||
async invoiceClient(formData, index) {
|
||||
const address = this.addresses[index];
|
||||
if (!address || !this.status || this.status == 'stopping') {
|
||||
this.status = 'stopping';
|
||||
this.invoicing = false;
|
||||
this.status = 'done';
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const params = {
|
||||
clientId: address.clientId,
|
||||
addressId: address.id,
|
||||
|
@ -191,13 +189,11 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
serialType: formData.serialType,
|
||||
};
|
||||
|
||||
this.status = 'invoicing';
|
||||
this.invoicing = true;
|
||||
|
||||
const { data } = await axios.post('InvoiceOuts/invoiceClient', params);
|
||||
|
||||
if (data) await this.makePdfAndNotify(data, address);
|
||||
this.addressIndex++;
|
||||
this.isInvoicing = false;
|
||||
} catch (err) {
|
||||
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;
|
||||
} else {
|
||||
this.invoicing = false;
|
||||
this.status = 'done';
|
||||
notify(
|
||||
'invoiceOut.globalInvoices.errors.criticalInvoiceError',
|
||||
'negative'
|
||||
);
|
||||
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) {
|
||||
this.invoicing = false;
|
||||
this.status = null;
|
||||
throw err;
|
||||
},
|
||||
|
||||
|
@ -279,7 +277,7 @@ export const useInvoiceOutGlobalStore = defineStore({
|
|||
return 0;
|
||||
}
|
||||
let porcentaje = (state.addressIndex / this.getNAddresses) * 100;
|
||||
return porcentaje;
|
||||
return porcentaje?.toFixed(2);
|
||||
},
|
||||
getAddressNumber(state) {
|
||||
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.