Merge branch 'Desarrollo' into DEV-LT

This commit is contained in:
Leonel Toro 2025-07-21 10:19:36 -04:00
commit 92ce18173e
27 changed files with 416 additions and 535 deletions

View file

@ -1,39 +1,43 @@
using System.Text.Json; using DAL;
using DAL;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Shared.DTO;
using Shared.DTO.Integracion_DGA; using Shared.DTO.Integracion_DGA;
using Shared.DTO.VariablesEntorno; using Shared.DTO.VariablesEntorno;
using Shared.Helper; using Shared.Helper;
using System.Text.Json;
namespace BLL.Integracion_DGA namespace BLL.Integracion_DGA
{ {
public class BusinessLogic public class ObtencionDatosDga
{ {
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly ApiService _apiService; private readonly ApiService _apiService;
private readonly JobsDgaRepository _jobs; private readonly JobsDgaRepository _jobs;
private readonly JobsDgaSupFlujRepository _jobsSupFluj; private readonly LogEnvioRepository _logEnvioRepository;
private readonly FileLoggerHelper _fileLoggerHelper;
public BusinessLogic(IConfiguration configuration, ApiService apiService, JobsDgaRepository jobs, JobsDgaSupFlujRepository jobsSupFluj) public ObtencionDatosDga(IConfiguration configuration, ApiService apiService, JobsDgaRepository jobs, LogEnvioRepository logEnvioRepository)
{ {
_configuration = configuration; _configuration = configuration;
_apiService = apiService; _apiService = apiService;
_jobs = jobs; _jobs = jobs;
_jobsSupFluj = jobsSupFluj;
FileLoggerHelper.ConfigureLogger(_configuration); FileLoggerHelper.ConfigureLogger(_configuration);
_logEnvioRepository = logEnvioRepository;
} }
public async Task Run() public async Task ObtenerDatosDga()
{ {
await _logEnvioRepository.InsertarLogProcesoAsync(new LogProceso
{
FechaEjecucion = DateTime.UtcNow,
NombreProceso = "OBTENCION DATOS DGA"
});
DateTimeOffset dateEnd = DateTimeOffset.Now; DateTimeOffset dateEnd = DateTimeOffset.Now;
DateTimeOffset dateStart = dateEnd.AddHours(-1); DateTimeOffset dateStart = dateEnd.AddHours(-1);
JsonSerializerOptions options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true }; JsonSerializerOptions options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
//FileLoggerHelper.ConfigureLogger(_configuration); ConsoleLoggerHelper.WriteLineAndLogInfo($"INICIO OBTENER DATOS DGA");
WriteLineAndLog($"Inicia Proceso DGA");
try try
{ {
string apiUrlBase = NexusApiUrl.ApiUrl; string apiUrlBase = NexusApiUrl.ApiUrl;
@ -44,19 +48,25 @@ namespace BLL.Integracion_DGA
{ "accept", "application/json" } { "accept", "application/json" }
}; };
WriteLineAndLog($"Obteniendo Documentos"); ConsoleLoggerHelper.WriteLineAndLogInfo($"OBTENIENDO DOCUMENTOS");
string apiUrlDocuments = apiUrlBase + "/api/Documents"; string apiUrlDocuments = apiUrlBase + "/api/Documents";
// Utiliza el servicio para realizar la solicitud a la API con URL y encabezados personalizados // Utiliza el servicio para realizar la solicitud a la API con URL y encabezados personalizados
string responseData = await _apiService.GetApiResponseAsync(apiUrlDocuments, headers); string responseData = await _apiService.GetApiResponseAsync(apiUrlDocuments, headers);
var documento = JsonSerializer.Deserialize<List<DocumentResponse>>(responseData, options); var documento = JsonSerializer.Deserialize<List<DocumentResponse>>(responseData, options);
if (documento == null || documento.Count == 0)
{
return;
}
foreach (DocumentResponse item in documento) foreach (DocumentResponse item in documento)
{ {
WriteLineAndLog($"Obteniendo Tagviews"); ConsoleLoggerHelper.WriteLineAndLogInfo($"OBTENIENDO TAGVIEWS");
string apiUrlTagViews = $"{apiUrlBase}/api/Documents/tagviews/{item.uid}"; string apiUrlTagViews = $"{apiUrlBase}/api/Documents/tagviews/{item.uid}";
responseData = await _apiService.GetApiResponseAsync(apiUrlTagViews, headers); responseData = await _apiService.GetApiResponseAsync(apiUrlTagViews, headers);
TagviewsResponse tagviews = JsonSerializer.Deserialize<TagviewsResponse>(responseData, options); TagviewsResponse tagviews = JsonSerializer.Deserialize<TagviewsResponse>(responseData, options) ?? new TagviewsResponse();
List<string> listTagsID = tagviews.Columns.Select(x => x.Uid).ToList(); List<string> listTagsID = tagviews.Columns.Select(x => x.Uid).ToList();
@ -69,15 +79,16 @@ namespace BLL.Integracion_DGA
EndTs = dateEnd.ToUnixTimeSeconds() EndTs = dateEnd.ToUnixTimeSeconds()
}; };
WriteLineAndLog($"Obteniendo Tagviews Historic"); ConsoleLoggerHelper.WriteLineAndLogInfo($"OBTENIENDO TAGVIEWS HISTORIC");
string apiUrlHistoric = $"{apiUrlBase}/api/Documents/tagviews/{item.uid}/realtime"; string apiUrlHistoric = $"{apiUrlBase}/api/Documents/tagviews/{item.uid}/historic";
responseData = await _apiService.PostApiResponseAsync(apiUrlHistoric, headers, listTagsID); responseData = await _apiService.PostApiResponseAsync(apiUrlHistoric, headers, historicRequest);
List<HistoricResponse> historicResponse = JsonSerializer.Deserialize<List<HistoricResponse>>(responseData, options); List<HistoricResponse> historicResponse = JsonSerializer.Deserialize<List<HistoricResponse>>(responseData, options) ?? new List<HistoricResponse>();
TimeZoneInfo zonaHorariaChile = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time"); TimeZoneInfo zonaHorariaChile = TimeZoneInfo.FindSystemTimeZoneById("Pacific SA Standard Time");
if (item.name == "API - DGA - CAUDALES") if (item.name == "API - DGA - CAUDALES")
{ {
ConsoleLoggerHelper.WriteLineAndLogInfo($"OBTENIENDO DATOS DGA CAUDAL");
var caudalData = tagviews.Columns var caudalData = tagviews.Columns
.SelectMany(tag => .SelectMany(tag =>
historicResponse.Where(h => h.Uid == tag.Uid) historicResponse.Where(h => h.Uid == tag.Uid)
@ -95,6 +106,7 @@ namespace BLL.Integracion_DGA
} }
else if (item.name == "API - DGA - NIVELES") else if (item.name == "API - DGA - NIVELES")
{ {
ConsoleLoggerHelper.WriteLineAndLogInfo($"OBTENIENDO DATOS DGA NIVEL");
var nivelData = tagviews.Columns var nivelData = tagviews.Columns
.SelectMany(tag => .SelectMany(tag =>
historicResponse.Where(h => h.Uid == tag.Uid) historicResponse.Where(h => h.Uid == tag.Uid)
@ -110,51 +122,17 @@ namespace BLL.Integracion_DGA
await _jobs.InsertarDgaNivel(nivelData); await _jobs.InsertarDgaNivel(nivelData);
} }
else if (item.name == "API - DGA")
{
var nivelData = tagviews.Columns
.SelectMany(tag =>
historicResponse.Where(h => h.Uid == tag.Uid)
.Select(h => new
{
TAG = tag.Name,
NIVEL_FREATICO = h.Value?.ToString(),
FECHAMEDICION = TimeZoneInfo.ConvertTimeFromUtc(
new DateTime(1970, 1, 1).AddSeconds(h.TimeStamp).ToUniversalTime(),
zonaHorariaChile)
})
).ToList();
}
} }
WriteLineAndLog($"INICIO REGISTRO DE MEDICIONES DGA"); ConsoleLoggerHelper.WriteLineAndLogInfo($"INICIO REGISTRO DE MEDICIONES DGA");
await _jobs.SpRegistrarMedicionesDga(); await _jobs.SpRegistrarMedicionesDga();
WriteLineAndLog($"FIN REGISTRO DE MEDICIONES DGA"); ConsoleLoggerHelper.WriteLineAndLogInfo($"FIN REGISTRO DE MEDICIONES DGA");
WriteLineAndLog($"FIN PROCESO DGA");
} }
catch (Exception ex) catch (Exception ex)
{ {
FileLoggerHelper.LogError($"{ex.Message}", ex); FileLoggerHelper.LogError($"{ex.Message}", ex);
WriteLineAndLog($"{ex.Message}", ConsoleColor.Red); ConsoleLoggerHelper.WriteLineAndLogInfo($"{ex.Message}", ConsoleColor.Red);
} }
}
static void WriteLineAndLog(string msj, ConsoleColor? color = null)
{
if (color.HasValue && Enum.IsDefined(typeof(ConsoleColor), color.Value))
{
Console.ForegroundColor = (ConsoleColor)color;
Console.WriteLine(msj);
Console.ResetColor();
}
else
{
Console.WriteLine($"{msj}");
}
FileLoggerHelper.LogInformation($"{msj}");
} }
} }
} }

