where("line_number", $lineListData->line_no) ->get(); // Collect spec joint types from weld logs $specJointTypes = $this->collectSpecJointTypes($weldlogs, $lineListData); if(empty($specJointTypes)) { return [ 'skipped' => true, 'reason' => 'no_spec_joint_types_found' ]; } Log::debug('specJointTypes içeriği:', ['specJointTypes' => $specJointTypes]); $update = 0; $create = 0; // Check if specJointTypes exist for this line list if(!isset($specJointTypes[$lineListData->fluid_code][$lineListData->line_no])) { Log::warning("NDE Matrix işlemi atlandı - specJointTypes bulunamadı", [ 'line_no' => $lineListData->line_no, 'fluid_code' => $lineListData->fluid_code ]); return [ 'skipped' => true, 'reason' => 'spec_joint_types_not_found_for_line' ]; } $typeOfJoint = $specJointTypes[$lineListData->fluid_code][$lineListData->line_no]; // Convert array to collection for chunk processing $jointCollection = collect($typeOfJoint); Log::debug("NDE Matrix sync starting with chunk transaction", [ 'total_joint_types' => $jointCollection->count(), 'line_no' => $lineListData->line_no, 'fluid_code' => $lineListData->fluid_code ]); // Process joints in chunks with TransactionHelper TransactionHelper::chunkTransaction( $jointCollection, function ($jointChunk) use ($lineListData, &$update, &$create) { foreach($jointChunk as $jointItem) { $ht = 0; if($lineListData->pwht == "YES") $ht = 100; $data = [ 'design_area' => $lineListData->unit, 'fluid' => $lineListData->fluid_code, 'line' => $lineListData->line_no, 'line_spec' => $lineListData->line_specification, 'operation_temp' => $lineListData->working_temperature, 'operations_pressure_kg' => $lineListData->working_pressure_mpa, 'pipe_material_class' => $lineListData->pipe_material_class, 'type_of_joint' => $jointItem, 'pwht' => $lineListData->pwht, 'pwht_field' => $lineListData->pwht, 'ht' => $ht, 'ndt' => $lineListData->ndt, 'piping_class_according_to_gost' => $lineListData->category, 'piping_group' => $lineListData->fluid_group, 'rev' => $lineListData->rev, 'tracing' => $lineListData->tracing, 'tracing_type' => $lineListData->tracing_type, 'naks_technology' => $lineListData->naks_technology, ]; // UNIQUE CONSTRAINT: line + type_of_joint + fluid $uniqueKey = [ 'line' => $lineListData->line_no, 'type_of_joint' => $jointItem, 'fluid' => $lineListData->fluid_code, ]; // Check if record already exists with deadlock prevention $already = NdeMatrix::where($uniqueKey) ->orderBy('id', 'ASC') // Deadlock prevention ->first(); if($already) { unset($data['pwht_field']); try { $updateResult = NdeMatrix::where($uniqueKey) ->orderBy('id', 'ASC') // Deadlock prevention ->update($data); Log::debug("NDE Matrix record updated successfully", [ 'affected_rows' => $updateResult, 'line_no' => $lineListData->line_no, 'joint_type' => $jointItem, 'fluid_code' => $lineListData->fluid_code ]); $update++; } catch (\Exception $e) { Log::error("NDE Matrix update error", [ 'line_no' => $lineListData->line_no, 'joint_type' => $jointItem, 'fluid_code' => $lineListData->fluid_code, 'error_message' => $e->getMessage() ]); throw $e; } } else { try { $ndeRecord = NdeMatrix::updateOrCreate($uniqueKey, $data); $action = $ndeRecord->wasRecentlyCreated ? 'created' : 'updated'; Log::debug("NDE Matrix record processed successfully", [ 'record_id' => $ndeRecord->id, 'action' => $action, 'line_no' => $lineListData->line_no, 'joint_type' => $jointItem, 'fluid_code' => $lineListData->fluid_code ]); if($action === 'created') { $create++; } else { $update++; } } catch (\Exception $e) { Log::error("NDE Matrix create/update error", [ 'line_no' => $lineListData->line_no, 'joint_type' => $jointItem, 'fluid_code' => $lineListData->fluid_code, 'error_message' => $e->getMessage() ]); throw $e; } } } return $jointChunk->count(); }, 1, // Chunk size 10000 // 10ms delay - sufficient for deadlock prevention ); Log::info("NDE Matrix sync completed", [ 'updated' => $update, 'created' => $create, 'total_affected' => $update + $create ]); return [ 'success' => true, 'created' => $create, 'updated' => $update ]; } /** * Collect spec joint types from weld logs */ protected function collectSpecJointTypes($weldlogs, $lineListData): array { $specJointTypes = []; foreach($weldlogs AS $weldlog) { // Update fluid_code if empty if(empty($weldlog->fluid_code) && !empty($lineListData->fluid_code)) { db("weld_logs") ->where("id", $weldlog->id) ->update([ 'fluid_code' => $lineListData->fluid_code, 'service_category' => $lineListData->category, 'fluid_group' => $lineListData->fluid_group, ]); $weldlog->fluid_code = $lineListData->fluid_code; $weldlog->service_category = $lineListData->category; $weldlog->fluid_group = $lineListData->fluid_group; } if(empty($weldlog->fluid_code)) { continue; } if(empty($weldlog->line_number)) { continue; } if(empty($weldlog->type_of_welds)) { continue; } if(!isset($specJointTypes[$weldlog->fluid_code][$weldlog->line_number])) { $specJointTypes[$weldlog->fluid_code][$weldlog->line_number] = []; } if(!in_array($weldlog->type_of_welds, $specJointTypes[$weldlog->fluid_code][$weldlog->line_number])) { $specJointTypes[$weldlog->fluid_code][$weldlog->line_number][] = $weldlog->type_of_welds; } } return $specJointTypes; } }