From 02911be806e03c232dfc389ffbdbb4a220a43d3f Mon Sep 17 00:00:00 2001 From: ygbanzato Date: Wed, 13 Mar 2024 14:08:23 +0000 Subject: [PATCH] updated on workstations, validation checked with qrcodes --- app/Console/Kernel.php | 3 +- .../Controllers/CreateProjectController.php | 9 +- .../WorkstationsJobsController.php | 168 +++++++--- .../WorkstationComposer copy.php | 316 ++++++++++++++++++ .../ViewComposers/WorkstationComposer.php | 236 ++++++++----- public/user_logos/1710242399.jpg | Bin 0 -> 12412 bytes .../Templates/templateWorkstations.blade.php | 314 +++++++++++++++-- .../views/workstations/workstations.blade.php | 115 ++++--- routes/web.php | 2 +- 9 files changed, 955 insertions(+), 208 deletions(-) create mode 100755 app/Http/ViewComposers/WorkstationComposer copy.php create mode 100644 public/user_logos/1710242399.jpg diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index a8ef93d5..04cbce7b 100755 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -27,12 +27,13 @@ protected function schedule(Schedule $schedule): void // Atualiza sessões inativas \App\Models\ControlEquipmentWorkstation::where('status', 1) + ->whereNull('departure_date') ->where('last_active_at', '<', $inactiveLimit) ->update([ 'status' => 0, 'id_workstations' => null, 'elemental_tasks_id' => null, - 'entry_date' => null + 'entry_date' => null, ]); // Adicione outras tarefas necessárias aqui diff --git a/app/Http/Controllers/CreateProjectController.php b/app/Http/Controllers/CreateProjectController.php index ce28ecd4..1f92d0aa 100755 --- a/app/Http/Controllers/CreateProjectController.php +++ b/app/Http/Controllers/CreateProjectController.php @@ -1225,8 +1225,6 @@ public function processStep2(Request $request) if ($chooseAction == 'selectEquipments') { - - if ($existingEquipment) { $foundInExcel = false; @@ -1274,8 +1272,6 @@ public function processStep2(Request $request) // Continua com o processo de salvar o novo registro $newEquipmentWorkHistory->ispt_number = $isptNumber; - - $newEquipmentWorkHistory->save(); // Recebe o Id do 'EquipmentWorkHistory' criado. @@ -1283,7 +1279,6 @@ public function processStep2(Request $request) $isptNumber++; - $ambit = AmbitsEquipment::where('ambits_description', $datas['ambit'])->first(); if ($ambit) { @@ -1473,8 +1468,8 @@ public function processStep2(Request $request) return redirect()->route('articulated_2', ['id' => $request->numberProject]) ->with('danger', 'Equipamentos Pendentes criados: ' . $countPendingEquipments) ->with('dangerLogs', $ignoredLines) - ->with('equipmentPendingLogs', $equipmentPendingLogs) - ->with('pendingEquipments', $pendingEquipments); + ->with('equipmentPendingLogs', $equipmentPendingLogs); + // ->with('pendingEquipments', $pendingEquipments); } else { // Se não houver equipamentos pendentes, redirecione com uma mensagem de sucesso e inclua os $linhasIgnoradas se não estiverem vazios return redirect()->route('articulated_2', ['id' => $request->numberProject]) diff --git a/app/Http/Controllers/WorkstationsJobsController.php b/app/Http/Controllers/WorkstationsJobsController.php index f585709a..c8d57373 100755 --- a/app/Http/Controllers/WorkstationsJobsController.php +++ b/app/Http/Controllers/WorkstationsJobsController.php @@ -13,6 +13,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; +use Mockery\Undefined; class WorkstationsJobsController extends Controller @@ -116,10 +117,11 @@ public function updateSessionStatus(Request $request, $controlEquipmentId) public function receiveAnswersEquipment(Request $request, $control_equipment_workstation_id) { + dd($request); //No request recebemos ID(NUmero da tarela elementar) , esta variavel vai receber este ID apos selerar o id da string $elementalTaskID = 0; - // Deve receber o id da control atual. + // Deve receber as perguntas e respostas para a tarefa selecionada $requestData = $request->all(); foreach ($requestData as $key => $value) { @@ -195,10 +197,12 @@ public function receiveAnswersEquipment(Request $request, $control_equipment_wor // Agora que guardamos os dados anteriores, vamos criar a nova linha na tabela Control Equipment ID para que o equipamento continue // $newControlEquipment = new ControlEquipmentWorkstation; // $newControlEquipment->equipmentWorkHistorys_id = $recebeDataControlWs->equipmentWorkHistorys_id; - // $newControlEquipment->id_workstations = $recebeDataControlWs->id_workstations; - // $newControlEquipment->entry_date = now(); + // $newControlEquipment->last_active_at = now(); + // $newControlEquipment->status = 0; // $newControlEquipment->save(); + // dd($newControlEquipment); + // Vamos buscar os dados da tarefa elementar comcluida para mandar uma mensagem ao Front e indicar que esta completada $receiveDataElementalTask = ElementalTasks::find($recebeDataControlWs->elemental_tasks_id, 'elemental_tasks_id')->first(); @@ -211,36 +215,46 @@ public function receiveAnswersEquipment(Request $request, $control_equipment_wor // Ao selecionar o equipamento para se inicializar a tarefa deve mostrar os dados relacionados. public function getEquipmentData($equipment_id, $component_tag) { + // dd($equipment_id); //vai receber o email atual, no caso o da workstation que se encontra $userEmail = Auth::user(); - // Busca os dados da Ws com base no Login $receiveDataWs = ConstructionWorkstation::where('name_workstations', $userEmail->user_name)->first(); - - // Recebe os dados do Equipamento $receiveDataEquipment = Equipment::where('equipment_id', $equipment_id)->first(); + + $tagType = explode('@', $component_tag)[1]; // Isola o tipo da tag após o '@' + // Recebe o id do Historico do equipamento, em sua obra atual $receiveEquipmentWorkHistory = EquipmentWorkHistory::where('equipment_id', $receiveDataEquipment->equipment_id) ->where('company_projects_id', $receiveDataEquipment->company_projects_id) ->first(); - - - - //Verificar se o equipamento ja esta sendo utilizado em outra Ws se sim, retorna para a pagina anterior. + $equipmentInUse = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) - ->whereNull('departure_date') - ->whereNotNull('id_workstations') - ->where('id_workstations', '!=', $receiveDataWs->id_workstations) - ->where('status', 1) - ->exists(); + ->whereNull('departure_date') // A data de saída deve ser nula, indicando que a tarefa ainda está ativa + ->whereNotNull('id_workstations') // Deve ter um posto de trabalho associado + ->where('id_workstations', '!=', $receiveDataWs->id_workstations) // E esse posto de trabalho não deve ser o atual + ->where(function ($query) use ($tagType) { + if ($tagType == 'Obturador') { + // Apenas se a tarefa for igual a 9, indicando uma tarefa de Obturador + $query->where('elemental_tasks_id', '=', 9); + } elseif ($tagType == 'Corpo') { + // Apenas se a tarefa for NULL, indicando uma tarefa de Corpo que não foi especificada + $query->whereNull('elemental_tasks_id'); + } + }) + ->where('status', 1) // O status deve indicar que está ativo + ->whereNotNull('entry_date') // Deve ter uma data de entrada, indicando que a tarefa foi iniciada + ->exists(); // Verifica se existe ao menos um registro que atenda às condições + // Se o equipamento já estiver em uso, redirecione com uma mensagem de erro if ($equipmentInUse) { return redirect()->back()->with('danger', 'O equipamento já se encontra a executar tarefas noutro posto de trabalho.'); } + // Recebe todas as tarefas elementares do equipamento. $recebeTasksForEquipment = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id)->get(); @@ -277,35 +291,90 @@ public function getEquipmentData($equipment_id, $component_tag) $divisionElementalTasks[2] = $receiveTasksThatCannotBeDone->all(); - //Aplica 2 condicoes a variavel a primeira e se os 3 campos forem nulos e a segunda e se a id_workstations nao for null e tiver o valor igual ao da sessao atual, - $existingDataControlEquipment = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) - ->where(function ($query) use ($receiveDataWs) { - $query->where(function ($q) { - $q->whereNull('elemental_tasks_id') - ->whereNull('departure_date') - ->whereNull('id_workstations'); - })->orWhere(function ($q) use ($receiveDataWs) { - $q->whereNotNull('id_workstations') - ->where('id_workstations', $receiveDataWs->id_workstations) - ->whereNull('departure_date'); - }); - }) - ->first(); - if ($existingDataControlEquipment) { - // Registro existente encontrado, atualize conforme necessário - if (strpos($component_tag, '@Obturador') !== false) { - $existingDataControlEquipment->elemental_tasks_id = 9; + + // // //Aplica 2 condicoes a variavel a primeira e se os 3 campos forem nulos e a segunda e se a id_workstations nao for null e tiver o valor igual ao da sessao atual, + // $existingDataControlEquipment = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) + // ->whereNull('departure_date') + // ->whereNull('elemental_tasks_id') + // ->orWhere('elemental_tasks_id',9) + // ->where(function ($query) use ($receiveDataWs) { + // $query->whereNull('id_workstations') + // ->orWhere(function ($q) use ($receiveDataWs) { + // $q->whereNotNull('id_workstations') + // ->where('id_workstations', $receiveDataWs->id_workstations); + // }); + // }) + // ->first(); + + // dd($existingDataControlEquipment); + + // if ($existingDataControlEquipment) { + // // Registro existente encontrado, atualize conforme necessário + // if (strpos($component_tag, '@Obturador') !== false) { + // $existingDataControlEquipment->elemental_tasks_id = 9; + // } + // $existingDataControlEquipment->id_workstations = $receiveDataWs->id_workstations; + // $existingDataControlEquipment->entry_date = now(); + // $existingDataControlEquipment->status = 1; + // $existingDataControlEquipment->last_active_at = now(); + + // $existingDataControlEquipment->save(); + + // $receiveDataControlEquipment = $existingDataControlEquipment; + + $existingDataControlEquipment = null; + + + // Inicia a consulta baseada no tipo de tag + $query = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) + ->whereNull('departure_date') + ->where('status', 1); // Suponho que você deseja apenas registros ativos + + // Adiciona condições específicas baseadas no tipo de tag + if ($tagType == 'Obturador') { + // Procura por registros com elemental_tasks_id = 9 + $query->where('elemental_tasks_id', 9); + } elseif ($tagType == 'Corpo') { + // Procura por registros com elemental_tasks_id NULL + $query->whereNull('elemental_tasks_id'); + } + // Se encontrar Dados nestas condicoes, provavelmente, se refere a Uma atualizacao na pagina atual + if ($query->first()) { + + $existingDataControlEquipment = $query->first(); + + // Caso nao seja uma possivel atualizacao, antes de criar um dado novo, deve verificar, se exsite um control_equipment_workstation_id, que nao estaja em uso para este equipamento. + } else { + + $query = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) + ->whereNull('departure_date') + ->where('status', 0) + ->whereNull('id_workstations') + ->whereNull('elemental_tasks_id'); + + if ($query->first()) { + + $existingDataControlEquipment = $query->first(); + } + } + // Verifica se um registro foi encontrado e atualiza conforme necessário + if ($existingDataControlEquipment) { + $existingDataControlEquipment->id_workstations = $receiveDataWs->id_workstations; $existingDataControlEquipment->entry_date = now(); $existingDataControlEquipment->status = 1; $existingDataControlEquipment->last_active_at = now(); + // Se a tag for 'Obturador', atualiza o elemental_tasks_id se nao deixa como NULL + if ($tagType == 'Obturador') { + $existingDataControlEquipment->elemental_tasks_id = 9; + } $existingDataControlEquipment->save(); - $receiveDataControlEquipment = $existingDataControlEquipment; + } else { // Nenhum registro existente encontrado, crie um novo $newDataControlEquipment = new ControlEquipmentWorkstation; @@ -323,7 +392,6 @@ public function getEquipmentData($equipment_id, $component_tag) $receiveDataControlEquipment = $newDataControlEquipment; } - // Primeiro, obtenha o registro de ControlEquipmentWorkstation que não deve ter 'elemental_tasks_id' e 'departure_date' como null $completedTasks = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) ->whereNotNull('elemental_tasks_id') @@ -442,7 +510,6 @@ public function getEquipmentData($equipment_id, $component_tag) $recebeTasksForEquipment = $recebeTasksForEquipment->sortBy('elemental_tasks_id'); } - dd($receiveDataControlEquipment); return view('workstations.workstations', [ // Deve receber o atual COntrol ID ? tudo a vez que atualizar ?? @@ -455,32 +522,25 @@ public function getEquipmentData($equipment_id, $component_tag) } - public function cancelElementalTaskForEquipment($equipmentID,) + public function cancelElementalTaskForEquipment($controlEquipmentID) { //Nesta funcao se o utilizador da Ws utilizar o botao cancelar na view principal,o equipamento deve se desvincular na Ws atual e poder ser selecionado por outra. // Assim sendo mais pratico excluindo o ultimo dado desta Ws da tabela control_equipment_workstation, quando seu 'elemental_tasks_id' e 'departure_date' forem 'Null' - $receiveDataEquipment = Equipment::where('equipment_id', $equipmentID)->first(); + // $receiveDataEquipment = Equipment::where('equipment_id', $equipmentID)->first(); - // Recebe o id do Historico do equipamento, em sua obra atual - $receiveEquipmentWorkHistory = EquipmentWorkHistory::where('equipment_id', $receiveDataEquipment->equipment_id) - ->where('company_projects_id', $receiveDataEquipment->company_projects_id) - ->first(); + $receiveControlEquipmentID = ControlEquipmentWorkstation::where('control_equipment_workstation_id', $controlEquipmentID)->first(); - $existingControlEquipment = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $receiveEquipmentWorkHistory->equipmentWorkHistorys_id) - ->whereNull('elemental_tasks_id') - ->whereNull('departure_date') - ->first(); + if ($receiveControlEquipmentID) { + + $receiveControlEquipmentID->id_workstations = null; + $receiveControlEquipmentID->elemental_tasks_id = null; + $receiveControlEquipmentID->status = 0; + $receiveControlEquipmentID->entry_date = null; + $receiveControlEquipmentID->save(); - if ($existingControlEquipment) { - $existingControlEquipment->id_workstations = null; - $existingControlEquipment->elemental_tasks_id = null; - $existingControlEquipment->status = 0; - $existingControlEquipment->entry_date = null; - $existingControlEquipment->last_active_at = null; - $existingControlEquipment->save(); } - return redirect(route('enterWorkstation')); + } } diff --git a/app/Http/ViewComposers/WorkstationComposer copy.php b/app/Http/ViewComposers/WorkstationComposer copy.php new file mode 100755 index 00000000..ebb1344e --- /dev/null +++ b/app/Http/ViewComposers/WorkstationComposer copy.php @@ -0,0 +1,316 @@ +email; + $receiveDataEmail = User::where('email', $userEmail)->first(); + $receiveDataWs = ConstructionWorkstation::where('name_workstations', $receiveDataEmail->user_name)->first(); + + + + + + + // Busca todos os equipamentos associados a um determinado projeto. + // $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) + // ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) use ($excludedEquipmentsQuery) { + // //Quarto filtro : Com base na variavel $excludedEquipmentsQuery que serve para excluir equipamentos PSV, quando tem o @Corpo e @Obturador sendo feito em simultanio. + // $query->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); + // // Primeiro filtro: Equipamentos sem ocorrência em ControlEquipmentWorkstation + // $query->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation'); + // // Segundo filtro: Equipamentos que ja tiverem um controlEquipmentWorkstation_ID criado uma dos Ws o fechou sem concluir por um metodo nao convencional e o script do servidor limpou o controlEquipmentWorkstation_ID + // $query->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + // $subQuery->whereNull('id_workstations') + // ->whereNull('elemental_tasks_id') + // ->whereNull('departure_date') + // ->where('status', 0); + // }); + // // Terceiro filtro: Equipamentos com todas as colunas sao prenchidas como deve ser, signifca que e uma tarefa concluida(finalizada) e agora vai criar um novo dado na controlEquipmentWorkstation para a proxima tarefa. + // $query->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + // $subQuery->whereNotNull('id_workstations') + // ->where(function ($innerQuery) { + // $innerQuery->whereNotNull('elemental_tasks_id') + // ->whereNotNull('departure_date') + // ->where('status', 1); + // }); + // }); + // }) + // // Adiciona condição para PSV (equipment_type_id = 3) + // ->orWhere(function ($query) use ($receiveDataWs) { + // // Verifica no sistema se for uma 'PSV' , mesmo apos entrar como @Corpo, ou pelo @Obutador deve deixar o outro disponivel. + // $query->whereHas('equipmentType', function ($typeQuery) { + // $typeQuery->where('equipment_type_id', 3); + // }) + // ->whereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + // $subQuery->where('status', 1) + // ->whereNull('departure_date') + // ->where(function ($taskQuery) { + // $taskQuery->where('elemental_tasks_id', 9) + // ->orWhereNull('elemental_tasks_id'); + // }); + // }); + // }) + // ->with([ + // 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { + // $query->where('company_projects_id', $receiveDataWs->company_projects_id) + // ->select('equipment_id', 'equipmentWorkHistorys_id'); + // } + // ]) + // ->get() + // ->map(function ($equipment) { + // if (!$equipment->equipmentWorkHistory->isEmpty()) { + // $equipmentWorkHistory = $equipment->equipmentWorkHistory->first(); + // $equipment->equipmentWorkHistoryId = $equipmentWorkHistory->equipmentWorkHistorys_id; + // } else { + // $equipment->equipmentWorkHistoryId = null; + // } + // return $equipment; + // }); + + + + + + + // foreach ($receiveAllEquipmentOfProject as $equipment) { + // // Agora 'equipmentWorkHistoryId' contém um único ID, então não usamos 'pluck' + // $workHistoryId = $equipment->equipmentWorkHistoryId; // Obter ID do histórico de trabalho diretamente + + // // Verifica se existe um workHistoryId antes de prosseguir + // if (is_null($workHistoryId)) { + // continue; // Se não houver histórico de trabalho, continua para o próximo equipamento + // } + + // $taskIds = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $workHistoryId) + // ->pluck('elemental_tasks_id'); // Obter IDs de tarefas elementares baseado em um único workHistoryId + + // if ($taskIds->isEmpty()) { + // continue; // Se não houver tarefas, continua para o próximo equipamento + // } + + // //ESTE Code ve quantas vezes ja foi realizada cada tarefa do equipamento atual, saber o code a baixo ver se falta muito ou ja esta quase a acaber + // $workstationTaskCounts = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $taskIds) + // ->select('elemental_tasks_id', DB::raw('count(*) as total')) + // ->groupBy('elemental_tasks_id') + // ->pluck('total', 'elemental_tasks_id'); // Contagem de tarefas nas estações de trabalho + + // // Verificar se todas as tarefas foram concluídas pelo menos uma vez + // $allTasksCompleted = $taskIds->every(function ($taskId) use ($workstationTaskCounts) { + // return isset ($workstationTaskCounts[$taskId]) && $workstationTaskCounts[$taskId] >= 1; + // }); + + // if ($allTasksCompleted && $workstationTaskCounts->count() >= $taskIds->count()) { + // $completedEquipments->push($equipment); // Adicionar equipamento à lista de concluídos + // } + // } + + // // Remover equipamentos concluídos da coleção original + // $receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($completedEquipments) { + // return $completedEquipments->contains($equipment); + // }); + + // $equipmentIds = $receiveAllEquipmentOfProject->pluck('equipment_id'); + + // $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds)->get(); + + // //VAMOS filtrar os valores recebidos e terar todas as correspondencias de Flange, ja nao e uma tag que nao vai entrar no percurso do Equipamento. + // $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->reject(function ($item) { + // return strpos($item->component_tag, '@Flange') !== false; + // }); + + + + + + + + + + + + // Este código identifica equipmentWorkHistorys_id que estão simultaneamente envolvidos em duas tarefas + // (uma identificada por elemental_tasks_id = 9 e elemental_tasks_id = NULL), quando o departure_date é null) ou seja, ainda em progresso... + // Agrupando-os por equipmentWorkHistorys_id e filtrando para garantir que existam exatamente dois tipos distintos de tarefas elementais para cada equipamento. + $excludedEquipmentsQuery = ControlEquipmentWorkstation::select('equipmentWorkHistorys_id') + ->whereNull('departure_date') + ->where(function ($query) { + $query->where('elemental_tasks_id', 9) + ->orWhereNull('elemental_tasks_id'); + }) + ->groupBy('equipmentWorkHistorys_id') + ->havingRaw('COUNT(DISTINCT elemental_tasks_id) = 2'); + + // Este código filtra equipamentos de um projeto específico, excluindo aqueles já entrados no (excludedEquipmentsQuery), + $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) + ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) use ($excludedEquipmentsQuery) { + $query->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); + }) + // Condicao 1 : Se todos esses campos foram confirmados como NULL e status = 0, signifca que e um control_equipment_workstation_id de um equipamento que foi limpo pelos metodos de fechar atividade do equipamento na Ws de forma nao convencional. pelo script do servidor + ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + $subQuery->whereNull('id_workstations') + ->whereNull('elemental_tasks_id') + ->whereNull('entry_date') + ->where('status', 0); + }) + // Condicao 2 : Se os dados encontrados do equipamento tiverem com o departure_date principalmente diferente de NUll, signica que o ultima dado deste equipamento fez e concluiu uma de suas tarefas e agora precisa criar um dado novo. + ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + $subQuery->whereNotNull('id_workstations') + ->where(function ($innerQuery) { + $innerQuery->whereNotNull('elemental_tasks_id') + ->whereNotNull('departure_date') + ->where('status',1); + // ->orWhere('elemental_tasks_id', 9); + }); + }) + + ->with([ + 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { + $query->where('company_projects_id', $receiveDataWs->company_projects_id) + ->select('equipment_id', 'equipmentWorkHistorys_id'); + } + ]) + ->get() + ->map(function ($equipment) { + $equipmentWorkHistory = $equipment->equipmentWorkHistory->first() ?? null; + $equipment->equipmentWorkHistoryId = $equipmentWorkHistory?->equipmentWorkHistorys_id; + return $equipment; + }); + + dd($receiveAllEquipmentOfProject); + + $completedEquipments = collect(); // Coleção para armazenar equipamentos concluídos + + // Inicializa um array para armazenar o status de cada equipamento + $equipmentStatus = []; + + foreach ($receiveAllEquipmentOfProject as $equipment) { + // Agora 'equipmentWorkHistoryId' contém um único ID, então não usamos 'pluck' + $workHistoryId = $equipment->equipmentWorkHistoryId; // Obter ID do histórico de trabalho diretamente + + // Verifica se existe um workHistoryId antes de prosseguir + if (is_null($workHistoryId)) { + continue; // Se não houver histórico de trabalho, continua para o próximo equipamento + } + + $taskIds = OrderEquipmentTasks::where('equipmentWorkHistorys_id', $workHistoryId) + ->pluck('elemental_tasks_id'); // Obter IDs de tarefas elementares baseado em um único workHistoryId + + if ($taskIds->isEmpty()) { + continue; // Se não houver tarefas, continua para o próximo equipamento + } + + + // Busca registros na ControlEquipmentWorkstation com base no equipmentWorkHistoryId + $controlRecords = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $workHistoryId)->get(); + + if ($controlRecords->isEmpty()) { + // Se não houver registros, considera como valor 0 (nenhuma tarefa ativa) + $equipmentStatus[$equipment->equipment_id] = 0; + } else { + //Deve verificar se o departure_date e NULL e o id_workstations <> null, e status = 0 + // $activeTasks = $controlRecords->whereNull('departure_date'); + $activeTasks = $controlRecords->whereNull('departure_date') + ->whereNotNull('id_workstations') + ->where('status', '!=', 0); + + if ($activeTasks->isEmpty()) { + // Se não houver tarefas ativas, considera como valor 0 (nenhuma tarefa ativa) + $equipmentStatus[$equipment->equipment_id] = 0; + } else { + // Verifica as condições para determinar os valores 1 ou 2 + $hasObturadorTask = $activeTasks->contains('elemental_tasks_id', 9); + $hasCorpoTask = $activeTasks->contains('elemental_tasks_id', null); + + if ($hasObturadorTask) { + // Se tiver tarefa ativa para Obturador, valor = 2 + $equipmentStatus[$equipment->equipment_id] = 2; + } elseif ($hasCorpoTask) { + // Se tiver tarefa ativa para Corpo, valor = 1 + $equipmentStatus[$equipment->equipment_id] = 1; + } else { + // Caso contrário, considera como 0 + $equipmentStatus[$equipment->equipment_id] = 0; + } + } + } + + $workstationTaskCounts = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $taskIds) + ->select('elemental_tasks_id', DB::raw('count(*) as total')) + ->groupBy('elemental_tasks_id') + ->pluck('total', 'elemental_tasks_id'); // Contagem de tarefas nas estações de trabalho + + // Verificar se todas as tarefas foram concluídas pelo menos uma vez + $allTasksCompleted = $taskIds->every(function ($taskId) use ($workstationTaskCounts) { + return isset ($workstationTaskCounts[$taskId]) && $workstationTaskCounts[$taskId] >= 1; + }); + + if ($allTasksCompleted && $workstationTaskCounts->count() >= $taskIds->count()) { + $completedEquipments->push($equipment); // Adicionar equipamento à lista de concluídos + } + } + + // Remover equipamentos concluídos da coleção original + $receiveAllEquipmentOfProject = $receiveAllEquipmentOfProject->reject(function ($equipment) use ($completedEquipments) { + return $completedEquipments->contains($equipment); + }); + + $equipmentIds = array_keys($equipmentStatus); + + + + // Obtendo os registros QrcodesAssociatedEquipment para esses equipamentos + $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds) + ->get(); + + + $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->filter(function ($qrcodeEquipment) use ($equipmentStatus) { + // Exclui 'Flange' + if (strpos($qrcodeEquipment->component_tag, '@Flange') !== false) { + return false; + } + + // Obtém o status do equipamento atual + $equipmentId = $qrcodeEquipment->equipment_id; + $status = $equipmentStatus[$equipmentId] ?? null; + + // Decide se 'Corpo' ou 'Obturador' deve ser excluído com base no status + switch ($status) { + case 1: // Exclui 'Corpo' se o status for 1 + return strpos($qrcodeEquipment->component_tag, '@Corpo') === false; + case 2: // Exclui 'Obturador' se o status for 2 + return strpos($qrcodeEquipment->component_tag, '@Obturador') === false; + case 0: // Mantém ambos se o status for 0 + default: + return true; + } + }); + + //Returning values of the queries to workstations layout + $view->with([ + 'receiveAllEquipmentOfProject' => $receiveAllEquipmentOfProject, + // foi alterado para a variavel 'filteredQrcodeEquipments' pois nao tem a necessidade do utilizador selecionar 'Flange'(AINDA NAO !) + 'receiveQrcodeEquipmentsProject' => $filteredQrcodeEquipments, + 'completedEquipments' => $completedEquipments, + 'receiveDataWs' => $receiveDataWs, + ]); + + } +} diff --git a/app/Http/ViewComposers/WorkstationComposer.php b/app/Http/ViewComposers/WorkstationComposer.php index 3433c9d7..9275e568 100755 --- a/app/Http/ViewComposers/WorkstationComposer.php +++ b/app/Http/ViewComposers/WorkstationComposer.php @@ -18,69 +18,70 @@ class WorkstationComposer { public function compose(View $view) { + //Recebe o User pela sessao atual e recebe seus dados. $userEmail = Auth::user()->email; $receiveDataEmail = User::where('email', $userEmail)->first(); - $receiveDataWs = ConstructionWorkstation::where('name_workstations', $receiveDataEmail->user_name)->first(); - // Busca todos os equipamentos associados a um determinado projeto. - // $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) - // // Verifica se existe histórico de trabalho associado ao equipamento e ao projeto específico. - // ->whereHas('equipmentWorkHistory', function ($query) use ($receiveDataWs) { - // $query->where('company_projects_id', $receiveDataWs->company_projects_id); + // Verifica equipamentos que tenho 2 dados com o departure_date = NULL e especificamente um dado tem o elemental_tasks_id = 9 e o outro igual a NULL. + //Isto para ser possivel identificar equipamentos (psv-Provavelmente) que esta sendo feitas em simultanio suas pecas e nao deve ser diponivel ate uma de suas pecas tiverem deponivel. + $excludedEquipmentsQuery = ControlEquipmentWorkstation::select('equipmentWorkHistorys_id') + ->whereNull('departure_date') + ->where('status', 1) + ->groupBy('equipmentWorkHistorys_id') + ->havingRaw('SUM(CASE WHEN elemental_tasks_id = 9 THEN 1 ELSE 0 END) = 1') // Assegura um registro com elemental_tasks_id = 9 + ->havingRaw('SUM(CASE WHEN elemental_tasks_id IS NULL THEN 1 ELSE 0 END) = 1') // Assegura um registro com elemental_tasks_id NULL + ->pluck('equipmentWorkHistorys_id'); // Obtém os IDs para exclusão + + + // // Busca todos os equipamentos associados a um determinado projeto. + // $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) + + // ->WhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) use ($excludedEquipmentsQuery) { + // $subQuery->whereNot('equipmentWorkHistorys_id', $excludedEquipmentsQuery); // }) - // // Exclui os equipamentos cujo histórico de trabalho mais recente (controlEquipmentWorkstation) tem 'elemental_tasks_id' e 'departure_date' nulos. - // ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) { - // $query->where(function ($q) { - // $q->whereNull('elemental_tasks_id') - // ->WhereNull('departure_date') - // ->WhereNotNull('id_workstations'); - // }) ; - // }) - - // // Carrega o histórico de trabalho associado ao equipamento e ao projeto específico. - // ->with([ - // 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { - // // Filtra o histórico de trabalho pelo 'company_projects_id' para obter os registros relevantes. - // $query->where('company_projects_id', $receiveDataWs->company_projects_id) - // ->select('equipment_id', 'equipmentWorkHistorys_id'); // Seleciona apenas os campos necessários. - // } - // ]) - // ->get() // Obtém os resultados da consulta. - // ->map(function ($equipment) { - // // Supondo que cada equipamento tem apenas um 'equipmentWorkHistory' relevante para este contexto - // if (!$equipment->equipmentWorkHistory->isEmpty()) { - // $equipmentWorkHistory = $equipment->equipmentWorkHistory->first(); - // $equipment->equipmentWorkHistoryId = $equipmentWorkHistory->equipmentWorkHistorys_id; - // } else { - // // Definir como null ou algum valor padrão se não houver histórico correspondente - // $equipment->equipmentWorkHistoryId = null; - // } - // return $equipment; - // }); - - // $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) // // Primeiro filtro: Equipamentos sem ocorrência em ControlEquipmentWorkstation // ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation') - // // Segundo filtro: Equipamentos com ocorrências onde id_workstations e elemental_tasks_id são nulos - // ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) { - // $query->whereNull('id_workstations') - // ->whereNull('elemental_tasks_id'); + + // // Segundo filtro: Equipamentos que ja tiverem um controlEquipmentWorkstation_ID criado uma dos Ws o fechou sem concluir por um metodo nao convencional e o script do servidor limpou o controlEquipmentWorkstation_ID + // ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + // $subQuery->whereNull('id_workstations') + // ->whereNull('elemental_tasks_id') + // ->whereNull('departure_date') + // ->where('status', 0); // }) - // // Terceiro filtro: Equipamentos com todas as ocorrências onde id_workstations, elemental_tasks_id e departure_date não são nulos - // ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($query) { - // $query->whereNotNull('id_workstations') - // ->whereNotNull('elemental_tasks_id') - // ->whereNotNull('departure_date'); + // // Terceiro filtro: Equipamentos com todas as colunas sao prenchidas como deve ser, signifca que e uma tarefa concluida(finalizada) e agora vai criar um novo dado na controlEquipmentWorkstation para a proxima tarefa. + // ->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + // $subQuery->whereNotNull('id_workstations') + // ->where(function ($innerQuery) { + // $innerQuery->whereNotNull('elemental_tasks_id') + // ->whereNotNull('departure_date') + // ->where('status', 1); + // }); + // }) + + // // No geral esta condicao verifica que e uma psv, e que tem a possiblidade de ficar diponivel para selecionar o equipamento , mesmo com ele ja dentro de uma Ws. + // // Adiciona condição para PSV (equipment_type_id = 3) + // ->orWhere(function ($query) { + // // Verifica no sistema se for uma 'PSV' , mesmo apos entrar como @Corpo, ou pelo @Obutador deve deixar o outro disponivel. + // $query->whereHas('equipmentType', function ($typeQuery) { + // $typeQuery->where('equipment_type_id', 3); + // }) + // ->whereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + // $subQuery->where('status', 1) + // ->whereNull('departure_date') + // ->where(function ($taskQuery) { + // $taskQuery->where('elemental_tasks_id', 9) + // ->orWhereNull('elemental_tasks_id'); + // }); + // }); + // }) + // // Último filtro: Equipamentos cujo equipmentWorkHistorys_id NÃO estão na lista excluída. + // ->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) use ($excludedEquipmentsQuery) { + // // Aqui é onde verificamos se o equipmentWorkHistorys_id NÃO está contido na lista excluída. + // $subQuery->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); // }) - // // Carrega o histórico de trabalho associado ao equipamento e ao projeto específico - // ->with([ - // 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { - // $query->where('company_projects_id', $receiveDataWs->company_projects_id) - // ->select('equipment_id', 'equipmentWorkHistorys_id'); - // } - // ]) // ->get() // ->map(function ($equipment) { // if (!$equipment->equipmentWorkHistory->isEmpty()) { @@ -93,34 +94,49 @@ public function compose(View $view) // }); + // Busca todos os equipamentos associados a um determinado projeto. $receiveAllEquipmentOfProject = Equipment::where('company_projects_id', $receiveDataWs->company_projects_id) - ->where(function ($query) use ($receiveDataWs) { + // Use whereDoesntHave para excluir os equipamentos cujos IDs de histórico estão no array excluído + ->where(function ($query) use ($excludedEquipmentsQuery) { + // Agrupa as condições para aplicar corretamente a lógica de exclusão e inclusão + $query->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) use ($excludedEquipmentsQuery) { + // Exclui os equipamentos cujos IDs de histórico estão no array excluído + $subQuery->whereIn('equipmentWorkHistorys_id', $excludedEquipmentsQuery); + }) + ->orWhere(function ($query) { + // Aplica o segundo filtro somente aos equipamentos que não foram excluídos pelo primeiro + $query->whereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + $subQuery->whereNotNull('id_workstations') + ->whereNotNull('elemental_tasks_id') + ->whereNotNull('departure_date') + ->where('status', 1); + }); + + // Verifica no sistema se for uma 'PSV' , mesmo apos entrar como @Corpo, ou pelo @Obutador deve deixar o outro disponivel. + $query->whereHas('equipmentType', function ($typeQuery) { + $typeQuery->where('equipment_type_id', 3); + }) + ->whereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { + $subQuery->where('status', 1) + ->whereNull('departure_date') + ->where(function ($taskQuery) { + $taskQuery->where('elemental_tasks_id', 9) + ->orWhereNull('elemental_tasks_id'); + }); + }); + }); // Primeiro filtro: Equipamentos sem ocorrência em ControlEquipmentWorkstation $query->whereDoesntHave('equipmentWorkHistory.controlEquipmentWorkstation'); - // Segundo filtro: Equipamentos com ocorrências onde id_workstations e elemental_tasks_id são nulos + // Segundo filtro: Equipamentos que ja tiverem um controlEquipmentWorkstation_ID criado uma dos Ws o fechou sem concluir por um metodo nao convencional e o script do servidor limpou o controlEquipmentWorkstation_ID $query->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { $subQuery->whereNull('id_workstations') - ->whereNull('elemental_tasks_id'); - }); - - // Terceiro filtro: Equipamentos com todas as ocorrências onde id_workstations, elemental_tasks_id e departure_date não são nulos - // Inclui a condição para elemental_tasks_id = 9 - $query->orWhereHas('equipmentWorkHistory.controlEquipmentWorkstation', function ($subQuery) { - $subQuery->whereNotNull('id_workstations') - ->where(function ($innerQuery) { - $innerQuery->whereNotNull('elemental_tasks_id') - ->whereNotNull('departure_date') - ->orWhere('elemental_tasks_id', 9); // Inclui equipamentos com elemental_tasks_id = 9 independentemente de outros critérios - }); + ->whereNull('elemental_tasks_id') + ->whereNull('departure_date') + ->where('status', 0); }); }) - ->with([ - 'equipmentWorkHistory' => function ($query) use ($receiveDataWs) { - $query->where('company_projects_id', $receiveDataWs->company_projects_id) - ->select('equipment_id', 'equipmentWorkHistorys_id'); - } - ]) + ->with('equipmentWorkHistory') // Carrega o relacionamento equipmentWorkHistory ->get() ->map(function ($equipment) { if (!$equipment->equipmentWorkHistory->isEmpty()) { @@ -132,10 +148,11 @@ public function compose(View $view) return $equipment; }); - - $completedEquipments = collect(); // Coleção para armazenar equipamentos concluídos + // Inicializa um array para armazenar o status de cada equipamento + $equipmentStatus = []; + foreach ($receiveAllEquipmentOfProject as $equipment) { // Agora 'equipmentWorkHistoryId' contém um único ID, então não usamos 'pluck' $workHistoryId = $equipment->equipmentWorkHistoryId; // Obter ID do histórico de trabalho diretamente @@ -152,6 +169,40 @@ public function compose(View $view) continue; // Se não houver tarefas, continua para o próximo equipamento } + // Busca registros na ControlEquipmentWorkstation com base no equipmentWorkHistoryId + $controlRecords = ControlEquipmentWorkstation::where('equipmentWorkHistorys_id', $workHistoryId)->get(); + + if ($controlRecords->isEmpty()) { + // Se não houver registros, considera como valor 0 (nenhuma tarefa ativa) + $equipmentStatus[$equipment->equipment_id] = 0; + } else { + //Deve verificar se o departure_date e NULL e o id_workstations <> null, e status = 0 + // $activeTasks = $controlRecords->whereNull('departure_date'); + $activeTasks = $controlRecords->whereNull('departure_date') + ->whereNotNull('id_workstations') + ->where('status', '!=', 0); + + if ($activeTasks->isEmpty()) { + // Se não houver tarefas ativas, considera como valor 0 (nenhuma tarefa ativa) + $equipmentStatus[$equipment->equipment_id] = 0; + } else { + // Verifica as condições para determinar os valores 1 ou 2 + $hasObturadorTask = $activeTasks->contains('elemental_tasks_id', 9); + $hasCorpoTask = $activeTasks->contains('elemental_tasks_id', null); + + if ($hasObturadorTask) { + // Se tiver tarefa ativa para Obturador, valor = 2 + $equipmentStatus[$equipment->equipment_id] = 2; + } elseif ($hasCorpoTask) { + // Se tiver tarefa ativa para Corpo, valor = 1 + $equipmentStatus[$equipment->equipment_id] = 1; + } else { + // Caso contrário, considera como 0 + $equipmentStatus[$equipment->equipment_id] = 0; + } + } + } + $workstationTaskCounts = ControlEquipmentWorkstation::whereIn('elemental_tasks_id', $taskIds) ->select('elemental_tasks_id', DB::raw('count(*) as total')) ->groupBy('elemental_tasks_id') @@ -172,18 +223,39 @@ public function compose(View $view) return $completedEquipments->contains($equipment); }); + $equipmentIds = array_keys($equipmentStatus); - $equipmentIds = $receiveAllEquipmentOfProject->pluck('equipment_id'); - $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds)->get(); - //VAMOS filtrar os valores recebidos e terar todas as correspondencias de Flange, ja nao e uma tag que nao vai entrar no percurso do Equipamento. - $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->reject(function ($item) { - return strpos($item->component_tag, '@Flange') !== false; + // Obtendo os registros QrcodesAssociatedEquipment para esses equipamentos + $receiveQrcodeEquipmentsProject = QrcodesAssociatedEquipment::whereIn('equipment_id', $equipmentIds) + ->get(); + + + $filteredQrcodeEquipments = $receiveQrcodeEquipmentsProject->filter(function ($qrcodeEquipment) use ($equipmentStatus) { + // Exclui 'Flange' + if (strpos($qrcodeEquipment->component_tag, '@Flange') !== false) { + return false; + } + + + + // Obtém o status do equipamento atual + $equipmentId = $qrcodeEquipment->equipment_id; + $status = $equipmentStatus[$equipmentId] ?? null; + + // Decide se 'Corpo' ou 'Obturador' deve ser excluído com base no status + switch ($status) { + case 1: // Exclui 'Corpo' se o status for 1 + return strpos($qrcodeEquipment->component_tag, '@Corpo') === false; + case 2: // Exclui 'Obturador' se o status for 2 + return strpos($qrcodeEquipment->component_tag, '@Obturador') === false; + case 0: // Mantém ambos se o status for 0 + default: + return true; + } }); - - //Returning values of the queries to workstations layout $view->with([ 'receiveAllEquipmentOfProject' => $receiveAllEquipmentOfProject, diff --git a/public/user_logos/1710242399.jpg b/public/user_logos/1710242399.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce91928d0f401447090aff08728e76d05dcb677a GIT binary patch literal 12412 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 - + {{-- + --}} + + + + - + + {{-- @@ -35,19 +36,25 @@ - + --}} @section('content') - - - - - - - + @endif
@@ -430,11 +437,11 @@ class="form-control card_inputs" id="isolation"
-
@@ -463,13 +470,19 @@ class="btn btn-danger float-right" style="background-color: red">Finalizar Açõ
+ method="POST" id="form1" enctype="multipart/form-data"> @csrf
+
+ + +
+ +
@@ -3507,27 +3520,22 @@ class="btn btn-primary float-right">Guardar @csrf
- - -
-
- formatted_answers['confirm_label_compliance']) && - $task_todo->formatted_answers['confirm_label_compliance'] == 'on') checked @endif - @if ($task_todo->cardTypeStyle == 'gray') disabled @endif required> - + +
+

+
+
+ +

+ + -
@@ -3809,8 +3817,10 @@ class="form-control select2" required> @if ($task_todo->cardTypeStyle != 'gray') @endif @@ -3821,10 +3831,10 @@ class="btn btn-primary float-right">Guardar