Initial commit
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use SoapClient;
|
||||
|
||||
/**
|
||||
* Integracja z SYNDIS (SOAP) - pobór aktualnego pomiaru studni i zapis do bazy.
|
||||
* Port legacy soap.php (SyndisConnector) + ajax_getdata4well.php.
|
||||
* Funkcje składowane MySQL zastąpione własnym kodem ([[port-db-functions-to-php]]).
|
||||
*
|
||||
* SKALA: SYNDIS zwraca wydajność w m³/min; do bazy zapisujemy m³/h (×60) -
|
||||
* baza zawsze m³/h ([[flow-unit-display]]).
|
||||
*/
|
||||
class SyndisService
|
||||
{
|
||||
/** Detale seg_dev_resources_det aktualizowane przy pobraniu (DRD_RESOURCES_DETAIL => 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user