View file

@ -1,6 +1,8 @@
using System.Text.Json; using System;
using System.Text.Json;
using DAL; using DAL;
using DAS; using DAS;
using Shared.DTO;
using Shared.DTO.Envios_DGA; using Shared.DTO.Envios_DGA;
using Shared.DTO.VariablesEntorno; using Shared.DTO.VariablesEntorno;
using Shared.Helper; using Shared.Helper;
@ -9,68 +11,48 @@ namespace BLL.Recuperacion_DGA
{ {
public class EnvioDGA public class EnvioDGA
{ {
private readonly MedicionScadaRepository _dGAMedicionScadaRepository; private readonly MedicionDGARepository _dGAMedicionRepository;
private readonly RegistrarMedicion _registrarMedicion; private readonly RegistrarMedicion _registrarMedicion;
private readonly LogEnvioRepository _logEnvioRepository;
public EnvioDGA(MedicionScadaRepository dGAMedicionScadaRepository, RegistrarMedicion registrarMedicion) public EnvioDGA(MedicionDGARepository dGAMedicionRepository, RegistrarMedicion registrarMedicion, LogEnvioRepository logEnvioRepository)
{ {
_dGAMedicionScadaRepository = dGAMedicionScadaRepository; _dGAMedicionRepository = dGAMedicionRepository;
_registrarMedicion = registrarMedicion; _registrarMedicion = registrarMedicion;
_logEnvioRepository = logEnvioRepository;
} }
public async Task<bool> RegistrarMedicionesAsync() public async Task<bool> RegistrarMedicionesAsync()
{ {
try try
{ {
await WriteLineAndLog("INICIO", "Inicio proceso de recuperación DGA", ""); await _logEnvioRepository.InsertarLogProcesoAsync(new LogProceso
WriteLineAndLog("Obteniendo Mediciones Scada", ConsoleColor.Green);
var mediciones = await _dGAMedicionScadaRepository.ObtenerMedicionesAsync();
var listaMediciones = new List<Object>();
foreach (var medicion in mediciones)
{ {
try FechaEjecucion = DateTime.UtcNow,
NombreProceso = "ENVIO DATOS DGA"
});
ConsoleLoggerHelper.WriteLineAndLogEventoAsync("INICIO", "Inicio proceso de recuperación DGA", "");
ConsoleLoggerHelper.WriteLineAndLogInfo("Obteniendo Mediciones Scada", ConsoleColor.Green);
var logsEnviados = new List<LogMedicionEnvio>();
var pageNumber = 1;
var fechaInicio = DateTime.UtcNow;
while (true)
{
var mediciones = await _dGAMedicionRepository.ObtenerMedicionesPorLoteAsync(pageNumber, fechaInicio);
if (mediciones == null || mediciones.Count == 0)
{ {
if (!string.IsNullOrEmpty(medicion.Code)) break;
}
foreach (var medicion in mediciones)
{
try
{ {
var rutEmpresa = string.Empty;
if (medicion.tipo_empresa == null)
{
continue;
}
if (medicion.tipo_empresa == "AV")
{
rutEmpresa = CredencialDGA.RutAv;
}
if (medicion.tipo_empresa == "EV")
{
rutEmpresa = CredencialDGA.RutEsval;
}
List<string> vacios = new List<string>();
if (medicion.Caudal == null || medicion.Caudal.Equals(""))
{
vacios.Add("caudal");
}
if (medicion.DateOrigen == null)
{
vacios.Add("fecha origen");
}
if (medicion.nivelFreaticoDelPozo == null || medicion.nivelFreaticoDelPozo.ToString().Equals(""))
{
vacios.Add("nivel freatico");
}
if (medicion.Totalizador == null || medicion.Totalizador.Equals(""))
{
vacios.Add("totalizador");
}
if (vacios.Count > 0)
{
await FileLoggerHelper.InsertarLogsAsync("REGISTRAR", $"Medicion {medicion.Code} no registra {string.Join(", ", vacios)}","");
}
var fechaEnvio = DateTime.UtcNow; var fechaEnvio = DateTime.UtcNow;
var body = new MedicionSubterraneaRequest var body = new MedicionSubterraneaRequest
@ -78,76 +60,55 @@ namespace BLL.Recuperacion_DGA
Autenticacion = new Autenticacion Autenticacion = new Autenticacion
{ {
Password = CredencialDGA.Password, Password = CredencialDGA.Password,
RutEmpresa = rutEmpresa, RutEmpresa = medicion.TIPO_EMPRESA == "EV" ? CredencialDGA.RutEsval : CredencialDGA.RutAv,
RutUsuario = CredencialDGA.RutUsuario RutUsuario = CredencialDGA.RutUsuario
}, },
MedicionSubterranea = new Medicion MedicionSubterranea = new Medicion
{ {
Caudal = medicion.Caudal.ToString() ?? "", Caudal = medicion.CAUDAL ?? "",
FechaMedicion = medicion.DateOrigen?.ToString("yyyy-MM-dd") ?? "", FechaMedicion = medicion.FECHA_MEDICION_CAUDAL?.ToString("yyyy-MM-dd") ?? "",
HoraMedicion = medicion.DateOrigen?.ToString("HH:mm:ss") ?? "", HoraMedicion = medicion.FECHA_MEDICION_CAUDAL?.ToString("HH:mm:ss") ?? "",
NivelFreaticoDelPozo = medicion.nivelFreaticoDelPozo?.ToString() ?? "", NivelFreaticoDelPozo = medicion.NIVEL_FREATICO_DEL_POZO ?? "",
Totalizador = medicion.Totalizador.ToString() ?? "", Totalizador = medicion.TOTALIZADOR_CAUDAL ?? "",
} }
}; };
await _registrarMedicion.EnviarMedicionAsync(medicion, body, fechaEnvio);
listaMediciones.Add(new {Id = medicion.Id,FechaEnvio = fechaEnvio.ToString("yyyy-MM-dd HH:mm:ss"), Enviado = medicion.Enviado + 1}); var response = await _registrarMedicion.EnviarMedicionAsync(medicion, body, fechaEnvio);
logsEnviados.Add(response);
}
catch (Exception ex)
{
ConsoleLoggerHelper.WriteLineAndLogInfo($"[Error]: medicion[{medicion.ID}], mensaje: {ex.Message}");
} }
} }
catch (Exception ex) try
{ {
FileLoggerHelper.LogError($"[Error] {ex.Message}.", ex); var idMediciones = mediciones.Select(x => x.ID).ToList();
WriteLineAndLog($"Error al enviar la medición con ID {medicion.Code}.", ConsoleColor.Red); await _dGAMedicionRepository.GuardarMedicionesEnviadasAsync(idMediciones);
await _logEnvioRepository.InsertarLogRespuesta(logsEnviados);
}
catch (Exception e)
{
ConsoleLoggerHelper.WriteLineAndLogInfo($"[Error] {e.Message}");
} }
}
var listaMedicionesJson = JsonSerializer.Serialize(listaMediciones);
if (listaMediciones.Count > 0) logsEnviados.Clear();
{ mediciones.Clear();
await MedicionScadaRepository.ActualizarMedicionesAsync(listaMedicionesJson); pageNumber++;
} }
await WriteLineAndLog("FIN","Fin proceso de recuperación DGA","");
ConsoleLoggerHelper.WriteLineAndLogEventoAsync("FIN","Fin proceso de recuperación DGA","");
} }
catch (Exception ex) catch (Exception ex)
{ {
FileLoggerHelper.LogError($"[Error] {ex.Message}.", ex); FileLoggerHelper.LogError($"[Error] {ex.Message}.", ex);
WriteLineAndLog($"Error al procesar las mediciones.", ConsoleColor.Red); ConsoleLoggerHelper.WriteLineAndLogInfo($"Error al procesar las mediciones.", ConsoleColor.Red);
return false; return false;
} }
return true; return true;
} }
static void WriteLineAndLog(string msj, ConsoleColor? color = null)
{
if (color.HasValue && Enum.IsDefined(typeof(ConsoleColor), color.Value))
{
Console.ForegroundColor = (ConsoleColor)color;
Console.WriteLine(msj);
Console.ResetColor();
}
else
{
Console.WriteLine($"{msj}");
}
FileLoggerHelper.LogInformation($"{msj}");
}
static async Task WriteLineAndLog(string evento, string proceso, string operacion = null, ConsoleColor? color = null)
{
if (color.HasValue && Enum.IsDefined(typeof(ConsoleColor), color.Value))
{
Console.ForegroundColor = (ConsoleColor)color;
Console.WriteLine($"{proceso}");
Console.ResetColor();
}
else
{
Console.WriteLine($"{proceso}");
}
FileLoggerHelper.LogInformation($"{proceso}");
await FileLoggerHelper.InsertarLogsAsync(evento,proceso,operacion);
}
} }
} }

