RB_ningyang/databaseutils.cpp
2026-01-22 19:08:28 +08:00

813 lines
27 KiB
C++

#include "databaseutils.h"
/*
*
"all_count INTEGER DEFAULT 0," 总检验次数
"manual_cnt INTEGER DEFAULT 0," 手动检验次数
"auto_cnt INTEGER DEFAULT 0," 自动检验次数
"up_cnt INTEGER DEFAULT 0," 超过大于范围的电阻值
"down_cnt INTEGER DEFAULT 0," 超过小于范围的电阻值
"max_res INTEGER DEFAULT 0," 检测范围范最大电阻值
"min_res INTEGER DEFAULT 0," 检测范围范最小电阻值
"auto_time INTEGER DEFAULT 1," 自动检测重复时间
"auto_sd INTEGER DEFAULT 5," 自动检测误差允许
"chexing TEXT DEFAULT ''," 车型
"sm_num INTEGER DEFAULT 0)"; 护面扫码编号
*
* */
namespace DatabaseUtils
{
QSqlDatabase db;
bool init_Database()
{
db = QSqlDatabase::database();
if (!db.isValid())
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("RB_RES.db");
}
if (!db.open())
{
qDebug() << "Error: Unable to open the database";
return false;
}
QSqlQuery query;
// value 阻值 state 0正常 1过大 2过小 flag 0手动 1自动
QString createResDataTable = "CREATE TABLE IF NOT EXISTS res_data_t ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"chexing TEXT DEFAULT '',"
"sm_num TEXT DEFAULT '',"
"hot_num TEXT DEFAULT '',"
"value REAL,"
"detect TEXT DEFAULT '',"
"state TEXT DEFAULT '',"
"flag TEXT DEFAULT '',"
"name TEXT DEFAULT '',"
"timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)";
if (!query.exec(createResDataTable))
{
qDebug() << "Error: Unable to create res_data_t table" << query.lastError();
}
// 检查并添加 hot_num 列(兼容旧数据库)
query.exec("ALTER TABLE res_data_t ADD COLUMN hot_num TEXT DEFAULT ''");
// 日检验次数 手动检测次数 合格 过大 过小 最大值 最小值 合格率 日期
QString createDailyInspectionTable = "CREATE TABLE IF NOT EXISTS daily_data_t ("
"ID INTEGER PRIMARY KEY AUTOINCREMENT,"
"daily_inspection_count INTEGER,"
"manual_inspection_count INTEGER,"
"qualified INTEGER,"
"over_limit INTEGER,"
"under_limit INTEGER,"
"max_value REAL,"
"min_value REAL,"
"qualification_rate REAL,"
"date DATE)";
if (!query.exec(createDailyInspectionTable))
{
qDebug() << "Error: Unable to create daily_data_t table" << query.lastError();
}
QString createInfoTable = "CREATE TABLE IF NOT EXISTS info_t ("
"all_count INTEGER DEFAULT 0," // 总次数
"manual_cnt INTEGER DEFAULT 0," // 手动检测次数
"auto_cnt INTEGER DEFAULT 0," // 自动检测次数
"qualified_cnt INTEGER DEFAULT 0," // 合格次数
"up_cnt INTEGER DEFAULT 0," // 超过最大范围次数
"down_cnt INTEGER DEFAULT 0," // 超过最小范围次数
"res_value REAL DEFAULT 0," // 电阻标准值
"res_sd REAL DEFAULT 0," // 电阻误差范围
"max_res REAL DEFAULT 0," // 最大阻值
"min_res REAL DEFAULT 0," // 最小阻值
"auto_time INTEGER DEFAULT 3," // 自动检测时间
"xc_sd REAL DEFAULT 0," // 线材阻值
"name TEXT DEFAULT ''," // 姓名
"pwd TEXT DEFAULT ''," // 密码
"chexing TEXT DEFAULT ''," // 车型
"sm_num TEXT DEFAULT ''," // 护面扫码编号
"hot_num TEXT DEFAULT '')"; // 加热垫扫码编号
QString checkTableEmpty = "SELECT COUNT(*) FROM info_t";
QString insertInitialData = "INSERT INTO info_t (all_count, manual_cnt, auto_cnt, qualified_cnt, up_cnt, down_cnt, res_value, res_sd,max_res, min_res, auto_time, xc_sd, name, pwd, chexing, sm_num, hot_num) "
"VALUES (0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0, 3, 0.0, '', 'nuobo123', '', '', '');";
if (!query.exec(createInfoTable))
{
qDebug() << "Error: Unable to create info_t table" << query.lastError();
}
// 检查并添加 hot_num 列(兼容旧数据库)
query.exec("ALTER TABLE info_t ADD COLUMN hot_num TEXT DEFAULT ''");
if (query.exec(checkTableEmpty))
{
if (query.next() && query.value(0).toInt() == 0)
{
if (!query.exec(insertInitialData))
{
qDebug() << "Error inserting initial data:" << query.lastError();
}
}
}
else
{
qDebug() << "Error checking table:" << query.lastError();
}
return true;
// db.close();
}
bool closeDatabase()
{
if (db.isOpen())
{
db.close();
return true;
}
return false;
}
bool insert_ResData(const QString &chexing, const QString &sm_num, const QString &hot_num, double value, const QString &detect, const QString &state, const QString &flag, const QString &name)
{
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return false;
}
}
QSqlQuery query(db);
query.prepare("INSERT INTO res_data_t (chexing, sm_num, hot_num, value, detect, state, flag, name, timestamp) VALUES (:chexing, :sm_num, :hot_num, :value, :detect, :state, :flag, :name, datetime('now', 'localtime'))");
query.bindValue(":chexing", chexing);
query.bindValue(":sm_num", sm_num);
query.bindValue(":hot_num", hot_num);
query.bindValue(":value", value);
query.bindValue(":detect", detect);
query.bindValue(":state", state);
query.bindValue(":flag", flag);
query.bindValue(":name", name);
if (!query.exec())
{
qDebug() << "Error: Unable to insert data into res_data_t table" << query.lastError();
return false;
}
return true;
}
int delete_ResData(int id)
{
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return -1;
}
}
QSqlQuery query(db);
query.prepare("DELETE FROM res_data_t WHERE id = :id");
query.bindValue(":id", id);
if (!query.exec())
{
qDebug() << "Error: Unable to delete data from res_data_t table" << query.lastError();
return -1;
}
// 没有行受到影响
if (query.numRowsAffected() == 0)
{
qDebug() << "Warning: No data deleted, ID not found";
return 0;
}
return 1;
}
bool update_ResData(int id, const QString &chexing, const QString &sm_num, const QString &hot_num, double value, const QString &detect, const QString &state, const QString &flag, const QString &name)
{
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return false;
}
}
QSqlQuery query(db);
query.prepare("UPDATE res_data_t SET chexing = :chexing, sm_num = :sm_num, hot_num = :hot_num, value = :value, detect = :detect, state = :state, flag = :flag, name = :name WHERE id = :id");
query.bindValue(":chexing", chexing);
query.bindValue(":sm_num", sm_num);
query.bindValue(":hot_num", hot_num);
query.bindValue(":value", value);
query.bindValue(":detect", detect);
query.bindValue(":state", state);
query.bindValue(":flag", flag);
query.bindValue(":name", name);
query.bindValue(":id", id);
if (!query.exec())
{
qDebug() << "Error: Unable to update data in res_data_t table" << query.lastError();
return false;
}
return true;
}
QList<QVariantMap> read_ResData()
{
QList<QVariantMap> dataList;
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return dataList;
}
}
QSqlQuery query(db);
if (!query.exec("SELECT * FROM res_data_t"))
{
qDebug() << "Error: Unable to read data from res_data_t table" << query.lastError();
return dataList;
}
while (query.next())
{
QVariantMap data;
data["id"] = query.value("id");
data["chexing"] = query.value("chexing");
data["sm_num"] = query.value("sm_num");
data["hot_num"] = query.value("hot_num");
data["value"] = query.value("value");
data["detect"] = query.value("detect");
data["state"] = query.value("state");
data["flag"] = query.value("flag");
data["name"] = query.value("name");
data["timestamp"] = query.value("timestamp");
dataList.append(data);
}
return dataList;
}
int getResTotalRows()
{
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return 0;
}
}
QSqlQuery query(db);
query.prepare("SELECT COUNT(*) FROM res_data_t");
if (query.exec() && query.next())
{
return query.value(0).toInt();
}
return 0;
}
QVector<QVariantList> getData(int limit, int offset)
{
QVector<QVariantList> data;
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return data;
}
}
QSqlQuery query(db);
query.prepare("SELECT * FROM res_data_t ORDER BY id LIMIT :limit OFFSET :offset");
query.bindValue(":limit", limit);
query.bindValue(":offset", offset);
if (query.exec())
{
while (query.next())
{
QVariantList row;
for (int i = 0; i < query.record().count(); ++i)
{
row.append(query.value(i));
}
data.append(row);
}
}
else
{
qDebug() << "Error: Unable to fetch data from res_data_t table" << query.lastError();
}
return data;
}
bool insertTestData(int numRows)
{
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return false;
}
}
QSqlQuery query(db);
query.prepare("INSERT INTO res_data_t (chexing, sm_num, hot_num, value, detect, state, flag, name, timestamp) VALUES (:chexing, :sm_num, :hot_num, :value, :detect, :state, :flag, :name, datetime('now', 'localtime'))");
db.transaction();
for (int i = 1; i <= numRows; ++i)
{
query.bindValue(":chexing", QString("chexing%1").arg(i));
query.bindValue(":sm_num", QString("sm_num%1").arg(i));
query.bindValue(":hot_num", QString("hot_num%1").arg(i));
query.bindValue(":value", i * 1.0);
query.bindValue(":detect", QString("detect%1").arg(i));
query.bindValue(":state", QString("state%1").arg(i));
query.bindValue(":flag", QString("flag%1").arg(i));
query.bindValue(":name", QString("name%1").arg(i));
if (!query.exec())
{
db.rollback();
qDebug() << "Error inserting data:" << query.lastError();
return false;
}
}
db.commit();
return true;
}
QVector<QVariantList> getAllData()
{
QVector<QVariantList> data;
if (!db.isOpen() && !db.open())
{
if (!init_Database())
{
qDebug() << "Error: Unable to open the database";
return data;
}
}
QSqlQuery query(db);
// 明确指定列顺序,确保与导出表头匹配
if (!query.exec("SELECT id, chexing, sm_num, hot_num, value, detect, state, flag, name, timestamp FROM res_data_t"))
{
qDebug() << "Error: failed to execute query -" << query.lastError();
return data;
}
while (query.next())
{
QVariantList row;
for (int i = 0; i < query.record().count(); ++i)
{
row.append(query.value(i));
}
data.append(row);
}
return data;
}
bool insert_Info_t(const QString &column, const QVariant &value)
{
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
if (!init_Database())
{
return false;
}
}
QSqlQuery query(db);
query.prepare("SELECT COUNT(*) FROM info_t");
if (!query.exec() || !query.next())
{
qDebug() << "Error: Unable to check data in info_t table" << query.lastError();
return false;
}
int count = query.value(0).toInt();
if (count == 0)
{
query.prepare(QString("INSERT INTO info_t (%1) VALUES (:value)").arg(column));
}
else
{
query.prepare(QString("UPDATE info_t SET %1 = :value").arg(column));
}
query.bindValue(":value", value);
if (!query.exec())
{
qDebug() << "Error: Unable to insert/update data in info_t table" << query.lastError();
return false;
}
return true;
}
bool update_Info_t(const QString &column, const QVariant &value)
{
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
if (!init_Database())
{
return false;
}
}
QSqlQuery query(db);
query.prepare(QString("UPDATE info_t SET %1 = :value").arg(column));
query.bindValue(":value", value);
if (!query.exec())
{
qDebug() << "Error: Unable to update data in info_t table" << query.lastError();
return false;
}
return true;
}
QVariant read_Info_t(const QString &column)
{
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
if (!init_Database())
{
return QVariant();
}
}
QSqlQuery query(db);
query.prepare(QString("SELECT %1 FROM info_t").arg(column));
if (!query.exec())
{
qDebug() << "Error: Unable to read data from info_t table" << query.lastError();
return QVariant();
}
if (query.next())
{
return query.value(0);
}
return QVariant();
}
bool delete_Info_t()
{
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
if (!init_Database())
{
return false;
}
}
QSqlQuery query(db);
query.prepare("DELETE FROM info_t");
if (!query.exec())
{
qDebug() << "Error: Unable to clear data from info_t table" << query.lastError();
return false;
}
return true;
}
QMap<QString, QVariant> read_all_Info_t()
{
QMap<QString, QVariant> data;
QSqlDatabase db = QSqlDatabase::database();
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
if (!init_Database())
{
return data;
}
}
QSqlQuery query(db);
query.prepare("SELECT * FROM info_t");
if (!query.exec())
{
qDebug() << "Error: Unable to read data from info_t table" << query.lastError();
return data;
}
if (query.next())
{
for (int i = 0; i < query.record().count(); ++i)
{
QString columnName = query.record().fieldName(i);
data[columnName] = query.value(i);
}
}
return data;
}
bool insertOrUpdateDailyData(int daily_inspection_count, int manual_inspection_count, int qualified, int over_limit, int under_limit, double max_value, double min_value, double qualification_rate)
{
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
if (!init_Database())
{
return false;
}
}
QSqlQuery query(db);
QString currentDate = QDate::currentDate().toString("yyyy-MM-dd");
query.prepare("SELECT ID, date FROM daily_data_t ORDER BY ID DESC LIMIT 1");
if (!query.exec())
{
qDebug() << "Error: Unable to retrieve data from daily_data_t table" << query.lastError();
return false;
}
int latestId = -1;
QString latestDate;
if (query.next())
{
latestId = query.value(0).toInt();
latestDate = query.value(1).toString();
}
// qDebug() << "latestDate:" << latestDate;
// qDebug() << "currentDate:" << currentDate;
QString latestDateOnly = latestDate.left(10);
// qDebug() << "latestDateOnly:" << latestDateOnly;
if (latestDateOnly == currentDate)
{
query.prepare("UPDATE daily_data_t SET daily_inspection_count = :daily_inspection_count, "
"manual_inspection_count = :manual_inspection_count, qualified = :qualified, "
"over_limit = :over_limit, under_limit = :under_limit, max_value = :max_value, "
"min_value = :min_value, qualification_rate = :qualification_rate "
"WHERE ID = :id");
query.bindValue(":id", latestId);
}
else
{
query.prepare("INSERT INTO daily_data_t (daily_inspection_count, manual_inspection_count, qualified, over_limit, under_limit, max_value, min_value, qualification_rate, date) "
"VALUES (:daily_inspection_count, :manual_inspection_count, :qualified, :over_limit, :under_limit, :max_value, :min_value, :qualification_rate, datetime('now', 'localtime'))");
}
query.bindValue(":daily_inspection_count", daily_inspection_count);
query.bindValue(":manual_inspection_count", manual_inspection_count);
query.bindValue(":qualified", qualified);
query.bindValue(":over_limit", over_limit);
query.bindValue(":under_limit", under_limit);
query.bindValue(":max_value", max_value);
query.bindValue(":min_value", min_value);
query.bindValue(":qualification_rate", qualification_rate);
if (!query.exec())
{
qDebug() << "Error: Unable to insert or update data in daily_data_t table" << query.lastError();
return false;
}
return true;
}
QList<QVariantList> getLastFiveDailyDataSkippingToday()
{
QList<QVariantList> dataList;
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
return dataList;
}
QSqlQuery query(db);
QString currentDate = QDate::currentDate().toString("yyyy-MM-dd");
query.prepare("SELECT date FROM daily_data_t ORDER BY ID DESC LIMIT 1");
if (!query.exec())
{
qDebug() << "Error: Unable to retrieve data from daily_data_t table" << query.lastError();
return dataList;
}
QString latestDate;
if (query.next())
{
latestDate = query.value(0).toString();
}
QString latestDateOnly = latestDate.left(10);
// qDebug() << "currentDate:" << currentDate;
// qDebug() << "latestDateOnly:" << latestDateOnly;
if (latestDateOnly == currentDate)
{
query.prepare("SELECT ID, daily_inspection_count, manual_inspection_count, qualified, over_limit, under_limit, max_value, min_value, qualification_rate, date "
"FROM daily_data_t WHERE date < :currentDate ORDER BY ID DESC LIMIT 5");
query.bindValue(":currentDate", currentDate);
}
else
{
query.prepare("SELECT ID, daily_inspection_count, manual_inspection_count, qualified, over_limit, under_limit, max_value, min_value, qualification_rate, date "
"FROM daily_data_t ORDER BY ID DESC LIMIT 5");
}
if (!query.exec())
{
qDebug() << "Error: Unable to retrieve data from daily_data_t table" << query.lastError();
return dataList;
}
while (query.next())
{
QVariantList row;
row << query.value(0) // ID
<< query.value(1) // daily_inspection_count
<< query.value(2) // manual_inspection_count
<< query.value(3) // qualified
<< query.value(4) // over_limit
<< query.value(5) // under_limit
<< query.value(6) // max_value
<< query.value(7) // min_value
<< query.value(8) // qualification_rate
<< query.value(9); // date
dataList.append(row);
}
return dataList;
}
QString get_today_daliy_t(int &daily_cnt, int &daily_cnt_manual,
int &daily_qualified_cnt, int &daily_cnt_over,
int &daily_cnt_down, double &daily_cnt_max,
double &daily_cnt_min)
{
if (!db.isOpen() && !db.open())
{
qDebug() << "Error: Unable to open the database";
return "";
}
QSqlQuery query(db);
QString currentDate = QDate::currentDate().toString("yyyy-MM-dd");
// qDebug() << "Current date: " << currentDate;
query.prepare("SELECT date FROM daily_data_t ORDER BY ID DESC LIMIT 1");
if (!query.exec())
{
qDebug() << "Error: Unable to retrieve data from daily_data_t table" << query.lastError();
return "";
}
QString latestDate;
if (query.next())
{
latestDate = query.value(0).toString();
// qDebug() << "Latest date in database: " << latestDate;
}
else
{
qDebug() << "No records found in daily_data_t table";
return "";
}
QString latestDateOnly = latestDate.left(10);
// qDebug() << "Latest date only: " << latestDateOnly;
if (latestDateOnly == currentDate)
{
query.prepare("SELECT daily_inspection_count, manual_inspection_count, qualified, over_limit, under_limit, max_value, min_value "
"FROM daily_data_t WHERE date(date) = :date");
query.bindValue(":date", currentDate);
if (!query.exec())
{
qDebug() << "Error: Unable to retrieve today's data from daily_data_t table" << query.lastError();
return "";
}
if (query.next())
{
daily_cnt = query.value(0).toInt(); // daily_inspection_count
// qDebug() << "daily_cnt db " << daily_cnt;
daily_cnt_manual = query.value(1).toInt(); // manual_inspection_count
daily_qualified_cnt = query.value(2).toInt(); // qualified
daily_cnt_over = query.value(3).toInt(); // over_limit
daily_cnt_down = query.value(4).toInt(); // under_limit
daily_cnt_max = query.value(5).toDouble(); // max_value
daily_cnt_min = query.value(6).toDouble(); // min_value
}
else
{
qDebug() << "No data found for today's date";
return "";
}
return latestDateOnly;
}
else
{
daily_cnt = 0;
daily_cnt_manual = 0;
daily_qualified_cnt = 0;
daily_cnt_over = 0;
daily_cnt_down = 0;
daily_cnt_max = 0;
daily_cnt_min = 0;
qDebug() << "Latest date does not match current date";
return "";
}
}
bool updateLastDate()
{
if (!db.isOpen())
{
qWarning() << "Database is not open!";
return false;
}
QSqlQuery query(db);
if (!query.exec("SELECT date FROM daily_data_t ORDER BY ID DESC LIMIT 1"))
{
qWarning() << "Failed to execute query:" << query.lastError().text();
return false;
}
if (!query.next())
{
qWarning() << "No records found in the table.";
return false;
}
QDate lastDate = query.value(0).toDate();
qDebug() << "Last date in the table:" << lastDate;
QDate newDate = lastDate.addDays(-1);
qDebug() << "New date after subtracting one day:" << newDate;
QSqlQuery updateQuery(db);
updateQuery.prepare("UPDATE daily_data_t SET date = :newDate WHERE ID = (SELECT MAX(ID) FROM daily_data_t)");
updateQuery.bindValue(":newDate", newDate);
if (!updateQuery.exec())
{
qWarning() << "Failed to update date:" << updateQuery.lastError().text();
return false;
}
qDebug() << "Date updated successfully.";
return true;
}
}