Witam,
Mam problem. Pewnie błahy dla większości, ale jednak. Zostałem poproszony o refaktoryzację kodu. Część nieodpowiedzialna za działania na widoku ma być odseparowana od tej, która na widoku operuje. Tutaj przykładowa klasa. Np funkcje: GetEventScan(), GetHistory(), GetOperatDetail() czy GetNormativePage() nie operują na żadnej kontrolce, a jedynie na danych przekazanych do tej klasy w konstruktorze. Jakaś propozycja jak to podzielić?
using A0Scann.Model;
using A0Scann.SQL;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace A0Scann
{
public partial class FilePathChanged : Form
{
public string pathTranche;
private string scannerName;
private string filePath;
private string schema;
private static double szerA4 = 21, wysA4 = 29.7, cal = 2.54;
private int imageHeight;
private int imageWidth;
private int imageDpi;
private int imageSize;
private int idOrder;
private int idTranche;
private int userId;
private double iloscStronA4;
private OperatDetail OperatDetail;
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public FilePathChanged(string schema, OperatDetail operatDetail, string pathTranche, string scannerName, int userId, int OrderId, int trancheId)
{
this.schema = schema;
OperatDetail = operatDetail;
this.pathTranche = pathTranche;
this.scannerName = scannerName;
this.userId = userId;
idOrder = OrderId;
idTranche = trancheId;
InitializeComponent();
}
private void FilePathChanged_Load(object sender, EventArgs e)
{
filePath = ChangePath();
textBoxFilePath.Text = filePath;
Clipboard.SetText(filePath);
Directory.CreateDirectory(filePath.Replace($"mapa{OperatDetail.PageNumber.ToString("0000")}.tif", ""));
log.Info("Zamiana ścieżki na zgodną ze wzorcem");
}
public string ChangePath()
{
return pathTranche
.Replace("SKANER", scannerName)
.Replace("DATA", DateTime.Now.ToString("yyyyMMdd"))
.Replace("IEMZ", OperatDetail.Operat.Iemz)//P.1111.2222.4444
.Replace("img####", $"mapa{OperatDetail.PageNumber.ToString("0000")}.tif");
}
private void FilePathChanged_FormClosed(object sender, FormClosedEventArgs e)
{
(this.Owner as HeadWindow).buttonScannMap.Enabled = true;
(this.Owner as HeadWindow).dataGridView1.Enabled = true;
// (this.Owner as HeadWindow).dataGridView1.Rows.Clear();
// (this.Owner as HeadWindow).dataGridView1.Refresh();
(this.Owner as HeadWindow).GetListOperatDetailsAndInsertToDGV(); // pobierz na nowo liste map i wyswietl
log.Info("Zamknieto formularz skanowania map");
}
private void ButtonReturn_Click(object sender, EventArgs e)
{
(this.Owner as HeadWindow).buttonScannMap.Enabled = true;
(this.Owner as HeadWindow).dataGridView1.Enabled = true;
// (this.Owner as HeadWindow).dataGridView1.Rows.Clear(); // czyści tabele
// (this.Owner as HeadWindow).dataGridView1.Refresh(); // odświeża ją
log.Info("Zamknieto formularz skanowania map");
this.Close(); //
}
private void ButtonScannedMap_Click(object sender, EventArgs e)
{
OperatDetailsSql operatDetailsSql = new OperatDetailsSql();
if (File.Exists(filePath)) // jeżeli plik o podanej ściezce istnieje
{
DialogResult result = MessageBox.Show("Czy napewno chcesz oznaczyć zaznaczoną mapę jako zeskanowaną?", "Potwierdzenie", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes) // jezeli uzytkownik potwierdzil chęć zeskanowania
{
GetNormativePage();
OperatDetail operatDetail = GetOperatDetail();
History newHistory = GetHistory();
EventScan eventScan = GetEventScan();
try
{
operatDetailsSql.AddOperatDetailWithHistoryAndEventScan(schema, operatDetail, eventScan, newHistory, OperatDetail);
log.Info("Utworzono wpis dla tabel operat szczegoly, historia i zdarzenia skanowania");
// LocalSqliteUtils sqliteUtils = new LocalSqliteUtils();
// sqliteUtils.AddToModel(operatDetail.Id, idOrder, idTranche, DateTime.Now, DateTime.Today, "Nieprzeniesiony", operatDetail.FilePath);
(this.Owner as HeadWindow).textBox1.Text = "";
this.Close();
}
catch (Exception ex)
{
log.Error($"Błąd w dodaniu wpisów do tabel operat szczegoly, historia i zdarzenia skanowania lub modelu");
log.Error(ex.StackTrace);
}
}
else
{
MessageBox.Show("Anulowano", "Uwaga");
}
}
else
{
log.Info($"Plik o podanej {filePath} nie istnieje!");
MessageBox.Show("Plik o podanej ścieżce nie istnieje. \n Najprawdopodobniej nie został zeskanowany!", "Błąd");
}
}
private void GetNormativePage()
{
try
{
using (FileStream fileStram = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
using (Image imag = Image.FromStream(fileStram, false, false))
{
imageWidth = (int)imag.PhysicalDimension.Width; // pobranie szerokosci w pikselach
imageHeight = (int)imag.PhysicalDimension.Height; // pobranie wysokosci w pikselach
imageDpi = (int)imag.HorizontalResolution; // pobranie rozdzielczosci
imageSize = (int)new FileInfo(filePath).Length; // pobranie rozmiaru obrazu
double wysokoscInCm = (imageHeight / imageDpi) * cal; // wysokosc kartki w cm
double szerokoscInCm = (imageWidth / imageDpi) * cal; // szerokosc kartki w cm
double poleInCm = (wysokoscInCm * szerokoscInCm); // pole kartki w cm^2
double poleA4 = (szerA4 * wysA4); // pole wzorca A4
double countA4 = (poleInCm / poleA4); // Math.Ceiling(poleInCm / poleA4); - ceiling zawsze zaokrągla do jedności w góre!!!
iloscStronA4 = 0;
if (countA4 > 0 && countA4 < 1) // mniejsze od A4
{
iloscStronA4 = 1;
}
else
{
iloscStronA4 = Math.Round(countA4, MidpointRounding.AwayFromZero); // zaokragla do 0.4 w dol, a od 0.5 w gore
}
}
}
}
catch (Exception e)
{
log.Error($"Błąd w odczycie pliku {filePath}");
}
}
private OperatDetail GetOperatDetail()
{
OperatDetail operatDetail = new OperatDetail
{
FilePath = filePath,
OperatId = OperatDetail.OperatId,
PageNumber = OperatDetail.PageNumber,
ScanTime = DateTime.Now,
IsRemove = false,
IsDelete = "",
Type = "Mapa",
Width = imageWidth,
Height = imageHeight,
NormativeA4 = (int)iloscStronA4,
Date = DateTime.Now,
Resolution = imageDpi,
Size = imageSize
};
log.Info("Utworzono obiekt dla tabeli operat szczegoly");
return operatDetail;
}
private History GetHistory()
{
History newHistory = new History
{
CreateDate = DateTime.Now,
Description = "Utworzenie pliku",
Date = DateTime.Today.Date,
EventTypeId = 39,
IsRemove = false,
OperatId = OperatDetail.OperatId,
OperatorId = userId,
Time = DateTime.Now,
OperatStatusId = 1
};
log.Info("Utworzono obiekt dla tabeli historia");
return newHistory;
}
private EventScan GetEventScan()
{
EventScan eventScan = new EventScan
{
CorrectPagesCount = 1,
EmptyPagesCount = 0,
EndTime = DateTime.Now,
OperatId = OperatDetail.OperatId,
OperatorId = userId,
ScannerName = scannerName,
ScanType = "A0",
StartTime = DateTime.Now,
TotalPagesCount = 1
};
log.Info("Utworzono obiekt dla tabeli zdarzenia skanowania");
return eventScan;
}
}
}