View file

@ -1,54 +0,0 @@
using System.Security.Cryptography;
using System.Text;
namespace DAL
{
public static class Encriptador
{
private static readonly byte[] key = Encoding.ASCII.GetBytes("1234567891234567");
private static readonly byte[] iv = Encoding.ASCII.GetBytes("Devjoker7.37hAES");
public static string Encripta(string Cadena)
{
using Aes aesAlg = Aes.Create();
aesAlg.Key = key;
aesAlg.IV = iv;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(Cadena);
}
}
return Convert.ToBase64String(msEncrypt.ToArray());
}
}
public static string Desencripta(string Cadena)
{
using Aes aesAlg = Aes.Create();
aesAlg.Key = key;
aesAlg.IV = iv;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(Cadena)))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
return srDecrypt.ReadToEnd();
}
}
}
}
}
}

View file

@ -1,74 +0,0 @@
using System.Data;
using Dapper;
using Microsoft.Data.SqlClient;
using Shared.DTO.Integracion_DGA;
using Shared.DTO.VariablesEntorno;
namespace DAL
{
public class JobsDgaSupFlujRepository
{
public async Task<bool> InsertarDgaMacroResultadoSupFluj(List<DgaMacroResultadoSupFluj> dgaMacroResultadoSupFluj)
{
try
{
// Configurar la conexión a la base de datos
using (SqlConnection connection = new SqlConnection(BdConexion.StringConnection))
{
await connection.OpenAsync();
await connection.ExecuteAsync("TRUNCATE TABLE DGA_MACRO_RESULTADO_SUP_FLUJ");
await SpCalculoDgaSupFluj();
string sql = "INSERT INTO DGA_MACRO_RESULTADO_SUP_FLUJ (TagName, TimeStamp, Value, Quality) VALUES (@TagName, @TimeStamp, @Value, @Quality)";
await connection.ExecuteAsync(sql, dgaMacroResultadoSupFluj);
return true;
}
}
catch (Exception ex)
{
throw new Exception($"Error: {ex.Message}");
}
}
public async Task<bool> SpCalculoDgaSupFluj()
{
try
{
using (var connection = new SqlConnection(BdConexion.StringConnection))
{
await connection.OpenAsync();
await connection.ExecuteAsync(
"SP_CALCULO_DGA_SUP_FLUJ",
commandType: CommandType.StoredProcedure
);
}
return true; // Éxito
}
catch (Exception ex)
{
throw new Exception($"Error: {ex.Message}");
}
}
public async Task<bool> SpTraspasoDatosAchirdSupFluj()
{
try
{
using (var connection = new SqlConnection(BdConexion.StringConnection))
{
await connection.OpenAsync();
await connection.ExecuteAsync(
"SP_TRASPASO_DATOS_ACHIRD_SUP_FLUJ",
commandType: CommandType.StoredProcedure
);
}
return true; // Éxito
}
catch (Exception ex)
{
throw new Exception($"Error: {ex.Message}");
}
}
}
}

