Files
kopalnia_2026/app/Http/Controllers/AggregateSelectionController.php
T
2026-09-03 12:21:17 +02:00

115 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Services\PumpService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
/**
* Wybór agregatu pompowego (legacy site201 "Wysokość podnoszenia dla posiadanych
* typów pomp"). Narzędzie doboru: użytkownik podaje wydajność Q (i opcjonalnie
* wysokość podnoszenia H), system zwraca pompy obejmujące to Q wraz z H(Q)/η(Q),
* listę zestawów pompa+silnik posortowaną malejąco po sprawności oraz wykres
* nałożonych krzywych H. Klik wiersza -> szczegóły zestawu (aggregates.show).
*
* Szczegół zestawu = istniejący ekran agregatu (site201det był jego duplikatem),
* więc nie powielamy - kierujemy do aggregates.show?pump=X&engine=Y.
*/
class AggregateSelectionController extends Controller
{
public function __construct(private readonly PumpService $pumps) {}
public function index(Request $request)
{
$qIn = $request->query('q');
$hIn = $request->query('h');
$q = $this->toFloat($qIn);
$h = $this->toFloat($hIn);
$searched = $q !== null && $q > 0;
$matches = $searched ? $this->pumps->matchingAggregates($q, $h) : collect();
[$rows, $chart] = $matches->isNotEmpty()
? [$this->buildRows($matches), $this->buildChart($matches)]
: [collect(), null];
return view('catalog.aggregate-selection.index', [
'q' => $qIn, // surowe (do ponownego wyświetlenia w polu)
'h' => $hIn,
'qVal' => $q, // liczbowe (do nagłówka Q_sz)
'rows' => $rows,
'chart' => $chart,
'searched' => $searched,
]);
}
/**
* Rozwija dopasowane pompy na wiersze pompa+silnik. Silniki pompy wg mocy
* (ENG_POWER) - jak legacy. leftJoin: pompa bez silnika wciąż daje 1 wiersz.
*/
private function buildRows($matches)
{
$engines = DB::connection('softspm')->table('seg_pump_engine_rel as r')
->leftJoin('seg_engines as e', 'e.ENG_ID', '=', 'r.RPE_ENG_ID')
->whereIn('r.RPE_PUP_ID', $matches->pluck('pump.PUP_ID')->all())
->orderBy('e.ENG_POWER')
->select('r.RPE_PUP_ID', 'e.ENG_ID', 'e.ENG_NAME', 'e.ENG_POWER', 'e.ENG_VOLTAGE')
->get()
->groupBy('RPE_PUP_ID');
$rows = collect();
$lp = 1;
foreach ($matches as $m) {
$pumpEngines = $engines->get($m->pump->PUP_ID) ?: collect([null]);
foreach ($pumpEngines as $e) {
$rows->push((object) [
'lp' => $lp++,
'pump_id' => $m->pump->PUP_ID,
'pump_name' => $m->pump->PUP_NAME,
'engine_id' => $e->ENG_ID ?? null,
'engine_name' => $e->ENG_NAME ?? null,
'q_n' => $m->pump->PUP_Q_N,
'h_val' => $m->h_val,
'eta_val' => $m->eta_val,
'power' => $e->ENG_POWER ?? null,
'voltage' => $e->ENG_VOLTAGE ?? null,
]);
}
}
return $rows;
}
/**
* Dane wykresu nałożonych krzywych H (wspólne osie). xMax = najszersza
* krzywa, yMax = najwyższa (zaokrąglona w górę do 10, jak legacy).
*/
private function buildChart($matches): ?array
{
$curves = $matches->filter(fn ($m) => $m->plot)
->map(fn ($m) => ['name' => $m->pump->PUP_NAME, 'plot' => $m->plot])
->values();
if ($curves->isEmpty()) {
return null;
}
return [
'curves' => $curves,
'xMax' => (float) $curves->max(fn ($c) => $c['plot']['xMax']),
'yMax' => max(10.0, ceil($curves->max(fn ($c) => $c['plot']['yMax']) / 10) * 10),
];
}
/** Pole tekstowe -> float (przecinek dziesiętny), puste -> null. */
private function toFloat($v): ?float
{
if ($v === null || trim((string) $v) === '') {
return null;
}
return (float) str_replace(',', '.', (string) $v);
}
}