From ef710d84619de98979555a89ec7b2078a89172bc Mon Sep 17 00:00:00 2001 From: Emilio Date: Wed, 5 Nov 2025 11:06:02 -0600 Subject: [PATCH] =?UTF-8?q?se=20agreg=C3=B3=20endpoint=20de=20ejemplo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mariadb/aria_log.00000001 | Bin 4988928 -> 4997120 bytes mariadb/aria_log_control | Bin 52 -> 52 bytes src/equipo/equipo.service.ts | 118 +++++++++++++++++++++++------------ 3 files changed, 77 insertions(+), 41 deletions(-) diff --git a/mariadb/aria_log.00000001 b/mariadb/aria_log.00000001 index e9677556fce8af2cd3a1f9cb50316763f8eefb31..d6843db78aace19ecc50338413df703aec6b82d8 100644 GIT binary patch delta 648 zcmYk(H%~$V6o%o;wIg7~dI1aeh8;V0L>6}!6GumX0K+>ty6Naokc7m=fx*!j2Ybbi zPL6DroaLPH`G$8mvE;rPi^a_tHcYa}CWl<|$fp21g*b5HqKINjD5Z>Y+*D9W71h*G zi-iX-KI*8afkyl^(M$`iw9!rnopjMn4*`1Vqn`l=8Df|qBaAY}I1@}VMTlu;m}QQ6 z7FZ-H9D)yBAAqdk`!4s_vs$NLxy5L)(+suC`~fBW*8Y-`ZZqET8JWiG{Vj si*0KA5Zlw17CYAV`EQ=;HPf*DJuc}tjEtVY{%7|=z>1z`#Y3j`3mio~0ssI2 delta 172 zcmV~$Syn*-007YAQD`ugMj28XG-wbFhEh^l)cd%5u#KE!0hVM5?hV6f5YGRDP(&aq zX2q(wgrqg=Hf%~s%gD;vvMq1Nu08t>94a_cR8m%Ptm?$6nltAvT&lZr?Z&N!JNF(u pYI@Sr_Uy&0HyvF)eeXUDeEKr|G@E@ABLl+^c^?KK#qf#)NH8z}08qySx&QzG delta 27 gcmXppnII>&`tIg?j0_AcGCmAIis3Q`kYHc{0BE!Yj{pDw diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 0623825..a69261a 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -552,66 +552,99 @@ export class EquipoService { async contar_perifericos_antiguedad( impresion: string[], digitalizacion: string[], - ): Promise { - const totalImpresion = this.contar_tipoEquipos(impresion); - const totalDigitalizacion = this.contar_tipoEquipos(digitalizacion); - + ): Promise<{ + impresion: { antiguedad: any; total: number; porcentaje: string }[]; + digitalizacion: { antiguedad: any; total: number; porcentaje: string }[]; + }> { try { - const countImpresion = await this.equipoRepository + // Helper para obtener total por tipos de equipo (count simple, sin group by) + const getTotalPorTipos = async (tipos: string[]): Promise => { + if (!tipos || tipos.length === 0) return 0; + return this.equipoRepository + .createQueryBuilder('e') + .innerJoin('e.tipoEquipo', 't') + .where('t.tipo_equipo IN (:...tipos)', { tipos }) + .getCount(); + }; + + // Ejecutar ambos totales en paralelo + const [totalImpresion, totalDigitalizacion] = await Promise.all([ + getTotalPorTipos(impresion), + getTotalPorTipos(digitalizacion), + ]); + + // Obtener conteos por antiguedad para impresion + const countImpresionPromise = this.equipoRepository .createQueryBuilder('e') .innerJoin('e.periferico', 'p') - .where('p.periferico IN (:...periferico)', { - periferico: impresion, - }) + .innerJoin('e.tipoEquipo', 't') + .where('p.periferico IN (:...periferico)', { periferico: impresion }) .select(['e.antiguedad AS antiguedad']) - .addSelect('COUNT(*) AS total') - .groupBy('e.antiguedad') - .getRawMany(); - const countDigitalizacion = await this.equipoRepository - .createQueryBuilder('e') - .innerJoin('e.perriferico', 'p') - .where('p.periferico IN (:...periferico)', { - tipo_equipo: digitalizacion, - }) - .select(['e.antiguedad AS antiguedad']) - .addSelect('COUNT(*) AS total') + .addSelect('COUNT(e.id_equipo) AS total') .groupBy('e.antiguedad') .getRawMany(); + // Obtener conteos por antiguedad para digitalizacion + const countDigitalizacionPromise = this.equipoRepository + .createQueryBuilder('e') + .innerJoin('e.periferico', 'p') + .innerJoin('e.tipoEquipo', 't') + .where('p.periferico IN (:...periferico)', { + periferico: digitalizacion, + }) + .select(['e.antiguedad AS antiguedad']) + .addSelect('COUNT(e.id_equipo) AS total') + .groupBy('e.antiguedad') + .getRawMany(); + + // Ejecutar ambas consultas en paralelo + const [countImpresion, countDigitalizacion] = await Promise.all([ + countImpresionPromise, + countDigitalizacionPromise, + ]); + + // Tipo para salida interface Porcentaje { antiguedad: any; - total: any; + total: number; porcentaje: string; } - let porcentajesImpresion: Porcentaje[] = []; - let porcentajesDigitalizacion: Porcentaje[] = []; - - countImpresion.forEach(async (item) => { - porcentajesImpresion.push({ + // Mapear resultados calculando porcentajes (evitar async dentro de map/forEach) + const porcentajesImpresion: Porcentaje[] = countImpresion.map((item) => { + const total = Number(item.total) || 0; + const porcentaje = + totalImpresion > 0 + ? ((total / totalImpresion) * 100).toFixed(2) + : '0.00'; + return { antiguedad: item.antiguedad, - total: item.total, - porcentaje: ((item.total / (await totalImpresion)) * 100).toFixed(2), - }); + total, + porcentaje, + }; }); - countDigitalizacion.forEach(async (item) => { - porcentajesDigitalizacion.push({ - antiguedad: item.antiguedad, - total: item.total, - porcentaje: ( - (item.total / (await totalDigitalizacion)) * - 100 - ).toFixed(2), - }); - }); + const porcentajesDigitalizacion: Porcentaje[] = countDigitalizacion.map( + (item) => { + const total = Number(item.total) || 0; + const porcentaje = + totalDigitalizacion > 0 + ? ((total / totalDigitalizacion) * 100).toFixed(2) + : '0.00'; + return { + antiguedad: item.antiguedad, + total, + porcentaje, + }; + }, + ); return { - impresion: porcentajesDigitalizacion, - digitalizacion: porcentajesImpresion, + impresion: porcentajesImpresion, + digitalizacion: porcentajesDigitalizacion, }; } catch (error) { - console.error('Error al contar equipos por tipo y uso:', error); + console.error('Error en contar_perifericos_antiguedad:', error); throw error; } } @@ -637,6 +670,7 @@ export class EquipoService { contar_impresoras_tipo_uso, contar_digitalizacion, contar_contar_digitalizacion_u, + contar_perifericos_antiguedad, ] = await Promise.all([ this.contar_tipoEquipos_tipoUso(), this.contar_tipoEquipos_sistemasOperativos(equpos_pc), @@ -657,6 +691,7 @@ export class EquipoService { this.contar_periferico_tipoUso(impresoras), this.equipos_impesion_group(dijitales), this.contar_periferico_tipoUso(dijitales), + this.contar_perifericos_antiguedad(impresoras, dijitales), ]); return { @@ -679,6 +714,7 @@ export class EquipoService { contar_impresoras_tipo_uso, contar_digitalizacion, contar_contar_digitalizacion_u, + contar_perifericos_antiguedad, }; }