PI_Assync_SCDE/Program.cs

353 lines
17 KiB
C#

// See https://aka.ms/new-console-template for more information
using Npgsql;
using System.Data;
using System.Data.OleDb;
using System.Globalization;
using System.Text;
using System.Xml;
using System.Xml.Linq;
internal class Plat_integ
{
static string PG_CONN_STRING_PROD = "Server = smart-energia-dev-pgsql.cykff7tj7mik.us-east-1.rds.amazonaws.com; Port = 5432; Database = smartenergiaprod; User Id = postgres; Password = VfHml#Z78!%kvvNM; Timeout = 300;CommandTimeout = 300";
public static IEnumerable<XElement>? pag_ant;
static void Main()
{
down_sync(); //metodo sincrono
Console.WriteLine("" +
"Pressione qualquer tecla para finalizar");
_ = Console.ReadLine();
Environment.Exit(0);
return;
}
public static void down_sync()
{
string caminho_BD, caminho_log;
DateTime tempo_ini;
List<Tuple<string, string>> lt_perf_pto;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
//auxiliar para calculo do tempo de execucao do codigo
tempo_ini = DateTime.Now;
//busca os dados para compor a lista perfis x
caminho_BD = @"\\srv-dados\documentos\Middle\Informativo Setorial\Modelo Word\BD1_dados cadastrais e faturas.accdb";
caminho_log = @"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_erros_" + DateTime.Now.Month + "_" + DateTime.Now.Day + "_" + DateTime.Now.Hour + "_" + DateTime.Now.Second + ".csv";
lt_perf_pto = Busca_dad_BD(caminho_BD);
//exlclui os dados do mes atual salvos no BD
caminho_BD = @"\\srv-dados\documentos\Back\Carteira x.x\Gestão Geral v1\Access\BDs teste\DB_med_5min.accdb";
DateTime now = DateTime.Now;
DateTime data_ini;
DateTime data_fim;
//configuração mês atual
data_ini = new DateTime(now.Year, now.Month, 1);
data_fim = new DateTime(now.Year, now.Month, now.Day);
Exclui_med(data_ini.ToOADate(), data_fim.ToOADate(), caminho_BD);
NpgsqlConnection pg_conn;
pg_conn = new(PG_CONN_STRING_PROD);
//loop para cada dia e cada cod ponto salvando os dados no BD
req_sincrona(data_ini, data_fim, lt_perf_pto, pg_conn, caminho_log);
Console.WriteLine("Concluido. Tempo TOTAL de execucao: {0}", DateTime.Now - tempo_ini);
}
//busca lista de PerfisCCEE e codigos ponto de medicao no BD cadastral
public static List<Tuple<string, string>> Busca_dad_BD(string caminho_BD)
{
var lt_perf_pto = new List<Tuple<string, string>>();
string strCOM;
int i;
//strCOM = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 AND Unidade_gerenciada = TRUE ORDER BY PerfilCCEE";
strCOM = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'PENHASCO GRANITOS' ORDER BY PerfilCCEE";
//strCOM = "SELECT Cod_5min, Codigo_SCDE FROM Dados_cadastrais WHERE LEN(Codigo_SCDE) > 5 and Cliente = 'ALMAVIVA' and Unidade = 'GUARULHOS' ORDER BY PerfilCCEE";
OleDbConnection conn = new("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + caminho_BD + ";Jet OLEDB:Database Password=gds21");
conn.Open();
OleDbCommand tcDC = new(strCOM, conn);
OleDbDataReader reader = tcDC.ExecuteReader();
i = 0;
while (reader.Read())
{
lt_perf_pto.Add(new Tuple<string, string>(reader["Cod_5min"].ToString(), reader["Codigo_SCDE"].ToString()));
i++;
}
conn.Close();
return lt_perf_pto;
}
//Exlclui dados do mes atual no BD medicoes
public static void Exclui_med(double data_ini, double data_fim, string caminho_BD)
{
NpgsqlConnection pg_conn;
pg_conn = new(PG_CONN_STRING_PROD);
pg_conn.Open();
//string pg_strCOM = "DELETE FROM med_5min WHERE dia_num >= " + data_ini + " AND dia_num < " + data_fim;
string pg_strCOM = "DELETE FROM med_5min WHERE dia_num >= " + data_ini + " AND dia_num < " + data_fim + " AND ponto = 'ESPMSOENTR101P'";
NpgsqlCommand pg_tcSCDE = new(pg_strCOM, pg_conn);
NpgsqlDataReader pg_reader = pg_tcSCDE.ExecuteReader();
pg_reader.Close();
pg_conn.Close();
return;
}
public static void req_sincrona(DateTime data_inicial, DateTime data_final, List<Tuple<string, string>> lt_perf_pto, NpgsqlConnection pg_conn, string caminho_log)
{
string log_erros;
int i;
long erros = 0;
var handler = new HttpClientHandler();
int tam_arr;
tam_arr = ((data_final - data_inicial).Days) * lt_perf_pto.Count;
handler.ClientCertificateOptions = ClientCertificateOption.Automatic;
DateTime aux_tempo = DateTime.Now;
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Add("SOAPAction", "listarMedidaCincoMinutos");
var endpoint = new Uri("https://servicos.ccee.org.br:443/ws/v2/MedidaCincoMinutosBSv2");
i = 0;
log_erros = "Perfil;Ponto;Status;Message\n";
while (data_inicial < data_final)
{
foreach (Tuple<string, string> item in lt_perf_pto)
{
int pagina = 1;
int paginasTotal = 1;
try
{
while (pagina <= paginasTotal)
{
var payload = new StringContent(Xml_requisicao(data_inicial, item.Item1, item.Item2, pagina), Encoding.UTF8, "application/json");
var retorno = client.PostAsync(endpoint, payload).Result.Content.ReadAsStringAsync().Result.ToString();
Console.WriteLine("Processando requisicao {0,5}, Perf: {1,6}, Ponto: {2,10}, Página: {3}", i, item.Item1, item.Item2, pagina);
if (pg_conn != null && pg_conn.State == ConnectionState.Closed)
{
pg_conn.Open();
}
paginasTotal = processar_XML_sincrono(retorno, pg_conn);
pagina++;
}
}
catch (Exception he)
{
Console.WriteLine(he.Message);
Console.WriteLine("caught exception");
erros++;
log_erros += item.Item1 + ";" + item.Item2 + ";Erro;" + he.Message.Replace("\n", "-n-") + "\n";
continue;
}
i++;
pag_ant = null;
}
data_inicial = data_inicial.AddDays(1);
}
Console.WriteLine("Houve {0} requisicoes, com {1} erros", i, erros);
File.WriteAllText(caminho_log, log_erros);
client.Dispose();
}
//prepara o xml de entrada a ser enviado à CCEE
public static string Xml_requisicao(DateTime data_req, string perfil, string cod_ponto, int pagina)
{
string cam_ent, tex_req, sdat_req;
cam_ent = @"X:\Back\Plataforma de Integração CCEE\RequestPaginate.txt";
cod_ponto += "P";
sdat_req = data_req.ToString("yyyy-MM-ddT00:00:00");
tex_req = File.ReadAllText(cam_ent);
tex_req = tex_req.Replace("DATAALTERADA", sdat_req);
tex_req = tex_req.Replace("PONTOMEDICAO", cod_ponto);
tex_req = tex_req.Replace("CODPERFIL", perfil);
tex_req = tex_req.Replace("PAGNUM", pagina.ToString());
return tex_req;
}
public static int processar_XML_sincrono(string entrada, NpgsqlConnection pg_conn)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(entrada);
DateTime aux_data = new DateTime(2005, 01, 01);
DateTime tempo_xml;
string access_strCOM, log_erros;
XElement pag_atual;
pag_atual = XElement.Parse(entrada);
tempo_xml = DateTime.Now;
double data, ativa_g, ativa_c, reat_g, reat_c;
long min;
string ponto, origem;
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("hdr", "http://xmlns.energia.org.br/MH/v2");
nsmgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope");
nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
nsmgr.AddNamespace("bmv2", "http://xmlns.energia.org.br/BM/v2");
nsmgr.AddNamespace("bov2", "http://xmlns.energia.org.br/BO/v2");
if (pg_conn.State != ConnectionState.Open)
{
pg_conn.Open();
}
log_erros = "Origem;Ponto;Status;Message\n";
ponto = "";
origem = "";
if (pag_ant == null)
{
XNamespace ns = "http://xmlns.energia.org.br/BO/v2";
pag_ant = pag_atual.Descendants(ns + "medida").Where(x => x.Element(ns + "tipoEnergia").Value == "L");
}
else
{
XNamespace ns = "http://xmlns.energia.org.br/BO/v2";
pag_ant = pag_ant.Concat(pag_atual.Descendants(ns + "medida").Where(x => x.Element(ns + "tipoEnergia").Value == "L"));
}
try
{
int num_pag = 1;
foreach (XmlNode n1 in doc.GetElementsByTagName("hdr:totalPaginas"))
{
int.TryParse(n1.InnerText, out num_pag);
}
int num_pag_atual = 1;
foreach (XmlNode n1 in doc.GetElementsByTagName("hdr:numero"))
{
int.TryParse(n1.InnerText, out num_pag_atual);
}
if (num_pag_atual == num_pag)
{
XmlNode node_ant = doc.SelectNodes("//bov2:medida", nsmgr).Item(5);
using (var pg_writer = pg_conn.BeginBinaryImport("COPY med_5min (origem, dia_num, minuto, ativa_consumo, ativa_geracao, reativa_consumo, reativa_geracao, ponto) FROM STDIN (FORMAT BINARY)"))
{
for (int i = 0; i < pag_ant.Count(); i++)
{
XmlDocument nodeDoc = new XmlDocument();
nodeDoc.LoadXml(pag_ant.ElementAt(i).ToString());
XmlNode node = nodeDoc.SelectSingleNode("//bov2:medida", nsmgr);
if (node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText == "Inspeção Lógica")
{
aux_data = DateTime.ParseExact(node.SelectSingleNode("bov2:data", nsmgr).InnerText, "yyyy-MM-dd'T'HH:mm:ss'-03:00'", null);
data = (aux_data.ToOADate() - aux_data.ToOADate() % 1);
min = aux_data.Hour * 60 + aux_data.Minute;
if (min == 0)
{
min = 1440;
data = data - 1;
}
ponto = node.SelectSingleNode("bov2:medidor//bov2:codigo", nsmgr).InnerText;
origem = node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText;
Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:consumo//bov2:valor", nsmgr).InnerText, out ativa_c);
Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:geracao//bov2:valor", nsmgr).InnerText, out ativa_g);
Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:consumo//bov2:valor", nsmgr).InnerText, out reat_c);
Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:geracao//bov2:valor", nsmgr).InnerText, out reat_g);
access_strCOM = "INSERT INTO Med_5min (Origem, Data, Minuto, Ativa_consumo, Ativa_geracao, Reativa_consumo, Reativa_geracao, Ponto)";
access_strCOM += " VALUES (\"" + origem + "\"," + data + "," + min + "," + ativa_c + "," + ativa_g + "," + reat_c + "," + reat_g + ",\"" + ponto + "\")";
pg_writer.StartRow();
pg_writer.Write(origem);
pg_writer.Write(data, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(min, NpgsqlTypes.NpgsqlDbType.Integer);
pg_writer.Write(ativa_c, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(ativa_g, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(reat_c, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(reat_g, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(ponto);
//PGSQL END
node_ant = node;
}
else if (node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText == "Coleta Diária")
{
var data_fut = "a";
if (i + 1 < pag_ant.Count())
{
data_fut = pag_ant.ElementAt(i + 1).Element("{http://xmlns.energia.org.br/BO/v2}data").Value;
}
var data_atual = node.SelectSingleNode("bov2:data", nsmgr).InnerText;
var data_ant = "a";
if (i != 0)
{
data_ant = node_ant.SelectSingleNode("bov2:data", nsmgr).InnerText;
}
if (data_ant != data_atual && data_fut != data_atual)
{
aux_data = DateTime.ParseExact(node.SelectSingleNode("bov2:data", nsmgr).InnerText, "yyyy-MM-dd'T'HH:mm:ss'-03:00'", null);
data = (aux_data.ToOADate() - aux_data.ToOADate() % 1);
min = aux_data.Hour * 60 + aux_data.Minute;
if (min == 0)
{
min = 1440;
data = data - 1;
}
ponto = node.SelectSingleNode("bov2:medidor//bov2:codigo", nsmgr).InnerText;
origem = node.SelectSingleNode("bov2:coletaMedicao//bov2:tipo//bov2:nome", nsmgr).InnerText;
Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:consumo//bov2:valor", nsmgr).InnerText, out ativa_c);
Double.TryParse(node.SelectSingleNode("bov2:energiaAtiva//bov2:geracao//bov2:valor", nsmgr).InnerText, out ativa_g);
Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:consumo//bov2:valor", nsmgr).InnerText, out reat_c);
Double.TryParse(node.SelectSingleNode("bov2:energiaReativa//bov2:geracao//bov2:valor", nsmgr).InnerText, out reat_g);
access_strCOM = "INSERT INTO Med_5min (Origem, Data, Minuto, Ativa_consumo, Ativa_geracao, Reativa_consumo, Reativa_geracao, Ponto)";
access_strCOM += " VALUES (\"" + origem + "\"," + data + "," + min + "," + ativa_c + "," + ativa_g + "," + reat_c + "," + reat_g + ",\"" + ponto + "\")";
pg_writer.StartRow();
pg_writer.Write(origem);
pg_writer.Write(data, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(min, NpgsqlTypes.NpgsqlDbType.Integer);
pg_writer.Write(ativa_c, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(ativa_g, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(reat_c, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(reat_g, NpgsqlTypes.NpgsqlDbType.Numeric);
pg_writer.Write(ponto);
//PGSQL END
}
node_ant = node;
}
}
pg_writer.Complete();
}
}
return num_pag;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
log_erros += origem + ";" + ponto + ";Erro;" + ex.Message.Replace("\n", "-n-") + "\n";
string caminho_log_sec = @"\\srv-dados\documentos\Back\Carteira x.x\Codigo\Erros\log_sec_erros_" + DateTime.Now.Month + "_" + DateTime.Now.Day + "_" + DateTime.Now.Hour + "_" + DateTime.Now.Second + "_" + DateTime.Now.Millisecond + "_sec.csv";
File.WriteAllText(caminho_log_sec, log_erros);
return 1;
}
}
}