From 6e58cf08feaaf921e34d5dbefa58d3bb952c71fa Mon Sep 17 00:00:00 2001 From: Djonathan Date: Fri, 24 Jun 2022 09:09:12 -0300 Subject: [PATCH] Implement Power Factor, Demand and Telemetry endpoints. --- app/Http/Controllers/TelemetryController.php | 67 ++++++++++++++++++ app/Http/Resources/TelemetryResource.php | 19 +++++ app/Models/Med5min.php | 29 ++++++++ app/Models/Scopes/UserScope.php | 9 --- .../Med5min/Med5minContractInterface.php | 9 +-- .../Med5min/Med5minRepository.php | 70 +++++++++++++++---- app/Support/FilterBuilder/FilterType.php | 5 +- routes/api.php | 7 ++ 8 files changed, 188 insertions(+), 27 deletions(-) create mode 100644 app/Http/Controllers/TelemetryController.php create mode 100644 app/Http/Resources/TelemetryResource.php diff --git a/app/Http/Controllers/TelemetryController.php b/app/Http/Controllers/TelemetryController.php new file mode 100644 index 0000000..acafe2f --- /dev/null +++ b/app/Http/Controllers/TelemetryController.php @@ -0,0 +1,67 @@ +med5minContract->getPowerFactor($request->all()); + return (new TelemetryResource($response)) + ->response() + ->setStatusCode(Response::HTTP_OK); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + + public function demand(Request $request) + { + try { + $response = $this->med5minContract->getDemand($request->all()); + return (new TelemetryResource($response)) + ->response() + ->setStatusCode(Response::HTTP_OK); + } catch (\Exception $ex) { + return $this->errorResponse(false, $ex->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); + } + } + + public function discretized15min($params) + { + + } + + public function discretizedOneHour($params) + { + + } + + public function discretizedOneDay($params) + { + + } + +} \ No newline at end of file diff --git a/app/Http/Resources/TelemetryResource.php b/app/Http/Resources/TelemetryResource.php new file mode 100644 index 0000000..7fba3bd --- /dev/null +++ b/app/Http/Resources/TelemetryResource.php @@ -0,0 +1,19 @@ +format('d/m/Y H:i:s'); + } } diff --git a/app/Models/Scopes/UserScope.php b/app/Models/Scopes/UserScope.php index 7c7238e..0543eac 100644 --- a/app/Models/Scopes/UserScope.php +++ b/app/Models/Scopes/UserScope.php @@ -28,15 +28,6 @@ class UserScope implements Scope "=", $model->qualifyColumn("cod_smart_unidade"), )->where('dados_cadastrais.cod_smart_cliente', '=', $user->client_id); - - -// $sql = DB::table('dados_cadastrais') -// ->select([ -// $model->qualifyColumn("cod_smart_unidade") -// ]) -// ->where($model->qualifyColumn("cod_smart_unidade"), '=', $user->client_id); -// -// $builder->whereRaw($sql, 'in', $user->client_id); } } diff --git a/app/Repositories/Med5min/Med5minContractInterface.php b/app/Repositories/Med5min/Med5minContractInterface.php index f644c56..6acc7bf 100644 --- a/app/Repositories/Med5min/Med5minContractInterface.php +++ b/app/Repositories/Med5min/Med5minContractInterface.php @@ -6,9 +6,10 @@ use App\Repositories\ContractInterface; interface Med5minContractInterface extends ContractInterface { - public function discretized5min($params); - public function discretized15min($params); - public function discretizedOneHour($params); - public function discretizedOneDay($params); + public function getDiscretized15min($params); + public function getDiscretizedOneHour($params); + public function getDiscretizedOneDay($params); + public function getPowerFactor($params); + public function getDemand($params); } \ No newline at end of file diff --git a/app/Repositories/Med5min/Med5minRepository.php b/app/Repositories/Med5min/Med5minRepository.php index cc40510..e637487 100644 --- a/app/Repositories/Med5min/Med5minRepository.php +++ b/app/Repositories/Med5min/Med5minRepository.php @@ -7,6 +7,8 @@ namespace App\Repositories\Med5min; use App\Models\Med5min; use App\Repositories\AbstractRepository; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; @@ -29,31 +31,77 @@ class Med5minRepository extends AbstractRepository implements Med5minContractInt return $query; } - public function discretized5min($params) + public function getPowerFactor($params): Collection|array { $fields = [ - 'med_5min.ponto', - 'med_5min.dia_num', + "med_5min.ponto", + "med_5min.dia_num", + DB::raw("TO_CHAR((date('1899-12-30') + interval '1' day * med_5min.dia_num), 'DD/MM/YYYY') as day_formatted"), DB::raw("(med_5min.minuto/60) AS hora"), - DB::raw("MOD(med_5min.minuto,60) AS minut"), DB::raw("SUM(med_5min.ativa_consumo) AS consumo"), - DB::raw("UM(med_5min.reativa_consumo+med_5min.reativa_geracao) AS reativa") + DB::raw("SUM(med_5min.reativa_consumo+med_5min.reativa_geracao) AS reativa"), + DB::raw("(SUM(med_5min.ativa_consumo)/( (SUM(med_5min.ativa_consumo)^2) + (SUM(med_5min.reativa_consumo+med_5min.reativa_geracao)^2) ))*100 as FP"), + DB::raw("0.92 as F_ref") ]; + $params = static::filterRow($params); + + return $this->execute($fields, $params) + ->groupBy(["med_5min.minuto", "med_5min.ponto", "med_5min.dia_num"]) + ->distinct() + ->get(); - return $this->execute($fields, $params); } - public function discretized15min($params) + public function getDemand($params): Collection|array + { + $fields = + [ + "med_5min.ponto", + "med_5min.dia_num", + DB::raw("TO_CHAR((date('1899-12-30') + interval '1' day * med_5min.dia_num), 'DD/MM/YYYY') as day_formatted"), + DB::raw("(med_5min.minuto/60) AS hora"), + DB::raw("SUM(med_5min.ativa_consumo) AS dem_reg"), + DB::raw("(CASE WHEN ((med_5min.minuto/60) >= 18 AND (med_5min.minuto/60) <= 21) THEN dados_cadastrais.demanda_p ELSE dados_cadastrais.demanda_fp END) as dem_cont") + ]; + + $params = static::filterRow($params); + + return $this->execute($fields, $params) + ->join( + "dados_cadastrais", + "dados_cadastrais.codigo_scde", + "=", + "med_5min.ponto" + ) + ->groupBy(["med_5min.ponto", "med_5min.dia_num", "day_formatted", 'hora', 'dem_cont']) + ->distinct() + ->get(); + } + + public static function filterRow($params, $field = 'dia_num'): array + { + $arr['filters'] = collect($params['filters']) + ->map(function ($value) use ($field) { + if ($value['field'] === $field) { + Arr::set($value, "field", "(date('1899-12-30') + interval '1' DAY * med_5min.{$value['field']})"); + $value['row'] = true; + } + return $value; + })->all(); + return $arr; + } + + public function getDiscretized15min($params) { $fields = [ 'med_5min.ponto', 'med_5min.dia_num', DB::raw("(med_5min.minuto/60) AS hora"), - DB::raw("MOD(med_5min.minuto,60) AS minut"), + DB::raw("((MOD(med_5min.minuto,60)/15)+1)*15 AS minut"), DB::raw("SUM(med_5min.ativa_consumo) AS consumo"), DB::raw("UM(med_5min.reativa_consumo+med_5min.reativa_geracao) AS reativa") ]; @@ -61,14 +109,13 @@ class Med5minRepository extends AbstractRepository implements Med5minContractInt return $this->execute($fields, $params); } - public function discretizedOneHour($params) + public function getDiscretizedOneHour($params) { $fields = [ 'med_5min.ponto', 'med_5min.dia_num', DB::raw("(med_5min.minuto/60) AS hora"), - DB::raw("MOD(med_5min.minuto,60) AS minut"), DB::raw("SUM(med_5min.ativa_consumo) AS consumo"), DB::raw("UM(med_5min.reativa_consumo+med_5min.reativa_geracao) AS reativa") ];; @@ -76,14 +123,13 @@ class Med5minRepository extends AbstractRepository implements Med5minContractInt return $this->execute($fields, $params); } - public function discretizedOneDay($params) + public function getDiscretizedOneDay($params) { $fields = [ 'med_5min.ponto', 'med_5min.dia_num', DB::raw("(med_5min.minuto/60) AS hora"), - DB::raw("MOD(med_5min.minuto,60) AS minut"), DB::raw("SUM(med_5min.ativa_consumo) AS consumo"), DB::raw("UM(med_5min.reativa_consumo+med_5min.reativa_geracao) AS reativa") ]; diff --git a/app/Support/FilterBuilder/FilterType.php b/app/Support/FilterBuilder/FilterType.php index 70403e6..886b6ee 100644 --- a/app/Support/FilterBuilder/FilterType.php +++ b/app/Support/FilterBuilder/FilterType.php @@ -77,10 +77,11 @@ class FilterType private static function makeBetweenFilter(Builder $builder, FilterItem $filter): Builder { + $field = ($filter->getRow()) ? DB::raw($filter->getField()) : $filter->getField(); if ($filter->getType() === "between") { - return $builder->whereBetween($filter->getField(), $filter->getValue()); + return $builder->whereBetween($field, $filter->getValue()); } elseif ($filter->getType() === "not_between") { - return $builder->whereNotBetween($filter->getField(), $filter->getValue()); + return $builder->whereNotBetween($field, $filter->getValue()); } return $builder; diff --git a/routes/api.php b/routes/api.php index de62591..3d9fb68 100644 --- a/routes/api.php +++ b/routes/api.php @@ -58,6 +58,13 @@ Route::middleware(['auth:sanctum', 'ability:Client'])->group(function () { Route::post('economy/estimates', [\App\Http\Controllers\EconomyController::class, 'captiveMonthlyEconomy']); Route::post('economy/MWh', [\App\Http\Controllers\EconomyController::class, 'costMWhEconomy']); +// Route::post('telemetry', [\App\Http\Controllers\TelemetryController::class, 'index']); + Route::post('telemetry/powerFactor', [\App\Http\Controllers\TelemetryController::class, 'powerFactor']); + Route::post('telemetry/demand', [\App\Http\Controllers\TelemetryController::class, 'demand']); +// Route::post('telemetry/grossMonthly', [\App\Http\Controllers\TelemetryController::class, 'grossMonthlyEconomy']); +// Route::post('telemetry/estimates', [\App\Http\Controllers\TelemetryController::class, 'captiveMonthlyEconomy']); +// Route::post('telemetry/MWh', [\App\Http\Controllers\TelemetryController::class, 'costMWhEconomy']); + Route::post('operation/summary', [\App\Http\Controllers\OperationSummaryController::class, 'operationSummary']); Route::post('operation', [\App\Http\Controllers\OperationSummaryController::class, 'index']);