From c3a6dd73b6cc943af67647dadb02bcc80e88cc2a Mon Sep 17 00:00:00 2001 From: "r.mubarakzyanov" Date: Thu, 28 May 2026 23:59:15 +0300 Subject: [PATCH] import backoff --- public/userarea/export_to_lims.php | 62 ++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 7 deletions(-) diff --git a/public/userarea/export_to_lims.php b/public/userarea/export_to_lims.php index 4102b5b..76c344b 100644 --- a/public/userarea/export_to_lims.php +++ b/public/userarea/export_to_lims.php @@ -59,6 +59,49 @@ function formatDateToExport($value) return null; // Imposta null se non è una data valida } +// ImportaCommessa con retry: la chiamata è asincrona lato LIMS e a volte +// risponde 200 senza importare (StatoCommessaWeb resta "Inviata"/"Nuova"). +// Riprova con backoff esponenziale finché non passa a "Elaborata". +function importaCommessaWithRetry($api, $commessaId, array $payload, $maxRetries = 3, $initialBackoff = 1) +{ + $result = null; + $stato = null; + $succeeded = false; + $log = ""; + $backoff = $initialBackoff; + + set_time_limit(120); // i backoff non devono far scadere il timeout della richiesta + + for ($attempt = 1; $attempt <= $maxRetries + 1; $attempt++) { + try { + $result = $api->post("CommessaWeb({$commessaId})/ImportaCommessa", $payload); + $stato = $result['StatoCommessaWeb'] ?? null; + $log .= "Attempt {$attempt}: HTTP 200, StatoCommessaWeb=" . ($stato ?? 'null') . "\n"; + } catch (Exception $e) { + $stato = null; + $log .= "Attempt {$attempt}: EXCEPTION " . $e->getMessage() . "\n"; + } + + if ($stato === 'Elaborata') { + $succeeded = true; + break; + } + + if ($attempt <= $maxRetries) { + $log .= " -> not Elaborata, waiting {$backoff}s before retry\n"; + sleep($backoff); + $backoff *= 2; + } + } + + return [ + 'succeeded' => $succeeded, + 'stato' => $stato, + 'result' => $result, + 'log' => $log, + ]; +} + try { $iddatadb = $_POST['iddatadb'] ?? null; if (!$iddatadb) { @@ -512,9 +555,8 @@ try { $writeLog($logFileStep9, $logContentStep9, "STEP 9 - InviaCommessa (commessa={$commessaId})"); - // 🔹 STEP 9.5: Importazione da CommessaWeb a Commessa (commentato come richiesto) + // 🔹 STEP 9.5: Importazione da CommessaWeb a Commessa (con retry) // Supplier call: POST api/odata/CommessaWeb(XXX)/ImportaCommessa - $importUserId = (!empty($lims_global_user_id) && is_numeric($lims_global_user_id)) ? (int) $lims_global_user_id : 285; @@ -522,17 +564,23 @@ try { $importPayload = [ "IdUtente" => $importUserId ]; - $importResult = $api->post("CommessaWeb({$commessaId})/ImportaCommessa", $importPayload); - $importPayloadLog = json_encode($importPayload, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); - // Logga il POST + + $importOutcome = importaCommessaWithRetry($api, $commessaId, $importPayload); + $importResult = $importOutcome['result']; + $importStato = $importOutcome['stato']; + $importSucceeded = $importOutcome['succeeded']; + + // Logga il POST (tutti i tentativi) $logContentStep91 = "curl --location --request POST '{$apiBaseUrl}CommessaWeb({$commessaId})/ImportaCommessa' \\\n" . "--header 'Content-Type: application/json' \\\n" . "--header 'Authorization: Bearer ••••••' \\\n" . "--data '{$importPayloadLog}'\n\n" . - "RESPONSE:\n" . json_encode($importResult, JSON_PRETTY_PRINT); + "ATTEMPTS:\n" . $importOutcome['log'] . "\n" . + "SUCCEEDED: " . ($importSucceeded ? 'yes' : 'NO') . "\n\n" . + "LAST RESPONSE:\n" . json_encode($importResult, JSON_PRETTY_PRINT); $logFileStep91 = $logDir . "commessa_{$commessaId}_importa_step91_" . time() . ".txt"; - $writeLog($logFileStep91, $logContentStep91, "STEP 9.5 - ImportaCommessa (commessa={$commessaId})"); + $writeLog($logFileStep91, $logContentStep91, "STEP 9.5 - ImportaCommessa (commessa={$commessaId}, succeeded=" . ($importSucceeded ? '1' : '0') . ")"); // 🔹 STEP 10: GET di controllo post-PATCH $expand = "CommesseCustomFields(\$expand=CustomField)";