69
DAL/LogEnvioRepository.cs Normal file
View file

@ -0,0 +1,69 @@
using Dapper;
using Microsoft.Data.SqlClient;
using Serilog;
using Shared.DTO;
using Shared.DTO.Envios_DGA;
using Shared.DTO.VariablesEntorno;
namespace DAL
{
public class LogEnvioRepository
{
public async Task<bool> InsertarLogProcesoAsync(LogProceso log)
{
try
{
await using var connection = new SqlConnection(BdConexion.StringConnection);
var sql = @"
INSERT INTO dbo.DGA_LOGS_PROCESOS
(
NOMBRE_PROCESO,
FECHA_EJECUCION
)
VALUES
(
@NombreProceso,
@FechaEjecucion
);";
await connection.ExecuteAsync(sql, log);
return true;
}
catch (Exception)
{
return false;
}
}
public async Task<bool> InsertarLogRespuesta(List<LogMedicionEnvio> logsEnviados)
{
await using var connection = new SqlConnection(BdConexion.StringConnection);
try
{
var sql = @"INSERT INTO DGA_LOGS_ENVIOS (
ESTADO_ENVIO,
JSON_ENVIO,
JSON_RESPUESTA,
COMPROBANTE,
FECHA_ENVIO,
ID_DGA_DATO)
VALUES (
@ESTADO_ENVIO,
@JSON_ENVIO,
@JSON_RESPUESTA,
@COMPROBANTE,
@FECHA_ENVIO,
@ID_DGA_DATO);";
await connection.ExecuteAsync(sql, logsEnviados);
return true;
}
catch (Exception ex)
{
throw new Exception($"Error al insertar logs de respuesta {ex.Message}");
}
}
}
}

