| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- import { Component, OnInit, ViewChild,OnChanges } from '@angular/core';
- import { Chart, ChartOptions, ChartType, ChartDataSets } from 'chart.js';
- import { Label, BaseChartDirective } from 'ng2-charts';
- import { MeasuresService } from 'src/app/services/measures.service';
- import { PlantsService } from 'src/app/services/plants.service';
- import { LogsService } from 'src/app/services/logs.service';
- import { OrganizationsService } from '@app/services/organizations.service';
- import { ActivatedRoute } from '@angular/router';
- import { Observable, forkJoin } from 'rxjs';
- import * as moment from 'moment';
- import Swal from 'sweetalert2';
- import { environment } from '@environments/environment';
- import { HttpClient } from '@angular/common/http';
- import { formatDate } from '@angular/common';
- import {AngularMyDatePickerDirective,IAngularMyDpOptions, IMyDateModel} from 'angular-mydatepicker';
- @Component({
- selector: 'app-tests',
- templateUrl: './tests.component.html',
- styleUrls: ['./tests.component.scss']
- })
- export class TestsComponent implements OnInit {
-
- title = "Plantas";
- organizationId:string;
- listAssets:any;
- listEnergyProduced:any;
- error:boolean;
- errorMessage:string;
- errortest:any;
- chartjs:boolean;
- chart1: Chart;
- metersKeys:any;
- metersValues:any;
- view:string;
- //For daterange
- daysLabels:any = {su: 'Dom', mo: 'Lun', tu: 'Mar', we: 'Mie', th: 'Jue', fr: 'Vie', sa: 'Sab'};
- monthsLabels:any = { 1: 'Ene', 2: 'Feb', 3: 'Mar', 4: 'Abr', 5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Ago', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dic' };
- todayBtnTxt:string = 'Hoy';
-
- myDpOptions: IAngularMyDpOptions = {
- dateRange: false,
- dateFormat: 'dd/mm/yyyy',
- dayLabels: this.daysLabels,
- monthLabels: this.monthsLabels,
- // other options are here...
- };
- myDateInit: boolean = true;
- model: IMyDateModel = null;
- // For chartjs
- tsLabels: any[];
- barChartColors:any = ['#3c8dbc', '#00a65a', '#f56954']
- metersData:any;
- initialDate:any;
- public barChartType: ChartType;
- public barChartLegend:boolean;
- public barChartLabels: Label[];
- public barChartOptions: ChartOptions;
- public barChartData: ChartDataSets[];
- isActive:[boolean,boolean,boolean,boolean]; //Activated param (chart)
- constructor(
- private orgService: OrganizationsService,
- private route: ActivatedRoute,
- private plantsService: PlantsService,
- private http: HttpClient,
- private logsService: LogsService,
- private measService: MeasuresService) {
-
- Swal.fire({
- allowOutsideClick: false,
- type: 'info',
- text: 'Espere por favor...'
- });
- Swal.showLoading();
-
- }
- @ViewChild("baseChart",null) chart: BaseChartDirective;
- ngOnInit() {
-
- let plants = this.plantsService.getAllAssets();
- let energy_produced = this.plantsService.getAssetsProducedEnergy();
- // Default date is today and set it on a string var and initialize dateRange plugin
- this.initialDate = new Date().toISOString().slice(0, 10);
- if (this.myDateInit) {
- let begin: Date = new Date();
- this.model = {
- isRange: false,
- singleDate: {
- date: {
- year: begin.getFullYear(), month: begin.getMonth() + 1, day: begin.getDate()
- }
- }
- };
- }
-
- // Observable of two objects
- forkJoin([plants, energy_produced]).subscribe(results => {
- console.log(results[0]["data"]);
- if (localStorage.getItem("email") == "inverlec@grupomerelec.com"){
- this.listAssets = [
- {
- name: "Inversiones MERELEC S.A de C.V",
- id: '5d70330cb288f25b679c68a8'
- },
- {
- name: "Inversiones MERELEC 2 S.A de C.V",
- id: '5d70330cb288f25b679c68n8'
- },
- ]
- this.view = "month";
- this.onMeasureClickRange(this.view, this.initialDate);
- console.log(this.listAssets[0]["id"]);
- }
- else {
- this.listAssets = results[0]["data"];
- console.log(this.listAssets[0]["id"]);
- this.view = "month";
- this.onMeasureClickRange(this.view, this.initialDate);
- }
-
- // Energy produced given an assetID
- this.listEnergyProduced = results[1];
- },
- (err) => {
- Swal.fire({
- type: 'error',
- title: 'Error en el servidor',
- text: "No su pudo obtener la informacion"
- });
- });
- this.chartjs = true;
- setTimeout(()=>{
- Swal.close();
- }, 2700);
-
- }
-
- // Default check asset dropdown if a value is equal to an assetID
- isSelected(){
- if(this.organizationId!=undefined){
- return true;
- }
- else{
- return false;
- }
- }
- // Trigger again the chart with the selected assetID
- onChangeObj(event:any) {
- this.onMeasureClickRange(this.view, this.initialDate, event.target.value);
- }
- // Change the date range of the chart, according to the selected view (daily, weekly, ...)
- onDateChanged(event: IMyDateModel) {
- let endDate = `${event.singleDate.date.year}-${event.singleDate.date.month}-${event.singleDate.date.day}`;
- switch (this.view)
- {
- case "day":
- this.onMeasureClickRange(this.view, endDate);
- break;
- case "week":
- this.onMeasureClickRange(this.view, endDate);
- break;
- case "month":
- this.onMeasureClickRange(this.view, endDate);
- break;
- case "year":
- this.onMeasureClickRange(this.view, endDate);
- break;
- default:
- console.log("nada");
- }
- }
- // Draw a measure chart using chartjs, given some params, view, for daily, weekly, monthly or yearly measures;
- // measureDate, for a date range given a view and a paramID, for an specific assetID selected in the dropdown
- onMeasureClickRange(view:string, measureDate?:string, paramId?:string): void {
- Swal.fire({
- allowOutsideClick: false,
- type: 'info',
- text: 'Espere por favor...'
- });
- Swal.showLoading();
- this.view = view;
- // Chart (re)initialize, to prevent double load on changing range or views
- if (this.chart1 != undefined){
- this.chart1.destroy();
- }
- this.chart1 = undefined;
-
- let dateRange:string;
- if (measureDate === undefined){
- dateRange = this.initialDate;
- }
- else {
- dateRange = measureDate;
- }
- // Set default assetID if paramId doesn't come in the function call
- let assetId:string;
- if (paramId === undefined){
- assetId = this.listAssets[0]["id"]; // Grab the first object
- }
- else {
- assetId = paramId;
- }
-
- // Select an interval according to the API permitted param
- let interval:string;
- switch (view)
- {
- case "day":
- interval = "1D";
- this.isActive = [true, false, false, false];
- break;
- case "week":
- interval = "7D";
- this.isActive = [false, true, false, false];
- break;
- case "month":
- interval = "1M";
- this.isActive = [false, false, true, false];
- break;
- case "mtd": //TO DO
- interval = "MTD";
- break;
- case "year":
- interval = "YTD";
- this.isActive = [false, false, false, true];
- break;
- default:
- console.log("nada");
- }
- this.logsService.getEnergyProducedByParams(assetId,interval,dateRange).toPromise()
- .then((data: any) => {
- this.metersData = [];
-
- this.metersKeys = Object.keys(data["data"][0]["dataset"]);
- // Get all the values according to each index (meter)
- this.metersValues = Object.values(data["data"][0]["dataset"]);
- let meterKeys2 = Object.keys(this.metersValues);
- for (let prop in meterKeys2) {
- let label = localStorage.getItem("email") == "inverlec@grupomerelec.com" ? `INVERLEC ${prop}` : this.metersValues[prop]["label"];
- //let keys = Object.keys();
- let test = Object.values(this.metersValues[prop]["data"].map(obj => obj.total_energy_kWh).reverse())
- this.metersData.push({"label": label, backgroundColor: this.barChartColors[prop], data: test });
- this.barChartLabels = this.metersValues[prop]["data"].map(obj => formatDate(obj.dateMax, 'dd/MM','es-Es','-0600')).reverse();
- }
- this.chart1 = new Chart('canvas', {
- type: 'bar',
- options: {
- title: {
- display: true,
- },
- tooltips: {
- mode: 'index',
- callbacks: {
- // Get the total of the energy produced in every point and show it in the hover tooltip
- label: function (tooltipItem, data) {
- var label = data.datasets[tooltipItem.datasetIndex].label || '';
- var value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
- var total = 0;
- for (var i = 0; i < data.datasets.length; i++)
- total += +data.datasets[i].data[tooltipItem.index];
- if (tooltipItem.datasetIndex !== data.datasets.length - 1) {
- return label + " : " + value;
- }
- else {
- return [label + " : " + value, "TOTAL : " + Math.round(total)];
- }
- }
- }
- },
- responsive: true,
- maintainAspectRatio: false,
- scales: {
- xAxes: [{
- stacked: true,
- }],
- yAxes: [{
- stacked: true
- }]
- }
- },
- data: {
- labels: this.barChartLabels,
- datasets: this.metersData,
- },
- });
- this.chartjs = true;
- });
- setTimeout(()=>{
- Swal.close();
- }, 1200)
- }
- }
|