diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DoctorPayments.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DoctorPayments.cs index 0661ccd..571f9f3 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DoctorPayments.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DoctorPayments.cs @@ -17,6 +17,7 @@ public class DoctorPayments public int Count_Patient { get; private set; } + public DateTime DoctorPaymentData { get; private set; } public int Payment { get; private set; } public static DoctorPayments CreateElement(int id, int idDoctor, string month, int count_patient, int payment) @@ -27,6 +28,7 @@ public class DoctorPayments IdDoctor = idDoctor, Month = month, Count_Patient = count_patient, + DoctorPaymentData = DateTime.Now, Payment = payment }; } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DrugMedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DrugMedicalHistory.cs index 1c79b3d..23dc566 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DrugMedicalHistory.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/DrugMedicalHistory.cs @@ -13,17 +13,17 @@ public class DrugMedicalHistory // Тоже самое что FeedFeedRepleshme public int DrugId { get; private set; } - //public int MedicalHistoryId { get; private set; } public string Description { get; private set; } = string.Empty; + + public static DrugMedicalHistory CreateEntity(int id, int drugId, string description) { return new DrugMedicalHistory { Id = id, DrugId = drugId, - //MedicalHistoryId = medicalHistoryId, Description = description ?? string.Empty }; } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs index a9bab71..5408a96 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs @@ -19,9 +19,9 @@ public class MedicalHistory // сущность пополнения, напо public DateTime VisitDate { get; private set; } - public IEnumerable DrugMedicalHistory { get; private set; } = []; + public IEnumerable DrugMedicalHistory { get; set; } = []; - public static MedicalHistory CreateEntity(int id, int patientId,int doctorId, + public static MedicalHistory CreateEntity(int id, int patientId, int doctorId, IEnumerable drugMedicalHistory) { return new MedicalHistory @@ -33,4 +33,16 @@ public class MedicalHistory // сущность пополнения, напо DrugMedicalHistory = drugMedicalHistory }; } + + public static MedicalHistory CreateOpeartion(TempDrugMedicalHistory tempDrugMedicalHistory, IEnumerable drugMedicalHistories) + { + return new MedicalHistory + { + Id = tempDrugMedicalHistory.Id, + PatientId = tempDrugMedicalHistory.PatientId, + DoctorId = tempDrugMedicalHistory.DoctorId, + VisitDate = tempDrugMedicalHistory.VisitDate, + DrugMedicalHistory = drugMedicalHistories + }; + } } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/TempDrugMedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/TempDrugMedicalHistory.cs new file mode 100644 index 0000000..60e896f --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/TempDrugMedicalHistory.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RegistrationPatientsPolyclinic.Entities; + +public class TempDrugMedicalHistory +{ + public int Id { get; private set; } + + public int PatientId { get; private set; } + + public int DoctorId { get; private set; } + + public DateTime VisitDate { get; private set; } + + public int DrugId { get; private set; } + + public string Description { get; private set; } = string.Empty; + + public int Count_Patient { get; private set; } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.Designer.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.Designer.cs index 3004d65..55e8dfa 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.Designer.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.Designer.cs @@ -37,6 +37,9 @@ DoctorPaymentToolStripMenuItem = new ToolStripMenuItem(); DiseaseRegistrationToolStripMenuItem = new ToolStripMenuItem(); ReportToolStripMenuItem = new ToolStripMenuItem(); + directoryReportToolStripMenuItem = new ToolStripMenuItem(); + drugReportToolStripMenuItem = new ToolStripMenuItem(); + DrugDistributionToolStripMenuItem = new ToolStripMenuItem(); menuStrip.SuspendLayout(); SuspendLayout(); // @@ -60,21 +63,21 @@ // DoctorsToolStripMenuItem // DoctorsToolStripMenuItem.Name = "DoctorsToolStripMenuItem"; - DoctorsToolStripMenuItem.Size = new Size(224, 26); + DoctorsToolStripMenuItem.Size = new Size(164, 26); DoctorsToolStripMenuItem.Text = "Врачи"; DoctorsToolStripMenuItem.Click += DoctorsToolStripMenuItem_Click; // // PacientToolStripMenuItem // PacientToolStripMenuItem.Name = "PacientToolStripMenuItem"; - PacientToolStripMenuItem.Size = new Size(224, 26); + PacientToolStripMenuItem.Size = new Size(164, 26); PacientToolStripMenuItem.Text = "Пациенты"; PacientToolStripMenuItem.Click += PacientToolStripMenuItem_Click; // // DrugToolStripMenuItem // DrugToolStripMenuItem.Name = "DrugToolStripMenuItem"; - DrugToolStripMenuItem.Size = new Size(224, 26); + DrugToolStripMenuItem.Size = new Size(164, 26); DrugToolStripMenuItem.Text = "Лекарство"; DrugToolStripMenuItem.Click += DrugToolStripMenuItem_Click; // @@ -88,23 +91,48 @@ // DoctorPaymentToolStripMenuItem // DoctorPaymentToolStripMenuItem.Name = "DoctorPaymentToolStripMenuItem"; - DoctorPaymentToolStripMenuItem.Size = new Size(224, 26); + DoctorPaymentToolStripMenuItem.Size = new Size(186, 26); DoctorPaymentToolStripMenuItem.Text = "Оплата врачу"; DoctorPaymentToolStripMenuItem.Click += DoctorPaymentToolStripMenuItem_Click; // // DiseaseRegistrationToolStripMenuItem // DiseaseRegistrationToolStripMenuItem.Name = "DiseaseRegistrationToolStripMenuItem"; - DiseaseRegistrationToolStripMenuItem.Size = new Size(224, 26); + DiseaseRegistrationToolStripMenuItem.Size = new Size(186, 26); DiseaseRegistrationToolStripMenuItem.Text = "Учет болезни"; DiseaseRegistrationToolStripMenuItem.Click += DiseaseRegistrationToolStripMenuItem_Click; // // ReportToolStripMenuItem // + ReportToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { directoryReportToolStripMenuItem, drugReportToolStripMenuItem, DrugDistributionToolStripMenuItem }); ReportToolStripMenuItem.Name = "ReportToolStripMenuItem"; ReportToolStripMenuItem.Size = new Size(73, 24); ReportToolStripMenuItem.Text = "Отчеты"; // + // directoryReportToolStripMenuItem + // + directoryReportToolStripMenuItem.Name = "directoryReportToolStripMenuItem"; + directoryReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.W; + directoryReportToolStripMenuItem.Size = new Size(350, 26); + directoryReportToolStripMenuItem.Text = "Документ со справочниками"; + directoryReportToolStripMenuItem.Click += DirectoryReportToolStripMenuItem_Click; + // + // drugReportToolStripMenuItem + // + drugReportToolStripMenuItem.Name = "drugReportToolStripMenuItem"; + drugReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.E; + drugReportToolStripMenuItem.Size = new Size(350, 26); + drugReportToolStripMenuItem.Text = "Отчет о лекарстве"; + drugReportToolStripMenuItem.Click += DrugReportToolStripMenuItem_Click; + // + // DrugDistributionToolStripMenuItem + // + DrugDistributionToolStripMenuItem.Name = "DrugDistributionToolStripMenuItem"; + DrugDistributionToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.P; + DrugDistributionToolStripMenuItem.Size = new Size(350, 26); + DrugDistributionToolStripMenuItem.Text = "Распределение лекарства"; + DrugDistributionToolStripMenuItem.Click += DrugDistributionToolStripMenuItem_Click; + // // FormPolyclinic // AutoScaleDimensions = new SizeF(8F, 20F); @@ -134,5 +162,8 @@ private ToolStripMenuItem DoctorPaymentToolStripMenuItem; private ToolStripMenuItem DiseaseRegistrationToolStripMenuItem; private ToolStripMenuItem DrugToolStripMenuItem; + private ToolStripMenuItem directoryReportToolStripMenuItem; + private ToolStripMenuItem drugReportToolStripMenuItem; + private ToolStripMenuItem DrugDistributionToolStripMenuItem; } } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.cs index 7bcd0ee..21f42ce 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/FormPolyclinic.cs @@ -74,5 +74,41 @@ namespace RegistrationPatientsPolyclinic MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void DirectoryReportToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void DrugReportToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void DrugDistributionToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.Designer.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.Designer.cs new file mode 100644 index 0000000..2a940b6 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.Designer.cs @@ -0,0 +1,99 @@ +namespace RegistrationPatientsPolyclinic.Forms +{ + partial class FormDirectoryReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + checkBoxPatients = new CheckBox(); + checkBoxDoctors = new CheckBox(); + checkBoxDrugs = new CheckBox(); + buttonBuild = new Button(); + SuspendLayout(); + // + // checkBoxPatients + // + checkBoxPatients.AutoSize = true; + checkBoxPatients.Location = new Point(22, 37); + checkBoxPatients.Name = "checkBoxPatients"; + checkBoxPatients.Size = new Size(102, 24); + checkBoxPatients.TabIndex = 0; + checkBoxPatients.Text = "Пациенты"; + checkBoxPatients.UseVisualStyleBackColor = true; + // + // checkBoxDoctors + // + checkBoxDoctors.AutoSize = true; + checkBoxDoctors.Location = new Point(22, 87); + checkBoxDoctors.Name = "checkBoxDoctors"; + checkBoxDoctors.Size = new Size(74, 24); + checkBoxDoctors.TabIndex = 1; + checkBoxDoctors.Text = "Врачи"; + checkBoxDoctors.UseVisualStyleBackColor = true; + // + // checkBoxDrugs + // + checkBoxDrugs.AutoSize = true; + checkBoxDrugs.Location = new Point(22, 134); + checkBoxDrugs.Name = "checkBoxDrugs"; + checkBoxDrugs.Size = new Size(103, 24); + checkBoxDrugs.TabIndex = 2; + checkBoxDrugs.Text = "Лекарство"; + checkBoxDrugs.UseVisualStyleBackColor = true; + // + // buttonBuild + // + buttonBuild.Location = new Point(180, 84); + buttonBuild.Name = "buttonBuild"; + buttonBuild.Size = new Size(137, 29); + buttonBuild.TabIndex = 3; + buttonBuild.Text = "Сформировать"; + buttonBuild.UseVisualStyleBackColor = true; + buttonBuild.Click += ButtonBuild_Click; + // + // FormDirectoryReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(426, 172); + Controls.Add(buttonBuild); + Controls.Add(checkBoxDrugs); + Controls.Add(checkBoxDoctors); + Controls.Add(checkBoxPatients); + Name = "FormDirectoryReport"; + Text = "FormDirectoryReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private CheckBox checkBoxPatients; + private CheckBox checkBoxDoctors; + private CheckBox checkBoxDrugs; + private Button buttonBuild; + } +} \ No newline at end of file diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.cs new file mode 100644 index 0000000..b222ce5 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.cs @@ -0,0 +1,61 @@ +using RegistrationPatientsPolyclinic.Reports; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace RegistrationPatientsPolyclinic.Forms +{ + public partial class FormDirectoryReport : Form + { + private readonly IUnityContainer _container; + public FormDirectoryReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + + private void ButtonBuild_Click(object sender, EventArgs e) + { + try + { + if (!checkBoxPatients.Checked && !checkBoxDoctors.Checked && !checkBoxDrugs.Checked) + { + throw new Exception("Не выбран ни один справочник для выгрузки"); + } + + var sfd = new SaveFileDialog() + { + Filter = "Docx Files | *.docx" + }; + + if (sfd.ShowDialog() != DialogResult.OK) + { + throw new Exception("Не выбран файла для отчета"); + } + + if (_container.Resolve().CreateDoc(sfd.FileName, checkBoxPatients.Checked, checkBoxDoctors.Checked, checkBoxDrugs.Checked)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", + "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании отчета", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.resx b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.Designer.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.Designer.cs new file mode 100644 index 0000000..62ad2ea --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.Designer.cs @@ -0,0 +1,107 @@ +namespace RegistrationPatientsPolyclinic.Forms +{ + partial class FormDrugPatientDistributionReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonSelectFileName = new Button(); + labelFileName = new Label(); + dateTimePicker = new DateTimePicker(); + labelDate = new Label(); + buttonCreate = new Button(); + SuspendLayout(); + // + // buttonSelectFileName + // + buttonSelectFileName.Location = new Point(12, 40); + buttonSelectFileName.Name = "buttonSelectFileName"; + buttonSelectFileName.Size = new Size(94, 29); + buttonSelectFileName.TabIndex = 0; + buttonSelectFileName.Text = "Выбрать"; + buttonSelectFileName.UseVisualStyleBackColor = true; + buttonSelectFileName.Click += buttonSelectFileName_Click; + // + // labelFileName + // + labelFileName.AutoSize = true; + labelFileName.Location = new Point(137, 44); + labelFileName.Name = "labelFileName"; + labelFileName.Size = new Size(45, 20); + labelFileName.TabIndex = 1; + labelFileName.Text = "Файл"; + // + // dateTimePicker + // + dateTimePicker.Location = new Point(83, 122); + dateTimePicker.Name = "dateTimePicker"; + dateTimePicker.Size = new Size(179, 27); + dateTimePicker.TabIndex = 2; + // + // labelDate + // + labelDate.AutoSize = true; + labelDate.Location = new Point(12, 122); + labelDate.Name = "labelDate"; + labelDate.Size = new Size(41, 20); + labelDate.TabIndex = 3; + labelDate.Text = "Дата"; + // + // buttonCreate + // + buttonCreate.Location = new Point(36, 220); + buttonCreate.Name = "buttonCreate"; + buttonCreate.Size = new Size(333, 29); + buttonCreate.TabIndex = 4; + buttonCreate.Text = "Сформировать"; + buttonCreate.UseVisualStyleBackColor = true; + buttonCreate.Click += buttonCreate_Click; + // + // FormDrugPatientDistributionReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(421, 286); + Controls.Add(buttonCreate); + Controls.Add(labelDate); + Controls.Add(dateTimePicker); + Controls.Add(labelFileName); + Controls.Add(buttonSelectFileName); + Name = "FormDrugPatientDistributionReport"; + Text = "FormDrugPatientDistributionReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonSelectFileName; + private Label labelFileName; + private DateTimePicker dateTimePicker; + private Label labelDate; + private Button buttonCreate; + } +} \ No newline at end of file diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.cs new file mode 100644 index 0000000..e8710f5 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.cs @@ -0,0 +1,63 @@ +using RegistrationPatientsPolyclinic.Reports; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace RegistrationPatientsPolyclinic.Forms +{ + public partial class FormDrugPatientDistributionReport : Form + { + private string _fileName = string.Empty; + private readonly IUnityContainer _container; + public FormDrugPatientDistributionReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + private void buttonSelectFileName_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Pdf Files | *.pdf" + }; + if (sfd.ShowDialog() == DialogResult.OK) + { + _fileName = sfd.FileName; + labelFileName.Text = Path.GetFileName(_fileName); + } + } + + private void buttonCreate_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(_fileName)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if (_container.Resolve().CreateChart(_fileName, dateTimePicker.Value)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа. Подробности в логах", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.resx b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.Designer.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.Designer.cs new file mode 100644 index 0000000..b135844 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.Designer.cs @@ -0,0 +1,163 @@ +namespace RegistrationPatientsPolyclinic.Forms +{ + partial class FormDrugReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dateTimePickerStart = new DateTimePicker(); + textBoxFilePath = new TextBox(); + buttonSelectFilePath = new Button(); + comboBoxDrug = new ComboBox(); + dateTimePickerEnd = new DateTimePicker(); + labelFilePath = new Label(); + labelDrug = new Label(); + labelDateStart = new Label(); + labelDateENd = new Label(); + buttonMakeReport = new Button(); + SuspendLayout(); + // + // dateTimePickerStart + // + dateTimePickerStart.Location = new Point(140, 233); + dateTimePickerStart.Name = "dateTimePickerStart"; + dateTimePickerStart.Size = new Size(250, 27); + dateTimePickerStart.TabIndex = 0; + // + // textBoxFilePath + // + textBoxFilePath.Location = new Point(140, 66); + textBoxFilePath.Name = "textBoxFilePath"; + textBoxFilePath.ReadOnly = true; + textBoxFilePath.Size = new Size(125, 27); + textBoxFilePath.TabIndex = 1; + // + // buttonSelectFilePath + // + buttonSelectFilePath.Location = new Point(288, 66); + buttonSelectFilePath.Name = "buttonSelectFilePath"; + buttonSelectFilePath.Size = new Size(36, 29); + buttonSelectFilePath.TabIndex = 2; + buttonSelectFilePath.Text = "..."; + buttonSelectFilePath.UseVisualStyleBackColor = true; + buttonSelectFilePath.Click += buttonSelectFilePath_Click; + // + // comboBoxDrug + // + comboBoxDrug.FormattingEnabled = true; + comboBoxDrug.Location = new Point(140, 143); + comboBoxDrug.Name = "comboBoxDrug"; + comboBoxDrug.Size = new Size(125, 28); + comboBoxDrug.TabIndex = 3; + // + // dateTimePickerEnd + // + dateTimePickerEnd.Location = new Point(140, 303); + dateTimePickerEnd.Name = "dateTimePickerEnd"; + dateTimePickerEnd.Size = new Size(250, 27); + dateTimePickerEnd.TabIndex = 4; + // + // labelFilePath + // + labelFilePath.AutoSize = true; + labelFilePath.Location = new Point(12, 66); + labelFilePath.Name = "labelFilePath"; + labelFilePath.Size = new Size(109, 20); + labelFilePath.TabIndex = 5; + labelFilePath.Text = "Путь до файла"; + // + // labelDrug + // + labelDrug.AutoSize = true; + labelDrug.Location = new Point(12, 143); + labelDrug.Name = "labelDrug"; + labelDrug.Size = new Size(81, 20); + labelDrug.TabIndex = 6; + labelDrug.Text = "Лекарство"; + // + // labelDateStart + // + labelDateStart.AutoSize = true; + labelDateStart.Location = new Point(5, 233); + labelDateStart.Name = "labelDateStart"; + labelDateStart.Size = new Size(94, 20); + labelDateStart.TabIndex = 7; + labelDateStart.Text = "Дата начала"; + // + // labelDateENd + // + labelDateENd.AutoSize = true; + labelDateENd.Location = new Point(12, 303); + labelDateENd.Name = "labelDateENd"; + labelDateENd.Size = new Size(87, 20); + labelDateENd.TabIndex = 8; + labelDateENd.Text = "Дата конца"; + // + // buttonMakeReport + // + buttonMakeReport.Location = new Point(126, 358); + buttonMakeReport.Name = "buttonMakeReport"; + buttonMakeReport.Size = new Size(148, 29); + buttonMakeReport.TabIndex = 9; + buttonMakeReport.Text = "Cформировать"; + buttonMakeReport.UseVisualStyleBackColor = true; + buttonMakeReport.Click += buttonMakeReport_Click; + // + // FormDrugReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(425, 401); + Controls.Add(buttonMakeReport); + Controls.Add(labelDateENd); + Controls.Add(labelDateStart); + Controls.Add(labelDrug); + Controls.Add(labelFilePath); + Controls.Add(dateTimePickerEnd); + Controls.Add(comboBoxDrug); + Controls.Add(buttonSelectFilePath); + Controls.Add(textBoxFilePath); + Controls.Add(dateTimePickerStart); + Name = "FormDrugReport"; + Text = "FormDrugReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private DateTimePicker dateTimePickerStart; + private TextBox textBoxFilePath; + private Button buttonSelectFilePath; + private ComboBox comboBoxDrug; + private DateTimePicker dateTimePickerEnd; + private Label labelFilePath; + private Label labelDrug; + private Label labelDateStart; + private Label labelDateENd; + private Button buttonMakeReport; + } +} \ No newline at end of file diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.cs new file mode 100644 index 0000000..b30e10e --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.cs @@ -0,0 +1,79 @@ +using RegistrationPatientsPolyclinic.Reports; +using RegistrationPatientsPolyclinic.Repositories; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Unity; + +namespace RegistrationPatientsPolyclinic.Forms +{ + public partial class FormDrugReport : Form + { + private readonly IUnityContainer _container; + + public FormDrugReport(IUnityContainer container, IDrugRepository drugRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + + comboBoxDrug.DataSource = drugRepository.ReadDrug(); + comboBoxDrug.DisplayMember = "Name"; + comboBoxDrug.ValueMember = "Id"; + + } + + private void buttonSelectFilePath_Click(object sender, EventArgs e) + { + var sfd = new SaveFileDialog() + { + Filter = "Excel Files | *.xlsx" + }; + if (sfd.ShowDialog() != DialogResult.OK) + { + return; + } + textBoxFilePath.Text = sfd.FileName; + } + + private void buttonMakeReport_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFilePath.Text)) + { + throw new Exception("Отсутствует имя файла для отчета"); + } + if (comboBoxDrug.SelectedIndex < 0) + { + throw new Exception("Не выбран корм"); + } + if (dateTimePickerEnd.Value <= dateTimePickerStart.Value) + { + throw new Exception("Дата начала должна быть раньше даты окончания"); + } + if (_container.Resolve().CreateTable(textBoxFilePath.Text, (int)comboBoxDrug.SelectedValue!, + dateTimePickerStart.Value, dateTimePickerEnd.Value)) + { + MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа. Подробности в логах", "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании очета", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.resx b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs index 2b617c9..7404038 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs @@ -93,7 +93,8 @@ _medicalHistoryRepository.ReadMedicalHistory(); } list.Add(DrugMedicalHistory.CreateEntity(0, Convert.ToInt32(row.Cells["ColumnDrug"].Value), row.Cells["ColumnDescription"].Value?.ToString())); } - return list; + return list.GroupBy(x => x.DrugId, x => x.Description, (id, description) => + DrugMedicalHistory.CreateEntity(0, id, string.Join(", ", description))).ToList(); } } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic.csproj b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic.csproj index 2efeb50..39c5d81 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic.csproj +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic.csproj @@ -11,11 +11,13 @@ + + diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs new file mode 100644 index 0000000..2584078 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs @@ -0,0 +1,52 @@ +using Microsoft.Extensions.Logging; +using RegistrationPatientsPolyclinic.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RegistrationPatientsPolyclinic.Reports; + +internal class ChartReport +{ + private readonly IDoctorPaymentsRepository _doctorPaymentsRepository; + private readonly IMedicalHistoryRepository _medicalHistoryRepository; + private readonly ILogger _logger; + + public ChartReport(IMedicalHistoryRepository medicalHistoryRepository, ILogger logger) + { + _medicalHistoryRepository = medicalHistoryRepository ?? + throw new ArgumentNullException(nameof(medicalHistoryRepository)); + _logger = logger ?? + throw new ArgumentNullException(nameof(logger)); + } + + public bool CreateChart(string filePath, DateTime dateTime) + { + try + { + new PdfBuilder(filePath) + .AddHeader("Пополенение лекарства") + .AddPieChart("Виды лекарства", GetData(dateTime)) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + private List<(string Caption, double Value)> GetData(DateTime dateTime) + { + // Получаем все медицинские истории за указанную дату + var medicalHistories = _medicalHistoryRepository.ReadMedicalHistory(dateTime, dateTime); + + // Группируем по идентификатору пациента и считаем количество посещений + return medicalHistories + .GroupBy(mh => mh.PatientId) + .Select(g => (Caption: $"Patient {g.Key}", Value: (double)g.Count())) + .ToList(); + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/DocReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/DocReport.cs new file mode 100644 index 0000000..0c3368f --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/DocReport.cs @@ -0,0 +1,90 @@ +using Microsoft.Extensions.Logging; +using RegistrationPatientsPolyclinic.Repositories; +using RegistrationPatientsPolyclinic.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RegistrationPatientsPolyclinic.Reports; + +internal class DocReport +{ + private readonly IPatientRepository _patientRepository; + + private readonly IDoctorRepository _doctorRepository; + + private readonly IDrugRepository _drugRepository; + + private readonly ILogger _logger; + + public DocReport(IPatientRepository patientRepository, IDoctorRepository doctorRepository, IDrugRepository drugRepository, ILogger logger) + { + _patientRepository = patientRepository ?? + throw new ArgumentNullException(nameof(patientRepository)); + _doctorRepository = doctorRepository ?? + throw new ArgumentNullException(nameof(doctorRepository)); ; + _drugRepository = drugRepository ?? + throw new ArgumentNullException(nameof(drugRepository)); + _logger = logger ?? + throw new ArgumentNullException(nameof(patientRepository)); + } + + public bool CreateDoc(string filePath, bool includePatients, bool includeDoctors, bool includeDrugs) + { + try + { + var builder = new WordBuilder(filePath).AddHeader("Документ со справочниками"); + if (includePatients) + { + builder.AddParagraph("Пациенты").AddTable([2400, 2400, 2400], GetPatients()); + } + if (includeDoctors) + { + builder.AddParagraph("Врачи").AddTable([2400, 2400, 2400], GetDoctors()); + } + if (includeDrugs) + { + builder.AddParagraph("Лекарство").AddTable([2400, 1200, 2400], GetDrugs()); + } + builder.Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + + private List GetPatients() + { + return [ + ["Имя", "Фамилия", "Контактный номер"], + .. _patientRepository + .ReadPatient() + .Select(x => new string[] { x.First_Name, x.Last_Name, x.ContactNumber }), + ]; + } + + private List GetDoctors() + { + return [ + ["Имя", "Фамилия", "Должность"], + .. _doctorRepository + .ReadDoctors() + .Select(x => new string[] { x.First_Name, x.Last_Name, x.DoctorPost.ToString() }), + ]; + } + + private List GetDrugs() + { + return [ + ["Название", "Грамм", "Описание"], + .. _drugRepository + .ReadDrug() + .Select(x => new string[] { x.DrugName.ToString(), x.Grams.ToString(), x.Description }), + ]; + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ExcelBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ExcelBuilder.cs new file mode 100644 index 0000000..7726867 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ExcelBuilder.cs @@ -0,0 +1,316 @@ +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RegistrationPatientsPolyclinic.Reports; + +internal class ExcelBuilder +{ + private readonly string _filePath; + private readonly SheetData _sheetData; + private readonly MergeCells _mergeCells; + private readonly Columns _columns; + private uint _rowIndex = 0; + public ExcelBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _sheetData = new SheetData(); + _mergeCells = new MergeCells(); + _columns = new Columns(); + _rowIndex = 1; + } + + public ExcelBuilder AddHeader(string header, int startIndex, int count) + { + CreateCell(startIndex, _rowIndex, header, StyleIndex.BoldTextWithoutBorder); + for (int i = startIndex + 1; i < startIndex + count; ++i) + { + CreateCell(i, _rowIndex, "", StyleIndex.SimpleTextWithoutBorder); + } + _mergeCells.Append(new MergeCell() + { + Reference = new StringValue($"{GetExcelColumnName(startIndex)}{_rowIndex}:{GetExcelColumnName(startIndex + count - 1)}{_rowIndex}") + }); + _rowIndex++; + return this; + } + + public ExcelBuilder AddParagraph(string text, int columnIndex) + { + CreateCell(columnIndex, _rowIndex++, text, StyleIndex.SimpleTextWithoutBorder); + return this; + } + + public ExcelBuilder AddTable(int[] columnsWidths, List data) + { + if (columnsWidths == null || columnsWidths.Length == 0) + { + throw new ArgumentNullException(nameof(columnsWidths)); + } + if (data == null || data.Count == 0) + { + throw new ArgumentNullException(nameof(data)); + } + if (data.Any(x => x.Length != columnsWidths.Length)) + { + throw new InvalidOperationException("widths.Length != data.Length"); + } + + uint counter = 1; + int coef = 2; + _columns.Append(columnsWidths.Select(x => new Column + { + Min = counter, + Max = counter++, + Width = x * coef, + CustomWidth = true + })); + for (var j = 0; j < data.First().Length; ++j) + { + CreateCell(j, _rowIndex, data.First()[j], StyleIndex.BoldTextWithBorder); + } + _rowIndex++; + + for (var i = 1; i < data.Count - 1; ++i) + { + for (var j = 0; j < data[i].Length; ++j) + { + CreateCell(j, _rowIndex, data[i][j], StyleIndex.SimpleTextWithBorder); + } + _rowIndex++; + } + for (var j = 0; j < data.Last().Length; ++j) + { + CreateCell(j, _rowIndex, data.Last()[j], StyleIndex.BoldTextWithBorder); + } + _rowIndex++; + return this; + } + + public void Build() + { + using var spreadsheetDocument = SpreadsheetDocument.Create(_filePath, SpreadsheetDocumentType.Workbook); + var workbookpart = spreadsheetDocument.AddWorkbookPart(); + GenerateStyle(workbookpart); + workbookpart.Workbook = new Workbook(); + var worksheetPart = workbookpart.AddNewPart(); + worksheetPart.Worksheet = new Worksheet(); + + if (_columns.HasChildren) + { + worksheetPart.Worksheet.Append(_columns); + } + + worksheetPart.Worksheet.Append(_sheetData); + var sheets = spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets()); + var sheet = new Sheet() + { + Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), + SheetId = 1, + Name = "Лист 1" + }; + sheets.Append(sheet); + if (_mergeCells.HasChildren) + { + worksheetPart.Worksheet.InsertAfter(_mergeCells, + worksheetPart.Worksheet.Elements().First()); + } + } + + private static void GenerateStyle(WorkbookPart workbookPart) + { + var workbookStylesPart = workbookPart.AddNewPart(); + workbookStylesPart.Stylesheet = new Stylesheet(); + + var fonts = new Fonts() + { + Count = 2, + KnownFonts = BooleanValue.FromBoolean(true) + }; + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize() { Val = 11 }, + FontName = new FontName() { Val = "Calibri" }, + FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 }, + FontScheme = new FontScheme() + { + Val = new EnumValue(FontSchemeValues.Minor) + } + }); + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize() { Val = 11 }, + FontName = new FontName() { Val = "Calibri" }, + FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 }, + FontScheme = new FontScheme() + { + Val = new EnumValue(FontSchemeValues.Minor) + }, + Bold = new Bold() { Val = true } + }); + workbookStylesPart.Stylesheet.Append(fonts); + + // Default Fill + var fills = new Fills() { Count = 1 }; + fills.Append(new Fill + { + PatternFill = new PatternFill() + { + PatternType = new EnumValue(PatternValues.None) + } + }); + workbookStylesPart.Stylesheet.Append(fills); + + // Default Border + var borders = new Borders() { Count = 2 }; + borders.Append(new Border + { + LeftBorder = new LeftBorder(), + RightBorder = new RightBorder(), + TopBorder = new TopBorder(), + BottomBorder = new BottomBorder(), + DiagonalBorder = new DiagonalBorder() + }); + borders.Append(new Border + { + LeftBorder = new LeftBorder() { Style = BorderStyleValues.Thin }, + RightBorder = new RightBorder() { Style = BorderStyleValues.Thin }, + TopBorder = new TopBorder() { Style = BorderStyleValues.Thin }, + BottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin }, + DiagonalBorder = new DiagonalBorder() + }); + workbookStylesPart.Stylesheet.Append(borders); + + // Default cell format and a date cell format + var cellFormats = new CellFormats() { Count = 4 }; + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 0, + BorderId = 0, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Left, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 0, + BorderId = 1, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Right, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 1, + BorderId = 0, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Center, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = 0, + FormatId = 0, + FontId = 1, + BorderId = 1, + FillId = 0, + Alignment = new Alignment() + { + Horizontal = HorizontalAlignmentValues.Center, + Vertical = VerticalAlignmentValues.Center, + WrapText = true + } + }); + workbookStylesPart.Stylesheet.Append(cellFormats); + } + + private enum StyleIndex + { + SimpleTextWithoutBorder = 0, + SimpleTextWithBorder = 1, + BoldTextWithoutBorder = 2, + BoldTextWithBorder = 3, + } + + private void CreateCell(int columnIndex, uint rowIndex, string text, StyleIndex styleIndex) + { + var columnName = GetExcelColumnName(columnIndex); + var cellReference = columnName + rowIndex; + var row = _sheetData.Elements().FirstOrDefault(r => r.RowIndex! == rowIndex); + if (row == null) + { + row = new Row() { RowIndex = rowIndex }; + _sheetData.Append(row); + } + var newCell = row.Elements().FirstOrDefault(c => c.CellReference != null && + c.CellReference.Value == columnName + rowIndex); + if (newCell == null) + { + Cell? refCell = null; + foreach (Cell cell in row.Elements()) + { + if (cell.CellReference?.Value != null && + cell.CellReference.Value.Length == cellReference.Length) + { + if (string.Compare(cell.CellReference.Value, cellReference, true) > 0) + { + refCell = cell; + break; + } + } + } + newCell = new Cell() { CellReference = cellReference }; + row.InsertBefore(newCell, refCell); + } + newCell.CellValue = new CellValue(text); + newCell.DataType = CellValues.String; + newCell.StyleIndex = (uint)styleIndex; + } + + private static string GetExcelColumnName(int columnNumber) + { + columnNumber += 1; + int dividend = columnNumber; + string columnName = string.Empty; + int modulo; + while (dividend > 0) + { + modulo = (dividend - 1) % 26; + columnName = Convert.ToChar(65 + modulo).ToString() + columnName; + dividend = (dividend - modulo) / 26; + } + return columnName; + } + +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs new file mode 100644 index 0000000..e626ae0 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs @@ -0,0 +1,80 @@ +using MigraDoc.DocumentObjectModel; +using MigraDoc.DocumentObjectModel.Shapes.Charts; +using MigraDoc.Rendering; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RegistrationPatientsPolyclinic.Reports; + +internal class PdfBuilder +{ + private readonly string _filePath; + private readonly Document _document; + + public PdfBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _document = new Document(); + DefineStyles(); + } + + public PdfBuilder AddHeader(string header) + { + _document.AddSection().AddParagraph(header, "NormalBold"); + return this; + } + + public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data) + { + if (data == null || data.Count == 0) + { + return this; + } + var chart = new Chart(ChartType.Pie2D); + var series = chart.SeriesCollection.AddSeries(); + series.Add(data.Select(x => x.Value).ToArray()); + var xseries = chart.XValues.AddXSeries(); + xseries.Add(data.Select(x => x.Caption).ToArray()); + chart.DataLabel.Type = DataLabelType.Percent; + chart.DataLabel.Position = DataLabelPosition.OutsideEnd; + chart.Width = Unit.FromCentimeter(16); + chart.Height = Unit.FromCentimeter(12); + chart.TopArea.AddParagraph(title); + chart.XAxis.MajorTickMark = TickMarkType.Outside; + chart.YAxis.MajorTickMark = TickMarkType.Outside; + chart.YAxis.HasMajorGridlines = true; + chart.PlotArea.LineFormat.Width = 1; + chart.PlotArea.LineFormat.Visible = true; + chart.TopArea.AddLegend(); + _document.LastSection.Add(chart); + return this; + } + + public void Build() + { + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); + var renderer = new PdfDocumentRenderer(true) + { + Document = _document + }; + renderer.RenderDocument(); + renderer.PdfDocument.Save(_filePath); + } + private void DefineStyles() + { + var headerStyle = _document.Styles.AddStyle("NormalBold", "Normal"); + headerStyle.Font.Bold = true; + headerStyle.Font.Size = 14; + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs new file mode 100644 index 0000000..779aea8 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs @@ -0,0 +1,102 @@ +using DocumentFormat.OpenXml.Drawing.Diagrams; +using DocumentFormat.OpenXml.Wordprocessing; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using RegistrationPatientsPolyclinic.Entities; +using RegistrationPatientsPolyclinic.Repositories; +using RegistrationPatientsPolyclinic.Repositories.Implementations; +using System; +using System.Collections.Generic; +using System.Diagnostics.Metrics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace RegistrationPatientsPolyclinic.Reports; + +internal class TableReport +{ + private readonly IMedicalHistoryRepository _medicalHistoryRepository; + + private readonly IDoctorPaymentsRepository _doctorPaymentsRepository; + + private readonly ILogger _logger; + + internal static readonly string[] item = ["Дата", "Описание", "Количество лекарства"]; + + public TableReport(IMedicalHistoryRepository medicalHistoryRepository, IDoctorPaymentsRepository doctorPaymentsRepository, ILogger logger) + { + _medicalHistoryRepository = medicalHistoryRepository ?? + throw new ArgumentNullException(nameof(medicalHistoryRepository)); ; + _doctorPaymentsRepository = doctorPaymentsRepository ?? + throw new ArgumentNullException(nameof(doctorPaymentsRepository)); + _logger = logger ?? + throw new ArgumentNullException(nameof(logger)); + } + + public bool CreateTable(string filePath, int drugId, DateTime startDate, DateTime endDate) + { + try + { + var data = GetData(drugId, startDate, endDate); + var columnsWidths = new int[] {10, 15, 15 }; + + if (columnsWidths.Length != data.First().Length) + { + throw new InvalidOperationException("Количество ширин столбцов не соответствует количеству данных."); + } + + new ExcelBuilder(filePath) + .AddHeader("Сводка по движению лекарство", 0, 3) + .AddParagraph("за период", 0) + .AddTable(columnsWidths, data) + .Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + + /// ВНИЗУ БЫЛ ПРАВИЛЬНЫЙ + + + private List GetData(int drugId, DateTime startDate, DateTime endDate) + { + var data = _medicalHistoryRepository + .ReadMedicalHistory() + .Where(x => x.VisitDate >= startDate && x.VisitDate <= endDate && x.DrugMedicalHistory.Any(y => y.DrugId == drugId) ) + .Select(x => new + { + Date = x.VisitDate, + CountIn = x.DrugMedicalHistory.FirstOrDefault(y => y.DrugId == drugId)?.Description, + CountOut = (int?)null + }) + .Union( + _doctorPaymentsRepository + .ReadDoctorPayments() + .Where(x => x.DoctorPaymentData >= startDate && x.DoctorPaymentData <= endDate) + .Select(x => new {Date = x.DoctorPaymentData, CountIn = (string?)null, CountOut = (int?)x.Count_Patient })) + .OrderBy(x => x.Date); + + + return new List() { item } + .Union( + data + .Select(x => new string[] {x.Date.ToString(), x.CountIn ?? string.Empty, x.CountOut?.ToString() ?? string.Empty })) + .Union( + new List() { new string[] { "Всего", data.Sum(x => x.CountOut ?? 0).ToString(), string.Empty } }) + .ToList(); + } + + + + + + + + + +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs new file mode 100644 index 0000000..ca72689 --- /dev/null +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs @@ -0,0 +1,119 @@ +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Wordprocessing; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using DocumentFormat.OpenXml.Packaging; + +namespace RegistrationPatientsPolyclinic.Reports; + +/// +/// Построитель Ворда +/// +internal class WordBuilder +{ + // Создание заголовка, вставить некий параграф с текстом + // Потребуется сделать табличку + private readonly string _filePath; + private readonly Document _document; + private readonly Body _body; + + public WordBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _document = new Document(); + _body = _document.AppendChild(new Body()); + } + + public WordBuilder AddHeader(string header) + { + // код ставки заголовка + var paragraph = _body.AppendChild(new Paragraph()); + var run = paragraph.AppendChild(new Run()); + var runProperties = run.AppendChild(new RunProperties()); + runProperties.AppendChild(new Bold()); + run.AppendChild(new Text(header)); + return this; + + } + + public WordBuilder AddParagraph(string text) + { + // код ставки заголовка + + var paragraph = _body.AppendChild(new Paragraph()); + var run = paragraph.AppendChild(new Run()); + run.AppendChild(new Text(text)); + return this; + } + + public WordBuilder AddTable(int[] widths, List data) + { + if (widths == null || widths.Length == 0) + { + throw new ArgumentNullException(nameof(widths)); + } + if (data == null || data.Count == 0) + { + throw new ArgumentNullException(nameof(data)); + } + if (data.Any(x => x.Length != widths.Length)) + { + throw new InvalidOperationException("widths.Length != data.Length"); + } + + var table = new Table(); + table.AppendChild(new TableProperties( + new TableBorders( + new TopBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, + new BottomBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, + new LeftBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, + new RightBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, + new InsideHorizontalBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, + new InsideVerticalBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 } + ) + )); + + // Заголовок + var tr = new TableRow(); + for (var j = 0; j < widths.Length; ++j) + { + tr.Append(new TableCell( + new TableCellProperties(new TableCellWidth() + { + Width = + widths[j].ToString() + }), + new Paragraph(new Run(new RunProperties(new Bold()), new + Text(data.First()[j]))))); + } + table.Append(tr); + + // Данные + table.Append(data.Skip(1).Select(x => + new TableRow(x.Select(y => new TableCell(new Paragraph(new + Run(new Text(y)))))))); + _body.Append(table); + return this; + } + + + public void Build() + { + // элемент какой будет все создавать + using var wordDocument = WordprocessingDocument.Create(_filePath, WordprocessingDocumentType.Document); + var mainPart = wordDocument.AddMainDocumentPart(); + mainPart.Document = _document; + } +} diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs index d7caca5..7979ac9 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs @@ -9,10 +9,16 @@ namespace RegistrationPatientsPolyclinic.Repositories; public interface IMedicalHistoryRepository { + IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, int? DoctorId = null); // по этим параметрам можно не весь список читать, а только какую то часть + + /* + IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, + int? DoctorId = null); // по этим параметрам можно не весь список читать, а только какую то часть + */ void CreateMedicalHistory(MedicalHistory medicalHistory); // объекь будет заносится в список diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/DoctorPaymentsRepository.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/DoctorPaymentsRepository.cs index 7bcfd5c..b1c5d0d 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/DoctorPaymentsRepository.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/DoctorPaymentsRepository.cs @@ -47,6 +47,7 @@ VALUES (@IdDoctor, @Month, @Count_Patient, @Payment)"; } + public IEnumerable ReadDoctorPayments() { _logger.LogInformation("Получение всех объектов"); @@ -69,6 +70,6 @@ VALUES (@IdDoctor, @Month, @Count_Patient, @Payment)"; } - - } + + diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs index fa4e999..b2f8a1c 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs @@ -24,6 +24,7 @@ public class MedicalHistoryRepository : IMedicalHistoryRepository _logger = logger; } + public void CreateMedicalHistory(MedicalHistory medicalHistory) { _logger.LogInformation("Добавление объекта"); @@ -62,7 +63,7 @@ VALUES (@DrugId,@MedicalHistoryId, @Description)"; } } - + public void DeletemedicalHistory(int id) { @@ -84,6 +85,34 @@ WHERE Id=@id"; } } + + public IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, int? DoctorId = null) + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + //var querySelect = @"SELECT * FROM MedicalHistory"; + var querySelect = @"SELECT mh.*, dmh.DrugId, dmh.Description + FROM MedicalHistory mh + INNER JOIN DrugMedicalHistory dmh ON dmh.MedicalHistoryId = mh.Id"; + var medicalHistory = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(medicalHistory)); + return medicalHistory.GroupBy(x => x.Id, y => y, + (key, value) => MedicalHistory.CreateOpeartion(value.First(), + value.Select(z => DrugMedicalHistory.CreateEntity(0, z.DrugId, z.Description)))).ToList(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } + + /* public IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, int? DoctorId = null) { _logger.LogInformation("Получение всех объектов"); @@ -105,5 +134,32 @@ WHERE Id=@id"; } } - + */ + /* + public IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, int? DoctorId = null) + { + _logger.LogInformation("Получение всех объектов"); + try + { + using var connection = new + NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = @"SELECT mh.*, dmh.DrugId, dmh.Description + FROM MedicalHistory mh + INNER JOIN DrugMedicalHistory dmh ON dmh.MedicalHistoryId = mh.Id"; + var medicalHistory = + connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(medicalHistory)); + return medicalHistory; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + }*/ } + + + +