From 5b3b9cca9b595a7ced82c53275b5c544ce80f4e6 Mon Sep 17 00:00:00 2001 From: Bulat Date: Sun, 8 Dec 2024 15:04:06 +0400 Subject: [PATCH 1/4] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/DoctorPayments.cs | 2 + .../Entities/DrugMedicalHistory.cs | 4 +- .../Entities/MedicalHistory.cs | 16 +- .../Entities/TempDrugMedicalHistory.cs | 24 ++ .../FormPolyclinic.Designer.cs | 41 ++- .../FormPolyclinic.cs | 36 ++ .../Forms/FormDirectoryReport.Designer.cs | 99 ++++++ .../Forms/FormDirectoryReport.cs | 61 ++++ .../Forms/FormDirectoryReport.resx | 120 +++++++ ...mDrugPatientDistributionReport.Designer.cs | 107 ++++++ .../FormDrugPatientDistributionReport.cs | 63 ++++ .../FormDrugPatientDistributionReport.resx | 120 +++++++ .../Forms/FormDrugReport.Designer.cs | 163 +++++++++ .../Forms/FormDrugReport.cs | 79 +++++ .../Forms/FormDrugReport.resx | 120 +++++++ .../Forms/FormMedicalHistory.cs | 3 +- .../RegistrationPatientsPolyclinic.csproj | 2 + .../Reports/ChartReport.cs | 52 +++ .../Reports/DocReport.cs | 90 +++++ .../Reports/ExcelBuilder.cs | 316 ++++++++++++++++++ .../Reports/PdfBuilder.cs | 80 +++++ .../Reports/TableReport.cs | 102 ++++++ .../Reports/WordBuilder.cs | 119 +++++++ .../Repositories/IMedicalHistoryRepository.cs | 6 + .../DoctorPaymentsRepository.cs | 5 +- .../MedicalHistoryRepository.cs | 60 +++- 26 files changed, 1876 insertions(+), 14 deletions(-) create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/TempDrugMedicalHistory.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.Designer.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDirectoryReport.resx create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.Designer.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugPatientDistributionReport.resx create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.Designer.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormDrugReport.resx create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/DocReport.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ExcelBuilder.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs create mode 100644 RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs 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; + } + }*/ } + + + + -- 2.25.1 From 3b0aeddf2f47ffc1901e06ad493e7d53727b3f41 Mon Sep 17 00:00:00 2001 From: Bulat Date: Thu, 19 Dec 2024 16:31:11 +0400 Subject: [PATCH 2/4] good --- .../RegistrationPatientsPolyclinic/Reports/TableReport.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs index 779aea8..8abee14 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs @@ -22,7 +22,7 @@ internal class TableReport private readonly ILogger _logger; - internal static readonly string[] item = ["Дата", "Описание", "Количество лекарства"]; + internal static readonly string[] item = ["Дата", "Описание", "Количество пациентов"]; public TableReport(IMedicalHistoryRepository medicalHistoryRepository, IDoctorPaymentsRepository doctorPaymentsRepository, ILogger logger) { -- 2.25.1 From 63a67391e92d142c756ad183a60f9937aafc15e6 Mon Sep 17 00:00:00 2001 From: Bulat Date: Fri, 20 Dec 2024 09:29:01 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=B4=D0=BE=D0=BF=D0=B8=D0=BB=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Reports/ChartReport.cs | 32 +++++++++++++- .../Reports/PdfBuilder.cs | 28 ++++++------ .../Reports/TableReport.cs | 10 ++--- .../Reports/WordBuilder.cs | 44 ++++++++++++------- 4 files changed, 76 insertions(+), 38 deletions(-) diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs index 2584078..cadbe00 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs @@ -27,8 +27,8 @@ internal class ChartReport try { new PdfBuilder(filePath) - .AddHeader("Пополенение лекарства") - .AddPieChart("Виды лекарства", GetData(dateTime)) + .AddHeader("Количество посещений пациентов") + .AddPieChart("Пациенты", GetData(dateTime)) .Build(); return true; } @@ -38,6 +38,7 @@ internal class ChartReport return false; } } + /* private List<(string Caption, double Value)> GetData(DateTime dateTime) { // Получаем все медицинские истории за указанную дату @@ -49,4 +50,31 @@ internal class ChartReport .Select(g => (Caption: $"Patient {g.Key}", Value: (double)g.Count())) .ToList(); } + */ + private List<(string Caption, double Value)> GetData(DateTime dateTime) + { + var medicalHistories = _medicalHistoryRepository.ReadMedicalHistory(null, null, null, null); + + var filteredHistories = medicalHistories + .Where(mh => mh.VisitDate.Date == dateTime.Date) + .Where(mh => mh.DrugMedicalHistory != null && mh.DrugMedicalHistory.Any()) + .ToList(); + var groupedData = filteredHistories + .GroupBy( + mh => mh.DoctorId, + (key, group) => new + { + DoctorId = key, + TotalDrugs = group + .SelectMany(mh => mh.DrugMedicalHistory) + .Count() + } + ) + .ToList(); + var result = groupedData + .Select(x => (x.DoctorId.ToString(), (double)x.TotalDrugs)) + .ToList(); + + return result; + } } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs index e626ae0..0939123 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs @@ -26,38 +26,38 @@ internal class PdfBuilder } _filePath = filePath; _document = new Document(); - DefineStyles(); + DefineStyles(); // настройка стиля } - public PdfBuilder AddHeader(string header) + public PdfBuilder AddHeader(string header) // Заголовок, header - это текст заголовка { - _document.AddSection().AddParagraph(header, "NormalBold"); + _document.AddSection().AddParagraph(header, "NormalBold"); // документу добавляется секция добавляется параграф return this; } - public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data) + 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(); + var chart = new Chart(ChartType.Pie2D); + var series = chart.SeriesCollection.AddSeries(); // добавляем серию series.Add(data.Select(x => x.Value).ToArray()); - var xseries = chart.XValues.AddXSeries(); + var xseries = chart.XValues.AddXSeries(); // добавляем подписи xseries.Add(data.Select(x => x.Caption).ToArray()); - chart.DataLabel.Type = DataLabelType.Percent; + chart.DataLabel.Type = DataLabelType.Percent; // вывод ввиде прицентов chart.DataLabel.Position = DataLabelPosition.OutsideEnd; - chart.Width = Unit.FromCentimeter(16); + 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.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); + chart.TopArea.AddLegend(); // где у нас будет легенда + _document.LastSection.Add(chart); // в документ добавляем нашу таблицу return this; } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs index 8abee14..393ea3e 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs @@ -22,7 +22,7 @@ internal class TableReport private readonly ILogger _logger; - internal static readonly string[] item = ["Дата", "Описание", "Количество пациентов"]; + internal static readonly string[] item = ["Id доктора", "Описание", "Количество пациентов"]; public TableReport(IMedicalHistoryRepository medicalHistoryRepository, IDoctorPaymentsRepository doctorPaymentsRepository, ILogger logger) { @@ -70,15 +70,15 @@ internal class TableReport .Where(x => x.VisitDate >= startDate && x.VisitDate <= endDate && x.DrugMedicalHistory.Any(y => y.DrugId == drugId) ) .Select(x => new { - Date = x.VisitDate, + Date = x.DoctorId, 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 })) + .Where(x => x.IdDoctor!=0) + .Select(x => new {Date = x.IdDoctor, CountIn = (string?)null, CountOut = (int?)x.Count_Patient })) .OrderBy(x => x.Date); @@ -87,7 +87,7 @@ internal class TableReport 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 } }) + new List() { new string[] { "Всего", string.Empty, data.Sum(x => x.CountOut ?? 0).ToString() } }) .ToList(); } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs index ca72689..5f04319 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs @@ -38,11 +38,13 @@ internal class WordBuilder public WordBuilder AddHeader(string header) { - // код ставки заголовка - var paragraph = _body.AppendChild(new Paragraph()); - var run = paragraph.AppendChild(new Run()); + // код ставки заголовка в документ Word + var paragraph = _body.AppendChild(new Paragraph()); // в body добавляем новый элемент дочерний это будет параграф + var run = paragraph.AppendChild(new Run()); // добавление блока + // жирный шрифт var runProperties = run.AppendChild(new RunProperties()); runProperties.AppendChild(new Bold()); + // добавляем текст run.AppendChild(new Text(header)); return this; @@ -50,7 +52,7 @@ internal class WordBuilder public WordBuilder AddParagraph(string text) { - // код ставки заголовка + // код ставки параграфа var paragraph = _body.AppendChild(new Paragraph()); var run = paragraph.AppendChild(new Run()); @@ -59,7 +61,12 @@ internal class WordBuilder } public WordBuilder AddTable(int[] widths, List data) - { + { // int[] width - будет передаваться массив intов + // Табличка в Word состоит из 3-ех блоков + // 1-ый блок: свойство . Здесь будем задавать границы + // 2-ой блок: колонки или Grid там передадим информацию по колонкам, какие колонки и какая у каждого ширина + // 3-ий блок: строчки, заполняем строчки с данными + // widths - ширина колонок if (widths == null || widths.Length == 0) { throw new ArgumentNullException(nameof(widths)); @@ -68,13 +75,14 @@ internal class WordBuilder { throw new ArgumentNullException(nameof(data)); } - if (data.Any(x => x.Length != widths.Length)) + if (data.Any(x => x.Length != widths.Length)) // использьем LinQ метод Any { throw new InvalidOperationException("widths.Length != data.Length"); } - + // создаем таблицу + // 1-ый блок свойства var table = new Table(); - table.AppendChild(new TableProperties( + table.AppendChild(new TableProperties( // мы здесь задаем границы new TableBorders( new TopBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, new BottomBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, @@ -86,24 +94,26 @@ internal class WordBuilder )); // Заголовок + // идем заполнять строчки, var tr = new TableRow(); for (var j = 0; j < widths.Length; ++j) { - tr.Append(new TableCell( - new TableCellProperties(new TableCellWidth() + tr.Append(new TableCell( // первая строчка, TableCell - это ячейка + new TableCellProperties(new TableCellWidth() // в первой строчке в свойствах проставлем ширину Width = widths[j].ToString() { Width = - widths[j].ToString() + widths[j].ToString() // заполняем ширину ячейки }), - new Paragraph(new Run(new RunProperties(new Bold()), new - Text(data.First()[j]))))); + new Paragraph(new Run(new RunProperties(new Bold()), new // заголовок делаем что у нас он жирный Bold(), это шапка каждой таблицы + Text(data.First()[j]))))); // Через LinQ метод вытаскиваем First, некий Text data.First() - берем элемент из первой строки } - table.Append(tr); + table.Append(tr); // заполнили первую строчку добавили в табличку // Данные - table.Append(data.Skip(1).Select(x => - new TableRow(x.Select(y => new TableCell(new Paragraph(new - Run(new Text(y)))))))); + // теперь просто заполняем данные + table.Append(data.Skip(1).Select(x => // LinQ метод data.Skip(1) - пропускаем первую запись, которая у нас шапка таблицы + new TableRow(x.Select(y => new TableCell(new Paragraph(new // а для всех остальных мы берем элемент data(список) + Run(new Text(y)))))))); // и основе каждого списка создаем объект TableRow, которого через x.Select заполняет ячейки _body.Append(table); return this; } -- 2.25.1 From dde7460c2e6dbdc1465ad6109fae8d53baa73ccd Mon Sep 17 00:00:00 2001 From: Bulat Date: Fri, 20 Dec 2024 10:23:08 +0400 Subject: [PATCH 4/4] =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/Enums/Diagnosis.cs | 6 +- .../Entities/MedicalHistory.cs | 2 +- .../Entities/Patient.cs | 3 +- .../Forms/FormMedicalHistory.cs | 6 -- .../Reports/ChartReport.cs | 14 +---- .../Reports/PdfBuilder.cs | 24 ++++---- .../Reports/TableReport.cs | 1 - .../Reports/WordBuilder.cs | 58 +++++++------------ .../Repositories/IDrugMedicalHistory.cs | 4 +- .../Repositories/IMedicalHistoryRepository.cs | 9 +-- .../Repositories/IPatientRepository.cs | 11 ++-- .../MedicalHistoryRepository.cs | 47 +-------------- 12 files changed, 47 insertions(+), 138 deletions(-) diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Enums/Diagnosis.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Enums/Diagnosis.cs index d9f3ee4..809214f 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Enums/Diagnosis.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Enums/Diagnosis.cs @@ -6,11 +6,7 @@ using System.Threading.Tasks; namespace RegistrationPatientsPolyclinic.Entities.Enums; -[Flags] // Flag - атрибут, его значения будут комбинироваться, например, если мы создадим объект от соотрудника, -// то его поле DoctorPost, то мы в него занесем только один из возможных вариантов(None, Junior, Senior, Head) -// а по атрибуту Flags позволяет хранить несколько записей -// ВАЖНО!!! Чтобы в перечеслении значения были степени двойки -// битовое объединение +[Flags] public enum Diagnosis { None = 0, diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs index 5408a96..f8171f5 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/MedicalHistory.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace RegistrationPatientsPolyclinic.Entities; -public class MedicalHistory // сущность пополнения, наподобие FeedReplenushment +public class MedicalHistory { public int Id { get; private set; } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Patient.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Patient.cs index 70cb6e3..a3a7751 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Patient.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Entities/Patient.cs @@ -10,14 +10,13 @@ public class Patient { public int Id { get; private set; } - public string First_Name { get; private set; } = string .Empty; // string.Empty - означает, что по умолчанию это свойство будет содержать пустую строку, а не null(то же самое "") + public string First_Name { get; private set; } = string .Empty; public string Last_Name { get; private set; } = string.Empty; public string ContactNumber { get; private set; } - // ТУТ СДЕЛАЕМ СТАТИСТИЧЕСКИЙ МЕТОД, который будет отвечать за создание объекта public static Patient CreateEntity(int id, string first_Name, string last_Name, string contactNumber) { diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs index 7404038..c347eea 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Forms/FormMedicalHistory.cs @@ -57,12 +57,6 @@ namespace RegistrationPatientsPolyclinic.Forms throw new Exception("Имеются незаполненные поля"); } - /* - CreateEntity(0, - Convert.ToInt32(comboBoxPacient.Text), - Convert.ToInt32(row.Cells["ColumnDoctor"].Value), (Diagnosis)row.Cells["ColumnDiagnosis"].Value, - (Status)row.Cells["ColumnStatus"].Value, ColumnDrug); - */ _medicalHistoryRepository.CreateMedicalHistory(MedicalHistory.CreateEntity(0, (int)comboBoxPacient.SelectedValue!, (int)comboBoxDoctor.SelectedValue!, CreateListMedicalHistoryFromDataGrid())); diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs index cadbe00..bde0a8c 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/ChartReport.cs @@ -38,19 +38,7 @@ internal class ChartReport 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(); - } - */ + private List<(string Caption, double Value)> GetData(DateTime dateTime) { var medicalHistories = _medicalHistoryRepository.ReadMedicalHistory(null, null, null, null); diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs index 0939123..46d1f19 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/PdfBuilder.cs @@ -29,35 +29,35 @@ internal class PdfBuilder DefineStyles(); // настройка стиля } - public PdfBuilder AddHeader(string header) // Заголовок, header - это текст заголовка + public PdfBuilder AddHeader(string header) { - _document.AddSection().AddParagraph(header, "NormalBold"); // документу добавляется секция добавляется параграф + _document.AddSection().AddParagraph(header, "NormalBold"); return this; } - public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data) // метод добавления диаграммы круговой + 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(); // добавляем серию + var series = chart.SeriesCollection.AddSeries(); series.Add(data.Select(x => x.Value).ToArray()); - var xseries = chart.XValues.AddXSeries(); // добавляем подписи + var xseries = chart.XValues.AddXSeries(); xseries.Add(data.Select(x => x.Caption).ToArray()); - chart.DataLabel.Type = DataLabelType.Percent; // вывод ввиде прицентов + chart.DataLabel.Type = DataLabelType.Percent; chart.DataLabel.Position = DataLabelPosition.OutsideEnd; - chart.Width = Unit.FromCentimeter(16); // ширина и высота + 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.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); // в документ добавляем нашу таблицу + chart.TopArea.AddLegend(); + _document.LastSection.Add(chart); return this; } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs index 393ea3e..e0aa030 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/TableReport.cs @@ -60,7 +60,6 @@ internal class TableReport } } - /// ВНИЗУ БЫЛ ПРАВИЛЬНЫЙ private List GetData(int drugId, DateTime startDate, DateTime endDate) diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs index 5f04319..58867cc 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Reports/WordBuilder.cs @@ -10,13 +10,8 @@ using DocumentFormat.OpenXml.Packaging; namespace RegistrationPatientsPolyclinic.Reports; -/// -/// Построитель Ворда -/// internal class WordBuilder { - // Создание заголовка, вставить некий параграф с текстом - // Потребуется сделать табличку private readonly string _filePath; private readonly Document _document; private readonly Body _body; @@ -38,13 +33,13 @@ internal class WordBuilder public WordBuilder AddHeader(string header) { - // код ставки заголовка в документ Word - var paragraph = _body.AppendChild(new Paragraph()); // в body добавляем новый элемент дочерний это будет параграф - var run = paragraph.AppendChild(new Run()); // добавление блока - // жирный шрифт + + 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; @@ -52,7 +47,7 @@ internal class WordBuilder public WordBuilder AddParagraph(string text) { - // код ставки параграфа + var paragraph = _body.AppendChild(new Paragraph()); var run = paragraph.AppendChild(new Run()); @@ -61,12 +56,8 @@ internal class WordBuilder } public WordBuilder AddTable(int[] widths, List data) - { // int[] width - будет передаваться массив intов - // Табличка в Word состоит из 3-ех блоков - // 1-ый блок: свойство . Здесь будем задавать границы - // 2-ой блок: колонки или Grid там передадим информацию по колонкам, какие колонки и какая у каждого ширина - // 3-ий блок: строчки, заполняем строчки с данными - // widths - ширина колонок + { + if (widths == null || widths.Length == 0) { throw new ArgumentNullException(nameof(widths)); @@ -75,14 +66,13 @@ internal class WordBuilder { throw new ArgumentNullException(nameof(data)); } - if (data.Any(x => x.Length != widths.Length)) // использьем LinQ метод Any + if (data.Any(x => x.Length != widths.Length)) { throw new InvalidOperationException("widths.Length != data.Length"); } - // создаем таблицу - // 1-ый блок свойства + var table = new Table(); - table.AppendChild(new TableProperties( // мы здесь задаем границы + table.AppendChild(new TableProperties( new TableBorders( new TopBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, new BottomBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }, @@ -93,27 +83,23 @@ internal class WordBuilder ) )); - // Заголовок - // идем заполнять строчки, var tr = new TableRow(); for (var j = 0; j < widths.Length; ++j) { - tr.Append(new TableCell( // первая строчка, TableCell - это ячейка - new TableCellProperties(new TableCellWidth() // в первой строчке в свойствах проставлем ширину Width = widths[j].ToString() + tr.Append(new TableCell( + new TableCellProperties(new TableCellWidth() { Width = - widths[j].ToString() // заполняем ширину ячейки + widths[j].ToString() }), - new Paragraph(new Run(new RunProperties(new Bold()), new // заголовок делаем что у нас он жирный Bold(), это шапка каждой таблицы - Text(data.First()[j]))))); // Через LinQ метод вытаскиваем First, некий Text data.First() - берем элемент из первой строки + new Paragraph(new Run(new RunProperties(new Bold()), new + Text(data.First()[j]))))); } - table.Append(tr); // заполнили первую строчку добавили в табличку - - // Данные - // теперь просто заполняем данные - table.Append(data.Skip(1).Select(x => // LinQ метод data.Skip(1) - пропускаем первую запись, которая у нас шапка таблицы - new TableRow(x.Select(y => new TableCell(new Paragraph(new // а для всех остальных мы берем элемент data(список) - Run(new Text(y)))))))); // и основе каждого списка создаем объект TableRow, которого через x.Select заполняет ячейки + 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; } @@ -121,7 +107,7 @@ internal class WordBuilder public void Build() { - // элемент какой будет все создавать + using var wordDocument = WordprocessingDocument.Create(_filePath, WordprocessingDocumentType.Document); var mainPart = wordDocument.AddMainDocumentPart(); mainPart.Document = _document; diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IDrugMedicalHistory.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IDrugMedicalHistory.cs index 264724a..35c5321 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IDrugMedicalHistory.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IDrugMedicalHistory.cs @@ -10,9 +10,9 @@ namespace RegistrationPatientsPolyclinic.Repositories; public interface IDrugMedicalHistory { - IEnumerable ReadDragMedicalHistory(int? drugId, string description); // чтение всего + IEnumerable ReadDragMedicalHistory(int? drugId, string description); - void CreateDrugMedicalHistory(DrugMedicalHistory drugHistory); // создание объекта + void CreateDrugMedicalHistory(DrugMedicalHistory drugHistory); void DeleteDrugMedicalHistory(int Id); } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs index 7979ac9..2aad5e0 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IMedicalHistoryRepository.cs @@ -11,15 +11,10 @@ public interface IMedicalHistoryRepository { IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, - int? DoctorId = null); // по этим параметрам можно не весь список читать, а только какую то часть + int? DoctorId = null); - /* - IEnumerable ReadMedicalHistory(DateTime? dateForm = null, DateTime? dateTo = null, int? PatientId = null, - int? DoctorId = null); // по этим параметрам можно не весь список читать, а только какую то часть - - */ - void CreateMedicalHistory(MedicalHistory medicalHistory); // объекь будет заносится в список + void CreateMedicalHistory(MedicalHistory medicalHistory); void DeletemedicalHistory(int id); diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IPatientRepository.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IPatientRepository.cs index 3cc9133..0ecf6ef 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IPatientRepository.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/IPatientRepository.cs @@ -7,18 +7,15 @@ using System.Threading.Tasks; namespace RegistrationPatientsPolyclinic.Repositories; -/// -/// Операцию read (чтение) разобьем на 2 метода: получение коллекции и получений одной записи по идентификатору. -/// public interface IPatientRepository { - IEnumerable ReadPatient(); // метод получения всего списка (в данном случае пациентов) + IEnumerable ReadPatient(); - Patient ReadPatientById(int id); // получение по id + Patient ReadPatientById(int id); - void CreatPatient(Patient patient); // метод для того чтобы добавить в существующую коллекцию пациента + void CreatPatient(Patient patient); - void UpdatePatient(Patient patient); // метод на изменение + void UpdatePatient(Patient patient); void DeletePatient(int id); } diff --git a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs index b2f8a1c..b654612 100644 --- a/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs +++ b/RegistrationPatientsPolyclinic/RegistrationPatientsPolyclinic/Repositories/Implementations/MedicalHistoryRepository.cs @@ -112,52 +112,7 @@ 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 medicalHistory = - connection.Query(querySelect); - _logger.LogDebug("Полученные объекты: {json}", - JsonConvert.SerializeObject(medicalHistory)); - return medicalHistory; - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка при чтении объектов"); - throw; - } - - } - */ - /* - 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; - } - }*/ + } -- 2.25.1