whereRaw("NULLIF(spool_status, '') IS NULL"); if($filterIsoNumber) { $updateEmptyQuery->where("iso_number", $filterIsoNumber); } if($filterSpoolNumber) { $updateEmptyQuery->where("spool_number", $filterSpoolNumber); } $updateEmpty = apply_welded_filter($updateEmptyQuery)->update([ 'spool_status' => "Waiting" ]); //dump("$updateEmpty spool_status empty updated"); $spoolLists = db("weld_logs") ->select( "id", "spool_status", "painting_cycle", "welding_date", "spool_number", "iso_number", "updated_at", "type_of_joint", "no_of_the_joint_as_per_as_built_survey" ); Log::info("Filter paint changed: {$filterPaintChanged}"); if($filterSpoolNumber) { $spoolLists = $spoolLists->where("spool_number", $filterSpoolNumber); Log::info("Spool status changer filtering by spool_number: {$filterSpoolNumber}"); } if($filterIsoNumber) { $spoolLists = $spoolLists->where("iso_number", $filterIsoNumber); Log::info("Spool status changer filtering by iso_number: {$filterIsoNumber}"); } if(!getesit("rollback", "")) { $rollbackData = db("weld_logs") ->where("id", get("rollback")) ->first(); if($rollbackData) { $spoolLists = $spoolLists->where("iso_number", $rollbackData->iso_number) ->where("spool_number", $rollbackData->spool_number); } } if($filterPaintChanged) { Log::info("Paint changed paint status refactored"); } else { $spoolLists = $spoolLists ->whereNotIn("spool_status", ['NDT Release', 'Paint', 'Completed']); } $spoolLists = apply_welded_filter($spoolLists); $spoolLists = $spoolLists ->where("no_of_the_joint_as_per_as_built_survey", "not like", "%clone%"); $spoolLists = $spoolLists ->orderBy("updated_at", "DESC"); $spoolLists = $spoolLists ->get(); DB::beginTransaction(); $k = 0; $say = 0; try { foreach($spoolLists AS $spoolList) { $isoNumber = $spoolList->iso_number; $spoolNumber = $spoolList->spool_number; $otherSpools = apply_welded_filter( db("weld_logs") ->where("iso_number", $isoNumber) ->where("spool_number", $spoolNumber) )->get(); $otherSpoolStatus = []; $otherSpoolTypeOfJoint = []; foreach($otherSpools AS $otherSpool) { $otherSpoolStatus[] = $otherSpool->spool_status; $otherSpoolTypeOfJoint[] = $otherSpool->type_of_joint; } $spoolStatus = "Waiting"; $weldingDateChecks = []; // //dump("{$spoolList->iso_number} {$spoolList->spool_number}"); $allSpoolIsField = true; $otherSpoolStatusCompletedCheck = false; $otherSpoolShopCheck = false; foreach($otherSpools AS $otherSpool) { if($otherSpool->type_of_joint != "F") { $weldingDateCheck = false; $allSpoolIsField = false; if(in_array("Completed", $otherSpoolStatus)) { $otherSpoolStatusCompletedCheck = true; } if(in_array("S", $otherSpoolTypeOfJoint)) { $otherSpoolShopCheck = true; } if(!rejected_date($otherSpool->welding_date)) { $weldingDateCheck = true; } $weldingDateChecks[] = $weldingDateCheck; } } /* if($spoolList->iso_number == "PG-900-AH01PG-FA00.030-HC") { if($spoolList->no_of_the_joint_as_per_as_built_survey == "6-NEW") { dump($otherSpoolStatusCompletedCheck); dump($otherSpoolTypeOfJoint); dump($weldingDateChecks); dd($otherSpoolShopCheck); } } */ if(in_array(false, $weldingDateChecks) && in_array(true, $weldingDateChecks)) { $spoolStatus = "On Going"; } else if(in_array(false, $weldingDateChecks) && !in_array(true, $weldingDateChecks)) { $spoolStatus = "Waiting"; } else if(!in_array(false, $weldingDateChecks) && in_array(true, $weldingDateChecks)) { if($spoolList->type_of_joint == "F") { if($otherSpoolStatusCompletedCheck && $otherSpoolShopCheck) { $spoolStatus = "Completed"; } else { $spoolStatus = "Spool Release"; } } else { if($filterPaintChanged) { $spoolStatus = "Completed"; } else { $spoolStatus = "Spool Release"; } } } if($allSpoolIsField) { if($spoolList->painting_cycle != "") { $spoolStatus = "Paint"; } else { $spoolStatus = "Completed"; } } db("weld_logs") /* ->where("iso_number", $isoNumber) ->where("spool_number", $spoolNumber) */ ->where("id", $spoolList->id) // ->whereNotIn("spool_status", ['NDT Release', 'Paint', 'Completed']) ->update([ 'spool_status' => $spoolStatus, // 'spool_ndt_check' => null, // 'spool_ndt_check_no' => null, ]); // Update construction_paint_logs table based on iso_drawings and spool // Sync spool_status from weld_logs to construction_paint_logs automatically $k++; /* if($say == $commitSize) { DB::commit(); DB::beginTransaction(); $say = 0; } */ $say++; } DB::commit(); } catch (\Throwable $th) { //throw $th; // dump($th); Log::error($th->getMessage()); DB::rollback(); } $updatePaintQuery = db("weld_logs") ->whereIn("spool_status", ["Completed", "NDT Release"]) //painting cycle dolu ise ->where(function($query) { $query->whereNotNull("painting_cycle") ->orWhere("painting_cycle", "<>", ""); }) //paint release date boş ise ->where(function($query) { $query->whereNull("paint_release_date") ->orWhere("paint_release_date", ""); }) //ndt release date dolu ise ->where(function($query) { $query->whereNotNull("ndt_release_date") ->orWhere("ndt_release_date", "<>", ""); }); if($filterIsoNumber) { $updatePaintQuery->where("iso_number", $filterIsoNumber); } if($filterSpoolNumber) { $updatePaintQuery->where("spool_number", $filterSpoolNumber); } $updatePaint = $updatePaintQuery->update([ 'spool_status' => "Paint" ]); $updateCompletedQuery = db("weld_logs") // ->whereIn("spool_status", ["Paint"]) ->where(function($query) { $query->whereNotNull("painting_cycle") ->orWhere("painting_cycle", "<>", ""); }) ->where(function($query) { $query->whereNotNull("paint_release_date") ->orWhere("paint_release_date", "<>", ""); }) //ndt release date dolu ise ->where(function($query) { $query->whereNotNull("ndt_release_date") ->orWhere("ndt_release_date", "<>", ""); }); if($filterIsoNumber) { $updateCompletedQuery->where("iso_number", $filterIsoNumber); } if($filterSpoolNumber) { $updateCompletedQuery->where("spool_number", $filterSpoolNumber); } $updateCompleted = $updateCompletedQuery->update([ 'spool_status' => "Completed" ]); //dump("$k processed"); // Performance monitoring - Start paint sync timing $paintSyncStartTime = microtime(true); $statusLog = "$lastIdPrefix finish $k processed updateComplete $updateCompleted updatePaint $updatePaint " . simdi(); // dump("Status Changer Affected Columns $k"); Log::debug($statusLog . simdi()); // OPTIMIZED SOLUTION 1: Using JOIN with Window Function (Best Performance) $cteConditions = ["spool_status IS NOT NULL"]; $cteParams = []; $whereConditions = []; $updateParams = []; // Check for spool_number parameter (GET or variable) if(!getesit("spool_number", "") || isset($spool_number)) { $spoolNumberValue = !getesit("spool_number", "") ? get("spool_number") : $spool_number; $cteConditions[] = "spool_number = ?"; $cteParams[] = $spoolNumberValue; $whereConditions[] = "cpl.spool = ?"; $updateParams[] = $spoolNumberValue; } // Check for line_number parameter (GET or variable) if(!getesit("iso_number", "") || isset($iso_number)) { $isoNumberValue = !getesit("iso_number", "") ? get("iso_number") : $iso_number; $cteConditions[] = "iso_number = ?"; $cteParams[] = $isoNumberValue; $whereConditions[] = "cpl.iso_drawings = ?"; $updateParams[] = $isoNumberValue; } $cteWhereClause = "WHERE " . implode(" AND ", $cteConditions); // Build WHERE clause for main query $whereClause = !empty($whereConditions) ? " WHERE " . implode(" AND ", $whereConditions) : ""; // Optimized query using CTE and Window Function (MySQL 8.0+) $sqlQuery = " WITH latest_weld_logs AS ( SELECT iso_number, spool_number, spool_status, ROW_NUMBER() OVER ( PARTITION BY iso_number, spool_number ORDER BY updated_at DESC ) as rn FROM weld_logs $cteWhereClause ) UPDATE construction_paint_logs cpl INNER JOIN latest_weld_logs lwl ON ( lwl.iso_number = cpl.iso_drawings AND lwl.spool_number = cpl.spool AND lwl.rn = 1 ) SET cpl.spool_status = lwl.spool_status" . $whereClause; try { $allParams = array_merge($cteParams, $updateParams); if(!empty($allParams)) { DB::statement($sqlQuery, $allParams); } else { DB::statement($sqlQuery); } Log::info("Paint logs sync completed successfully using optimized CTE query"); } catch (\Exception $e) { Log::warning("CTE query failed, falling back to batch processing: " . $e->getMessage()); // FALLBACK SOLUTION: Batch Processing for MySQL < 8.0 or large datasets $batchSize = 1000; $offset = 0; $totalUpdated = 0; do { // Get latest spool status for each iso_number + spool_number combination $latestStatuses = DB::table('weld_logs as wl1') ->select('wl1.iso_number', 'wl1.spool_number', 'wl1.spool_status') ->leftJoin('weld_logs as wl2', function($join) { $join->on('wl1.iso_number', '=', 'wl2.iso_number') ->on('wl1.spool_number', '=', 'wl2.spool_number') ->whereRaw('wl1.updated_at < wl2.updated_at'); }) ->whereNull('wl2.id') ->whereNotNull('wl1.spool_status') ->when($filterIsoNumber, function($query) use ($filterIsoNumber) { return $query->where('wl1.iso_number', $filterIsoNumber); }) ->when($filterSpoolNumber, function($query) use ($filterSpoolNumber) { return $query->where('wl1.spool_number', $filterSpoolNumber); }) ->limit($batchSize) ->offset($offset) ->get(); if($latestStatuses->isEmpty()) { break; } // Batch update construction_paint_logs foreach($latestStatuses as $status) { $updateQuery = DB::table('construction_paint_logs') ->where('iso_drawings', $status->iso_number) ->where('spool', $status->spool_number); if($filterIsoNumber) { $updateQuery->where('iso_drawings', $filterIsoNumber); } if($filterSpoolNumber) { $updateQuery->where('spool', $filterSpoolNumber); } $updated = $updateQuery->update(['spool_status' => $status->spool_status]); $totalUpdated += $updated; } $offset += $batchSize; // Memory cleanup unset($latestStatuses); } while (true); Log::info("Paint logs sync completed using batch processing. Total updated: $totalUpdated"); } // Performance monitoring - End timing and log results $paintSyncEndTime = microtime(true); $paintSyncDuration = round($paintSyncEndTime - $paintSyncStartTime, 2); // Log performance metrics $performanceLog = [ 'operation' => 'paint_logs_sync', 'duration_seconds' => $paintSyncDuration, 'weld_logs_processed' => $k, 'paint_updates' => $updatePaint, 'completed_updates' => $updateCompleted, 'memory_usage_mb' => round(memory_get_peak_usage() / 1024 / 1024, 2), 'timestamp' => simdi() ]; Log::info("Performance metrics for spool status sync: " . json_encode($performanceLog)); // Alert if performance is degraded (> 30 seconds for paint sync) if($paintSyncDuration > 30) { Log::warning("Paint sync performance degraded - took {$paintSyncDuration} seconds. Consider database maintenance or optimization."); } ?>