Commit 0bafc88763a6c36356b26672ace0e458407ff30b

Authored by Antigravity AI
1 parent a3050e01

Hito: Estadísticas Reales y Actualización Forzada de FDW (.123)

VERSION.txt
... ... @@ -10,3 +10,4 @@ PROYECTO GIS-GEOSERVER - 2026.04.06.12.44.00 ID DOCKER: d983a409769d. ObservaciÃ
10 10 PROYECTO GIS-GEOSERVER - 2026.04.06.13.31.00 ID DOCKER: d983a409769d. Observación: Prueba de funcionamiento del Manual v1.1 tras estandarización de prefijos y manual de recuperación.
11 11 PROYECTO GIS-GEOSERVER - 2026.04.07.08.18.07 ID DOCKER: d983a409769d. Observación: Optimización visual de interfaz completada: unificación de anchos al 100%, limpieza de barra superior, traslado de controles al sidebar y registro legal SIGEM-MIC/DINAPI.
12 12 PROYECTO GIS-GEOSERVER - 2026.04.07.20.37.47 ID DOCKER: d983a409769d. Observación: Modernización definitiva del Dashboard completada: Replicación de bloque de bienvenida legado, integración de mapa embebido en modo limpio y reestructuración de la fila inferior de gestión al 100% de ancho. Versión estable validada.Version SIG (Abril 2026) - 2026.04.07.22.30.00 ID DOCKER: d983a409769d. Observación: Éxito en implementación de Login Dinámico (SaaS), integración de logos binarios, eslóganes y responsables desde el servidor .254.
  13 +Version SIG (Abril 2026) - 2026.04.07.23.35.00 ID DOCKER: cb7329596324. Observación: Éxito en la implementación de Estadísticas Reales (formato vertical fdw_X.estadisticas_datos) y actualización forzada de FDW desde el menú Administración.