View file

@ -1,34 +0,0 @@
using Dapper;
using Microsoft.Data.SqlClient;
using Shared.DTO.Envios_DGA;
using Shared.DTO.VariablesEntorno;
namespace DAL
{
public class LogMedicionScadaRepository
{
public async Task<bool> InsertarLogMedicionScadaAsync(LogMedicionScada logMedicionScada)
{
try
{
using (var connection = new SqlConnection(BdConexion.StringConnection))
{
await connection.OpenAsync();
// Insertar todos los datos de la lista usando Dapper
var sql = @"INSERT INTO dbo.DGA_LOGS_OPERACION
(estado_envio, json_enviado, json_recibido, comprobante, fecha_envio, id_medicion_smartscada_operacion)
VALUES
(@EstadoEnvio, @JsonEnviado, @JsonRecibido, @Comprobante, @FechaEnvio, @IdMedicionSmartscadaOperacion)";
await connection.ExecuteAsync(sql, logMedicionScada);
return true; // Éxito
}
}
catch (Exception ex)
{
throw new Exception($"Error: {ex.Message}");
}
}
}
}

View file

@ -0,0 +1,43 @@
using System.Data;
using Dapper;
using Microsoft.Data.SqlClient;
using Shared.DTO.Envios_DGA;
using Shared.DTO.VariablesEntorno;
namespace DAL
{
public class MedicionDGARepository
{
public async Task<List<DatoDGATemporal>> ObtenerMedicionesPorLoteAsync(int pageNumber, DateTime fecha)
{
var parameters = new DynamicParameters();
parameters.Add("@PageNumber", pageNumber);
parameters.Add("@FechaInicio", fecha);
await using var connection = new SqlConnection(BdConexion.StringConnection);
var resultado = await connection.QueryAsync<DatoDGATemporal>(
"SP_OBTENER_LOTE_DGA_DATOS",
parameters,
commandType: CommandType.StoredProcedure);
return resultado.ToList();
}
public async Task<bool> GuardarMedicionesEnviadasAsync(List<int> medicionesGuardadas)
{
await using var connection = new SqlConnection(BdConexion.StringConnection);
try
{
var query = @"UPDATE DGA_DATOS SET ENVIADO = 1 WHERE ID IN @Ids";
await connection.ExecuteAsync(query, new { Ids = medicionesGuardadas });
return true;
}
catch(Exception ex) {
throw new Exception($"Error {ex.Message}");
}
}
}
}

View file

@ -1,36 +0,0 @@
using System.Data;
using Dapper;
using Microsoft.Data.SqlClient;
using Shared.DTO.Envios_DGA;
using Shared.DTO.VariablesEntorno;
namespace DAL
{
public class MedicionScadaRepository
{
public async Task<List<MedicionScada>> ObtenerMedicionesAsync()
{
await using var connection = new SqlConnection(BdConexion.StringConnection);
var result = await connection.QueryAsync<MedicionScada>(
"SP_OBTENER_MEDICION_SMARTSCADA_OPERACION",
commandType: CommandType.StoredProcedure);
return result.ToList();
}
public static async Task<bool> ActualizarMedicionesAsync(string medicionesJson)
{
try
{
await using var connection = new SqlConnection(BdConexion.StringConnection);
await connection.ExecuteAsync("SP_ACTUALIZAR_MEDICION_SMARTSCADA_OPERACION", new { JsonMediciones = medicionesJson }, commandType: CommandType.StoredProcedure);
return true;
}
catch (Exception ex)
{
throw new Exception($"Error: {ex.Message}");
}
}
}
}

