ispt4.0_laravel/app/Http/ViewComposers/WorkstationComposer copy.php

315 lines
16 KiB
PHP
Executable File

<?php
namespace App\Http\ViewComposers;
use App\Models\ConstructionWorkstation;
use App\Models\ControlEquipmentWorkstation;
use App\Models\Equipment;
use App\Models\EquipmentWorkHistory;
use App\Models\OrderEquipmentTasks;
use App\Models\QrcodesAssociatedEquipment;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\View\View;
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)
// ->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;
});
$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,
]);
}
}