... ...
src/main/java/com/sigem/gis/controller/AdminController.java
... ... @@ -20,7 +20,7 @@ public class AdminController {
20 20 Map<String, Object> response = new HashMap<>();
21 21 try {
22 22 System.out.println("Solicitud de actualización FDW recibida para Entidad: " + entidadId);
23   - fdwService.setupFdw(entidadId);
  23 + fdwService.setupFdw(entidadId, true);
24 24  
25 25 response.put("success", true);
26 26 response.put("message", "Datos del municipio " + entidadId + " actualizados con éxito (FDW y Geometrías vinculadas).");
... ...
src/main/java/com/sigem/gis/controller/GisController.java
... ... @@ -88,4 +88,17 @@ public class GisController {
88 88 return ResponseEntity.status(500).body(Map.of("error", e.getMessage()));
89 89 }
90 90 }
  91 + @GetMapping("/entidad/{id}/estadisticas")
  92 + public ResponseEntity<?> getEstadisticas(@PathVariable String id) {
  93 + try {
  94 + String schemaName = "fdw_" + id;
  95 + String sql = "SELECT descripcion, valor FROM " + schemaName + ".estadisticas_datos";
  96 + List<Map<String, Object>> results = gisJdbcTemplate.queryForList(sql);
  97 +
  98 + return ResponseEntity.ok(results);
  99 + } catch (Exception e) {
  100 + e.printStackTrace();
  101 + return ResponseEntity.status(500).body(Map.of("error", e.getMessage()));
  102 + }
  103 + }
91 104 }
... ...
src/main/java/com/sigem/gis/security/AuthController.java
... ... @@ -64,7 +64,7 @@ public class AuthController {
64 64 String responsable = convertObjectToString(entidadData.get("responsable"));
65 65  
66 66 // 2. Asegurar Infraestructura FDW (Regla 16: Solo crea si no existe)
67   - fdwService.setupFdw(request.getEntidad());
  67 + fdwService.setupFdw(request.getEntidad(), false);
68 68 String schemaName = "fdw_" + request.getEntidad();
69 69  
70 70 System.out.println("Validando usuario vía FDW local para entidad: " + request.getEntidad());
... ...
src/main/java/com/sigem/gis/service/FdwService.java
... ... @@ -22,7 +22,7 @@ public class FdwService {
22 22 @Qualifier("gisJdbcTemplate")
23 23 private JdbcTemplate gisJdbcTemplate;
24 24  
25   - public void setupFdw(String entidadId) {
  25 + public void setupFdw(String entidadId, boolean forceUpdate) {
26 26 // 1. Obtener datos de la entidad desde el Directorio Maestro (.254)
27 27 String sqlEntidad = "SELECT sigem_site, sigem_dbname, boundno, boundse, latlong, zoom, maxzoom, minzoom " +
28 28 "FROM public.entidades WHERE entidad = ?";
... ... @@ -56,9 +56,9 @@ public class FdwService {
56 56 // ... (verificación de infraestructura fdw igual hasta la creación de vistas)
57 57 // ...
58 58 String checkSql = "SELECT count(*) FROM information_schema.tables WHERE table_schema = ? AND table_name = 'usuarios'";
59   - Integer count = gisJdbcTemplate.queryForObject(checkSql, Integer.class, schemaName);
60   -
61   - if (count == null || count == 0) {
  59 + Integer count = (forceUpdate) ? 0 : gisJdbcTemplate.queryForObject(checkSql, Integer.class, schemaName);
  60 +
  61 + if (forceUpdate || count == null || count == 0) {
62 62 // (creación de server, user mapping y esquema igual)
63 63 gisJdbcTemplate.execute("DROP SERVER IF EXISTS " + serverName + " CASCADE");
64 64 gisJdbcTemplate.execute(String.format(
... ... @@ -69,7 +69,7 @@ public class FdwService {
69 69 serverName, user, pass));
70 70 gisJdbcTemplate.execute("CREATE SCHEMA IF NOT EXISTS " + schemaName);
71 71 gisJdbcTemplate.execute(String.format(
72   - "IMPORT FOREIGN SCHEMA public LIMIT TO (v_liq_entidad_totalxobjeto, v_liq_entidad_percentiles, usuarios, ventanas_usuario) FROM SERVER %s INTO %s",
  72 + "IMPORT FOREIGN SCHEMA public LIMIT TO (v_liq_entidad_totalxobjeto, v_liq_entidad_percentiles, usuarios, ventanas_usuario, estadisticas_datos) FROM SERVER %s INTO %s",
73 73 serverName, schemaName));
74 74 }
75 75  
... ...
src/main/resources/static/widgets.html
... ... @@ -12,6 +12,7 @@
12 12 <style>
13 13 body { background-color: #f4f6f9; padding: 20px; font-family: 'Source Sans Pro', sans-serif; }
14 14 .welcome-header { font-size: 24px; color: #333; margin-bottom: 20px; font-weight: 600;}
  15 + .info-box-text { font-size: 11px; font-weight: 600; text-transform: uppercase; }
15 16 /* Estilos para el mapa embebido */
16 17 .map-container {
17 18 width: 100%;
... ... @@ -30,7 +31,7 @@
30 31 </head>
31 32 <body>
32 33 <div class="welcome-header">
33   - <i class="fas fa-home text-primary"></i> Tablero General (Estadísticas Simuladas)
  34 + Tablero General
34 35 </div>
35 36  
36 37 <!-- FILA 1: INFO BOXES ESTILO LEGADO (ESTADÍSTICAS) -->
... ... @@ -201,10 +202,33 @@
201 202 <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
202 203 <script>
203 204 // Dinamizar el título con el nombre de la entidad si está disponible
  205 + const entidadId = localStorage.getItem('entidad');
204 206 const entidadNombre = localStorage.getItem('entidad_nombre');
  207 +
205 208 if (entidadNombre && entidadNombre !== 'null') {
206 209 document.getElementById('welcome-title').innerHTML = `<i class="fas fa-map mr-1"></i> Bienvenido al Sistema Integrado de Gestión Municipal de ${entidadNombre}`;
207 210 }
  211 +
  212 + // Cargar estadísticas reales
  213 + if (entidadId) {
  214 + fetch(`/gis-geoserver/api/gis/entidad/${entidadId}/estadisticas`)
  215 + .then(response => response.json())
  216 + .then(list => {
  217 + if (list && Array.isArray(list)) {
  218 + list.forEach(item => {
  219 + const desc = (item.descripcion || "").toUpperCase();
  220 + const val = Number(item.valor || 0).toLocaleString();
  221 +
  222 + if (desc.includes("CONTRIBUYENTE")) document.getElementById('contribnum').innerText = val;
  223 + if (desc.includes("PROPIEDAD")) document.getElementById('propnum').innerText = val;
  224 + if (desc.includes("COMERCIO")) document.getElementById('comnum').innerText = val;
  225 + if (desc.includes("VEHICULO")) document.getElementById('vehinum').innerText = val;
  226 + if (desc.includes("LICENCIA")) document.getElementById('licennum').innerText = val;
  227 + });
  228 + }
  229 + })
  230 + .catch(err => console.error("Error cargando estadísticas:", err));
  231 + }
208 232 </script>
209 233 </body>
210 234 </html>
... ...
GitLab Appliance - Powered by TurnKey Linux