View file

@ -1,66 +1,77 @@
using System.Text; using DAL;
using System.Text.Json; using Serilog;
using DAL;
using Shared.DTO.Envios_DGA; using Shared.DTO.Envios_DGA;
using Shared.DTO.VariablesEntorno; using Shared.DTO.VariablesEntorno;
using System.Globalization;
using System.Net;
using System.Text;
using System.Text.Json;
namespace DAS namespace DAS
{ {
public class RegistrarMedicion public class RegistrarMedicion
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
private readonly LogMedicionScadaRepository _logMedicionScadaRepository; private readonly LogEnvioRepository _logMedicionScadaRepository;
public RegistrarMedicion(HttpClient httpClient, LogMedicionScadaRepository logMedicionScadaRepository) public RegistrarMedicion(HttpClient httpClient, LogEnvioRepository logMedicionScadaRepository)
{ {
_httpClient = httpClient; _httpClient = httpClient;
_logMedicionScadaRepository = logMedicionScadaRepository; _logMedicionScadaRepository = logMedicionScadaRepository;
} }
public async Task<bool> EnviarMedicionAsync(MedicionScada medicion, MedicionSubterraneaRequest request,DateTime fechaEnvio) public async Task<LogMedicionEnvio> EnviarMedicionAsync(DatoDGATemporal medicion, MedicionSubterraneaRequest request, DateTime fechaEnvio)
{ {
var timeStamp = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss-0000"); var log = new LogMedicionEnvio();
try
var json = JsonSerializer.Serialize(request);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.Add("codigoObra", medicion.Code);
content.Headers.Add("timeStampOrigen", timeStamp);
var response = await _httpClient.PostAsync($"{SubterraneaApiUrl.BaseUrl}{SubterraneaApiUrl.EndPoint}", content);
string jsonRecibido = await response.Content.ReadAsStringAsync();
string estado = response.IsSuccessStatusCode ? "OK" : "ERROR";
string comprobante = string.Empty;
if (response.IsSuccessStatusCode)
{ {
try var timeStamp = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss-0000", CultureInfo.InvariantCulture);
{ var json = JsonSerializer.Serialize(request, new JsonSerializerOptions
using var doc = JsonDocument.Parse(jsonRecibido);
if (doc.RootElement.TryGetProperty("data", out var dataProp) &&
dataProp.TryGetProperty("numeroComprobante", out var comprobanteProp))
{
comprobante = comprobanteProp.GetString() ?? "";
}
}
catch
{ {
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
var req = new HttpRequestMessage(HttpMethod.Post, $"{SubterraneaApiUrl.BaseUrl}{SubterraneaApiUrl.EndPoint}");
req.Headers.Add("codigoObra", medicion.CODIGO_DGA);
req.Headers.Add("timeStampOrigen", timeStamp);
req.Content = new StringContent(json, Encoding.UTF8, "application/json");
log.JSON_ENVIO = json;
log.FECHA_ENVIO = DateTime.UtcNow;
log.ID_DGA_DATO = medicion.ID;
using var response = await _httpClient.SendAsync(req);
string jsonRecibido = await response.Content.ReadAsStringAsync();
log.JSON_RESPUESTA = jsonRecibido;
if (response == null || !response.IsSuccessStatusCode)
{
log.COMPROBANTE = null;
log.ESTADO_ENVIO = "ERROR";
} }
var apiResponse = JsonSerializer.Deserialize<ApiResponse<MedicionSubterraneaResponse>>(jsonRecibido, new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
if (apiResponse == null || string.IsNullOrEmpty(apiResponse.Status) || apiResponse.Status != "00")
{
log.COMPROBANTE = null;
log.ESTADO_ENVIO = "ERROR";
}
log.COMPROBANTE = apiResponse!.Data!.NumeroComprobante ?? null;
log.ESTADO_ENVIO = "EXITO";
}
catch (Exception)
{
log.COMPROBANTE = null;
log.ESTADO_ENVIO = "ERROR";
}
finally
{
} }
var logMedicionScada = new LogMedicionScada return log;
{
EstadoEnvio = estado,
JsonEnviado = json,
JsonRecibido = jsonRecibido,
Comprobante = comprobante,
FechaEnvio = fechaEnvio,
IdMedicionSmartscadaOperacion = medicion.Id
};
await _logMedicionScadaRepository.InsertarLogMedicionScadaAsync(logMedicionScada);
return true;
} }
} }
} }

View file

@ -46,22 +46,21 @@ namespace Integracion_DGA
.ConfigureServices((context, services) => .ConfigureServices((context, services) =>
{ {
services.AddSingleton<IConfiguration>(configuration); services.AddSingleton<IConfiguration>(configuration);
services.AddScoped<MedicionScadaRepository>(); services.AddScoped<MedicionDGARepository>();
services.AddScoped<EnvioDGA>(); services.AddScoped<EnvioDGA>();
services.AddHttpClient<RegistrarMedicion>(); services.AddHttpClient<RegistrarMedicion>();
services.AddScoped<JobsDgaRepository>(); services.AddScoped<JobsDgaRepository>();
services.AddScoped<JobsDgaSupFlujRepository>(); services.AddScoped<LogEnvioRepository>();
services.AddScoped<LogMedicionScadaRepository>();
services.AddScoped<ApiService>(); services.AddScoped<ApiService>();
services.AddScoped<BusinessLogic>(); services.AddScoped<ObtencionDatosDga>();
}) })
.Build(); .Build();
var envioDGA = host.Services.GetRequiredService<EnvioDGA>(); var envioDGA = host.Services.GetRequiredService<EnvioDGA>();
var bussinessLogic = host.Services.GetRequiredService<BusinessLogic>(); var bussinessLogic = host.Services.GetRequiredService<ObtencionDatosDga>();
var apiService = host.Services.GetRequiredService<ApiService>(); var apiService = host.Services.GetRequiredService<ApiService>();
await bussinessLogic.Run(); await bussinessLogic.ObtenerDatosDga();
} }
} }
} }

