2025-01-24 22:28:05 +07:00
|
|
|
|
using System;
|
|
|
|
|
using System.Data;
|
|
|
|
|
using System.Windows.Forms;
|
2025-01-25 00:58:39 +07:00
|
|
|
|
using System.Data.SQLite;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using OfficeOpenXml;
|
2025-01-25 01:56:40 +07:00
|
|
|
|
using System.Collections.Generic;
|
2025-01-24 22:28:05 +07:00
|
|
|
|
|
|
|
|
|
namespace ПХД
|
|
|
|
|
{
|
|
|
|
|
public partial class Form1 : Form
|
|
|
|
|
{
|
2025-01-25 00:58:39 +07:00
|
|
|
|
private DatabaseManager dbManager;
|
|
|
|
|
|
2025-01-24 22:28:05 +07:00
|
|
|
|
public Form1()
|
|
|
|
|
{
|
|
|
|
|
InitializeComponent();
|
2025-01-25 00:58:39 +07:00
|
|
|
|
dbManager = new DatabaseManager();
|
|
|
|
|
SetupDataGridView();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Form1_Load(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
dbManager = new DatabaseManager();
|
|
|
|
|
dbManager.InitializeDatabase();
|
|
|
|
|
LoadEngines();
|
|
|
|
|
txtReason.Enabled = false;
|
|
|
|
|
datePickerOutOfOrder.Enabled = false;
|
2025-01-25 01:56:40 +07:00
|
|
|
|
dbManager.UpdateDatabaseSchema();
|
|
|
|
|
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LoadEngines()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
dataGridView1.DataSource = dbManager.GetAllEngines();
|
2025-01-25 01:56:40 +07:00
|
|
|
|
CheckVerificationDates();
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show($"Ошибка загрузки данных: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void btnSave_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
string registrationDate = datePickerRegistration.Value.ToString("yyyy-MM-dd");
|
|
|
|
|
string engineType = cmbEngineType.Text;
|
|
|
|
|
double power = double.Parse(txtPower.Text);
|
|
|
|
|
int rpm = int.Parse(cmbRPM.Text);
|
|
|
|
|
string mountingType = cmbMountingType.Text;
|
|
|
|
|
string uniqueNumber = txtUniqueNumber.Text;
|
|
|
|
|
string factoryNumber = txtFactoryNumber.Text;
|
|
|
|
|
string partNumber = txtPartNumber.Text;
|
|
|
|
|
string installationSite = txtInstallationSite.Text;
|
|
|
|
|
bool isOutOfOrder = chkOutOfOrder.Checked;
|
|
|
|
|
string reason = isOutOfOrder ? txtReason.Text : null;
|
|
|
|
|
string outOfOrderDate = isOutOfOrder ? datePickerOutOfOrder.Value.ToString("yyyy-MM-dd") : null;
|
2025-01-25 01:56:40 +07:00
|
|
|
|
string verificationDate = datePickerVerification.Value.ToString("yyyy-MM-dd");
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
|
|
|
|
dbManager.AddEngine(
|
|
|
|
|
registrationDate, engineType, power, rpm, mountingType,
|
|
|
|
|
uniqueNumber, factoryNumber, partNumber, installationSite,
|
2025-01-25 01:56:40 +07:00
|
|
|
|
isOutOfOrder, reason, outOfOrderDate, verificationDate
|
2025-01-25 00:58:39 +07:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
LoadEngines();
|
|
|
|
|
MessageBox.Show("Запись успешно сохранена!");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show($"Произошла ошибка: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void SetupDataGridView()
|
|
|
|
|
{
|
|
|
|
|
dataGridView1.AutoGenerateColumns = false;
|
|
|
|
|
dataGridView1.Columns.Clear();
|
|
|
|
|
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
Name = "Id",
|
|
|
|
|
HeaderText = "ID",
|
|
|
|
|
DataPropertyName = "Id",
|
|
|
|
|
Width = 50
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Дата постановки",
|
|
|
|
|
DataPropertyName = "RegistrationDate",
|
|
|
|
|
Width = 120
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Тип двигателя",
|
|
|
|
|
DataPropertyName = "EngineType",
|
|
|
|
|
Width = 100
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Мощность (кВт)",
|
|
|
|
|
DataPropertyName = "Power",
|
|
|
|
|
Width = 100
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Обороты",
|
|
|
|
|
DataPropertyName = "RPM",
|
|
|
|
|
Width = 100
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Монтажное исполнение",
|
|
|
|
|
DataPropertyName = "MountingType",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Уникальный номер",
|
|
|
|
|
DataPropertyName = "UniqueNumber",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Заводской номер",
|
|
|
|
|
DataPropertyName = "FactoryNumber",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Номер номенклатуры",
|
|
|
|
|
DataPropertyName = "PartNumber",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Место установки",
|
|
|
|
|
DataPropertyName = "InstallationSite",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
Name = "IsOutOfOrder", // Имя столбца в DataGridView
|
|
|
|
|
HeaderText = "Вышел из строя",
|
|
|
|
|
DataPropertyName = "IsOutOfOrder", // Имя столбца в DataTable/базе данных
|
|
|
|
|
Width = 120
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Причина",
|
|
|
|
|
DataPropertyName = "Reason",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
HeaderText = "Дата выхода из строя",
|
|
|
|
|
DataPropertyName = "OutOfOrderDate",
|
|
|
|
|
Width = 150
|
|
|
|
|
});
|
2025-01-25 01:56:40 +07:00
|
|
|
|
|
|
|
|
|
dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
|
|
|
|
|
{
|
|
|
|
|
Name = "VerificationDate",
|
|
|
|
|
HeaderText = "Дата поверки",
|
|
|
|
|
DataPropertyName = "VerificationDate",
|
|
|
|
|
Width = 120
|
|
|
|
|
});
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void btnDelete_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (dataGridView1.SelectedRows.Count > 0)
|
|
|
|
|
{
|
|
|
|
|
// Получаем ID выбранной строки
|
|
|
|
|
var idCell = dataGridView1.SelectedRows[0].Cells["Id"];
|
|
|
|
|
if (idCell != null && idCell.Value != null)
|
|
|
|
|
{
|
|
|
|
|
int id = Convert.ToInt32(idCell.Value);
|
|
|
|
|
|
|
|
|
|
// Подтверждение удаления
|
|
|
|
|
var result = MessageBox.Show("Вы уверены, что хотите удалить эту запись?",
|
|
|
|
|
"Подтверждение удаления",
|
|
|
|
|
MessageBoxButtons.YesNo,
|
|
|
|
|
MessageBoxIcon.Question);
|
|
|
|
|
if (result == DialogResult.Yes)
|
|
|
|
|
{
|
|
|
|
|
dbManager.DeleteEngine(id);
|
|
|
|
|
LoadEngines(); // Обновляем таблицу
|
|
|
|
|
MessageBox.Show("Запись успешно удалена!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show("Не удалось определить ID записи.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show("Пожалуйста, выберите запись для удаления.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show($"Произошла ошибка при удалении записи: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void chkOutOfOrder_CheckedChanged(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
// Поля блокируются, если чекбокс не установлен
|
|
|
|
|
bool isEnabled = chkOutOfOrder.Checked;
|
|
|
|
|
txtReason.Enabled = isEnabled;
|
|
|
|
|
datePickerOutOfOrder.Enabled = isEnabled;
|
|
|
|
|
}
|
|
|
|
|
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
|
|
|
|
|
{
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Проверяем, что это столбец "Id"
|
|
|
|
|
if (dataGridView1.Columns[e.ColumnIndex].Name == "Id")
|
2025-01-25 00:58:39 +07:00
|
|
|
|
{
|
|
|
|
|
var row = dataGridView1.Rows[e.RowIndex];
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Проверяем существование столбца "IsOutOfOrder" и его значения
|
2025-01-25 00:58:39 +07:00
|
|
|
|
if (row.Cells["IsOutOfOrder"] != null && row.Cells["IsOutOfOrder"].Value != null)
|
|
|
|
|
{
|
2025-01-25 01:56:40 +07:00
|
|
|
|
string value = row.Cells["IsOutOfOrder"].Value.ToString();
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Пытаемся преобразовать значение в bool
|
|
|
|
|
if (bool.TryParse(value, out bool isOutOfOrder))
|
2025-01-25 00:58:39 +07:00
|
|
|
|
{
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Подсвечиваем цвет, если двигатель вышел из строя
|
|
|
|
|
if (isOutOfOrder)
|
|
|
|
|
{
|
|
|
|
|
e.CellStyle.BackColor = System.Drawing.Color.LightCoral;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
e.CellStyle.BackColor = System.Drawing.Color.White;
|
|
|
|
|
}
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Если преобразование не удалось, используем белый фон
|
2025-01-25 00:58:39 +07:00
|
|
|
|
e.CellStyle.BackColor = System.Drawing.Color.White;
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-25 01:56:40 +07:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// Если значение отсутствует, используем белый фон
|
|
|
|
|
e.CellStyle.BackColor = System.Drawing.Color.White;
|
|
|
|
|
}
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void btnClear_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
// Очистка текстовых полей
|
|
|
|
|
txtPower.Text = string.Empty;
|
|
|
|
|
txtUniqueNumber.Text = string.Empty;
|
|
|
|
|
txtFactoryNumber.Text = string.Empty;
|
|
|
|
|
txtPartNumber.Text = string.Empty;
|
|
|
|
|
txtInstallationSite.Text = string.Empty;
|
|
|
|
|
txtReason.Text = string.Empty;
|
|
|
|
|
|
|
|
|
|
// Сброс выпадающих списков
|
|
|
|
|
cmbEngineType.SelectedIndex = -1; // Сбрасывает выбор
|
|
|
|
|
cmbRPM.SelectedIndex = -1;
|
|
|
|
|
cmbMountingType.SelectedIndex = -1;
|
|
|
|
|
|
|
|
|
|
// Сброс чекбоксов
|
|
|
|
|
chkOutOfOrder.Checked = false;
|
|
|
|
|
|
|
|
|
|
// Сброс дат
|
|
|
|
|
datePickerRegistration.Value = DateTime.Now;
|
|
|
|
|
datePickerOutOfOrder.Value = DateTime.Now;
|
|
|
|
|
|
|
|
|
|
// Блокировка полей "Неисправность"
|
|
|
|
|
txtReason.Enabled = false;
|
|
|
|
|
datePickerOutOfOrder.Enabled = false;
|
|
|
|
|
LoadEngines();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void btnSearch_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// Формируем SQL-запрос с фильтрацией
|
|
|
|
|
string query = "SELECT * FROM Engines WHERE 1=1"; // Условие 1=1 позволяет добавлять фильтры динамически
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(txtPower.Text))
|
|
|
|
|
{
|
|
|
|
|
query += $" AND Power = {txtPower.Text}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(cmbEngineType.Text))
|
|
|
|
|
{
|
|
|
|
|
query += $" AND EngineType LIKE '%{cmbEngineType.Text}%'";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(txtUniqueNumber.Text))
|
|
|
|
|
{
|
|
|
|
|
query += $" AND UniqueNumber LIKE '%{txtUniqueNumber.Text}%'";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(txtFactoryNumber.Text))
|
|
|
|
|
{
|
|
|
|
|
query += $" AND FactoryNumber LIKE '%{txtFactoryNumber.Text}%'";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(txtPartNumber.Text))
|
|
|
|
|
{
|
|
|
|
|
query += $" AND PartNumber LIKE '%{txtPartNumber.Text}%'";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(txtInstallationSite.Text))
|
|
|
|
|
{
|
|
|
|
|
query += $" AND InstallationSite LIKE '%{txtInstallationSite.Text}%'";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (chkOutOfOrder.Checked)
|
|
|
|
|
{
|
|
|
|
|
query += " AND IsOutOfOrder = 1";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Выполняем запрос
|
|
|
|
|
DataTable searchResults = dbManager.ExecuteQuery(query);
|
|
|
|
|
dataGridView1.DataSource = searchResults; // Отображаем результаты поиска
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show($"Произошла ошибка при поиске: {ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void экспортToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var saveFileDialog = new SaveFileDialog())
|
|
|
|
|
{
|
|
|
|
|
saveFileDialog.Filter = "Excel Files|*.xlsx";
|
|
|
|
|
saveFileDialog.Title = "Сохранить таблицу как Excel файл";
|
|
|
|
|
saveFileDialog.FileName = "Engines.xlsx";
|
|
|
|
|
|
|
|
|
|
if (saveFileDialog.ShowDialog() == DialogResult.OK)
|
|
|
|
|
{
|
|
|
|
|
// Получаем данные из DataGridView
|
|
|
|
|
DataTable table = (DataTable)dataGridView1.DataSource;
|
|
|
|
|
|
|
|
|
|
// Экспортируем в Excel
|
|
|
|
|
ExportToExcel(table, saveFileDialog.FileName);
|
|
|
|
|
|
|
|
|
|
MessageBox.Show("Данные успешно экспортированы!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show($"Произошла ошибка при экспорте: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ExportToExcel(DataTable table, string filePath)
|
|
|
|
|
{
|
|
|
|
|
// Указываем контекст лицензии
|
|
|
|
|
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
|
|
|
|
|
|
|
|
|
using (var package = new OfficeOpenXml.ExcelPackage())
|
|
|
|
|
{
|
|
|
|
|
// Создаем новый лист
|
|
|
|
|
var worksheet = package.Workbook.Worksheets.Add("Engines");
|
|
|
|
|
|
|
|
|
|
// Заголовки столбцов из DataGridView
|
|
|
|
|
for (int col = 0; col < dataGridView1.Columns.Count; col++)
|
|
|
|
|
{
|
|
|
|
|
worksheet.Cells[1, col + 1].Value = dataGridView1.Columns[col].HeaderText; // Используем HeaderText
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Данные из DataTable
|
|
|
|
|
for (int row = 0; row < table.Rows.Count; row++)
|
|
|
|
|
{
|
|
|
|
|
for (int col = 0; col < table.Columns.Count; col++)
|
|
|
|
|
{
|
|
|
|
|
worksheet.Cells[row + 2, col + 1].Value = table.Rows[row][col];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Авторазмер столбцов
|
|
|
|
|
worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
|
|
|
|
|
|
|
|
|
|
// Сохраняем файл
|
|
|
|
|
package.SaveAs(new FileInfo(filePath));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void импортToolStripMenuItem_Click(object sender, EventArgs e)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var openFileDialog = new OpenFileDialog())
|
|
|
|
|
{
|
|
|
|
|
openFileDialog.Filter = "Excel Files|*.xlsx";
|
|
|
|
|
openFileDialog.Title = "Выберите Excel файл для импорта";
|
|
|
|
|
|
|
|
|
|
if (openFileDialog.ShowDialog() == DialogResult.OK)
|
|
|
|
|
{
|
|
|
|
|
// Импортируем данные из Excel
|
|
|
|
|
DataTable importedTable = ImportFromExcel(openFileDialog.FileName);
|
|
|
|
|
|
|
|
|
|
// Проверяем, содержит ли таблица строки
|
|
|
|
|
if (importedTable.Rows.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show("Файл Excel не содержит данных для импорта.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Сохраняем импортированные данные в базу данных
|
|
|
|
|
foreach (DataRow row in importedTable.Rows)
|
|
|
|
|
{
|
|
|
|
|
// Обработка столбца IsOutOfOrder
|
|
|
|
|
bool isOutOfOrder = false;
|
|
|
|
|
if (row["IsOutOfOrder"] != null && !string.IsNullOrWhiteSpace(row["IsOutOfOrder"].ToString()))
|
|
|
|
|
{
|
|
|
|
|
// Попытка преобразования строки в bool
|
|
|
|
|
if (!bool.TryParse(row["IsOutOfOrder"].ToString(), out isOutOfOrder))
|
|
|
|
|
{
|
|
|
|
|
// Проверяем числовые значения ("1" => true, "0" => false)
|
|
|
|
|
isOutOfOrder = row["IsOutOfOrder"].ToString() == "1";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Добавляем запись в базу данных
|
|
|
|
|
dbManager.AddEngine(
|
|
|
|
|
row["RegistrationDate"].ToString(),
|
|
|
|
|
row["EngineType"].ToString(),
|
|
|
|
|
double.Parse(row["Power"].ToString()),
|
|
|
|
|
int.Parse(row["RPM"].ToString()),
|
|
|
|
|
row["MountingType"].ToString(),
|
|
|
|
|
row["UniqueNumber"].ToString(),
|
|
|
|
|
row["FactoryNumber"].ToString(),
|
|
|
|
|
row["PartNumber"].ToString(),
|
|
|
|
|
row["InstallationSite"].ToString(),
|
|
|
|
|
isOutOfOrder,
|
|
|
|
|
row["Reason"].ToString(),
|
|
|
|
|
row["OutOfOrderDate"].ToString(),
|
|
|
|
|
row["VerificationDate"].ToString()
|
|
|
|
|
);
|
|
|
|
|
}
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Обновляем DataGridView
|
|
|
|
|
LoadEngines();
|
|
|
|
|
|
|
|
|
|
MessageBox.Show("Данные успешно импортированы и сохранены в базу данных!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
MessageBox.Show($"Произошла ошибка при импорте: {ex.Message}", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
|
|
|
|
|
|
2025-01-25 00:58:39 +07:00
|
|
|
|
private DataTable ImportFromExcel(string filePath)
|
|
|
|
|
{
|
|
|
|
|
DataTable table = new DataTable();
|
|
|
|
|
|
|
|
|
|
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
|
|
|
|
|
|
|
|
|
|
using (var package = new OfficeOpenXml.ExcelPackage(new FileInfo(filePath)))
|
|
|
|
|
{
|
|
|
|
|
// Получаем первый лист из файла
|
|
|
|
|
var worksheet = package.Workbook.Worksheets[0];
|
|
|
|
|
if (worksheet == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception("В файле отсутствуют листы.");
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Создаем DataTable на основе столбцов DataGridView
|
2025-01-25 00:58:39 +07:00
|
|
|
|
foreach (DataGridViewColumn column in dataGridView1.Columns)
|
|
|
|
|
{
|
|
|
|
|
table.Columns.Add(column.DataPropertyName);
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
// Проверяем наличие заголовков в Excel
|
|
|
|
|
Dictionary<string, int> excelColumnIndices = new Dictionary<string, int>();
|
|
|
|
|
for (int col = 1; col <= worksheet.Dimension.End.Column; col++)
|
|
|
|
|
{
|
|
|
|
|
string columnHeader = worksheet.Cells[1, col].Text.Trim();
|
|
|
|
|
foreach (DataGridViewColumn dgvColumn in dataGridView1.Columns)
|
|
|
|
|
{
|
|
|
|
|
if (dgvColumn.HeaderText == columnHeader)
|
|
|
|
|
{
|
|
|
|
|
excelColumnIndices[dgvColumn.DataPropertyName] = col;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-25 00:58:39 +07:00
|
|
|
|
// Читаем данные начиная со второй строки
|
|
|
|
|
for (int row = 2; row <= worksheet.Dimension.End.Row; row++)
|
|
|
|
|
{
|
|
|
|
|
DataRow newRow = table.NewRow();
|
2025-01-25 01:56:40 +07:00
|
|
|
|
foreach (var mapping in excelColumnIndices)
|
2025-01-25 00:58:39 +07:00
|
|
|
|
{
|
2025-01-25 01:56:40 +07:00
|
|
|
|
newRow[mapping.Key] = worksheet.Cells[row, mapping.Value].Text.Trim();
|
2025-01-25 00:58:39 +07:00
|
|
|
|
}
|
|
|
|
|
table.Rows.Add(newRow);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return table;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
private void CheckVerificationDates()
|
|
|
|
|
{
|
|
|
|
|
txtNotification.Clear();
|
|
|
|
|
txtNotification.ForeColor = System.Drawing.Color.Black;
|
|
|
|
|
var engines = dbManager.GetAllEngines();
|
|
|
|
|
|
|
|
|
|
foreach (DataRow row in engines.Rows)
|
|
|
|
|
{
|
|
|
|
|
if (DateTime.TryParse(row["VerificationDate"].ToString(), out DateTime verificationDate))
|
|
|
|
|
{
|
|
|
|
|
if (verificationDate <= DateTime.Now.AddMonths(1) && verificationDate > DateTime.Now)
|
|
|
|
|
{
|
|
|
|
|
txtNotification.ForeColor = System.Drawing.Color.Red;
|
|
|
|
|
txtNotification.AppendText(
|
|
|
|
|
$"Двигатель с заводским номером {row["FactoryNumber"]} нуждается в поверке {verificationDate:dd-MM-yyyy}.\r\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (string.IsNullOrEmpty(txtNotification.Text))
|
|
|
|
|
{
|
|
|
|
|
txtNotification.ForeColor = System.Drawing.Color.Black; // Нет уведомлений — чёрный текст
|
|
|
|
|
txtNotification.Text = "Уведомлений нет.";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private class DatabaseManager
|
|
|
|
|
{
|
|
|
|
|
private string connectionString = "Data Source=Engines.db;Version=3;";
|
|
|
|
|
|
|
|
|
|
public void InitializeDatabase()
|
|
|
|
|
{
|
|
|
|
|
using (var connection = new SQLiteConnection(connectionString))
|
|
|
|
|
{
|
|
|
|
|
connection.Open();
|
|
|
|
|
string createTableQuery = @"
|
|
|
|
|
CREATE TABLE IF NOT EXISTS Engines (
|
|
|
|
|
Id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
RegistrationDate TEXT NOT NULL,
|
|
|
|
|
EngineType TEXT NOT NULL,
|
|
|
|
|
Power REAL NOT NULL,
|
|
|
|
|
RPM INTEGER NOT NULL,
|
|
|
|
|
MountingType TEXT NOT NULL,
|
|
|
|
|
UniqueNumber TEXT NOT NULL,
|
|
|
|
|
FactoryNumber TEXT NOT NULL,
|
|
|
|
|
PartNumber TEXT NOT NULL,
|
|
|
|
|
InstallationSite TEXT NOT NULL,
|
|
|
|
|
IsOutOfOrder INTEGER NOT NULL,
|
|
|
|
|
Reason TEXT,
|
|
|
|
|
OutOfOrderDate TEXT
|
|
|
|
|
)";
|
|
|
|
|
SQLiteCommand command = new SQLiteCommand(createTableQuery, connection);
|
|
|
|
|
command.ExecuteNonQuery();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void AddEngine(
|
|
|
|
|
string registrationDate, string engineType, double power, int rpm,
|
|
|
|
|
string mountingType, string uniqueNumber, string factoryNumber,
|
|
|
|
|
string partNumber, string installationSite, bool isOutOfOrder,
|
2025-01-25 01:56:40 +07:00
|
|
|
|
string reason, string outOfOrderDate, string verificationDate)
|
2025-01-25 00:58:39 +07:00
|
|
|
|
{
|
|
|
|
|
using (var connection = new SQLiteConnection(connectionString))
|
|
|
|
|
{
|
|
|
|
|
connection.Open();
|
|
|
|
|
string insertQuery = @"
|
|
|
|
|
INSERT INTO Engines
|
|
|
|
|
(RegistrationDate, EngineType, Power, RPM, MountingType,
|
|
|
|
|
UniqueNumber, FactoryNumber, PartNumber, InstallationSite,
|
2025-01-25 01:56:40 +07:00
|
|
|
|
IsOutOfOrder, Reason, OutOfOrderDate, VerificationDate)
|
2025-01-25 00:58:39 +07:00
|
|
|
|
VALUES
|
|
|
|
|
(@RegistrationDate, @EngineType, @Power, @RPM, @MountingType,
|
|
|
|
|
@UniqueNumber, @FactoryNumber, @PartNumber, @InstallationSite,
|
2025-01-25 01:56:40 +07:00
|
|
|
|
@IsOutOfOrder, @Reason, @OutOfOrderDate, @VerificationDate)";
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
|
|
|
|
SQLiteCommand command = new SQLiteCommand(insertQuery, connection);
|
|
|
|
|
command.Parameters.AddWithValue("@RegistrationDate", registrationDate);
|
|
|
|
|
command.Parameters.AddWithValue("@EngineType", engineType);
|
|
|
|
|
command.Parameters.AddWithValue("@Power", power);
|
|
|
|
|
command.Parameters.AddWithValue("@RPM", rpm);
|
|
|
|
|
command.Parameters.AddWithValue("@MountingType", mountingType);
|
|
|
|
|
command.Parameters.AddWithValue("@UniqueNumber", uniqueNumber);
|
|
|
|
|
command.Parameters.AddWithValue("@FactoryNumber", factoryNumber);
|
|
|
|
|
command.Parameters.AddWithValue("@PartNumber", partNumber);
|
|
|
|
|
command.Parameters.AddWithValue("@InstallationSite", installationSite);
|
|
|
|
|
command.Parameters.AddWithValue("@IsOutOfOrder", isOutOfOrder ? 1 : 0);
|
|
|
|
|
command.Parameters.AddWithValue("@Reason", reason ?? (object)DBNull.Value);
|
|
|
|
|
command.Parameters.AddWithValue("@OutOfOrderDate", outOfOrderDate ?? (object)DBNull.Value);
|
2025-01-25 01:56:40 +07:00
|
|
|
|
command.Parameters.AddWithValue("@VerificationDate", verificationDate ?? (object)DBNull.Value);
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
|
|
|
|
command.ExecuteNonQuery();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public DataTable GetAllEngines()
|
|
|
|
|
{
|
|
|
|
|
using (var connection = new SQLiteConnection(connectionString))
|
|
|
|
|
{
|
|
|
|
|
connection.Open();
|
|
|
|
|
|
|
|
|
|
string selectQuery = @"
|
2025-01-25 01:56:40 +07:00
|
|
|
|
SELECT
|
|
|
|
|
Id, RegistrationDate, EngineType, Power, RPM, MountingType,
|
|
|
|
|
UniqueNumber, FactoryNumber, PartNumber, InstallationSite,
|
|
|
|
|
IsOutOfOrder, Reason, OutOfOrderDate, VerificationDate
|
|
|
|
|
FROM Engines";
|
|
|
|
|
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SQLiteDataAdapter adapter = new SQLiteDataAdapter(selectQuery, connection);
|
|
|
|
|
DataTable table = new DataTable();
|
|
|
|
|
adapter.Fill(table);
|
|
|
|
|
return table;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void DeleteEngine(int id)
|
|
|
|
|
{
|
|
|
|
|
using (var connection = new SQLiteConnection(connectionString))
|
|
|
|
|
{
|
|
|
|
|
connection.Open();
|
|
|
|
|
string deleteQuery = "DELETE FROM Engines WHERE Id = @Id";
|
|
|
|
|
SQLiteCommand command = new SQLiteCommand(deleteQuery, connection);
|
|
|
|
|
command.Parameters.AddWithValue("@Id", id);
|
|
|
|
|
command.ExecuteNonQuery();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public DataTable ExecuteQuery(string query)
|
|
|
|
|
{
|
|
|
|
|
using (var connection = new SQLiteConnection(connectionString))
|
|
|
|
|
{
|
|
|
|
|
connection.Open();
|
|
|
|
|
SQLiteDataAdapter adapter = new SQLiteDataAdapter(query, connection);
|
|
|
|
|
DataTable table = new DataTable();
|
|
|
|
|
adapter.Fill(table);
|
|
|
|
|
return table;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-25 01:56:40 +07:00
|
|
|
|
public void UpdateDatabaseSchema()
|
|
|
|
|
{
|
|
|
|
|
using (var connection = new SQLiteConnection(connectionString))
|
|
|
|
|
{
|
|
|
|
|
connection.Open();
|
|
|
|
|
string addColumnQuery = @"
|
|
|
|
|
ALTER TABLE Engines ADD COLUMN VerificationDate TEXT";
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
SQLiteCommand command = new SQLiteCommand(addColumnQuery, connection);
|
|
|
|
|
command.ExecuteNonQuery();
|
|
|
|
|
}
|
|
|
|
|
catch (SQLiteException ex)
|
|
|
|
|
{
|
|
|
|
|
if (!ex.Message.Contains("duplicate column name")) // Игнорируем, если столбец уже существует
|
|
|
|
|
{
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-25 00:58:39 +07:00
|
|
|
|
|
|
|
|
|
|
2025-01-24 22:28:05 +07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|