Implement Power Factor, Demand and Telemetry endpoints.

This commit is contained in:
Djonathan 2022-06-24 09:09:12 -03:00
parent ed8d95a942
commit 6e58cf08fe
8 changed files with 188 additions and 27 deletions

View File

@ -0,0 +1,67 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers;
use App\Http\Resources\TelemetryResource;
use App\Repositories\Med5min\Med5minContractInterface;
use App\Traits\ApiResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class TelemetryController extends Controller
{
use ApiResponse;
public function __construct(
protected Med5minContractInterface $med5minContract
){}
public function index()
{
//
}
public function powerFactor(Request $request)
{
try {
$response = $this->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)
{
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class TelemetryResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return parent::toArray($request);
}
}

View File

@ -2,6 +2,7 @@
namespace App\Models;
use DateTimeInterface;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
@ -12,4 +13,32 @@ use OwenIt\Auditing\Auditable;
class Med5min extends Model implements Auditing
{
use HasFactory, SoftDeletes, Auditable;
protected $table = "med_5min";
protected $guarded = ['id'];
protected $fillable = [
'origem',
'dia_num',
'minuto',
'ativa_consumo',
'ativa_geracao',
'reativa_consumo',
'reativa_geracao',
'ponto',
'created_at',
'updated_at',
'deleted_at',
];
protected $hidden = [
'updated_at',
'deleted_at',
];
protected function serializeDate(DateTimeInterface $date): string
{
return $date->format('d/m/Y H:i:s');
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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")
];

View File

@ -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;

View File

@ -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']);