View file

@ -46,10 +46,10 @@ namespace Recuperacion_DGA
.ConfigureServices((context, services) => .ConfigureServices((context, services) =>
{ {
services.AddSingleton<IConfiguration>(configuration); services.AddSingleton<IConfiguration>(configuration);
services.AddScoped<MedicionScadaRepository>(); services.AddScoped<MedicionDGARepository>();
services.AddScoped<EnvioDGA>(); services.AddScoped<EnvioDGA>();
services.AddHttpClient<RegistrarMedicion>(); services.AddHttpClient<RegistrarMedicion>();
services.AddScoped<LogMedicionScadaRepository>(); services.AddScoped<LogEnvioRepository>();
}) })
.Build(); .Build();

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shared.DTO.Envios_DGA
{
public class ApiResponse<T>
{
public string? Status { get; set; }
public string? Message { get; set; }
public T? Data { get; set; }
}
}

View file

@ -0,0 +1,27 @@
namespace Shared.DTO.Envios_DGA
{
public class DatoDGA
{
public int ID { get; set; }
public string? CODIGO_DGA { get; set; }
public string? MACRO { get; set; }
public string? SENSOR { get; set; }
public string? CAUDAL { get; set; }
public string? TOTALIZADOR_CAUDAL { get; set; }
public DateTime? FECHA_MEDICION_CAUDAL { get; set; }
public string? NIVEL_FREATICO_DEL_POZO { get; set; }
public DateTime? FECHA_MEDICION_NIVEL { get; set; }
public string? TIPO_EMPRESA { get; set; }
public int ENVIADO { get; set; } = 0;
}
}

View file

@ -0,0 +1,18 @@
namespace Shared.DTO.Envios_DGA
{
public class DatoDGATemporal
{
public int ID { get; set; }
public string? CODIGO_DGA { get; set; }
public string? CAUDAL { get; set; }
public string? TOTALIZADOR_CAUDAL { get; set; }
public DateTime? FECHA_MEDICION_CAUDAL { get; set; }
public string? NIVEL_FREATICO_DEL_POZO { get; set; }
public string? TIPO_EMPRESA { get; set; }
}
}

View file

@ -0,0 +1,12 @@
namespace Shared.DTO.Envios_DGA
{
public class LogMedicionEnvio
{
public string ESTADO_ENVIO { get; set; } = string.Empty;
public string? JSON_ENVIO { get; set; }
public string? JSON_RESPUESTA { get; set; }
public string? COMPROBANTE { get; set; }
public DateTime FECHA_ENVIO { get; set; }
public int ID_DGA_DATO { get; set; }
}
}

View file

@ -1,12 +0,0 @@
namespace Shared.DTO.Envios_DGA
{
public class LogMedicionScada
{
public string EstadoEnvio { get; set; }
public string JsonEnviado { get; set; }
public string JsonRecibido { get; set; }
public string Comprobante { get; set; }
public DateTime FechaEnvio { get; set; }
public long IdMedicionSmartscadaOperacion { get; set; }
}
}

View file

@ -1,28 +0,0 @@
namespace Shared.DTO.Envios_DGA
{
public class MedicionScada
{
public long Id { get; set; }
public string? Code { get; set; }
public DateTime? DateOrigen { get; set; }
public DateTime? DateMedicionSup { get; set; }
public decimal? Caudal { get; set; }
public decimal? Altura { get; set; }
public DateTime? DateMedicionSub { get; set; }
public decimal? Totalizador { get; set; }
public decimal? Caudalsub { get; set; }
public decimal? Nivel { get; set; }
public DateTime? FechaEnvio { get; set; }
public int Enviado { get; set; }
public string? tipo_empresa { get; set; }
public string? nivelFreaticoDelPozo { get; set; }
}
}

View file

