tests.component.ts 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. import { Component, OnInit, ViewChild,OnChanges } from '@angular/core';
  2. import { Chart, ChartOptions, ChartType, ChartDataSets } from 'chart.js';
  3. import { Label, BaseChartDirective } from 'ng2-charts';
  4. import { MeasuresService } from 'src/app/services/measures.service';
  5. import { PlantsService } from 'src/app/services/plants.service';
  6. import { LogsService } from 'src/app/services/logs.service';
  7. import { OrganizationsService } from '@app/services/organizations.service';
  8. import { ActivatedRoute } from '@angular/router';
  9. import { Observable, forkJoin } from 'rxjs';
  10. import * as moment from 'moment';
  11. import Swal from 'sweetalert2';
  12. import { environment } from '@environments/environment';
  13. import { HttpClient } from '@angular/common/http';
  14. import { formatDate } from '@angular/common';
  15. import {AngularMyDatePickerDirective,IAngularMyDpOptions, IMyDateModel} from 'angular-mydatepicker';
  16. @Component({
  17. selector: 'app-tests',
  18. templateUrl: './tests.component.html',
  19. styleUrls: ['./tests.component.scss']
  20. })
  21. export class TestsComponent implements OnInit {
  22. title = "Plantas";
  23. organizationId:string;
  24. listAssets:any;
  25. listEnergyProduced:any;
  26. error:boolean;
  27. errorMessage:string;
  28. errortest:any;
  29. chartjs:boolean;
  30. chart1: Chart;
  31. metersKeys:any;
  32. metersValues:any;
  33. view:string;
  34. //For daterange
  35. daysLabels:any = {su: 'Dom', mo: 'Lun', tu: 'Mar', we: 'Mie', th: 'Jue', fr: 'Vie', sa: 'Sab'};
  36. 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' };
  37. todayBtnTxt:string = 'Hoy';
  38. myDpOptions: IAngularMyDpOptions = {
  39. dateRange: false,
  40. dateFormat: 'dd/mm/yyyy',
  41. dayLabels: this.daysLabels,
  42. monthLabels: this.monthsLabels,
  43. // other options are here...
  44. };
  45. myDateInit: boolean = true;
  46. model: IMyDateModel = null;
  47. // For chartjs
  48. tsLabels: any[];
  49. barChartColors:any = ['#3c8dbc', '#00a65a', '#f56954']
  50. metersData:any;
  51. initialDate:any;
  52. public barChartType: ChartType;
  53. public barChartLegend:boolean;
  54. public barChartLabels: Label[];
  55. public barChartOptions: ChartOptions;
  56. public barChartData: ChartDataSets[];
  57. isActive:[boolean,boolean,boolean,boolean]; //Activated param (chart)
  58. constructor(
  59. private orgService: OrganizationsService,
  60. private route: ActivatedRoute,
  61. private plantsService: PlantsService,
  62. private http: HttpClient,
  63. private logsService: LogsService,
  64. private measService: MeasuresService) {
  65. Swal.fire({
  66. allowOutsideClick: false,
  67. type: 'info',
  68. text: 'Espere por favor...'
  69. });
  70. Swal.showLoading();
  71. }
  72. @ViewChild("baseChart",null) chart: BaseChartDirective;
  73. ngOnInit() {
  74. let plants = this.plantsService.getAllAssets();
  75. let energy_produced = this.plantsService.getAssetsProducedEnergy();
  76. // Default date is today and set it on a string var and initialize dateRange plugin
  77. this.initialDate = new Date().toISOString().slice(0, 10);
  78. if (this.myDateInit) {
  79. let begin: Date = new Date();
  80. this.model = {
  81. isRange: false,
  82. singleDate: {
  83. date: {
  84. year: begin.getFullYear(), month: begin.getMonth() + 1, day: begin.getDate()
  85. }
  86. }
  87. };
  88. }
  89. // Observable of two objects
  90. forkJoin([plants, energy_produced]).subscribe(results => {
  91. console.log(results[0]["data"]);
  92. if (localStorage.getItem("email") == "inverlec@grupomerelec.com"){
  93. this.listAssets = [
  94. {
  95. name: "Inversiones MERELEC S.A de C.V",
  96. id: '5d70330cb288f25b679c68a8'
  97. },
  98. {
  99. name: "Inversiones MERELEC 2 S.A de C.V",
  100. id: '5d70330cb288f25b679c68n8'
  101. },
  102. ]
  103. this.view = "month";
  104. this.onMeasureClickRange(this.view, this.initialDate);
  105. console.log(this.listAssets[0]["id"]);
  106. }
  107. else {
  108. this.listAssets = results[0]["data"];
  109. console.log(this.listAssets[0]["id"]);
  110. this.view = "month";
  111. this.onMeasureClickRange(this.view, this.initialDate);
  112. }
  113. // Energy produced given an assetID
  114. this.listEnergyProduced = results[1];
  115. },
  116. (err) => {
  117. Swal.fire({
  118. type: 'error',
  119. title: 'Error en el servidor',
  120. text: "No su pudo obtener la informacion"
  121. });
  122. });
  123. this.chartjs = true;
  124. setTimeout(()=>{
  125. Swal.close();
  126. }, 2700);
  127. }
  128. // Default check asset dropdown if a value is equal to an assetID
  129. isSelected(){
  130. if(this.organizationId!=undefined){
  131. return true;
  132. }
  133. else{
  134. return false;
  135. }
  136. }
  137. // Trigger again the chart with the selected assetID
  138. onChangeObj(event:any) {
  139. this.onMeasureClickRange(this.view, this.initialDate, event.target.value);
  140. }
  141. // Change the date range of the chart, according to the selected view (daily, weekly, ...)
  142. onDateChanged(event: IMyDateModel) {
  143. let endDate = `${event.singleDate.date.year}-${event.singleDate.date.month}-${event.singleDate.date.day}`;
  144. switch (this.view)
  145. {
  146. case "day":
  147. this.onMeasureClickRange(this.view, endDate);
  148. break;
  149. case "week":
  150. this.onMeasureClickRange(this.view, endDate);
  151. break;
  152. case "month":
  153. this.onMeasureClickRange(this.view, endDate);
  154. break;
  155. case "year":
  156. this.onMeasureClickRange(this.view, endDate);
  157. break;
  158. default:
  159. console.log("nada");
  160. }
  161. }
  162. // Draw a measure chart using chartjs, given some params, view, for daily, weekly, monthly or yearly measures;
  163. // measureDate, for a date range given a view and a paramID, for an specific assetID selected in the dropdown
  164. onMeasureClickRange(view:string, measureDate?:string, paramId?:string): void {
  165. Swal.fire({
  166. allowOutsideClick: false,
  167. type: 'info',
  168. text: 'Espere por favor...'
  169. });
  170. Swal.showLoading();
  171. this.view = view;
  172. // Chart (re)initialize, to prevent double load on changing range or views
  173. if (this.chart1 != undefined){
  174. this.chart1.destroy();
  175. }
  176. this.chart1 = undefined;
  177. let dateRange:string;
  178. if (measureDate === undefined){
  179. dateRange = this.initialDate;
  180. }
  181. else {
  182. dateRange = measureDate;
  183. }
  184. // Set default assetID if paramId doesn't come in the function call
  185. let assetId:string;
  186. if (paramId === undefined){
  187. assetId = this.listAssets[0]["id"]; // Grab the first object
  188. }
  189. else {
  190. assetId = paramId;
  191. }
  192. // Select an interval according to the API permitted param
  193. let interval:string;
  194. switch (view)
  195. {
  196. case "day":
  197. interval = "1D";
  198. this.isActive = [true, false, false, false];
  199. break;
  200. case "week":
  201. interval = "7D";
  202. this.isActive = [false, true, false, false];
  203. break;
  204. case "month":
  205. interval = "1M";
  206. this.isActive = [false, false, true, false];
  207. break;
  208. case "mtd": //TO DO
  209. interval = "MTD";
  210. break;
  211. case "year":
  212. interval = "YTD";
  213. this.isActive = [false, false, false, true];
  214. break;
  215. default:
  216. console.log("nada");
  217. }
  218. this.logsService.getEnergyProducedByParams(assetId,interval,dateRange).toPromise()
  219. .then((data: any) => {
  220. this.metersData = [];
  221. this.metersKeys = Object.keys(data["data"][0]["dataset"]);
  222. // Get all the values according to each index (meter)
  223. this.metersValues = Object.values(data["data"][0]["dataset"]);
  224. let meterKeys2 = Object.keys(this.metersValues);
  225. for (let prop in meterKeys2) {
  226. let label = localStorage.getItem("email") == "inverlec@grupomerelec.com" ? `INVERLEC ${prop}` : this.metersValues[prop]["label"];
  227. //let keys = Object.keys();
  228. let test = Object.values(this.metersValues[prop]["data"].map(obj => obj.total_energy_kWh).reverse())
  229. this.metersData.push({"label": label, backgroundColor: this.barChartColors[prop], data: test });
  230. this.barChartLabels = this.metersValues[prop]["data"].map(obj => formatDate(obj.dateMax, 'dd/MM','es-Es','-0600')).reverse();
  231. }
  232. this.chart1 = new Chart('canvas', {
  233. type: 'bar',
  234. options: {
  235. title: {
  236. display: true,
  237. },
  238. tooltips: {
  239. mode: 'index',
  240. callbacks: {
  241. // Get the total of the energy produced in every point and show it in the hover tooltip
  242. label: function (tooltipItem, data) {
  243. var label = data.datasets[tooltipItem.datasetIndex].label || '';
  244. var value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
  245. var total = 0;
  246. for (var i = 0; i < data.datasets.length; i++)
  247. total += +data.datasets[i].data[tooltipItem.index];
  248. if (tooltipItem.datasetIndex !== data.datasets.length - 1) {
  249. return label + " : " + value;
  250. }
  251. else {
  252. return [label + " : " + value, "TOTAL : " + Math.round(total)];
  253. }
  254. }
  255. }
  256. },
  257. responsive: true,
  258. maintainAspectRatio: false,
  259. scales: {
  260. xAxes: [{
  261. stacked: true,
  262. }],
  263. yAxes: [{
  264. stacked: true
  265. }]
  266. }
  267. },
  268. data: {
  269. labels: this.barChartLabels,
  270. datasets: this.metersData,
  271. },
  272. });
  273. this.chartjs = true;
  274. });
  275. setTimeout(()=>{
  276. Swal.close();
  277. }, 1200)
  278. }
  279. }