klucz danych SYNDIS / wyliczenie). */ private function db() { return DB::connection('softspm'); } /** * Pobiera aktualne dane studni z SYNDIS i zapisuje pomiar. Zwraca true gdy * zapisano (pompa załączona), false gdy pompa wyłączona / brak danych. * * @throws \Throwable gdy SOAP/SYNDIS niedostępny (obsługiwane w kontrolerze) */ public function refreshWell(int $drs, string $wellName, string $user): bool { $data = $this->getWellData($wellName); if ((int) $this->raw($data, 'pumpOnOff') !== 1) { return false; // legacy: zapis tylko gdy pompa pracuje } $v = fn (string $k) => $this->num($this->raw($data, $k)); // Przeliczenia jak legacy: $pp = $v('pressureInPistonBody') - (($v('barometricPressuremA') * 10) / 98); $lp = (float) ($this->lastDetailValue(240, $drs) ?? 0); $hh = $lp - $v('dynamicWaterTable'); $qH = $v('pumpEfficiency') * 60; // m³/min -> m³/h $now = Carbon::now()->toDateTimeString(); $meas = [ 'RHD_DRS_ID' => $drs, 'RHD_DATE' => $now, 'RHD_HD_VAL' => $v('dynamicWaterTable'), 'RHD_Q_VAL' => $qH, 'RHD_P1_VAL' => $v('pressureBeforeThrottle'), 'RHD_P2_VAL' => $v('pressureAfterThrottle'), 'RHD_I_VAL' => $v('currentL1'), 'RHD_U_VAL' => $v('voltageL12'), 'RHD_PE_VAL' => $v('activePower'), 'RHD_COS_VAL' => $v('cos'), 'RHD_PP_VAL' => $pp, 'RHD_HH_VAL' => $hh, 'RHD_WTEMP_VAL' => $v('waterTemperature'), 'RHD_DGN_VAL' => $v('currentDiagnosticsOperationState'), 'RHD_AUDIT_CD' => $now, ]; // Detale do podmiany w seg_dev_resources_det (jak legacy delete+insert). $details = [ 200 => $qH, 205 => $v('dynamicWaterTable'), 215 => $v('pressureBeforeThrottle'), 220 => $v('pressureAfterThrottle'), 245 => $v('waterTemperature'), 260 => $v('activePower'), 265 => $v('activeEnergy'), 270 => $v('currentL1'), 275 => $v('voltageL12'), 280 => $v('cos'), 401 => $pp, 402 => $hh, ]; $this->db()->transaction(function () use ($drs, $meas, $details, $user, $now) { $this->db()->table('rep_soap_syndis_quality_data') ->where('SQD_DRS_ID', $drs)->update(['SQD_AUDIT_CD' => $now]); $this->db()->table('rep_his_data_everyday')->insert($meas); $this->db()->table('rep_his_data_demand')->insert($meas); foreach ($details as $detail => $value) { $this->db()->table('seg_dev_resources_det') ->where('DRD_RESOURCES_DETAIL', $detail) ->where('DRD_DRS_ID', $drs) ->delete(); $this->db()->table('seg_dev_resources_det')->insert([ 'DRD_DRS_ID' => $drs, 'DRD_RESOURCES_DETAIL'=> $detail, 'DRD_VALUE' => (string) $value, 'DRD_EXPORT_SEGAP' => '1', 'DRD_AUDIT_USR' => $user, 'DRD_AUDIT_DATE' => $now, ]); } }); return true; } /** Wywołanie SOAP GetWellData -> tablica (port SyndisConnector::GetWellDataAsArray). */ private function getWellData(string $wellName): array { if (! class_exists(SoapClient::class)) { throw new \RuntimeException('Rozszerzenie PHP soap nie jest dostępne na serwerze.'); } $cfg = config('softspm.syndis'); $client = new SoapClient($cfg['wsdl'], ['trace' => 1, 'cache_wsdl' => WSDL_CACHE_NONE]); if (! empty($cfg['location'])) { $client->__setLocation($cfg['location']); } return $this->objectToArray($client->GetWellData(['id' => $wellName])); } /** Ostatnia wartość detalu (port getLastValue) - dla Lp przy przeliczeniu Hh. */ private function lastDetailValue(int $detail, int $drs): ?string { return $this->db()->table('seg_dev_resources_det') ->where('DRD_RESOURCES_DETAIL', $detail) ->where('DRD_DRS_ID', $drs) ->orderByDesc('DRD_AUDIT_DATE')->orderByDesc('DRD_ID') ->value('DRD_VALUE'); } /** SYNDIS zwraca pola jako {'value' => x}; wyciąga surową wartość. */ private function raw(array $data, string $key): mixed { return $data[$key]['value'] ?? null; } private function num(mixed $v): float { return (float) str_replace(',', '.', (string) ($v ?? 0)); } private function objectToArray(mixed $d): mixed { if (is_object($d)) { $d = get_object_vars($d); } return is_array($d) ? array_map([$this, 'objectToArray'], $d) : $d; } }