$data->line_number, 'design_area' => $data->design_area, 'commitSize' => 5, // Chunk size for transaction batching 'triggerMode' => true // Called from SaveTrigger ])->render(); Log::info("Line Lists to NDE Matrix sync completed via view render", [ 'line_number' => $data->line_number, 'design_area' => $data->design_area ]); // Special handling for type_of_welds change if (!is_null($beforeData) && $beforeData->type_of_welds !== $data->type_of_welds) { TransactionHelper::retryTransaction(function () use ($data, $beforeData) { // Where condition for old type $oldTypeWhereData = [ 'line' => $data->line_number, 'type_of_joint' => $beforeData->type_of_welds, 'fluid' => $data->fluid_code, ]; // Check if old type is still used by other WeldLog records $otherRecordsUsingOldType = db("weld_logs") ->where('line_number', $data->line_number) ->where('type_of_welds', $beforeData->type_of_welds) ->where('fluid_code', $data->fluid_code) ->where('id', '!=', $data->id) ->orderBy('id', 'ASC') // Deadlock prevention ->exists(); // Delete from NDE Matrix only if old type is not used elsewhere if (!$otherRecordsUsingOldType) { $deleteResult = db("nde_matrices") ->where($oldTypeWhereData) ->delete(); Log::info("NDE Matrix old type cleaned up - no other weld logs using it", [ 'line' => $data->line_number, 'old_type_of_joint' => $beforeData->type_of_welds, 'new_type_of_joint' => $data->type_of_welds, 'fluid' => $data->fluid_code, 'delete_result' => $deleteResult ]); } else { Log::info("NDE Matrix old type preserved - still used by other weld logs", [ 'line' => $data->line_number, 'old_type_of_joint' => $beforeData->type_of_welds, 'new_type_of_joint' => $data->type_of_welds, 'fluid' => $data->fluid_code ]); } }, 5); // 5 attempts with exponential backoff } } catch (\Throwable $th) { Log::error("NDE Matrix sync error: " . $th->getMessage(), [ 'line_number' => $data->line_number, 'design_area' => $data->design_area ]); throw $th; } // Sync from NDE Matrix to WeldLog return $this->syncNdeMatrixToWeldLog($data); } /** * Sync NDE Matrix data to WeldLog * Updates scope percentages and other NDE-related fields */ protected function syncNdeMatrixToWeldLog($data): array { // fluid_code null check - get from line_lists if needed $currentFluidCode = $data->fluid_code ?? ''; if(empty($currentFluidCode)) { $lineListForFluid = db("line_lists")->where('line_no', $data->line_number)->first(); if($lineListForFluid) { $currentFluidCode = $lineListForFluid->fluid_code ?? ''; } } Log::info("NDE Matrix to WeldLog sync started", [ 'weld_log_id' => $data->id, 'line_number' => $data->line_number, 'type_of_welds' => $data->type_of_welds, 'fluid_code' => $currentFluidCode ]); // Skip if fluid_code is null if(empty($currentFluidCode)) { Log::info("NDE Matrix to WeldLog sync skipped - fluid_code is null", [ 'weld_log_id' => $data->id, 'line_number' => $data->line_number ]); return ['skipped' => true, 'reason' => 'fluid_code_null']; } // Get NDE Matrix records $ndeMatrices = NdeMatrix::where("line", $data->line_number) ->where("type_of_joint", $data->type_of_welds) ->where("fluid", $currentFluidCode) ->get(); Log::debug("NDE Matrix records retrieved", [ 'matrix_count' => $ndeMatrices->count(), 'matrix_examples' => $ndeMatrices->take(2)->toArray() ]); $ndeToWeldLogUpdateCount = 0; // Process NDE Matrix in chunks with TransactionHelper Log::debug("NDE Matrix to WeldLog sync starting", [ 'total_records' => $ndeMatrices->count() ]); TransactionHelper::chunkTransaction( $ndeMatrices, function ($ndeMatrixChunk) use (&$ndeToWeldLogUpdateCount) { foreach($ndeMatrixChunk as $ndeMatrix) { $weldLogUpdateData = [ 'vt_scope' => 100, 'rt_scope' => $ndeMatrix->rt, 'ut_scope' => $ndeMatrix->ut, 'mt_scope' => $ndeMatrix->mt, 'pt_scope' => $ndeMatrix->pt, 'pmi_scope' => $ndeMatrix->pmi, 'ht_scope' => $ndeMatrix->ht, 'pwht' => $ndeMatrix->pwht_field, 'ferrite_scope' => $ndeMatrix->fn, 'ndt_percent' => $ndeMatrix->ndt, 'operating_temperature_s' => $ndeMatrix->operation_temp, 'operating_pressure_mpa' => $ndeMatrix->operations_pressure_kg, 'fluid_group' => $ndeMatrix->piping_group, 'main_material' => $ndeMatrix->material, 'updated_at' => simdi() ]; $result = db("weld_logs") ->where("line_number", $ndeMatrix->line) ->where("type_of_welds", $ndeMatrix->type_of_joint) ->orderBy('id', 'ASC') // Deadlock prevention ->update($weldLogUpdateData); $ndeToWeldLogUpdateCount += $result; } return $ndeMatrixChunk->count(); }, 10, // Chunk size increased from 3 to 10 for better performance 10000 // 10ms delay (reduced from 150ms) - sufficient for deadlock prevention ); Log::info("NDE Matrix to WeldLog sync completed", [ 'total_updated_records' => $ndeToWeldLogUpdateCount ]); return [ 'success' => true, 'updated_records' => $ndeToWeldLogUpdateCount ]; } }