@ -2,25 +2,23 @@
{ {
public class MedicionSubterraneaRequest public class MedicionSubterraneaRequest
{ {
public Autenticacion Autenticacion { get; set; } public Autenticacion Autenticacion { get; set; } = new();
public Medicion MedicionSubterranea { get; set; } public Medicion MedicionSubterranea { get; set; } = new();
} }
public class Autenticacion public class Autenticacion
{ {
public string Password { get; set; } public string Password { get; set; } = string.Empty;
public string RutEmpresa { get; set; } public string RutEmpresa { get; set; } = string.Empty;
public string RutUsuario { get; set; } public string RutUsuario { get; set; } = string.Empty;
} }
public class Medicion public class Medicion
{ {
public string Caudal { get; set; } public string? Caudal { get; set; }
public string FechaMedicion { get; set; } public string? FechaMedicion { get; set; }
public string HoraMedicion { get; set; } public string? HoraMedicion { get; set; }
public string NivelFreaticoDelPozo { get; set; } public string? NivelFreaticoDelPozo { get; set; }
public string Totalizador { get; set; } public string? Totalizador { get; set; }
public string? TipoEmpresa { get; set; }
} }
} }

View file

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shared.DTO.Envios_DGA
{
public class MedicionSubterraneaResponse
{
public string? NumeroComprobante { get; set; }
}
}

View file

@ -1,12 +0,0 @@
namespace Shared.DTO.Integracion_DGA;
public partial class DgaMacroResultado
{
public string TagName { get; set; } = null!;
public DateTime TimeStamp { get; set; }
public double? Value { get; set; }
public string? Quality { get; set; }
}

View file

@ -1,12 +0,0 @@
namespace Shared.DTO.Integracion_DGA;
public partial class DgaMacroResultadoSupFluj
{
public string TagName { get; set; } = null!;
public DateTime TimeStamp { get; set; }
public double? Value { get; set; }
public string? Quality { get; set; }
}

View file

@ -1,12 +0,0 @@
namespace Shared.DTO.Integracion_DGA;
public partial class DgaMacroResultadoSupFlujSuma
{
public string TagName { get; set; } = null!;
public DateTime TimeStamp { get; set; }
public double? Value { get; set; }
public string? Quality { get; set; }
}

View file

@ -1,12 +0,0 @@
namespace Shared.DTO.Integracion_DGA;
public partial class DgaSensorResultado
{
public string TagName { get; set; } = null!;
public DateTime TimeStamp { get; set; }
public double? Value { get; set; }
public string? Quality { get; set; }
}

14
SHARED/DTO/LogProceso.cs Normal file
View file

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shared.DTO
{
public class LogProceso
{
public string NombreProceso { get; set; } = string.Empty;
public DateTime FechaEjecucion { get; set; }
}
}

View file

@ -0,0 +1,39 @@
using System;
namespace Shared.Helper
{
public static class ConsoleLoggerHelper
{
public static void WriteLineAndLogInfo(string msj, ConsoleColor? color = null)
{
if (color.HasValue && Enum.IsDefined(typeof(ConsoleColor), color.Value))
{
Console.ForegroundColor = color.Value;
Console.WriteLine(msj);
Console.ResetColor();
}
else
{
Console.WriteLine(msj);
}
FileLoggerHelper.LogInformation(msj);
}
public static void WriteLineAndLogEventoAsync(string evento, string proceso, string operacion = "", ConsoleColor? color = null)
{
if (color.HasValue && Enum.IsDefined(typeof(ConsoleColor), color.Value))
{
Console.ForegroundColor = color.Value;
Console.WriteLine(proceso);
Console.ResetColor();
}
else
{
Console.WriteLine(proceso);
}
FileLoggerHelper.LogInformation(proceso);
}
}
}

View file

@ -1,6 +1,4 @@
using Dapper; using Microsoft.Extensions.Configuration;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using Serilog; using Serilog;
using Shared.DTO.VariablesEntorno; using Shared.DTO.VariablesEntorno;
@ -10,7 +8,7 @@ namespace Shared.Helper
{ {
public static void ConfigureLogger(IConfiguration configuration) public static void ConfigureLogger(IConfiguration configuration)
{ {
var logFilePath = configuration.GetSection("Logging:LogFile:Path").Value; var logFilePath = configuration.GetSection("Logging:LogFile:Path").Value ?? "";
var logFileFullPath = Path.Combine(Directory.GetCurrentDirectory(), logFilePath); var logFileFullPath = Path.Combine(Directory.GetCurrentDirectory(), logFilePath);
Log.Logger = new LoggerConfiguration() Log.Logger = new LoggerConfiguration()
@ -28,31 +26,5 @@ namespace Shared.Helper
{ {
Log.Error(ex, message); Log.Error(ex, message);
} }
public static async Task<bool> InsertarLogsAsync(string evento, string proceso, string operacion)
{
try
{
using var connection = new SqlConnection(BdConexion.StringConnection);
await connection.OpenAsync();
string sql = @"INSERT INTO DGA_LOGS_REGISTROS_ENVIOS (evento, proceso, operacion)
VALUES (@evento, @proceso, @operacion)";
await connection.ExecuteAsync(sql, new
{
evento,
proceso,
operacion
});
return true;
}
catch (Exception e)
{
LogError("Error al insertar logs", e);
return false;
}
}
} }
} }

View file

@ -7,8 +7,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="Microsoft.Data.SqlClient" Version="6.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.6" /> <PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.6" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />