fix(back-end): fix exclude object 0
This commit is contained in:
@@ -34,6 +34,7 @@ dependencies {
|
||||
compileOnly 'org.projectlombok:lombok'
|
||||
annotationProcessor 'org.projectlombok:lombok'
|
||||
implementation 'io.github.openhtmltopdf:openhtmltopdf-pdfbox:1.1.37'
|
||||
implementation 'io.github.openhtmltopdf:openhtmltopdf-svg-support:1.1.37'
|
||||
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
|
||||
implementation 'net.codecrete.qrbill:qrbill-generator:3.4.0'
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.printcalculator.service;
|
||||
|
||||
import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
|
||||
import com.openhtmltopdf.svgsupport.BatikSVGDrawer;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thymeleaf.TemplateEngine;
|
||||
@@ -34,6 +35,7 @@ public class InvoicePdfRenderingService {
|
||||
|
||||
PdfRendererBuilder openHtmlToPdfRendererBuilder = new PdfRendererBuilder();
|
||||
openHtmlToPdfRendererBuilder.useFastMode();
|
||||
openHtmlToPdfRendererBuilder.useSVGDrawer(new BatikSVGDrawer());
|
||||
openHtmlToPdfRendererBuilder.withHtmlContent(renderedInvoiceHtml, classpathBaseUrlForHtmlResources);
|
||||
openHtmlToPdfRendererBuilder.toStream(generatedPdfByteArrayOutputStream);
|
||||
openHtmlToPdfRendererBuilder.run();
|
||||
|
||||
@@ -76,9 +76,9 @@
|
||||
Pagamento entro 7 giorni. Grazie.
|
||||
</div>
|
||||
|
||||
<!-- Pagina dedicata alla QR-bill -->
|
||||
<div class="page-break"></div>
|
||||
<div th:utext="${qrBillSvg}" style="width: 210mm; height: 105mm; position: absolute; bottom: 0; left: 0;"></div>
|
||||
<div style="page-break-before: always;"></div>
|
||||
<div style="position: absolute; bottom: 0; left: 0; width: 210mm; height: 105mm;" th:utext="${qrBillSvg}">
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -180,22 +180,20 @@ export class QuoteEstimatorService {
|
||||
const sessionId = sessionRes.id;
|
||||
const sessionSetupCost = sessionRes.setupCostChf || 0;
|
||||
|
||||
// 2. Upload files to this session
|
||||
// 2. Process items SEQUENTIALLY to avoid timeouts/overload
|
||||
const totalItems = request.items.length;
|
||||
const allProgress: number[] = new Array(totalItems).fill(0);
|
||||
const finalResponses: any[] = [];
|
||||
let completedRequests = 0;
|
||||
let completedCount = 0;
|
||||
|
||||
const checkCompletion = () => {
|
||||
const avg = Math.round(allProgress.reduce((a, b) => a + b, 0) / totalItems);
|
||||
observer.next(avg);
|
||||
|
||||
if (completedRequests === totalItems) {
|
||||
const processNextItem = (index: number) => {
|
||||
if (index >= totalItems) {
|
||||
// All done
|
||||
finalize(finalResponses, sessionSetupCost, sessionId);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
request.items.forEach((item, index) => {
|
||||
const item = request.items[index];
|
||||
const formData = new FormData();
|
||||
formData.append('file', item.file);
|
||||
|
||||
@@ -222,23 +220,35 @@ export class QuoteEstimatorService {
|
||||
next: (event) => {
|
||||
if (event.type === HttpEventType.UploadProgress && event.total) {
|
||||
allProgress[index] = Math.round((100 * event.loaded) / event.total);
|
||||
checkCompletion();
|
||||
reportProgress();
|
||||
} else if (event.type === HttpEventType.Response) {
|
||||
allProgress[index] = 100;
|
||||
finalResponses[index] = { ...event.body, success: true, fileName: item.file.name, originalQty: item.quantity, originalItem: item };
|
||||
completedRequests++;
|
||||
checkCompletion();
|
||||
completedCount++;
|
||||
reportProgress();
|
||||
// Next
|
||||
processNextItem(index + 1);
|
||||
}
|
||||
},
|
||||
error: (err) => {
|
||||
console.error('Item upload failed', err);
|
||||
const errorMsg = err.error?.code === 'VIRUS_DETECTED' ? 'VIRUS_DETECTED' : 'UPLOAD_FAILED';
|
||||
finalResponses[index] = { success: false, fileName: item.file.name, error: errorMsg };
|
||||
completedRequests++;
|
||||
checkCompletion();
|
||||
completedCount++;
|
||||
reportProgress();
|
||||
// Next even if error
|
||||
processNextItem(index + 1);
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
const reportProgress = () => {
|
||||
const avg = Math.round(allProgress.reduce((a, b) => a + b, 0) / totalItems);
|
||||
observer.next(avg);
|
||||
};
|
||||
|
||||
// Start first item
|
||||
processNextItem(0);
|
||||
},
|
||||
error: (err) => {
|
||||
console.error('Failed to create session', err);
|
||||
@@ -268,10 +278,8 @@ export class QuoteEstimatorService {
|
||||
unitTime: res.printTimeSeconds || 0,
|
||||
unitWeight: res.materialGrams || 0,
|
||||
quantity: quantity,
|
||||
material: request.material,
|
||||
material: this.mapMaterial(request.material), // Uses session material
|
||||
color: res.originalItem.color || 'Default'
|
||||
// Store ID if needed for updates? QuoteItem interface might need update
|
||||
// or we map it in component
|
||||
});
|
||||
|
||||
grandTotal += unitPrice * quantity;
|
||||
@@ -280,7 +288,6 @@ export class QuoteEstimatorService {
|
||||
});
|
||||
|
||||
if (validCount === 0) {
|
||||
// Check if any failed due to virus
|
||||
const virusError = responses.find(r => r.error === 'VIRUS_DETECTED');
|
||||
if (virusError) {
|
||||
observer.error('VIRUS_DETECTED');
|
||||
|
||||
Reference in New Issue
Block a user