#include "randommanager.h" #include #include RandomManager::RandomManager(QObject *parent) : QObject(parent) , m_database(nullptr) { } RandomManager::~RandomManager() { // Сохраняем данные при уничтожении if (m_database) { saveToDatabase(); } } bool RandomManager::initialize(uDataBase *database) { if (!database || !database->isConnected()) { qWarning() << "RandomManager: База данных не подключена"; return false; } m_database = database; return loadFromDatabase(); } bool RandomManager::addRange(const QString &name, int startValue, int endValue) { // Проверка входных данных if (name.isEmpty()) { qWarning() << "RandomManager: Нельзя добавить диапазон с пустым именем"; return false; } if (!isValidRange(startValue, endValue)) { qWarning() << "RandomManager: Некорректный диапазон:" << startValue << "-" << endValue; return false; } // Проверка на дубликат if (contains(name)) { qWarning() << "RandomManager: Диапазон с именем" << name << "уже существует"; return false; } // Добавляем в список RandomStruct newRange(name, startValue, endValue); m_ranges.append(newRange); // Сохраняем в БД if (!saveToDatabase()) { m_ranges.removeLast(); // Откатываем если не удалось сохранить return false; } emit rangeAdded(name, startValue, endValue); emit dataChanged(); qDebug() << "RandomManager: Добавлен диапазон" << name << startValue << "-" << endValue; return true; } bool RandomManager::removeRange(const QString &name) { int index = findIndex(name); if (index == -1) { qWarning() << "RandomManager: Диапазон" << name << "не найден"; return false; } // Сохраняем данные для сигнала RandomStruct removedRange = m_ranges.at(index); // Удаляем из списка m_ranges.removeAt(index); // Сохраняем в БД if (!saveToDatabase()) { // Откатываем изменения m_ranges.insert(index, removedRange); return false; } emit rangeRemoved(name); emit dataChanged(); qDebug() << "RandomManager: Удален диапазон" << name; return true; } bool RandomManager::updateRange(const QString &oldName, const QString &newName, int startValue, int endValue) { int index = findIndex(oldName); if (index == -1) { qWarning() << "RandomManager: Диапазон" << oldName << "не найден"; return false; } if (!isValidRange(startValue, endValue)) { qWarning() << "RandomManager: Некорректный диапазон:" << startValue << "-" << endValue; return false; } // Проверяем, не занято ли новое имя другим диапазоном (если имя изменилось) if (oldName != newName && contains(newName)) { qWarning() << "RandomManager: Имя" << newName << "уже занято"; return false; } // Сохраняем старые данные для отката RandomStruct oldRange = m_ranges.at(index); // Обновляем m_ranges[index].name = newName; m_ranges[index].startValue = startValue; m_ranges[index].endValue = endValue; // Сохраняем в БД if (!saveToDatabase()) { // Откатываем изменения m_ranges[index] = oldRange; return false; } emit rangeUpdated(oldName, newName); emit dataChanged(); qDebug() << "RandomManager: Обновлен диапазон" << oldName << "->" << newName << startValue << "-" << endValue; return true; } bool RandomManager::contains(const QString &name) const { return findIndex(name) != -1; } int RandomManager::getRandomValue(const QString &name) const { int index = findIndex(name); if (index == -1) { qWarning() << "RandomManager: Диапазон" << name << "не найден"; return 0; } const RandomStruct &range = m_ranges.at(index); if (range.startValue == range.endValue) { return range.startValue; } int min = qMin(range.startValue, range.endValue); int max = qMax(range.startValue, range.endValue); return QRandomGenerator::global()->bounded(min, max + 1); } QPair RandomManager::getRange(const QString &name) const { int index = findIndex(name); if (index == -1) { return qMakePair(0, 0); } const RandomStruct &range = m_ranges.at(index); return qMakePair(range.startValue, range.endValue); } bool RandomManager::saveToDatabase() { if (!m_database) { qWarning() << "RandomManager: База данных не установлена"; return false; } // Создаем временную таблицу для сохранения QTableWidget tempTable; // Настраиваем таблицу QStringList headers; headers << "Имя" << "От" << "До"; tempTable.setColumnCount(headers.size()); tempTable.setHorizontalHeaderLabels(headers); // Заполняем таблицу данными tempTable.setRowCount(m_ranges.size()); for (int i = 0; i < m_ranges.size(); ++i) { const RandomStruct &range = m_ranges.at(i); // Имя QTableWidgetItem *nameItem = new QTableWidgetItem(range.name); tempTable.setItem(i, 0, nameItem); // Начальное значение QTableWidgetItem *startItem = new QTableWidgetItem(QString::number(range.startValue)); startItem->setTextAlignment(Qt::AlignCenter); tempTable.setItem(i, 1, startItem); // Конечное значение QTableWidgetItem *endItem = new QTableWidgetItem(QString::number(range.endValue)); endItem->setTextAlignment(Qt::AlignCenter); tempTable.setItem(i, 2, endItem); } // Сохраняем в БД // Используем метод SaveTableWidget, который сохраняет данные в соответствующую таблицу m_database->SaveTableWidget(&tempTable); qDebug() << "RandomManager: Сохранено" << m_ranges.size() << "диапазонов в БД"; return true; } bool RandomManager::loadFromDatabase() { if (!m_database) { qWarning() << "RandomManager: База данных не установлена"; return false; } // Создаем временную таблицу для загрузки QTableWidget tempTable; // Настраиваем таблицу QStringList headers; headers << "Имя" << "От" << "До"; tempTable.setColumnCount(headers.size()); tempTable.setHorizontalHeaderLabels(headers); // Загружаем данные из БД m_database->LoadTableWidget(&tempTable); // Очищаем текущий список m_ranges.clear(); // Заполняем список из таблицы for (int row = 0; row < tempTable.rowCount(); ++row) { QTableWidgetItem *nameItem = tempTable.item(row, 0); QTableWidgetItem *startItem = tempTable.item(row, 1); QTableWidgetItem *endItem = tempTable.item(row, 2); if (!nameItem || !startItem || !endItem) { qWarning() << "RandomManager: Пропущена строка" << row << "из-за отсутствия данных"; continue; } QString name = nameItem->text().trimmed(); if (name.isEmpty()) { qWarning() << "RandomManager: Пропущена строка" << row << "с пустым именем"; continue; } bool okStart, okEnd; int startValue = startItem->text().toInt(&okStart); int endValue = endItem->text().toInt(&okEnd); if (!okStart || !okEnd) { qWarning() << "RandomManager: Некорректные числовые значения в строке" << row; continue; } if (!isValidRange(startValue, endValue)) { qWarning() << "RandomManager: Некорректный диапазон в строке" << row << startValue << "-" << endValue; continue; } m_ranges.append(RandomStruct(name, startValue, endValue)); } qDebug() << "RandomManager: Загружено" << m_ranges.size() << "диапазонов из БД"; emit dataChanged(); return true; } bool RandomManager::isValidRange(int start, int end) const { // Допускаются любые целые числа, даже если start > end // Мы будем использовать qMin и qMax при генерации случайного числа return true; } int RandomManager::findIndex(const QString &name) const { for (int i = 0; i < m_ranges.size(); ++i) { if (m_ranges.at(i).name == name) { return i; } } return -1; }