248 lines
11 KiB
C#
248 lines
11 KiB
C#
|
using MySql.Data.MySqlClient;
|
|||
|
using Support.Crypto;
|
|||
|
using Support.Models;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace Support.Controllers
|
|||
|
{
|
|||
|
public class DashboardController
|
|||
|
{
|
|||
|
private readonly Database _dbContext;
|
|||
|
|
|||
|
public DashboardController(Database database)
|
|||
|
{
|
|||
|
_dbContext = database;
|
|||
|
}
|
|||
|
|
|||
|
public DashboardViewModel GetModel(Appsettings appsettings)
|
|||
|
{
|
|||
|
DashboardViewModel result = null;
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
if (_dbContext != null)
|
|||
|
{
|
|||
|
result = new DashboardViewModel();
|
|||
|
|
|||
|
if (appsettings != null)
|
|||
|
{
|
|||
|
if (!string.IsNullOrEmpty(appsettings.PrivateDirectory) && Directory.Exists(appsettings.PrivateDirectory))
|
|||
|
{
|
|||
|
result.ResultsFiles = Directory.GetFiles(appsettings.PrivateDirectory, "*.hl7", SearchOption.TopDirectoryOnly).Length;
|
|||
|
|
|||
|
string ack = Path.Combine(appsettings.PrivateDirectory, "ack");
|
|||
|
string ack_done = Path.Combine(ack, "done");
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(ack) && Directory.Exists(ack))
|
|||
|
{
|
|||
|
result.PendingAcks = Directory.GetFiles(ack, "*.log", SearchOption.TopDirectoryOnly).Length;
|
|||
|
}
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(ack_done) && Directory.Exists(ack_done))
|
|||
|
{
|
|||
|
result.DoneAcks = Directory.GetFiles(ack_done, "*", SearchOption.TopDirectoryOnly).Length;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(appsettings.PublicDirectory) && Directory.Exists(appsettings.PublicDirectory))
|
|||
|
{
|
|||
|
result.EncryptedResultsFiles = Directory.GetFiles(appsettings.PublicDirectory, "*", SearchOption.TopDirectoryOnly).Length;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
using (MySqlConnection client = _dbContext.CreateConnection())
|
|||
|
{
|
|||
|
client.Open();
|
|||
|
|
|||
|
MySqlCommand cmd = client.CreateCommand();
|
|||
|
|
|||
|
cmd.CommandText = "select * from config c limit 1";
|
|||
|
|
|||
|
MySqlDataReader reader = cmd.ExecuteReader();
|
|||
|
|
|||
|
if (reader != null && reader.HasRows && reader.Read() && reader["maintenance"] != null)
|
|||
|
{
|
|||
|
string c = reader["maintenance"].ToString();
|
|||
|
int c_out = 0;
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out))
|
|||
|
{
|
|||
|
result.Maintenance = c_out;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!reader.IsClosed)
|
|||
|
{
|
|||
|
reader.Close();
|
|||
|
}
|
|||
|
|
|||
|
cmd.CommandText = "select count(d.udid) c from device d";
|
|||
|
|
|||
|
reader = cmd.ExecuteReader();
|
|||
|
|
|||
|
if (reader != null && reader.HasRows && reader.Read() && reader["c"] != null)
|
|||
|
{
|
|||
|
string c = reader["c"].ToString();
|
|||
|
int c_out = 0;
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out))
|
|||
|
{
|
|||
|
result.Devices = c_out;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!reader.IsClosed)
|
|||
|
{
|
|||
|
reader.Close();
|
|||
|
}
|
|||
|
|
|||
|
cmd.CommandText = "select count(d.udid) c from device d where d.created >= curdate()";
|
|||
|
|
|||
|
reader = cmd.ExecuteReader();
|
|||
|
|
|||
|
if (reader != null && reader.HasRows && reader.Read() && reader["c"] != null)
|
|||
|
{
|
|||
|
string c = reader["c"].ToString();
|
|||
|
int c_out = 0;
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out))
|
|||
|
{
|
|||
|
result.DevicesToday = c_out;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!reader.IsClosed)
|
|||
|
{
|
|||
|
reader.Close();
|
|||
|
}
|
|||
|
|
|||
|
cmd.CommandText = "select count(r.pgs) c, sum(if(r.available = 1, 1, 0)) a, sum(if(r.picked_up, 1, 0)) p, sum(if(r.notified, 1, 0)) n from results r";
|
|||
|
|
|||
|
reader = cmd.ExecuteReader();
|
|||
|
|
|||
|
if (reader != null && reader.HasRows && reader.Read() && reader["c"] != null)
|
|||
|
{
|
|||
|
string c = reader["c"].ToString();
|
|||
|
string a = reader["a"].ToString();
|
|||
|
string p = reader["p"].ToString();
|
|||
|
string n = reader["n"].ToString();
|
|||
|
|
|||
|
int c_out = 0;
|
|||
|
int a_out = 0;
|
|||
|
int p_out = 0;
|
|||
|
int n_out = 0;
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(c) && Int32.TryParse(c, out c_out))
|
|||
|
{
|
|||
|
result.Results = c_out;
|
|||
|
}
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(a) && Int32.TryParse(a, out a_out))
|
|||
|
{
|
|||
|
result.ResultsAvailable = a_out;
|
|||
|
}
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(p) && Int32.TryParse(p, out p_out))
|
|||
|
{
|
|||
|
result.ResultsPickedUp = p_out;
|
|||
|
}
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(n) && Int32.TryParse(n, out n_out))
|
|||
|
{
|
|||
|
result.ResultsNotified = n_out;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!reader.IsClosed)
|
|||
|
{
|
|||
|
reader.Close();
|
|||
|
}
|
|||
|
|
|||
|
cmd.CommandText = @"select
|
|||
|
r.pgs,
|
|||
|
r.pgs_hash,
|
|||
|
r.udid,
|
|||
|
r.notified,
|
|||
|
date_format(r.notified_ts, '%d.%m.%Y %H:%i:%s') notified_on,
|
|||
|
r.picked_up,
|
|||
|
date_format(r.picked_up_ts, '%d.%m.%Y %H:%i:%s') picked_up_on,
|
|||
|
r.available,
|
|||
|
date_format(r.available_ts, '%d.%m.%Y %H:%i:%s') available_on,
|
|||
|
date_format(r.created, '%d.%m.%Y %H:%i:%s') created_on,
|
|||
|
r.status
|
|||
|
from
|
|||
|
results r
|
|||
|
order by
|
|||
|
r.created desc
|
|||
|
limit 50";
|
|||
|
|
|||
|
reader = cmd.ExecuteReader();
|
|||
|
|
|||
|
if (reader != null && reader.HasRows)
|
|||
|
{
|
|||
|
result.LastResults = new List<Models.Results>();
|
|||
|
|
|||
|
while (reader.Read())
|
|||
|
{
|
|||
|
if (reader["pgs"] != null && reader["udid"] != null && reader["created_on"] != null)
|
|||
|
{
|
|||
|
Models.Results results = new Models.Results();
|
|||
|
results.PGS = reader["pgs"].ToString();
|
|||
|
results.UDID = reader["udid"].ToString();
|
|||
|
results.Notified = (reader["notified"] != null && reader["notified"] != DBNull.Value && Convert.ToInt32(reader["notified"].ToString()) == 1);
|
|||
|
results.NotifiedOn = (reader["notified_on"] != null && reader["notified_on"] != DBNull.Value ? reader["notified_on"].ToString() : null);
|
|||
|
results.PickedUp = (reader["picked_up"] != null && reader["picked_up"] != DBNull.Value && Convert.ToInt32(reader["picked_up"].ToString()) == 1);
|
|||
|
results.PickedUpOn = (reader["picked_up_on"] != null && reader["picked_up_on"] != DBNull.Value ? reader["picked_up_on"].ToString() : null);
|
|||
|
results.Available = (reader["available"] != null && reader["available"] != DBNull.Value && Convert.ToInt32(reader["available"].ToString()) == 1);
|
|||
|
results.AvailableOn = (reader["available_on"] != null && reader["available_on"] != DBNull.Value ? reader["available_on"].ToString() : null);
|
|||
|
results.Created = reader["created_on"].ToString();
|
|||
|
results.Status = (reader["status"] != null && reader["status"] != DBNull.Value ? reader["status"].ToString() : null);
|
|||
|
|
|||
|
if (reader["pgs_hash"] != null && reader["pgs_hash"] != DBNull.Value)
|
|||
|
{
|
|||
|
string pgs_hash = reader["pgs_hash"].ToString();
|
|||
|
string decrypted_values = AES.Decrypt(pgs_hash, AES.GetKey(results.UDID + AES.PGS_ENCRYPT_PARTIAL_KEY));
|
|||
|
|
|||
|
if (!string.IsNullOrEmpty(decrypted_values))
|
|||
|
{
|
|||
|
string[] values = decrypted_values.Split('|');
|
|||
|
|
|||
|
if (values.Length == 3)
|
|||
|
{
|
|||
|
results.ZIP = values[0];
|
|||
|
results.Birthday = values[1];
|
|||
|
results.OrderId = values[2];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
result.LastResults.Add(results);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!reader.IsClosed)
|
|||
|
{
|
|||
|
reader.Close();
|
|||
|
}
|
|||
|
|
|||
|
client.Close();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine(ex);
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|