API update.

This commit is contained in:
Djonathan 2022-07-05 00:26:26 -03:00
parent 8ce9e92550
commit 9b7987a11e
10 changed files with 255 additions and 39 deletions

View File

@ -42,3 +42,16 @@ if (!function_exists('xmlToObject')) {
return @simplexml_load_string(@file_get_contents($link), 'SimpleXMLElement', LIBXML_NOCDATA);
}
}
if ('format_date_sql'){
function format_date_sql($params, $model)
{
foreach ($params->getFields() as $param) {
$params->setFields(["TO_CHAR(TO_DATE({$model->qualifyColumn($param)}, 'YYMM'), 'MM/YYYY')"]);
}
return $params;
}
}

View File

@ -3,6 +3,11 @@
namespace App\Helpers;
use DateInterval;
use DatePeriod;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
class Helpers
{
public static function uploadFiles($params, $field): ?string
@ -15,4 +20,50 @@ class Helpers
return $result;
}
public static function orderByDate($result): array
{
return collect($result)->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all();
}
public static function checkDate($value): array
{
$year = collect($value)->transform(fn($item, $value) => collect(Str::of($item['mes'])
->explode('-')->offsetGet(0)))->unique()->toArray();
$month = collect($value)->transform(fn($item, $value) => collect(Str::of($item['mes'])
->explode('-')->offsetGet(1)))->unique()->toArray();
$month_stat = end($month);
$date_stat = current($year);
$date_end = end($year);
$start_date = date_create("{$date_stat[0]}-01-01");
$end_date = date_create("{$date_end[0]}-{$month_stat[0]}-30");
$interval = DateInterval::createFromDateString('1 months');
$daterange = new DatePeriod($start_date, $interval, $end_date);
$date = [];
foreach ($daterange as $date1) {
$date[] = $date1->format('Y-m'.'-01');
}
$arr = collect($value)->toArray();
foreach ($date as $dt) {
if (!in_array($dt, array_column($arr, 'mes'))) {
$arr[] = ['mes' => $dt];
}
}
usort($arr, function ($a, $b, $i = 'mes') {
$t1 = strtotime($a[$i]);
$t2 = strtotime($b[$i]);
return $t1 - $t2;
});
return $arr;
}
}

View File

@ -16,6 +16,8 @@ abstract class AbstractRepository
protected AbstractRepository|Model $model;
protected $item;
/**
* @throws BindingResolutionException
*/
@ -24,20 +26,9 @@ abstract class AbstractRepository
$this->model = $model ?? $this::resolveModel();
}
public function __call($name, $arguments)
public function filterBuilder($params): void
{
$result = $this->forwardCallTo($this->model, $name, $arguments);
if ($result === $this->model) {
return $this;
}
return $result;
}
public function __get($name)
{
return $this->model->{$name};
$this->item = static::getFilterBuilder($params);
}
/**
@ -56,4 +47,21 @@ abstract class AbstractRepository
return (new static)->$model;
}
public function __call($name, $arguments)
{
$result = $this->forwardCallTo($this->model, $name, $arguments);
if ($result === $this->model) {
return $this;
}
return $result;
}
public function __get($name)
{
return $this->model->{$name};
}
}

View File

@ -33,6 +33,7 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
return $query;
}
/* Economia bruta anual */
public function getGrossAnnualEconomy($params): Collection|array
{
$field = [
@ -52,11 +53,12 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
->get();
}
/* Economia bruta mensal */
public function getGrossMonthlyEconomy($params)
{
$field = [
DB::raw("TO_DATE(economia.mes, 'YYMM') as mes"),
DB::raw("SUM(economia.economia_acumulada)/1000 as economia_acumulada"),
DB::raw("SUM(economia.economia_acumulada) as economia_acumulada"),
DB::raw("(SUM(economia.economia_mensal)/SUM(economia.custo_livre)) as econ_percentual"),
"economia.dad_estimado"
];
@ -66,14 +68,14 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
">=",
DB::raw("TO_DATE(TO_CHAR(current_date , 'YYYY-01-01'), 'YYYY-MM-DD') - interval '1' year"))
->groupBy(['mes', 'dad_estimado'])
->orderBy('mes')
->orderBy('dad_estimado')
->orderBy(DB::raw("mes, dad_estimado"))
->get();
return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all();
}
/* cativo x livre mensal*/
public function getCaptiveMonthlyEconomy($params)
{
$field = [
@ -93,11 +95,11 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
DB::raw("TO_DATE(TO_CHAR(current_date, 'YYYY-12-31'), 'YYYY-MM-DD') ")
])
->groupBy(['mes', 'dad_estimado'])
->orderBy('mes')
->orderBy('dad_estimado')
->orderBy(DB::raw("mes, dad_estimado"))
->get();
}
/* Indicador de custo R$/MWh */
public function getCostMWhEconomy($params)
{
$field = [
@ -114,8 +116,7 @@ class EconomyRepository extends AbstractRepository implements EconomyContractInt
DB::raw("TO_DATE(TO_CHAR(current_date, 'YYYY-12-31'), 'YYYY-MM-DD') ")
])
->groupBy(['mes', 'dad_estimado'])
->orderBy('mes')
->orderBy('dad_estimado')
->orderBy(DB::raw("mes, dad_estimado"))
->get();
return collect(static::checkDate($result))->transform(fn($value) => Arr::set($value, 'mes', date_format(date_create($value['mes']), "M/Y")))->all();

