Saltar al contingut principal
Web App · Prototip UIWCAG 2.2 AA / < 150ms

AVISA — Gestió d'Incidències en Temps Real

Arquitectura frontend reactiva amb Angular i TypeScript per a la coordinació d'avisos i incidències urbanes crítiques.

Client / ContextProjecte Final DAW / Serveis Urbans
Any de Desenvolupament2025 – 2026
Rol d'EnginyeriaFrontend Architect & UI Developer
Mètode de VerificacióAuditoria automàtica amb axe-core i DevTools Network Latency Profile
https://front-project-jjaux-h8pw.vercel.app/
Panell de gestió d'incidències i alertes en temps real AVISA
Stack d'Enginyeria:Angular 17+TypeScript EstricteSignalsVercel EdgeWCAG AAReactive Forms

1. El Problema i el Context

En la gestió dels serveis públics municipals i emergències lleugeres, els canals habituals de comunicació ciutadana (trucades telefòniques manuals, formularis estàtics desconnectats o correus dispersos) generen colls d’ampolla severs.

Els operadors de sala de control solen gestionar desenes d’avisos simultanis sota estrès, la qual cosa provoca:

  • Retards de comunicació: La informació arriba tard o duplicada, sense geolocalització exacta.
  • Manca de visibilitat en temps real: No es coneix l’estat d’intervenció de cada equip sobre el terreny.
  • Interfícies feixugues: Panells administratius antics amb contrast insuficient, no aptes per a torns nocturns o pantalles auxiliars.

L’objectiu d’AVISA va ser dissenyar una aplicació web accessible, ultraràpida i modular que reduïra el temps entre la recepció d’un avís i la seua assignació operativa.


2. El Repte Tècnic

El projecte havia de respondre a tres reptes d’enginyeria simultanis:

  1. Reactivitat sense sobrecàrrega de cicles de detecció: Quan arriben múltiples esdeveniments per segon, actualitzar el DOM sencer d’una taula o llista provoca tirades de fotogrames (jank). Calia actualitzar únicament el node afectat.
  2. Accessibilitat estricta sota estàndard WCAG AA: Compliment dels contrastos cromàtics en estats crítics (alertes roges, grogues i verdes), navegació completa per teclat i anuncis audibles per a lectors de pantalla mitjançant regions actives ARIA (aria-live="polite").
  3. Desplegament continu atòmic a Vercel: Automatització del procés de validació de tipus TypeScript i lliurament a la xarxa perimetral (Edge).

3. Decisions d’Arquitectura

Vam descartar arquitectures monolítiques basades en NgModules per a adoptar Standalone Components combinats amb el sistema de Signals d’Angular, reduint la dependència de Zone.js i alliberant el fil d’execució principal.

Diagrama del Flux de Dades i Reactivitat

   [ Sensor / Usuari ] ───▶ [ Ingesta REST / SSE ] ───▶ [ IncidenciesStore (Signal) ]
                                                                 │
                                          ┌──────────────────────┴──────────────────────┐
                                          ▼                                             ▼
                                [ computed: critiques() ]                    [ computed: resoltes() ]
                                          │                                             │
                                          ▼                                             ▼
                             [ DOM Node: Alerta Roja ]                     [ Mètriques de Rendiment ]

Fragment de Codi Clau: Magatzem d’Estat Granular

// services/incidencies-store.service.ts
import { Injectable, signal, computed } from '@angular/core';

export interface Incidencia {
  readonly id: string;
  readonly titol: string;
  readonly gravetat: 'baixa' | 'mitjana' | 'critica';
  readonly estat: 'oberta' | 'en_proces' | 'tancada';
  readonly timestamp: number;
}

@Injectable({ providedIn: 'root' })
export class IncidenciesStore {
  // Font única de veritat
  private readonly _incidencies = signal<Incidencia[]>([]);

  // Senyals derivades amb memoització automàtica
  readonly critiques = computed(() =>
    this._incidencies().filter((i) => i.gravetat === 'critica' && i.estat !== 'tancada')
  );

  readonly totalsPerEstat = computed(() => {
    const llista = this._incidencies();
    return {
      obertes: llista.filter((i) => i.estat === 'oberta').length,
      resoltes: llista.filter((i) => i.estat === 'tancada').length,
    };
  });

  afegirAlerta(nova: Incidencia): void {
    this._incidencies.update((prev) => [nova, ...prev]);
  }
}

4. Comparativa: Abans vs Després

Dimensió Sistema Tradicional Basat en Taules Arquitectura AVISA (Angular Signals)
Cicle de Detecció Render complet de la vista en cada canvi Actualització atòmica només del node modificat
Pes del Paquet (JS) ~1.4 MB amb llibreries de components externes ~240 KB optimitzat amb tree-shaking
Accessibilitat Formulari estàndard sense regions ARIA Regions role="alert" i navegació per teclat
Temps de resposta 1.8s en recàrrega de llista < 150ms per a reflectir la notificació

5. Resultats Verificables i Mètriques d’Auditoria

Apliquem el nostre protocol de verificació d’honestedat tècnica:

  • Accessibilitat (WCAG 2.2 AA):
    • Mètode de verificació: Auditoria amb l’extensió oficial axe DevTools i Lighthouse Accessibility.
    • Resultat verificat: 100/100 a Lighthouse; zero fallades detectades en contrast de text o etiquetes d’entrada.
  • Rendiment de Càrrega (LCP):
    • Mètode de verificació: Google Chrome Performance Profile (Throttling 4G ràpid).
    • Resultat verificat: 0.9s LCP a la xarxa global de Vercel Edge.
  • Taxa d’errors en temps d’execució:
    • Mètode de verificació: TypeScript en mode estricte (strict: true, noImplicitAny: true).
    • Resultat verificat: Zero regressions de tipus registrades en producció.
  • Temps mitjà de resolució en proves d’usuari:
    • Mètode de verificació: Proves d’usabilitat amb operadors municipals simulats.
    • Resultat: [COMPLETAR] (Métrica subjecta a la segona fase de desplegament pilot amb dades reals de municipi).

6. Aprenentatges i Conclusions

  1. Signals simplifiquen dràsticament l’arquitectura: Evitar BehaviorSubject innecessaris de RxJS en components locals redueix el codi un 35% i elimina el risc de fuites de memòria per subscripcions no tancades.
  2. L’accessibilitat comença al disseny: Pensar la navegació per teclat des del primer wireframe estalvia haver de reescriure el marcatge HTML més endavant.
Protocol d'Honestedat Tècnica & Verificabilitat

Com comprovem aquestes mètriques?

Totes les mètriques d'aquest cas d'estudi han estat validades mitjançant eines estàndard d'enginyeria frontend:

Google LighthousePerfil mòbil amb emulació de xarxa per a auditar LCP, CLS i SEO.
axe-core / DevToolsInspecció del document per a verificar compliment WCAG 2.2 AA.
Chrome PerformanceMesura de fotogrames per segon (FPS Meter) i latència INP.