View File

@ -4,7 +4,10 @@ declare(strict_types=1);
namespace App\Repositories;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\DB;
trait MethodsTrait
{
@ -40,17 +43,20 @@ trait MethodsTrait
}
public function search($params)
/**
* @throws BindingResolutionException
*/
public function search($params, $rowField = false)
{
$filter = static::getFilterBuilder($params);
$this->filterBuilder($params);
$filter->setFields(collect($filter->getFields())->transform(fn($value) => $this->model->qualifyColumn($value))->all());
$fields = $this->item->applyField();
$query = $this->model->select($filter->getFields());
$query = $this->model->select($fields);
$response = $filter->applyFilter($query);
$response = $this->item->applyFilter($query);
if ($filter->isDistinct()){
if ($this->item->isDistinct()){
$response = $response->distinct();
}

View File

@ -34,7 +34,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
/**
* @throws BindingResolutionException
* Geral por Região
*/
public function getOverviewByRegion(): array|Collection
{
@ -42,7 +42,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
'pld.submercado as submarket',
'pld.mes_ref as year_month',
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"),
DB::raw("SUM(pld.valor) as value")
DB::raw("AVG(pld.valor) as value")
];
@ -52,6 +52,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
->get();
}
/** Tabela de Consumo */
public function getListConsumption($params): Collection|array
{
$fields = [
@ -144,6 +145,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
/**
* @throws BindingResolutionException
* PLD, Valores Diários
*/
public function getConsumptionByDaily($params, $field = "mes_ref"): Collection|array
{
@ -151,7 +153,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
DB::raw("TO_CHAR((date('1899-12-31') + interval '1' day * pld.dia_num), 'DD') as day_formatted"),
DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"),
'pld.submercado as submarket',
DB::raw("SUM(pld.valor) as value"),
DB::raw("AVG(pld.valor) as value"),
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month"),
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"),
];
@ -177,7 +179,7 @@ class PldRepository extends AbstractRepository implements PldContractInterface
'hora as hour',
DB::raw("(date('1899-12-31') + interval '1' day * pld.dia_num) as day_calc"),
'pld.submercado as submarket',
DB::raw("SUM(pld.valor) as value"),
'pld.valor as value',
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month"),
DB::raw("TO_CHAR(TO_DATE(pld.mes_ref, 'YYMM'), 'MM/YYYY') as year_month_formatted"),
];
@ -185,13 +187,13 @@ class PldRepository extends AbstractRepository implements PldContractInterface
$i = 0;
foreach ($params['filters'] as $param) {
if ($param['field'] === $field) {
$params['filters'][$i]['field'] = "(date('1899-12-31') + interval '1' day * pld.{$param['field']})";
$params['filters'][$i]['field'] = "(date('1899-12-30') + interval '1' day * pld.{$param['field']})";
}
$i++;
}
return $this->execute($fields, $params)
->groupBy('day_formatted', 'hour', 'day_calc', 'submarket', 'year_month', 'year_month_formatted')
->orderBy('hour', 'asc')
->get();
}

View File

@ -0,0 +1,77 @@
<?php
declare(strict_types=1);
namespace App\Support\FilterBuilder\Entity;
use App\Support\FilterBuilder\EntityJson;
class FieldItem extends EntityJson
{
/**
* @var string|null
*/
protected string|null $type = null;
/**
* @var string|null
*/
protected string|null $format = null;
/**
* @var string
*/
protected string $field;
/**
* @return string|null
*/
public function getType(): string|null
{
return $this->type;
}
/**
* @param string $type
*/
public function setType(string $type): void
{
$this->type = $type;
}
/**
* @return string|null
*/
public function getFormat(): ?string
{
return $this->format;
}
/**
* @param string|null $format
*/
public function setFormat(?string $format): void
{
$this->format = $format;
}
/**
* @return string
*/
public function getField(): string
{
return $this->field;
}
/**
* @param string $field
*/
public function setField(string $field): void
{
$this->field = $field;
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace App\Support\FilterBuilder;
use App\Support\FilterBuilder\Entity\FieldItem;
use Illuminate\Database\Query\Expression;
use Illuminate\Support\Facades\DB;
class FieldType
{
const FUNCTION_FIELD = [
"TO_CHAR"
];
public static function field(FieldItem $field)
{
if (in_array($field->getType(), self::FUNCTION_FIELD)) {
return static::makeFormatFieldDate($field);
}
return $field->getField();
}
public static function makeFormatFieldDate($field): Expression
{
return DB::raw("TO_CHAR(TO_DATE({$field->field}, 'YYMM'), '{$field->format}') as {$field->field}");
}
}

View File

@ -4,10 +4,13 @@ declare(strict_types=1);
namespace App\Support\FilterBuilder;
use App\Support\FilterBuilder\Entity\FieldItem;
use App\Support\FilterBuilder\Entity\FilterItem;
use App\Support\FilterBuilder\Entity\OrderItem;
use App\Support\FilterBuilder\Interfaces\IFilterBuilder;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class FilterQueryBuilder extends EntityJson implements IFilterBuilder
{
@ -47,6 +50,30 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder
return $builder;
}
public function applyField($fields = [])
{
if (!empty($this->getFields())) {
foreach ($this->getFields() as $field)
{
$fields[] = FieldType::field($field);
}
}
return $fields;
}
/**
*/
public function format_date_sql(): static
{
foreach ($this->getFields() as $param) {
$this->setFields([DB::raw("TO_CHAR(TO_DATE({$param}, 'YYMM'), 'MM/YYYY') as {$param}")]);
}
return $this;
}
/**
* @return array
*/
@ -60,7 +87,7 @@ class FilterQueryBuilder extends EntityJson implements IFilterBuilder
*/
public function setFields(array $fields): void
{
$this->fields = $fields;
$this->fields = $this->arrayObjectCast($fields, FieldItem::class);
}
/**

View File

@ -55,10 +55,11 @@ Route::middleware(['auth:sanctum', 'ability:Admin'])->group(function () {
});
Route::middleware(['auth:sanctum', 'ability:Client'])->group(function () {
Route::post('pld/overview', [\App\Http\Controllers\PldController::class, 'overviewByRegion']);
Route::post('pld/list', [\App\Http\Controllers\PldController::class, 'listConsumption']);
Route::post('pld/daily', [\App\Http\Controllers\PldController::class, 'consumptionByDaily']);
Route::post('pld/schedule', [\App\Http\Controllers\PldController::class, 'consumptionBySchedule']);
Route::post('pld/overview', [\App\Http\Controllers\PldController::class, 'overviewByRegion']); //Visão Geral por Região
Route::post('pld/list', [\App\Http\Controllers\PldController::class, 'listConsumption']); // Tabela de Consumo
Route::post('pld/daily', [\App\Http\Controllers\PldController::class, 'consumptionByDaily']); // Consumo por Diário
Route::post('pld/schedule', [\App\Http\Controllers\PldController::class, 'consumptionBySchedule']); // Consumo por Horários
Route::post('economy', [\App\Http\Controllers\EconomyController::class, 'index']);
Route::post('economy/grossAnnual', [\App\Http\Controllers\EconomyController::class, 'grossAnnualEconomy']);
@ -70,7 +71,7 @@ Route::middleware(['auth:sanctum', 'ability:Client'])->group(function () {
Route::post('telemetry/demand', [\App\Http\Controllers\TelemetryController::class, 'demand']);
Route::post('telemetry/discretization', [\App\Http\Controllers\TelemetryController::class, 'discretization']);
Route::post('operation/summary', [\App\Http\Controllers\OperationSummaryController::class, 'operationSummary']);
Route::post('operation/summary', [\App\Http\Controllers\OperationSummaryController::class, 'operationSummary']); // Resumo Operações
Route::post('operation', [\App\Http\Controllers\OperationSummaryController::class, 'index']);
Route::post('notify', [\App\Http\Controllers\NotificationController::class, 'notify']);