From d84b1d2d512a3deee69dc2090c54e8a2e2765569 Mon Sep 17 00:00:00 2001 From: bobpan Date: Wed, 7 Apr 2021 16:04:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0lpreport=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E8=BD=AF=E4=BB=B6=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tpvs17/lpReport/DetectDataDB.cpp | 391 +++++ tpvs17/lpReport/DetectDataDB.h | 34 + tpvs17/lpReport/InfoFile.h | 63 + tpvs17/lpReport/ModelDB.cpp | 47 + tpvs17/lpReport/ModelDB.h | 33 + tpvs17/lpReport/Resources/Log.png | Bin 0 -> 31091 bytes tpvs17/lpReport/Resources/log.ico | Bin 0 -> 55665 bytes tpvs17/lpReport/checkdata.h | 70 + tpvs17/lpReport/checkthread.h | 53 + tpvs17/lpReport/countdata.h | 84 + tpvs17/lpReport/databasesql.cpp | 165 ++ tpvs17/lpReport/databasesql.h | 74 + tpvs17/lpReport/gensql.cpp | 116 ++ tpvs17/lpReport/gensql.h | 15 + tpvs17/lpReport/lpReport.aps | Bin 0 -> 57792 bytes tpvs17/lpReport/lpReport.cpp | 1337 +++++++++++++++ tpvs17/lpReport/lpReport.h | 130 ++ tpvs17/lpReport/lpReport.qrc | 6 + tpvs17/lpReport/lpReport.rc | Bin 0 -> 3244 bytes tpvs17/lpReport/lpReport.ui | 1918 ++++++++++++++++++++++ tpvs17/lpReport/lpReport.vcxproj | 232 +++ tpvs17/lpReport/lpReport.vcxproj.filters | 141 ++ tpvs17/lpReport/lpReport.vcxproj.user | 15 + tpvs17/lpReport/main.cpp | 10 + tpvs17/lpReport/qcheckcal.cpp | 12 + tpvs17/lpReport/qcheckcal.h | 18 + tpvs17/lpReport/qreportwidget.cpp | 186 +++ tpvs17/lpReport/qreportwidget.h | 51 + tpvs17/lpReport/qsavecsvthread.h | 124 ++ tpvs17/lpReport/qtimedlg.cpp | 131 ++ tpvs17/lpReport/qtimedlg.h | 477 ++++++ tpvs17/lpReport/qtimedlg.ui | 611 +++++++ tpvs17/lpReport/resource.h | 16 + tpvs17/lpReport/testwidget.cpp | 103 ++ tpvs17/lpReport/testwidget.h | 22 + tpvs17/lpReport/testwidget.ui | 35 + tpvs17/lpReport/waitingdialog.cpp | 50 + tpvs17/lpReport/waitingdialog.h | 28 + tpvs17/lpReport/workfordb.h | 32 + tpvs17/wheel.sln | 52 +- 40 files changed, 6881 insertions(+), 1 deletion(-) create mode 100644 tpvs17/lpReport/DetectDataDB.cpp create mode 100644 tpvs17/lpReport/DetectDataDB.h create mode 100644 tpvs17/lpReport/InfoFile.h create mode 100644 tpvs17/lpReport/ModelDB.cpp create mode 100644 tpvs17/lpReport/ModelDB.h create mode 100644 tpvs17/lpReport/Resources/Log.png create mode 100644 tpvs17/lpReport/Resources/log.ico create mode 100644 tpvs17/lpReport/checkdata.h create mode 100644 tpvs17/lpReport/checkthread.h create mode 100644 tpvs17/lpReport/countdata.h create mode 100644 tpvs17/lpReport/databasesql.cpp create mode 100644 tpvs17/lpReport/databasesql.h create mode 100644 tpvs17/lpReport/gensql.cpp create mode 100644 tpvs17/lpReport/gensql.h create mode 100644 tpvs17/lpReport/lpReport.aps create mode 100644 tpvs17/lpReport/lpReport.cpp create mode 100644 tpvs17/lpReport/lpReport.h create mode 100644 tpvs17/lpReport/lpReport.qrc create mode 100644 tpvs17/lpReport/lpReport.rc create mode 100644 tpvs17/lpReport/lpReport.ui create mode 100644 tpvs17/lpReport/lpReport.vcxproj create mode 100644 tpvs17/lpReport/lpReport.vcxproj.filters create mode 100644 tpvs17/lpReport/lpReport.vcxproj.user create mode 100644 tpvs17/lpReport/main.cpp create mode 100644 tpvs17/lpReport/qcheckcal.cpp create mode 100644 tpvs17/lpReport/qcheckcal.h create mode 100644 tpvs17/lpReport/qreportwidget.cpp create mode 100644 tpvs17/lpReport/qreportwidget.h create mode 100644 tpvs17/lpReport/qsavecsvthread.h create mode 100644 tpvs17/lpReport/qtimedlg.cpp create mode 100644 tpvs17/lpReport/qtimedlg.h create mode 100644 tpvs17/lpReport/qtimedlg.ui create mode 100644 tpvs17/lpReport/resource.h create mode 100644 tpvs17/lpReport/testwidget.cpp create mode 100644 tpvs17/lpReport/testwidget.h create mode 100644 tpvs17/lpReport/testwidget.ui create mode 100644 tpvs17/lpReport/waitingdialog.cpp create mode 100644 tpvs17/lpReport/waitingdialog.h create mode 100644 tpvs17/lpReport/workfordb.h diff --git a/tpvs17/lpReport/DetectDataDB.cpp b/tpvs17/lpReport/DetectDataDB.cpp new file mode 100644 index 0000000..f6604d4 --- /dev/null +++ b/tpvs17/lpReport/DetectDataDB.cpp @@ -0,0 +1,391 @@ +#include "DetectDataDB.h" +#include "InfoFile.h" +#include "gensql.h" + +#define _MD_WARNINGTABLE "warningtable" +/*myself */ +#define _MD_PRIMARY_KEY "uid" +#define _MD_TABLE_FORMS_MANE "wftable" //数据表名称 + +#define _MD_MODEL "model" //model 模型名称 +#define _MD_DIAMETER "diameter" //直径 +#define _MD_HIGHT "hight" //高度 +#define _MD_CORRELATE "correlate" //相似度 +#define _MD_CHANNEL "channel" //通道 +#define _MD_PICPATH "picpath" //图片路径 +#define _MD_ROTATE "rotate"//辐条个数 +#define _MD_UPDATE_TIME "time" //最后更新的时间 +#define _MD_PIC "pic" //图片 + + +#define _MD_TIMETABLE "wftimetable_2" +#define _MD_TYPE "type" +#define _MD_STARTTIME "starttime" +#define _MD_ENDTIME "endtime" +#define _MD_TIMETYPY_S "startType" +#define _MD_TIMETYPY_E "EndType" + +#define _MD_WARNINGTABLE "warningtable" +#define _MD_MESSAGE "message" +#define _MD_CLASS "class" +#define _INDEX_FORTABLE "CREATE INDEX idx_wftable ON wftable (time COLLATE BINARY ASC); " +DetectDataDB::DetectDataDB(const QString& dbName,const QString &dbType) :DataBaseSql(dbName,dbType) +{ +// db = QSqlDatabase::addDatabase("QSQLITE"); +// db.setDatabaseName(dbName); +// if (!dbUser.isEmpty()){ +// db.setUserName(dbUser); +// db.setPassword(dbPwb); +// } +} + +DetectDataDB::~DetectDataDB() +{ + +} +//m_value.insert("time1", "");//起始时间 +//m_value.insert("time2", "");//结束时间 +//m_value.insert("name", "");//模型名字 +//m_value.insert("Type", "");//查询类型 +QString DataBaseSql::genCheckStr(QVariantMap m_value) +{ + int nType = m_value.value(_CHECK_TYPE_).toInt(); + QString select_sql; + switch (nType) + { + case EMT_CHECK_BY_TIME: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString strFifter = QString(" where time ='%1'").arg(time1); + int IsCount = m_value.value(_CHECK_COUNT_).toInt(0); + if (IsCount==1) + select_sql = QString("select count(*) from ") + _MD_TABLE_FORMS_MANE + strFifter; + else + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + break; + case EMT_CHECK_BY_NAME: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + QString modelname = m_value.value(_CHECK_NAME_).toString(); + QString strFifter = QString(" where time >'%1' and time < '%2' and model='%3'").arg(time1).arg(time2).arg(modelname); + int IsCount = m_value.value(_CHECK_COUNT_).toInt(0); + if (IsCount == 1) + select_sql = QString("select count(*) from ") + _MD_TABLE_FORMS_MANE + strFifter; + else + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + break; + case EMT_CHECK_BY_SAE: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + QString checktypeStr = m_value.value("CheckType").toString(); + QString strFifter = QString(" where time >'%1' and time < '%2'").arg(time1).arg(time2); + int IsCount = m_value.value(_CHECK_COUNT_).toInt(0); + if (IsCount == 1) + select_sql = QString("select count(*) from ") + _MD_TABLE_FORMS_MANE + strFifter; + else{ + if (checktypeStr == "Count") + select_sql = QString("select %1 from ").arg(_MD_MODEL) + _MD_TABLE_FORMS_MANE + strFifter; + else + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + } + break; + case EMT_CHECK_BY_LOG: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + int logType = m_value.value(_CHECK_LOGTYPE).toInt(); + QString strFifter = QString(" where time >'%1' and time < '%2' and class = '%3' order by time desc ").arg(time1).arg(time2).arg(logType); + int IsCount = m_value.value(_CHECK_COUNT_).toInt(0); + if (IsCount == 1) + select_sql = QString("select count(*) from ") + _MD_WARNINGTABLE + strFifter; + else + select_sql = QString("select * from ") + _MD_WARNINGTABLE + strFifter; + } + break; + case EMT_CHECK_BY_COUNT: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + QString checktypeStr = m_value.value("CheckType").toString(); + QString strFifter = QString(" where time >'%1' and time < '%2'").arg(time1).arg(time2); + int IsCount = m_value.value(_CHECK_COUNT_).toInt(0); + if (IsCount == 1) + select_sql = QString("select count(*) from ") + _MD_TABLE_FORMS_MANE + strFifter; + else{ + QString strGroup = QString(" GROUP BY %1 ORDER BY %2").arg(_MD_MODEL).arg(_MD_MODEL); + if (checktypeStr == "Count") + select_sql = QString("select %1 from ").arg(_MD_MODEL).arg(_MD_MODEL) + _MD_TABLE_FORMS_MANE + strFifter;// +strGroup; + else + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + } + break; + case EMT_CHECK_BY_UID: + { + QString uid = m_value.value(_CHECK_UID_).toString(); + QString strFifter = QString(" where uid = %1 ").arg(uid); + int IsCount = m_value.value(_CHECK_COUNT_).toInt(0); + if (IsCount == 1) + select_sql = QString("select count(*) from ") + _MD_TABLE_FORMS_MANE + strFifter; + else + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + break; + default: + break; + } + return select_sql; +} + +bool DetectDataDB::checkoutData(QVariantMap m_value, QSqlQuery &sql) +{ + int nType = m_value.value(_CHECK_TYPE_).toInt(); + QString select_sql; + switch (nType) + { + case EMT_CHECK_BY_TIME: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString strFifter = QString(" where time ='%1'").arg(time1); + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + break; + case EMT_CHECK_BY_NAME: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + QString modelname = m_value.value(_CHECK_NAME_).toString(); + QString strFifter = QString(" where time >'%1' and time < '%2' and model='%3'").arg(time1).arg(time2).arg(modelname); + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + break; + case EMT_CHECK_BY_SAE: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + QString strFifter = QString(" where time >'%1' and time < '%2'").arg(time1).arg(time2); + select_sql = QString("select * from ") + _MD_TABLE_FORMS_MANE + strFifter; + } + break; + case EMT_CHECK_BY_LOG: + { + QString time1 = m_value.value(_CHECK_TIME1_).toString(); + QString time2 = m_value.value(_CHECK_TIME2_).toString(); + int logType = m_value.value(_CHECK_LOGTYPE).toInt(); + QString strFifter = QString(" where time >'%1' and time < '%2' and class = '%3' order by time desc ").arg(time1).arg(time2).arg(logType); + select_sql = QString("select * from ") + _MD_WARNINGTABLE + strFifter; + } + break; + default: + break; + } + + sql = db->exec(select_sql); + return true; +} + +bool DetectDataDB::checkoutData(QString selectStr, QSqlQuery &sql) +{ + sql = db->exec(selectStr); + return true; +} +// bool DetectDataDB::checkoutData(QString selectStr, QSqlQuery &sql) +// { +// Q +// } +bool DetectDataDB::DelDatasByTime(QString minTime) +{ + QString StrTime = QString("time <'%1'").arg(minTime); + QString select_sql = QString("DELETE FROM %1 WHERE %2").arg(_MD_TABLE_FORMS_MANE).arg(StrTime); + db->exec(select_sql); + return true; +} + +bool DetectDataDB::DelAllDatas() +{ + QString strSqll = QString("delete from %1 ").arg(_MD_TABLE_FORMS_MANE); + db->exec(strSqll); + strSqll = QString("delete from %1 ").arg("warningtable"); + db->exec(strSqll); + return true; +} + +bool DetectDataDB::DelWarnDataByCount(int model /*=1*/, int nCount/*=100000*/) +{ + QString strLimit1 = QString("select count(uid) from %1 where class = '%3'").arg("warningtable").arg(model); + QString strLimit2 = QString("uid in(select uid from %1 where class = '%2' order by time desc limit(select count(uid) from %3 where class = '%4') offset %5)").arg("warningtable").arg(model).arg("warningtable").arg(model).arg(nCount); + QString strSqll = QString("delete from %1 where (%2)>%3 and %4").arg("warningtable").arg(strLimit1).arg(nCount).arg(strLimit2); + QSqlQuery sql = db->exec(strSqll); + return true; +} + +bool DetectDataDB::InitDatabase() +{ + if (!openDB()) + { + return false; + } + + QString strCheckTable = QString("select name from sqlite_master where type='table' order by name;"); + QSqlQuery sql = db->exec(strCheckTable);//查询数据库中所有的数据表 + QStringList tablenamelist; + while (sql.next()) + { + QString strname = sql.value(0).toString(); + tablenamelist.append(strname); + } + if (!tablenamelist.contains(_MD_TABLE_FORMS_MANE))//是否包含 table 否则创建新表 + { + QVariantMap vDataMap; + vDataMap.insert(_MD_MODEL, "VARCHAR(32)"); + vDataMap.insert(_MD_DIAMETER, "INT(100)");//直径 + vDataMap.insert(_MD_HIGHT, "INT(100)");//高度 + vDataMap.insert(_MD_CORRELATE, "INT(100)");//相似度 + vDataMap.insert(_MD_CHANNEL, "INT(100)"); + vDataMap.insert("detecttime", "VARCHAR(32)"); + vDataMap.insert(_MD_UPDATE_TIME, "DATETIME(32)"); + vDataMap.insert(_MD_PIC, "BLOB"); + if (!CreatTable(_MD_TABLE_FORMS_MANE, _MD_PRIMARY_KEY, vDataMap)) + { + //return false; + } + else + { + QString strIndex = QString("CREATE INDEX idx_wftable ON wftable (time COLLATE BINARY ASC); "); + db->exec(strIndex);//创建索引 + } + } + + if (!tablenamelist.contains(_MD_TIMETABLE)) + { + QVariantMap vTimeMap;//保存班次时间 + vTimeMap.insert(_MD_TYPE, "VARCHAR(32)"); + vTimeMap.insert(_MD_STARTTIME, "VARCHAR(32)"); + vTimeMap.insert(_MD_ENDTIME, "VARCHAR(32)"); + vTimeMap.insert(_MD_TIMETYPY_S, "INT(100)"); + vTimeMap.insert(_MD_TIMETYPY_E, "INT(100)"); + if (!CreatTable(_MD_TIMETABLE, _MD_PRIMARY_KEY, vTimeMap)) + { + //return false; + } + else{ + + } + } + + if (!tablenamelist.contains(_MD_WARNINGTABLE)) + { + QVariantMap vWarningMap;//报警信息 + vWarningMap.insert(_MD_MESSAGE, "VARCHAR(256)"); + vWarningMap.insert(_MD_CLASS, "VARCHAR(32)"); + vWarningMap.insert(_MD_UPDATE_TIME, "DATETIME(32)"); + if (!CreatTable(_MD_WARNINGTABLE, _MD_PRIMARY_KEY, vWarningMap)) + { + //return false; + + } + else{ + QString strIndex = QString("CREATE INDEX idx_warningtable ON warningtable (time COLLATE BINARY ASC); "); + db->exec(strIndex); + } + } + + return true; +} + +bool DetectDataDB::ReadOutTimeData(QMap &m_MapTimeMatch) +{ + QString select_sql = QString("select * from ") + _MD_TIMETABLE; + QSqlQuery sql = db->exec(select_sql); + QSqlError err = sql.lastError(); + int t = err.type(); + if (t != QSqlError::NoError) + { + return false; + } + while (sql.next()) + { + int nIndex = sql.value("uid").toInt(); + QString type = sql.value(_MD_TYPE).toString(); + QTime start = sql.value(_MD_STARTTIME).toTime(); + QTime end = sql.value(_MD_ENDTIME).toTime(); + int nSt = sql.value(_MD_TIMETYPY_S).toInt(); + int nEd = sql.value(_MD_TIMETYPY_E).toInt(); + TimeStruct m_timeStruct; + m_timeStruct.m_Index = nIndex; + m_timeStruct.m_name = type; + m_timeStruct.m_startTime = start; + m_timeStruct.m_endTime = end; + m_timeStruct.time_start = (AMPMType)nSt; + m_timeStruct.time_end = (AMPMType)nEd; + m_MapTimeMatch.insert(type, m_timeStruct); + } + return true; +} + +bool DetectDataDB::AddOneWarningMessage(WarnMessage m_messageInfo) +{ + QVariantMap m_map; + m_map.insert(_MD_MESSAGE, m_messageInfo.m_Message); + m_map.insert(_MD_UPDATE_TIME, m_messageInfo.m_Date); + m_map.insert(_MD_CLASS, m_messageInfo.m_class); + return InsertOneData(_MD_WARNINGTABLE, m_map); +} +bool DetectDataDB::AddOneTime(TimeStruct &m_timestruct) +{ + QVariantMap m_map; + m_map.insert(_MD_TYPE, m_timestruct.m_name); + m_map.insert(_MD_STARTTIME, m_timestruct.m_startTime); + m_map.insert(_MD_ENDTIME, m_timestruct.m_endTime); + m_map.insert(_MD_TIMETYPY_S, (int)m_timestruct.time_start); + m_map.insert(_MD_TIMETYPY_E, (int)m_timestruct.time_end); + return InsertOneData(_MD_TIMETABLE, m_map); +} +bool DetectDataDB::DelOneTime(TimeStruct &m_timestruct) +{ + QString m_map = gensql::genClass(_MD_TYPE, m_timestruct.m_name);//!>生成where条件语句 + QString strSql = gensql::genDeleteData(_MD_TIMETABLE, m_map); + db->exec(strSql); + if (db->lastError().isValid()) + { + return false; + } + return true; +} + +bool DetectDataDB::AddOneData(QVariantMap m_map) +{ + /*该部分数据是保存检测结果+结果图片*/ + + QString strInsert = "INSERT INTO %1(%2) VALUES(%3)"; + QString strHeader;// + QString strValue;// + + QStringList strKeys = m_map.keys(); + for (int i = 0; i < strKeys.size(); i++) { + strHeader += strKeys[i]; + if (i + 1 < strKeys.size()) + strHeader += ","; + strValue += ":" + strKeys[i] + ""; + + if (i + 1 < strKeys.size()) + strValue += ","; + } + strInsert = strInsert.arg(_MD_TABLE_FORMS_MANE, strHeader, strValue); + //return strInsert; + QSqlQuery query = db->exec(); + query.prepare(strInsert); + for (int i = 0; i < strKeys.size(); i++) + { + QString m_keys = strKeys.at(i); + QString str = ":" + m_keys; + query.bindValue(str, m_map.value(m_keys)); + } + query.exec(); + return true; +} diff --git a/tpvs17/lpReport/DetectDataDB.h b/tpvs17/lpReport/DetectDataDB.h new file mode 100644 index 0000000..a9a97f6 --- /dev/null +++ b/tpvs17/lpReport/DetectDataDB.h @@ -0,0 +1,34 @@ +#ifndef DETECTDATA_H +#define DETECTDATA_H +#include "databasesql.h" +#include +#include "InfoFile.h" +#include "QMutex" +/*DetectDataDB 用于记录检测数据 便于查询和插入*/ +class DetectDataDB : public DataBaseSql +{ + Q_OBJECT + +public: + DetectDataDB(const QString& dbName, const QString &dbType = QString("QSQLITE")); + ~DetectDataDB(); + virtual bool InitDatabase(); + + virtual bool checkoutData(QVariantMap m_value, QSqlQuery &sql); + virtual bool checkoutData(QString selectStr, QSqlQuery &sql); + virtual bool DelDatasByTime(QString minTime); + virtual bool DelAllDatas(); + virtual bool DelWarnDataByCount(int model /*=1*/, int nCount/*=100000*/); + bool AddOneWarningMessage(WarnMessage m_messageInfo); + + /*班次时间管理*/ + bool ReadOutTimeData(QMap &m_MapTimeMatch); + bool DelOneTime(TimeStruct &m_timestruct); + bool AddOneTime(TimeStruct &m_timestruct); + bool AddOneData(QVariantMap m_map); + +private: + +}; + +#endif // DETECTDATA_H diff --git a/tpvs17/lpReport/InfoFile.h b/tpvs17/lpReport/InfoFile.h new file mode 100644 index 0000000..cbf4319 --- /dev/null +++ b/tpvs17/lpReport/InfoFile.h @@ -0,0 +1,63 @@ +#ifndef _INFOFILE_H_ +#define _INFOFILE_H_ +#include +#include +#include "qstringlist.h" +#define WS_PICSIZE 129 //!>缩放大小 +#define WS_PICSIZELIST 120 + +#define WF_HUBMODEL_ID "hubID" +#define WF_HUBMODEL_DIAMETER "diameter"//轮毂直径 +#define WF_HUBMODEL_HEIGHT "height"//轮毂厚度 +#define WF_HUBMODEL_CHANNELS "channels" +#define WF_HUBMODEL_FILEPATH "filepath" + +#define WF_LIFHT "Light" +#define WF_PLCPARA "PlcPara" +#define WF_PARASET "paraSetting"//PLC参数设置 +enum AMPMType{ + AM=0, + PM=1, +}; +struct TimeStruct +{ + int m_Index; + QString m_name; + QTime m_startTime; + AMPMType time_start; + QTime m_endTime; + AMPMType time_end; + TimeStruct(){ + time_start = AM; + time_end = AM; + } +}; +struct WarnMessage +{ + QString m_Message; + QString m_Date; + QString m_class; +}; + +struct ChannelInfo +{ + QString m_ChannelName; + QString m_AboutName; + int m_value; + QStringList m_strModels; +}; +enum EM_LOG_TYPE{ + emTypeWaring = 1, + emTypeCameraState, + emTypeNetState, + emTypeRunState, + emTypeUseState +}; +enum emTypeBee{ + LIGHT_REDBEE = 0, + LIGHT_GREENBEE, + LIGHT_YELLOWBEE, + LIGHT_BEE +}; + +#endif diff --git a/tpvs17/lpReport/ModelDB.cpp b/tpvs17/lpReport/ModelDB.cpp new file mode 100644 index 0000000..8a3e225 --- /dev/null +++ b/tpvs17/lpReport/ModelDB.cpp @@ -0,0 +1,47 @@ +#include "ModelDB.h" +#define _MD_PRIMARY_KEY "uid" +#define _MD_TABLE_FORMS_MANE "wftable" //ݱ +#define _MD_MODEL "model" //model ģ +#define _MD_DIAMETER "diameter" //ֱ +#define _MD_HIGHT "hight" //߶ +#define _MD_CORRELATE "correlate" //ƶ +#define _MD_CHANNEL "channel" //ͨ +#define _MD_PICPATH "picpath" //ͼƬ· +#define _MD_ROTATE "rotate"// +#define _MD_UPDATE_TIME "time" //µʱ +#define _MD_PIC "pic" //ͼƬ +ModelDB::ModelDB(const QString& dbName, const QString& dbType) :DataBaseSql(dbName, dbType) +{ +} + +ModelDB::~ModelDB() +{ +} + +bool ModelDB::InitDatabase() +{ + if (!db->open()) + { + return false; + } + return true; +} + +QStringList ModelDB::ReadAllModes() +{ + QStringList lst; + QString select_sql = QString("select * from ") + "modelTable"; + QSqlQuery sql = db->exec(select_sql); + QSqlError err = sql.lastError(); + int t = err.type(); + if (t != QSqlError::NoError) + { + return lst; + } + while (sql.next()) + { + QString strName = sql.value(_MD_MODEL).toString(); + lst.append(strName); + } + return lst; +} \ No newline at end of file diff --git a/tpvs17/lpReport/ModelDB.h b/tpvs17/lpReport/ModelDB.h new file mode 100644 index 0000000..88f136e --- /dev/null +++ b/tpvs17/lpReport/ModelDB.h @@ -0,0 +1,33 @@ +/*! + *FileName: ModelDB.h + *Author: Pan Yingdong + *Email: bob.pan@hzleaper.com + *Created:2021/4/7 11:10 + *Note: +*/ +#ifndef _H_MODELDB_H_ +#define _H_MODELDB_H_ + +#include "databasesql.h" +#include "InfoFile.h" + +class ModelDB : public DataBaseSql +{ + Q_OBJECT + +public: + ModelDB(const QString& dbName, const QString &dbType = QString("QSQLITE")); + ~ModelDB(); + + virtual bool InitDatabase(); + QStringList ReadAllModes();//ģͺ + + virtual bool checkoutData(QVariantMap m_value, QSqlQuery &sql) { return false; }; + virtual bool checkoutData(QString selectStr, QSqlQuery &sql) { return false; }; + virtual bool AddOneWarningMessage(struct WarnMessage m_messageInfo) { return false; }; + virtual bool DelWarnDataByCount(int model = 1, int nCount = 100000) { return false; }; + virtual bool DelAllDatas() { return false; }; + virtual bool DelDatasByTime(QString minTime) { return false; }; +}; + +#endif diff --git a/tpvs17/lpReport/Resources/Log.png b/tpvs17/lpReport/Resources/Log.png new file mode 100644 index 0000000000000000000000000000000000000000..b36063285e72df7b28e52cdfad8aed0040ea4b0b GIT binary patch literal 31091 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 KMNUMnLSTZ+{e|WL literal 0 HcmV?d00001 diff --git a/tpvs17/lpReport/Resources/log.ico b/tpvs17/lpReport/Resources/log.ico new file mode 100644 index 0000000000000000000000000000000000000000..fe051a64dfde752f34d880704227435eff95893c GIT binary patch literal 55665 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 %MM?!+6xJD#HMgvoUu2n4eCDDG#Oy1g@SDc| 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 NTz|l0AZLu+{|~E^pVI&U literal 0 HcmV?d00001 diff --git a/tpvs17/lpReport/checkdata.h b/tpvs17/lpReport/checkdata.h new file mode 100644 index 0000000..a759475 --- /dev/null +++ b/tpvs17/lpReport/checkdata.h @@ -0,0 +1,70 @@ +#ifndef CHECKDATA_H +#define CHECKDATA_H + +#include +#include "QStandardItemModel.h" +#include "QIcon" +#include "QPixmap" +#include "QByteArray" +#include "databasesql.h" +#include "QJsonObject" +#include +#pragma execution_character_set("utf-8")//使用utf-8编码 可以使用中文,解决乱码 + +class CheckData : public QObject +{ + Q_OBJECT + +public: + CheckData(QObject *parent=0){ m_pDb = NULL; }; + ~CheckData(){}; + void setDB(DataBaseSql* pDB){ m_pDb = pDB; }; +public slots: + void doWork(QVariantMap m_map) + { + QVariantMap m_proMap; + m_proMap.insert("Type", "start"); + emit sgShowProgress(m_proMap); + + QVariantMap Mapstr; + QString strSql_Count = m_map.value("SqlCount").toString(); + QString strSql_Check = m_map.value("SqlCheck").toString(); + int nLimit = m_map.value("limit").toInt(); + int nSum = 0; + int nIndex = 0; + QSqlQuery sql_Check; + if (m_pDb){ + QSqlQuery sql_Count; + m_proMap.insert("msg", "正在获取数量"); + emit sgShowProgress(m_proMap); + m_pDb->checkoutData(strSql_Count, sql_Count); + while (sql_Count.next()){ + nSum = sql_Count.value(0).toInt(); + } + //加入 + //emit something + m_proMap.remove("msg"); + m_proMap.insert("msg", "正在获取数据"); + emit sgShowProgress(m_proMap); + m_pDb->checkoutData(strSql_Check, sql_Check); + + } + Mapstr.insert("sum", nSum); + Mapstr.insert("nIndex", nIndex); + Mapstr.insert("limit", nLimit); + m_proMap.remove("Type"); + m_proMap.insert("Type", "stop"); + emit sgShowProgress(m_proMap); + + emit resultReady(Mapstr, sql_Check); + //emit something + }; +private: + class DataBaseSql *m_pDb; +signals: + void resultReady(QVariantMap Mapstr,QSqlQuery sql); + void sgShowMsg(QString str); + void sgShowProgress(QVariantMap m_Map); +}; + +#endif // CHECKDATA_H diff --git a/tpvs17/lpReport/checkthread.h b/tpvs17/lpReport/checkthread.h new file mode 100644 index 0000000..b8dcf26 --- /dev/null +++ b/tpvs17/lpReport/checkthread.h @@ -0,0 +1,53 @@ +#ifndef CHECKTHREAD_H +#define CHECKTHREAD_H + +#include +#include "QSqlQuery" +#include "databasesql.h" +#include "QMetaType" +#include "QStandardItemModel" +#include +class CheckThread : public QThread +{ + Q_OBJECT + +public: + CheckThread(QObject *parent){ bFlags = false; }; + ~CheckThread(){}; + void setModelFlags(bool m_flags = false){ bFlags = m_flags; } + void setCheckStr(DataBaseSql *pDb ,QString m_str){ + m_pDb = pDb; + m_CheckStr = m_str; + }; + void run() Q_DECL_OVERRIDE{ + QSqlQuery sql; + int nCount = 0; + if (m_pDb){ + + m_pDb->checkoutData(m_CheckStr, sql); + + if (bFlags == true) + { + while (sql.next()) + { + QSqlRecord record = sql.record(); + QString fieldName = record.fieldName(0); + QString num = sql.value(0).toString(); + nCount = num.toInt(); +// /*这里下面是统计查询到的通道对应的产品总数*/ + } + } + } + emit (resultReady(sql)); + emit(resultCount(nCount)); + } +private: + DataBaseSql *m_pDb; + QString m_CheckStr; + bool bFlags; +signals: + void resultReady(QSqlQuery sql); + void resultCount(int nCount); +}; + +#endif // CHECKTHREAD_H diff --git a/tpvs17/lpReport/countdata.h b/tpvs17/lpReport/countdata.h new file mode 100644 index 0000000..c2a1970 --- /dev/null +++ b/tpvs17/lpReport/countdata.h @@ -0,0 +1,84 @@ +#ifndef COUNTDATA_H +#define COUNTDATA_H + +#include +#include "databasesql.h" +#include "QSqlQuery" +#pragma execution_character_set("utf-8") +class CountData : public QObject +{ + Q_OBJECT + +public: + CountData(QObject *parent = 0){ m_pDb = NULL; }; + ~CountData(){}; + void setDB(class DataBaseSql *pDb){ m_pDb = pDb; }; +public slots: + void doWork(QVariantMap m_Map) { + QMap *m_counter=new QMap(); + QVariantMap m_proMap; + m_proMap.insert("Type", "start"); + emit sgShowProgress(m_proMap); + + QString result; + QSqlQuery sqlCount; + QSqlQuery sql; + /* ... here is the expensive or blocking operation ... */ + + QString strSql_Count = m_Map.value("SqlCount").toString(); + QString strSql_Check = m_Map.value("SqlCheck").toString(); + + if (m_pDb){ + //m_counter->clear(); + m_proMap.insert("msg", "正在获取数量..."); + emit sgShowProgress(m_proMap); + m_pDb->checkoutData(strSql_Count, sqlCount); + //emit sgShowMsg("正在查询数据"); + int sum = 0; + int m_size = 0; + while (sqlCount.next()) + { + m_size = sqlCount.value(0).toInt(); + } + + QString strname = QString("select model,count(model) from (%1) GROUP BY model ;").arg(strSql_Check); + m_pDb->checkoutData(strname, sql); + //m_pDb->checkoutData(strSql_Check, sql); + //emit sgShowMsg("正在统计中"); + + m_proMap.remove("msg"); + m_proMap.insert("msg", QString("共%1条记录,正在分类核算数据,请稍后").arg(m_size)); + emit sgShowProgress(m_proMap); + + while (sql.next()) + { + /*这里下面是统计查询到的通道对应的产品总数*/ + + QString model = sql.value(0).toString(); + int nValue = sql.value(1).toInt(); + if (m_counter->contains(model)) + { + (*m_counter)[model]++; + } + else + { + m_counter->insert(model, nValue); + } + } + result = QString("%1").arg(m_size); + emit sgShowMsg("统计完成"); + } + m_proMap.remove("Type"); + m_proMap.insert("Type", "stop"); + emit sgShowProgress(m_proMap); + emit resultReady(result, m_counter); + } +signals: + void resultReady(const QString &result, const QMap *p); + void sgShowMsg(QString str); + void sgShowProgress(QVariantMap m_map); +private: + class DataBaseSql *m_pDb; +}; + +#endif // COUNTDATA_H diff --git a/tpvs17/lpReport/databasesql.cpp b/tpvs17/lpReport/databasesql.cpp new file mode 100644 index 0000000..dd0f6a5 --- /dev/null +++ b/tpvs17/lpReport/databasesql.cpp @@ -0,0 +1,165 @@ +#include "databasesql.h" +#include "gensql.h" +#define _MD_PRIMARY_KEY "uid" +#define _QMYSQL_ "QMYSQL" +#define _SQLITE_ "QSQLITE" + +DataBaseSql::DataBaseSql(const QString& dbName, const QString &dbType) +{ + m_DBType = dbType; + if (dbType == "QSQLITE") + { + db = new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE", dbName)); + db->setDatabaseName(dbName); + //qry = QSqlQuery::QSqlQuery(db); + } + else if (dbType == "QMYSQL") + { + //if (!QSqlDatabase::contains(m_DBType)) + db = new QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL", dbName)); + //db.setDatabaseName(dbName); + } +} + +DataBaseSql::~DataBaseSql() +{ + if (db->isOpen()) + { + db->close(); + } + delete db; + db = NULL; +} + +bool DataBaseSql::openDB() +{ + return db->open(); +} + +void DataBaseSql::closeDB() +{ + db->close(); +} + +bool DataBaseSql::InitDatabase() +{ + if (!db->open() && db->open()) + { + return false; + } + + return true; +} + +bool DataBaseSql::CreatTable(QString m_tableName, QString m_primaty, QVariantMap m_map) +{ + QString strSql; + if (m_DBType == _SQLITE_) + strSql = gensql::genCreateTabel(m_tableName, m_primaty, "INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL", m_map); + else if (m_DBType == _QMYSQL_) + strSql = QString("CREATE TABLE `testtable2` (`id` int(11) NOT NULL,`name` varchar(60) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY(`id`)) ENGINE = InnoDB DEFAULT CHARSET = utf8; "); + QSqlQuery sql = db->exec(strSql); + + QSqlError err = sql.lastError(); + int nType = err.type(); + if (nType != QSqlError::NoError) + return false; + return true; +} + +bool DataBaseSql::InsertOneData(QString m_tableName, QVariantMap m_map) +{ + + if (m_tableName.isEmpty() || m_map.empty()) { + return false; + } + QString strSql; + strSql = gensql::genInsertData(m_tableName, m_map); + qry = db->exec(strSql); + QSqlError bflags = qry.lastError(); + int nType = bflags.type(); + QString str = db->databaseName(); + if (db->lastError().isValid()) + { + return false; + } + return true; +} + +bool DataBaseSql::ModefyOneData(QString m_tableName, QVariantMap m_map) +{ + if (m_tableName.isEmpty() || m_map.empty()) { + return false; + } + int max_id = 0; + QString select_max_sql = "select max(md_unique) from e_report_forms"; + QSqlQuery sql = db->exec(select_max_sql); + if (db->lastError().isValid()) + { + return false; + } + else + { + while (sql.next()) + { + max_id = sql.value(0).toInt(); + } + } + QString m = gensql::genClass(_MD_PRIMARY_KEY, "0"); + QString strSql = gensql::genUpdate(m_tableName, m_map, m); + + db->exec(strSql); + if (db->lastError().isValid()) + { + return false; + } + return true; +} + +bool DataBaseSql::DeleteOneData(QString m_tableName, QString m_map) +{ + if (m_tableName.isEmpty() || m_map.isEmpty()) { + return false; + } + int max_id = 0; + QString select_max_sql = "select max(" + QString(_MD_PRIMARY_KEY) + ") from " + m_tableName; + QSqlQuery sql = db->exec(select_max_sql); + if (db->lastError().isValid()) + { + return false; + } + else + { + while (sql.next()) + { + max_id = sql.value(0).toInt(); + } + } + QString m;// = genClass(_MD_PRIMARY_KEY, "0"); + QString strSql = gensql::genDeleteData(m_tableName, m); + + db->exec(strSql); + if (db->lastError().isValid()) + { + return false; + } + return true; +} + +void DataBaseSql::SetDatabaseName(QString dbName) +{ + db->setDatabaseName(dbName); +} + +void DataBaseSql::SetDBPort(QString nAddr /*= QString("localhost")*/, int nPort /*= 3306*/) +{ + db->setHostName(nAddr); + db->setPort(nPort); +} + +void DataBaseSql::SetDBUser(QString dbUser /*= QString("root")*/, QString dbPwd /*= QString("hzleaper")*/) +{ + db->setUserName(dbUser); + db->setPassword(dbPwd); +} + diff --git a/tpvs17/lpReport/databasesql.h b/tpvs17/lpReport/databasesql.h new file mode 100644 index 0000000..37d0e54 --- /dev/null +++ b/tpvs17/lpReport/databasesql.h @@ -0,0 +1,74 @@ +#ifndef DATABASESQL_H +#define DATABASESQL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "QMutex" + +#define _CHECK_TIME1_ "time1" +#define _CHECK_TIME2_ "time2" +#define _CHECK_NAME_ "name" +#define _CHECK_TYPE_ "Type" +#define _CHECK_COUNT_ "Count" +#define _CHECK_LOGTYPE "logType" +#define _CHECK_UID_ "uid" +enum EMTYPE_CHECKTYPE{ + EMT_CHECK_BY_TIME = 0,//只按时间查询 + EMT_CHECK_BY_NAME,//按照模型名查询 + EMT_CHECK_BY_SAE,//按照起始结束时间查询 + EMT_CHECK_BY_LOG, + EMT_CHECK_BY_COUNT, + EMT_CHECK_BY_UID, +}; +class DataBaseSql : public QObject +{ + Q_OBJECT + +public: + DataBaseSql( const QString& dbName ,const QString &dbType = QString("QSQLITE")); + ~DataBaseSql(); + bool openDB(); + void closeDB(); + void SetDatabaseName(QString dbName); + void SetDBPort(QString nAddr = QString("localhost"), int nPort = 3306); + void SetDBUser(QString dbUser = QString("root"), QString dbPwd = QString("hzleaper")); + virtual bool InitDatabase(); + bool CreatTable(QString m_tableName, QString m_primaty, QVariantMap m_map); + + virtual bool InsertOneData(QString m_tableName, QVariantMap m_map); + virtual bool ModefyOneData(QString m_tableName, QVariantMap m_map); + virtual bool DeleteOneData(QString m_tableName, QString m_map); + /* + m_value.insert("time1","");//起始时间 + m_value.insert("time2","");//结束时间 + m_value.insert("name","");//模型名字 + m_value.insert("Type","");//查询类型 + m_value.insert("logType","");//报警信息查询 + */ + virtual bool checkoutData(QVariantMap m_value, QSqlQuery &sql) = 0; + virtual bool checkoutData(QString selectStr, QSqlQuery &sql) = 0; + virtual bool AddOneWarningMessage(struct WarnMessage m_messageInfo) = 0; + virtual bool DelWarnDataByCount(int model = 1, int nCount = 100000) = 0; + virtual bool DelAllDatas() = 0; + virtual bool DelDatasByTime(QString minTime) = 0; + virtual QString genCheckStr(QVariantMap m_value);//通过value数据生成查询语句 实现与checkoutdata相同 +public: + +protected: + QSqlDatabase *db; + QSqlQuery qry; + QString m_DBType; + +}; + +#endif // DATABASESQL_H diff --git a/tpvs17/lpReport/gensql.cpp b/tpvs17/lpReport/gensql.cpp new file mode 100644 index 0000000..fe955ad --- /dev/null +++ b/tpvs17/lpReport/gensql.cpp @@ -0,0 +1,116 @@ +#include "gensql.h" +#include +#include "QStringList" + +QString gensql::genInsertData(const QString & strTableName, const QVariantMap &vMap) +{ + QString strInsert = "INSERT INTO %1(%2) VALUES(%3)"; + QString strHeader;// + QString strValue;// + + QStringList strKeys = vMap.keys(); + for (int i = 0; i < strKeys.size(); i++) { + strHeader += strKeys[i]; + if (i + 1 < strKeys.size()) + strHeader += ","; + strValue += "'" + vMap[strKeys[i]].toString() + "'"; + if (i + 1 < strKeys.size()) + strValue += ","; + } + strInsert = strInsert.arg(strTableName, strHeader, strValue); + return strInsert; +} + +QString gensql::genSelect(const QString & strTableName, QStringList strSelectList, QString strClass) +{ + QString strDstSelect; + if (strClass.isEmpty()) { + strDstSelect = "SELECT %1 FROM %2"; + } + else { + strDstSelect = "SELECT %1 FROM %2 WHERE " + strClass; + } + + if (0 == strSelectList.size()) { + strDstSelect = strDstSelect.arg("*").arg(strTableName); + } + else { + QString strSeletTmp = strSelectList[0]; + for (int i = 1; i < strSelectList.size(); i++) { + strSeletTmp += "," + strSelectList[i]; + } + strDstSelect = strDstSelect.arg(strSeletTmp, strTableName); + } + + return strDstSelect; +} + +QString gensql::genClass(QString strName, QString strValue) +{ + QString strDst = ""; + strDst += strName + " = '" + strValue + "'"; + return strDst; +} + +QString gensql::genUpdate(const QString & strTableName, QVariantMap &vMap, QString strClass) +{ + QString strDst = "";// + if (strClass.isEmpty()) { + strDst = "UPDATE %1 SET %2";//全部修改 + } + else { + strDst = "UPDATE %1 SET %2 WHERE %3";//指定修改 + } + QString strUpdateTmp = ""; + if (vMap.size() != 0) { + QStringList strList = vMap.keys(); + strUpdateTmp += gensql::genClass(strList[0], vMap[strList[0]].toString()); + for (int i = 1; i < strList.size(); i++) { + strUpdateTmp += "," + gensql::genClass(strList[i], vMap[strList[i]].toString()); + } + } + + strDst = strDst.arg(strTableName, strUpdateTmp, strClass); + return strDst; +} + +QString gensql::genDeleteData(const QString & strTableName, QString strClass) +{ + QString strDst; + if (strClass.isEmpty()) { + strDst = "DELETE FROM %1";//全部删除 + } + else { + strDst = "DELETE FROM %1 WHERE %2";//指定删除 + } + + strDst = strDst.arg(strTableName, strClass); + return strDst; +} + +QString gensql::genInsertColumn(const QString & strTableName, QString strName, QString strType) +{ + QString strDst = "ALTER TABLE %1 ADD COLUMN %2 %3"; + strDst = strDst.arg(strTableName).arg(strName).arg(strType); + + return strDst; +} + +QString gensql::genDeleteColumn(const QString & strTableName, QString strColumnName) +{ + QString strDst = "ALTER TABLE %1 DROP %2"; + strDst = strDst.arg(strTableName, strColumnName); + return strDst; +} + +QString gensql::genCreateTabel(const QString strTable, QString strPrimary, QString strType, QVariantMap &vMap) +{ + QString strDst = "CREATE TABLE IF NOT EXISTS %1 (%2)"; + QString strColumn = strPrimary + " " + strType; + QStringList strList = vMap.keys(); + for (int i = 0; i < strList.size(); i++) { + strColumn += ", " + strList[i] + " " + vMap[strList[i]].toString(); + } + strDst = strDst.arg(strTable, strColumn); + return strDst; +} diff --git a/tpvs17/lpReport/gensql.h b/tpvs17/lpReport/gensql.h new file mode 100644 index 0000000..0a72be0 --- /dev/null +++ b/tpvs17/lpReport/gensql.h @@ -0,0 +1,15 @@ +#ifndef _GENSQL_H_ +#define _GENSQL_H_ +#include "QMetaType" +#include "QString" +namespace gensql{ + QString genInsertData(const QString & strTableName, const QVariantMap &vMap); + QString genSelect(const QString & strTableName, QStringList strSelectList, QString strClass); + QString genClass(QString strName, QString strValue); + QString genUpdate(const QString & strTableName, QVariantMap &vMap, QString strClass); + QString genDeleteData(const QString & strTableName, QString strClass); + QString genInsertColumn(const QString & strTableName, QString strName, QString strType); + QString genDeleteColumn(const QString & strTableName, QString strColumnName); + QString genCreateTabel(const QString strTable, QString strPrimary, QString strType, QVariantMap &vMap); +} +#endif diff --git a/tpvs17/lpReport/lpReport.aps b/tpvs17/lpReport/lpReport.aps new file mode 100644 index 0000000000000000000000000000000000000000..f5e99f2fde3d97da9df467be510fa4f93d394de6 GIT binary patch literal 57792 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�#&)9$&9$CdzELSQ2oerH*(Syt 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 Q0<`o0e<_4Nkk$bL0FD<8s{jB1 literal 0 HcmV?d00001 diff --git a/tpvs17/lpReport/lpReport.cpp b/tpvs17/lpReport/lpReport.cpp new file mode 100644 index 0000000..8f3363f --- /dev/null +++ b/tpvs17/lpReport/lpReport.cpp @@ -0,0 +1,1337 @@ +#include "lpReport.h" +#include "qtimedlg.h" +#include +#include +#include +#include "QProgressDialog" +#include "qsavecsvthread.h" +#include "checkthread.h" +#include "QCompleter" +#include "qreportwidget.h" +#include +#include "ModelDB.h" + +#pragma execution_character_set("utf-8") + +#define WHEEL_PIC_SIZE 150 +enum EM_TYPE_TIME +{ + em_Time_Year = 1, + em_Time_Moth, + em_Time_Day +}; +#define _QSQLITE_WHEELHUBWF_NAME "wheelhubwf.db" +#define WHEEL_DB_FILE "\\pattern\\modelTemplate.db" + +lpReport::lpReport(QWidget *parent) + : QMainWindow(parent) +{ + + qRegisterMetaType("QSqlQuery"); + ui.setupUi(this); + onInitUI(); + QString strDbPath = QApplication::applicationDirPath() + "\\" + _QSQLITE_WHEELHUBWF_NAME; + m_pDb = new DetectDataDB(strDbPath); + m_pDb->InitDatabase(); + m_pDb->ReadOutTimeData(m_Totaltime); + + QString strModelPath = QApplication::applicationDirPath() + "\\" + WHEEL_DB_FILE; + m_pModeDB = new ModelDB(strModelPath); + m_pModeDB->InitDatabase(); + QStringList strList = m_pModeDB->ReadAllModes(); + + m_GridLayout = new QGridLayout; + reportdlg = new QReportWidget; + m_GridLayout->addWidget(reportdlg); + m_countwidget = new QWidget; + Hbox = new QVBoxLayout; + m_GridLayout->setMargin(0); + m_GridLayout->addLayout(Hbox, 0, 1); + m_countwidget->setLayout(m_GridLayout); + nstartTime.setHMS(0, 0, 0); + nEndTime.setHMS(23, 59, 59); + m_tableModel = new QStandardItemModel; + + m_WorkDB = new WorkForDB; + m_WorkDB->moveToThread(&m_Workthread); + m_WorkDB->setDB(m_pDb); + connect(&m_Workthread, &QThread::finished, m_WorkDB, &QObject::deleteLater); + connect(this, &lpReport::operate, m_WorkDB, &WorkForDB::doWork); + connect(m_WorkDB, &WorkForDB::resultReady, this, &lpReport::handleResults); + m_Workthread.start(); + qDebug() << "start thread m_Workthread"; + + m_WorkCount = new CountData; + m_WorkCount->moveToThread(&m_WorkThreadCount); + m_WorkCount->setDB(m_pDb); + connect(&m_WorkThreadCount, &QThread::finished, m_WorkCount, &QObject::deleteLater); + connect(this, &lpReport::operateCount, m_WorkCount, &CountData::doWork); + connect(m_WorkCount, &CountData::resultReady, this, &lpReport::handleResultsCount); + connect(m_WorkCount, SIGNAL(sgShowMsg(QString)), this, SLOT(onShowMessage(QString))); + connect(m_WorkCount, &CountData::sgShowProgress, this, &lpReport::onProgressForTsk); + m_WorkThreadCount.start(); + qDebug() << "start thread m_WorkThreadCount"; + + m_WorkHistory = new CheckData; + m_WorkHistory->moveToThread(&m_WorkThreadCheckHistory); + m_WorkHistory->setDB(m_pDb); + connect(&m_WorkThreadCheckHistory, &QThread::finished, m_WorkHistory, &QObject::deleteLater); + connect(this, &lpReport::operateHistory, m_WorkHistory, &CheckData::doWork); + connect(m_WorkHistory, &CheckData::resultReady, this, &lpReport::handleResultsHistory); + connect(m_WorkHistory, &CheckData::sgShowProgress, this, &lpReport::onProgressForTsk); + m_WorkThreadCheckHistory.start(); + qDebug() << "start thread m_WorkThreadCheckHistory"; + + m_Progressdlg.setWindowModality(Qt::ApplicationModal); + m_Progressdlg.setWindowIcon(QIcon(":/image/leaper")); + m_IsRunCountTsk = false; + ui.scrollArea->setWidget(m_countwidget); + + InitUIParam(); + SetModelNames(strList); + + setWindowTitle("ݼ¼鿴"); + setWindowIcon(QIcon(":/lpReport/Resources/Log.png")); +} + +lpReport::~lpReport() +{ + if (m_Workthread.isRunning()) + { + qDebug() << "delete m_Workthread"; + m_Workthread.quit(); + m_Workthread.wait(50); + qDebug() << "delete m_Workthread end"; + } + if (m_WorkThreadCount.isRunning()) + { + qDebug() << "delete m_WorkThreadCount"; + m_WorkThreadCount.quit(); + m_WorkThreadCount.wait(50); + qDebug() << "delete m_WorkThreadCount end"; + } + if (m_WorkThreadCheckHistory.isRunning()) + { + qDebug() << "delete m_WorkThreadCheckHistory"; + m_WorkThreadCheckHistory.quit(); + m_WorkThreadCheckHistory.wait(50); + qDebug() << "delete m_WorkThreadCheckHistory end"; + } + if (m_tableWarnModel) { + delete m_tableWarnModel; + m_tableWarnModel = NULL; + } + if (m_tableModel) { + delete m_tableModel; + m_tableModel = NULL; + } + if (_pCompleter) { + delete _pCompleter; + _pCompleter = NULL; + } + if (m_countwidget) + { + delete m_countwidget; + m_countwidget = NULL; + } + +} + +void lpReport::onInitUI() +{ + connect(ui.pushButton_Set1_Warning, SIGNAL(clicked()), this, SLOT(SlotEditTime())); + connect(ui.pushButton_Set2_Warning, SIGNAL(clicked()), this, SLOT(SlotEditTime())); + connect(ui.pushButton_Set1_History, SIGNAL(clicked()), this, SLOT(SlotEditTime())); + connect(ui.pushButton_Set2_History, SIGNAL(clicked()), this, SLOT(SlotEditTime())); + connect(ui.pushButton_Set1_Count, SIGNAL(clicked()), this, SLOT(SlotEditTime())); + connect(ui.pushButton_Set2_Count, SIGNAL(clicked()), this, SLOT(SlotEditTime())); + + connect(ui.pushButton_Checkdata, SIGNAL(clicked()), this, SLOT(onCheckButton())); + connect(ui.pushButton_SaveHistory, SIGNAL(clicked()), this, SLOT(onCheckButton())); + connect(ui.pushButton_Wandring, SIGNAL(clicked()), this, SLOT(onCheckButton())); + connect(ui.pushButton_SaveWaring, SIGNAL(clicked()), this, SLOT(onCheckButton())); + connect(ui.pushButton_Checkdata_Calculate, SIGNAL(clicked()), this, SLOT(onCheckButton())); + connect(ui.pushButton_SaveCalculate, SIGNAL(clicked()), this, SLOT(onCheckButton())); + connect(this, SIGNAL(sgSetCurrentIndex(int)), ui.stackedWidget, SLOT(setCurrentIndex(int))); + connect(ui.comboBox_Banci_Calculate, SIGNAL(currentIndexChanged(int)), this, SLOT(SlotCombox(int))); + connect(ui.comboBox_Banci, SIGNAL(currentIndexChanged(int)), this, SLOT(SlotCombox(int))); + + ui.comboBox_Model->setEditable(true); + + connect(ui.Prev_checkShengchang, SIGNAL(clicked()), this, SLOT(onHistoryButton())); + connect(ui.Next_checkShengchang, SIGNAL(clicked()), this, SLOT(onHistoryButton())); + + ui.LineNumber_checkShengchang->setText("50"); + QValidator *validator = new QIntValidator(1, 9999, this); + ui.LineNumber_checkShengchang->setValidator(validator); + + ui.showNum_Label_Checkdata->setText(tr("ʾ%1¼").arg(0)); + ui.showPage_Label_Checkdata->setText(tr("%1ҳ %2ҳ").arg(0).arg(0)); + + int nItenCount = ui.check_listWidget->count(); + for (int nIndex = 0; nIndex < nItenCount; nIndex++) + { + QListWidgetItem *itenn = ui.check_listWidget->item(nIndex); + QSize s = itenn->sizeHint(); + itenn->setSizeHint(QSize(s.width(), 45)); + } + connect(ui.check_listWidget, SIGNAL(currentRowChanged(int)), this, SLOT(onSetCurrentIndex(int))); + + + ui.LineNumber_log->setText("50"); + QValidator *validatorlog = new QIntValidator(1, 9999, this); + ui.LineNumber_log->setValidator(validatorlog); + + connect(ui.Prev_checklog, SIGNAL(clicked()), this, SLOT(onLogButton())); + connect(ui.Next_checklog, SIGNAL(clicked()), this, SLOT(onLogButton())); + + ui.showPage_Label_Checkdata_2->setText(tr("%1ҳ %2ҳ").arg(0).arg(0)); + ui.showNum_Label_Checkdata_2->setText(tr("ʾ%1¼").arg(0)); +} + +void lpReport::timerEvent(QTimerEvent *event) +{ + +} + +Q_SLOT void lpReport::SlotEditTime() +{ + QObject *obj = sender(); + QString str = obj->objectName(); + if (str == "pushButton_Set1_Count") + { + QTimeDlg dlg; + dlg.SetDateTime(m_startDate_Count); + dlg.setWindowModality(Qt::ApplicationModal); + if (dlg.exec() == QDialog::Accepted) + { + dlg.GetDateTime(m_startDate_Count); + QString m_strLast = m_startDate_Count.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time1_Count->setText(m_strLast); + } + } + else if (str == "pushButton_Set2_Count") + { + QTimeDlg dlg; + dlg.SetDateTime(m_endDate_Count); + if (dlg.exec() == QDialog::Accepted) + { + dlg.GetDateTime(m_endDate_Count); + QString m_endLast = m_endDate_Count.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time2_Count->setText(m_endLast); + } + } + else if (str == "pushButton_Set1_Warning") + { + QTimeDlg dlg; + dlg.SetDateTime(m_startDate_Warning); + if (dlg.exec() == QDialog::Accepted) + { + dlg.GetDateTime(m_startDate_Warning); + QString m_endLast = m_startDate_Warning.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time1_warning->setText(m_endLast); + } + } + else if (str == "pushButton_Set2_Warning") + { + QTimeDlg dlg; + dlg.SetDateTime(m_endDate_Warning); + if (dlg.exec() == QDialog::Accepted) + { + dlg.GetDateTime(m_endDate_Warning); + QString m_endLast = m_endDate_Warning.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time2_warning->setText(m_endLast); + } + } + else if (str == "pushButton_Set1_History") + { + QTimeDlg dlg(NULL); + dlg.SetDateTime(m_startDate_History); + if (dlg.exec() == QDialog::Accepted) + { + dlg.GetDateTime(m_startDate_History); + QString m_endLast = m_startDate_History.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time1_History->setText(m_endLast); + } + } + else if (str == "pushButton_Set2_History") + { + QTimeDlg dlg; + dlg.SetDateTime(m_endDate_History); + if (dlg.exec() == QDialog::Accepted) + { + dlg.GetDateTime(m_endDate_History); + QString m_endLast = m_endDate_History.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time2_History->setText(m_endLast); + } + } +} + +Q_SLOT void lpReport::onCheckButton() +{ + QObject *obj = sender(); + QString str = obj->objectName(); + if ("pushButton_Checkdata" == str)//ѯ + {/*Ҫݷҳʾ ڴй¶*/ + static bool checkflags = false; + if (checkflags == false) + { + checkflags = true; + QString strBanci = ui.comboBox_Banci->currentText(); + QString modelName = ui.comboBox_Model->currentText(); + if (m_Totaltime.contains(strBanci)) + { + if (m_startDate_History.date() > m_endDate_History.date()) + { + if (m_Totaltime.value(strBanci).m_startTime > m_Totaltime.value(strBanci).m_endTime) + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ѡİʱǸҹģѡһµǰѯڣٲѯ")); + checkflags = false; + return; + } + else + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ѡڲѡһµǰѯڣٲѯ")); + checkflags = false; + return; + } + } + } + else + { + if (m_startDate_History.date() > m_endDate_History.date()) + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ѡڲѡһµǰѯڣٲѯ")); + checkflags = false; + return; + } + } + + QString m_strLast = ui.label_Time1_History->text(); + QString m_endLast = ui.label_Time2_History->text(); + QString strMsg = tr("ѯ%1-%2").arg(m_strLast).arg(m_endLast); + SaveLog(strMsg); + QApplication::setOverrideCursor(Qt::WaitCursor); + QFont font; + font.setPixelSize(14); + ui.label_Tab2_Title->setFont(font); + QString m_Title = tr("ʼʱ:%1 ʱ:%2 ʷ¼").arg(m_strLast).arg(m_endLast); + ui.label_Tab2_Title->setText(m_Title); + if (modelName == tr("ȫ")) + CheckDataHistoryByDate(m_strLast, m_endLast, "*"); + else + CheckDataHistoryByDate(m_strLast, m_endLast, modelName); + QApplication::restoreOverrideCursor(); + checkflags = false; + } + else + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ڲѯݣԺ")); + } + } + else if ("pushButton_SaveHistory" == str) + { + if (m_tableModel == NULL) + return; + if (m_tableModel->rowCount() <= 0) + { + onMessageBox(QMessageBox::Warning, tr("ʾ"), tr("ûݣ²ѯ")); + return; + } + + QString filename = QString("History_%1.csv").arg(QDateTime::currentDateTime().toString("yyyy_MM_dd")); + QString fileTitle = tr("ѡ񱣴ļ·"); + QFileDialog *fileDialog = new QFileDialog(NULL, fileTitle, filename); + fileDialog->setWindowTitle("Save As"); + fileDialog->setAcceptMode(QFileDialog::AcceptSave); + fileDialog->setFileMode(QFileDialog::AnyFile); + fileDialog->setViewMode(QFileDialog::Detail); + fileDialog->setGeometry(10, 30, 300, 200); + fileDialog->setDirectory("."); + fileDialog->setNameFilter("Execl(*.csv)"); + + if (fileDialog->exec() == QDialog::Accepted) + { + QString path = fileDialog->selectedFiles()[0]; + + QString strString = getHistoryCheckString(); + QSaveCSVThread *workerThread = new QSaveCSVThread(this); + workerThread->setInform(ui.label_Tab2_Title->text(), "username"); + workerThread->setCheckStr(m_pDb, strString, path, 0); + connect(workerThread, SIGNAL(resultReady(int)), this, SLOT(onSaveCSVDone(int))); + connect(workerThread, &QSaveCSVThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + onEventLoop(tr("ڵݣԵ")); + + QString strMsg = tr("%1-%2").arg(ui.label_Time1_History->text()).arg(ui.label_Time2_History->text()); + SaveLog(strMsg); + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ݵ")); + } + if (fileDialog) { + delete fileDialog; + fileDialog = NULL; + } + } + else if (str == "pushButton_Wandring") + { + static bool checkflags = false; + if (checkflags == false) + { + checkflags = true; + QApplication::setOverrideCursor(Qt::WaitCursor); + QString m_strLast = ui.label_Time1_warning->text(); + QString m_endLast = ui.label_Time2_warning->text(); + QString strMsg = tr("ѯ%1-%2־").arg(m_strLast).arg(m_endLast); + QString strCombox = ui.comboBox_Wandring_Log->currentText(); + int mType = 0; + if (strCombox == tr("ʹü¼ѯ")) { + mType = (int)emTypeUseState; + } + else if (strCombox == tr("¼ѯ")) { + mType = (int)emTypeWaring; + } + else if (strCombox == tr("״̬ѯ")) { + mType = (int)emTypeRunState; + } + SaveLog(strMsg); + QFont font; + font.setPixelSize(14); + ui.label_Tab3_Title->setFont(font); + QString m_Title = tr("ʼʱ:%1 ʱ:%2 ʷ¼").arg(m_strLast).arg(m_endLast); + ui.label_Tab3_Title->setText(m_Title); + + CheckDataWarningByDate(mType, m_strLast, m_endLast); + QApplication::restoreOverrideCursor(); + checkflags = false; + } + else + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ڲѯݣԺ")); + } + } + else if (str == "pushButton_SaveWaring") + { + if (m_tableWarnModel == NULL) + { + onMessageBox(QMessageBox::Warning, tr("ʾ"), tr("ûݣ²ѯ")); + return; + } + if (m_tableWarnModel->rowCount() <= 0) + { + onMessageBox(QMessageBox::Warning, tr("ʾ"), tr("ûݣ²ѯ")); + return; + } + QString filename = QString("WarnMessage_%1.csv").arg(QDateTime::currentDateTime().toString("yyyy_MM_dd")); + QString fileTitle = tr("ѡ񱣴ļ·"); + QFileDialog *fileDialog = new QFileDialog(NULL, fileTitle, filename); + fileDialog->setWindowTitle("Save As"); + fileDialog->setAcceptMode(QFileDialog::AcceptSave); + fileDialog->setFileMode(QFileDialog::AnyFile); + fileDialog->setViewMode(QFileDialog::Detail); + fileDialog->setGeometry(10, 30, 300, 200); + fileDialog->setDirectory("."); + fileDialog->setNameFilter("Execl(*.csv)"); + + if (fileDialog->exec() == QDialog::Accepted) + { + QString path = fileDialog->selectedFiles()[0]; + QString strString = getLogCheckString(); + QSaveCSVThread *workerThread = new QSaveCSVThread(this); + workerThread->setInform(ui.label_Tab3_Title->text(), "username"); + workerThread->setCheckStr(m_pDb, strString, path, 1); + connect(workerThread, SIGNAL(resultReady(int)), this, SLOT(onSaveCSVDone(int))); + connect(workerThread, &QSaveCSVThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + onEventLoop(tr("ڵݣԵ")); + + QString strMsg = tr("%1-%2־").arg(ui.label_Time1_warning->text()).arg(ui.label_Time2_warning->text()); + SaveLog(strMsg); + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ݵ")); + } + if (fileDialog) { + delete fileDialog; + fileDialog = NULL; + } + } + else if ("pushButton_Checkdata_Calculate" == str) + { + static bool checkflags = false; + if (checkflags == false) + { + checkflags = true; + QString strBanci = ui.comboBox_Banci_Calculate->currentText(); + QString modelName = ui.comboBox_Model->currentText(); + if (m_Totaltime.contains(strBanci)) + { + if (m_startDate_Count.date() > m_endDate_Count.date()) + { + if (m_Totaltime.value(strBanci).m_startTime > m_Totaltime.value(strBanci).m_endTime) + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ѡİʱǸҹģѡһµǰѯڣٲѯ")); + checkflags = false; + return; + } + else + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ѡڲʼڣٲѯ")); + checkflags = false; + return; + } + } + } + else + { + if (m_startDate_Count.date() > m_endDate_Count.date()) + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ѡڲѡһµǰѯڣٲѯ")); + checkflags = false; + return; + } + } + QString m_strLast = ui.label_Time1_Count->text(); + QString m_endLast = ui.label_Time2_Count->text(); + QString strMsg = tr("ѯ%1-%2ͳ").arg(ui.label_Time1_Count->text()).arg(ui.label_Time2_Count->text()); + SaveLog(strMsg); + QApplication::setOverrideCursor(Qt::WaitCursor); + CheckDataByDate(m_strLast, m_endLast); + QApplication::restoreOverrideCursor(); + checkflags = false; + } + else + { + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ڲѯݣԺ")); + } + } + else if ("pushButton_SaveCalculate" == str) + { + if (m_CountNumber.size() <= 0) + { + onMessageBox(QMessageBox::Warning, tr("ʾ"), tr("ûݣ²ѯ")); + return; + } + QString filename = QString("Data_%1.csv").arg(QDateTime::currentDateTime().toString("yyyy_MM_dd")); + QString fileTitle = tr("ѡ񱣴ļ·"); + QFileDialog *fileDialog = new QFileDialog(NULL, fileTitle, filename); + fileDialog->setWindowTitle("Save As"); + fileDialog->setAcceptMode(QFileDialog::AcceptSave); + fileDialog->setFileMode(QFileDialog::AnyFile); + fileDialog->setViewMode(QFileDialog::Detail); + fileDialog->setGeometry(10, 30, 300, 200); + fileDialog->setDirectory("."); + fileDialog->setNameFilter("Execl(*.csv)"); + + if (fileDialog->exec() == QDialog::Accepted) + { + QString path = fileDialog->selectedFiles()[0]; + if (SaveDataToCSV(path, m_CountNumber)) + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("ݵ")); + QString strMsg = tr("%1-%2ͳ").arg(ui.label_Time1_Count->text()).arg(ui.label_Time2_Count->text()); + SaveLog(strMsg); + } + if (fileDialog) { + delete fileDialog; + fileDialog = NULL; + } + } +} + +bool lpReport::onMessageBox(QMessageBox::Icon ntype, QString strTitle, QString strAtl, int onlyOK) +{ + QMessageBox::StandardButton button = QMessageBox::Ok; + + if (onlyOK == 1) + button = QMessageBox::Cancel; + QMessageBox infobox(ntype, strTitle, strAtl, QMessageBox::Ok | button, NULL); + infobox.setWindowIcon(QIcon(":/image/leaper")); + infobox.setButtonText(QMessageBox::Ok, tr("ȷ")); + infobox.setButtonText(QMessageBox::Cancel, tr("ȡ")); + return (infobox.exec() == QMessageBox::Ok); +} + +void lpReport::CheckDataHistoryByDate(QString m_strLast, QString m_endLast, QString modelname) +{ + QSqlQuery sql; + QVariantMap m_Value; + m_Value.insert(_CHECK_TYPE_, EMT_CHECK_BY_NAME); + m_Value.insert(_CHECK_TIME1_, m_strLast); + m_Value.insert(_CHECK_TIME2_, m_endLast); + m_Value.insert(_CHECK_NAME_, modelname); + m_Value.insert(_CHECK_COUNT_, 1); + if (modelname == "*") + m_Value.insert(_CHECK_TYPE_, EMT_CHECK_BY_SAE); + else + m_Value.insert(_CHECK_TYPE_, EMT_CHECK_BY_NAME); + QString strString; + strString = m_pDb->genCheckStr(m_Value); + int nlimit = ui.LineNumber_checkShengchang->text().toInt(); + if (nlimit <= 0) + { + nlimit = 10; + ui.LineNumber_checkShengchang->setText("10"); + } + m_totlaNum = 0; + m_PrevNum = 0; + QString strStringcheck; + if (modelname == "*") + strStringcheck = QString("select * from wftable where time >'%1' and time <'%2' LIMIT %4 OFFSET %5").arg(m_strLast).arg(m_endLast).arg(nlimit).arg(m_PrevNum); + else + strStringcheck = QString("select * from wftable where time >'%1' and time <'%2' and model = '%3' LIMIT %4 OFFSET %5").arg(m_strLast).arg(m_endLast).arg(modelname).arg(nlimit).arg(m_PrevNum); + QVariantMap m_mapVarite; + m_mapVarite.insert("SqlCount", strString); + m_mapVarite.insert("SqlCheck", strStringcheck); + m_mapVarite.insert("limit", nlimit); + emit operateHistory(m_mapVarite); + +} + +bool lpReport::SaveDataToCSV(QString filePath, QMap &m_mapTable) +{ + QFile file(filePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append))// ׷д + return false; + QTextStream out(&file); + QString tableData; + QString m_startStr = m_startDate_Count.toString("yyyy-MM-dd ") + m_startTime.toString("hh:mm:ss"); + QString m_endStr = m_endDate_Count.toString("yyyy-MM-dd ") + m_endTime.toString("hh:mm:ss"); + out << tr("%1%2ͳƵ").arg(m_startStr).arg(m_endStr) << "\n"; + out << tr("") << "," << tr("ͺ") << "," << tr("") << "\n"; + int index = 1; + int sum = 0; + for (QMap::iterator its = m_mapTable.begin(); its != m_mapTable.end(); ++its) + { + out << (index++) << ","; + tableData = its.key(); + out << tableData << ","; + out << QString::number(m_mapTable[tableData]) << ","; + sum += m_mapTable[tableData]; + out << "\n"; + } + if (!m_mapTable.contains(QString("NG"))) + { + out << (index++) << "," << QString("NG") << "," << 0 << "\n"; + } + out << (index++) << "," << tr("") << "," << QString::number(sum) << "\n"; + out << tr("ʱ:") << "," << QDateTime::currentDateTime().toString("yyyy-MM-dd") << "," << QDateTime::currentDateTime().toString("hh:mm:ss") << "\n"; + out << tr("û:") << "," << "username" << "," << "\n"; + file.close(); + return true; +} + +void lpReport::CheckDataByDate(QString m_strLast, QString m_endLast) +{ + if (m_IsRunCountTsk != false) + { + return; + } + m_IsRunCountTsk = true; + m_CountNumber.clear(); + m_channels.clear(); + + QProgressDialog progress; + progress.setWindowModality(Qt::ApplicationModal); + progress.setWindowTitle(tr("ѯ")); + progress.setWindowIcon(QIcon(":/image/leaper")); + progress.setLabelText(tr("ݲѯ,Ժ.....")); + progress.setCancelButton(0); + QSqlQuery sql; + QVariantMap m_Value; + m_Value.insert(_CHECK_TYPE_, EMT_CHECK_BY_COUNT); + m_Value.insert(_CHECK_TIME1_, m_strLast); + m_Value.insert(_CHECK_TIME2_, m_endLast); + m_Value.insert("CheckType", "Count"); + QString strCheck = m_pDb->genCheckStr(m_Value); + m_Value.insert(_CHECK_COUNT_, 1); + QString strCount = m_pDb->genCheckStr(m_Value); + QVariantMap m_map; + m_map.insert("SqlCount", strCount); + m_map.insert("SqlCheck", strCheck); + emit operateCount(m_map); +} + +void lpReport::onEventLoop(QString strMsg) +{ + WaitingDialog dlg; + dlg.setWindowModality(Qt::ApplicationModal); + dlg.setWindowIcon(QIcon(":/image/leaper")); + dlg.setWindowTitle(strMsg); + dlg.Start(50, 150), + dlg.show(); + QEventLoop eventloop; + connect(this, SIGNAL(sgFinish()), &eventloop, SLOT(quit())); + eventloop.exec(); +} + + +void lpReport::SaveLog(QString str) +{ + // QString strMsg = m_pCtrl->getUserName() + ":" + str; + // m_pCtrl->addLog(strMsg, emTypeUseState); +} + +QString lpReport::getHistoryCheckString() +{ + QString m_strLast = ui.label_Time1_History->text(); + QString m_endLast = ui.label_Time2_History->text(); + QString modelName = ui.comboBox_Model->currentText(); + QString strString; + if (modelName == tr("ȫ")) + strString = QString("select * from wftable where time >'%1' and time <'%2'").arg(m_strLast).arg(m_endLast); + else + strString = QString("select * from wftable where time >'%1' and time <'%2' and model = '%3'").arg(m_strLast).arg(m_endLast).arg(modelName); + return strString; +} + +Q_SLOT void lpReport::onHistoryButton() +{ + QString strObj = sender()->objectName(); + if ("Prev_checkShengchang" == strObj) { + + if (m_PrevNum <= 0) + return; + int limitNum = ui.LineNumber_checkShengchang->text().toInt(); + if (limitNum <= 0) + { + limitNum = 10; + ui.LineNumber_checkShengchang->setText("10"); + } + QString strString = getHistoryCheckString(); + m_PrevNum -= limitNum; + if (m_PrevNum <= 0) + m_PrevNum = 0; + strString = strString + QString(" LIMIT %1 OFFSET %2").arg(limitNum).arg(m_PrevNum); + + /*̲߳ѯ ٽ濨*/ + CheckThread *workerThread = new CheckThread(this); + workerThread->setCheckStr(m_pDb, strString); + connect(workerThread, SIGNAL(resultReady(QSqlQuery)), this, SLOT(onUpdateTableViewShow(QSqlQuery))); + connect(workerThread, &CheckThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + m_totalPage = (m_totlaNum / limitNum); + m_page = ((m_PrevNum) / limitNum) + 1; + ui.showPage_Label_Checkdata->setText(tr("%1ҳ %2ҳ").arg(m_page).arg(m_totalPage + 1)); + if (m_PrevNum <= 0) + { + m_PrevNum = 0; + ui.Prev_checkShengchang->setDisabled(true); + } + ui.Next_checkShengchang->setDisabled(false); + } + else if ("Next_checkShengchang" == strObj) { + if (m_PrevNum >= m_totlaNum) + return; + int limitNum = ui.LineNumber_checkShengchang->text().toInt(); + if (limitNum <= 0) + { + limitNum = 10; + ui.LineNumber_checkShengchang->setText("10"); + } + m_PrevNum += limitNum; + if (m_PrevNum >= m_totlaNum) + m_PrevNum = m_totlaNum - limitNum; + QString strString = getHistoryCheckString(); + strString = strString + QString(" LIMIT %1 OFFSET %2").arg(limitNum).arg(m_PrevNum); + + /*̲߳ѯ ٽ濨*/ + CheckThread *workerThread = new CheckThread(this); + workerThread->setCheckStr(m_pDb, strString); + connect(workerThread, SIGNAL(resultReady(QSqlQuery)), this, SLOT(onUpdateTableViewShow(QSqlQuery))); + connect(workerThread, &CheckThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + m_totalPage = (m_totlaNum / limitNum); + m_page = (m_PrevNum + limitNum) / limitNum; + ui.showPage_Label_Checkdata->setText(tr("%1ҳ %2ҳ").arg(m_page).arg(m_totalPage + 1)); + if ((m_PrevNum + limitNum) >= m_totlaNum) + { + m_PrevNum = m_totlaNum; + ui.Next_checkShengchang->setDisabled(true); + } + ui.Prev_checkShengchang->setDisabled(false); + } +} + +void lpReport::cleanHistorycal() +{ + m_PrevNum = 0; + m_NextNum = 0; + m_totlaNum = 0; + m_page = 0; + m_totalPage = 0; + + m_PrevNumlog = 0; + m_NextNumlog = 0; + m_totlaNumlog = 0; + m_pagelog = 0; + m_totalPagelog = 0; + + ui.showNum_Label_Checkdata->setText(tr("ʾ%1¼").arg(0)); + ui.showPage_Label_Checkdata->setText(tr("%1ҳ %2ҳ").arg(0).arg(0)); + ui.Prev_checkShengchang->setDisabled(true); + ui.Next_checkShengchang->setDisabled(true); + + ui.showNum_Label_Checkdata_2->setText(tr("ʾ%1¼").arg(0)); + ui.showPage_Label_Checkdata_2->setText(tr("%1ҳ %2ҳ").arg(0).arg(0)); + ui.Prev_checklog->setDisabled(true); + ui.Next_checklog->setDisabled(true); +} + +Q_SLOT void lpReport::onSetCurrentIndex(int nIndex) +{ + ui.label_Title->setText(ui.check_listWidget->item(nIndex)->data(0).toString()); + emit(sgSetCurrentIndex(nIndex)); +} + +Q_SLOT void lpReport::onSaveCSVDone(int) +{ + emit(sgFinish()); +} + +Q_SLOT void lpReport::handleResults(QString str) +{ + //QString strMsg = "username" + ":" + tr("ϵͳԶʱѯһɣĿڵ"); + //m_pCtrl->addLog(strMsg, emTypeRunState); + onShowMessage(tr("ϵͳԶ")); +} +Q_SLOT void lpReport::onShowMessage(QString str) +{ + // QPulpewidget *pw = new QPulpewidget(); + // pw->showmessage(str); + // pw->setParent(m_pDlgCheck); + // connect(pw, SIGNAL(finished()), pw, SLOT(deleteLater()));// +} + + +Q_SLOT void lpReport::onProgressForTsk(QVariantMap m_map) +{ + QString nType = m_map.value("Type").toString(); + if (nType == "start") + { + QString strMsg = m_map.value("msg", tr("ڲѯ")).toString(); + m_Progressdlg.setWindowTitle(strMsg); + m_Progressdlg.Start(50, 150), + m_Progressdlg.show(); + } + else + { + m_Progressdlg.Stop(); + m_Progressdlg.hide(); + } +} + +Q_SLOT void lpReport::handleResultsHistory(QVariantMap Mapstr, QSqlQuery sql) +{ + updateModelShowHistory(sql); + QString m_strLast = ui.label_Time1_History->text(); + QString m_endLast = ui.label_Time2_History->text(); + m_totlaNum = Mapstr.value("sum").toInt(); + int nlimit = Mapstr.value("limit").toInt(); + int nIndex = Mapstr.value("nIndex").toInt(); + QString m_Title = tr("ʼʱ:%1 ʱ:%2 ʷ¼ %3").arg(m_strLast).arg(m_endLast).arg(m_totlaNum); + ui.label_Number->setText(QString::number(m_totlaNum)); + QFont font; + font.setPixelSize(14); + font.setBold(true); + ui.label_Tab2_Title->setFont(font); + ui.label_Tab2_Title->setText(m_Title); + ui.Next_checkShengchang->setDisabled(false); + m_totalPage = (m_totlaNum / nlimit); + if (m_totlaNum > 0) + { + m_totalPage = m_totalPage + 1; + m_page = 1; + nIndex = m_totlaNum; + } + else + { + m_totlaNum = 0; + m_page = 0; + } + ui.showPage_Label_Checkdata->setText(tr("%1ҳ %2ҳ").arg(m_page).arg(m_totalPage)); + ui.showNum_Label_Checkdata->setText(tr("ʾ%1¼").arg(nIndex)); + onShowMessage(tr("ݲѯ")); +} + +Q_SLOT void lpReport::onShowMsg() +{ + onMessageBox(QMessageBox::Information, tr("ʾ"), tr("Ч")); +} + +Q_SLOT void lpReport::handleResultsCount(const QString &result, const QMap *p) +{ + reportdlg->ClearData(); + reportdlg->setTitle(tr("ͳƽ ")); + if (p == NULL) { + m_IsRunCountTsk = false; + return; + } + reportdlg->SetData(QMap(*p)/*m_CountNumber*/); + if (!p->contains(QString("NG"))) + reportdlg->AppendData(QString("NG"), 0, true); + reportdlg->AppendData(tr(""), result.toInt(), true); + reportdlg->UpdateTableView(); + onShowMessage(tr("ͳ")); + m_IsRunCountTsk = false; + if (p) + delete p; +} + +Q_SLOT void lpReport::onLogButton() +{ + QString strObj = sender()->objectName(); + if ("Prev_checklog" == strObj) { + if (m_PrevNumlog <= 0) + return; + int limitNum = ui.LineNumber_log->text().toInt(); + if (limitNum <= 0) + { + limitNum = 10; + ui.LineNumber_log->setText("10"); + } + m_PrevNumlog -= limitNum; + if (m_PrevNumlog <= 0) + m_PrevNumlog = 0; + QString strString = getLogCheckString(); + strString += QString(" LIMIT %1 OFFSET %2 ").arg(limitNum).arg(m_PrevNumlog); + /*̲߳ѯ ٽ濨*/ + CheckThread *workerThread = new CheckThread(this); + workerThread->setCheckStr(m_pDb, strString); + connect(workerThread, SIGNAL(resultReady(QSqlQuery)), this, SLOT(onUpdateTableViewShowlog(QSqlQuery))); + connect(workerThread, &CheckThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + m_totalPagelog = (m_totlaNumlog / limitNum); + m_pagelog = ((m_PrevNumlog) / limitNum) + 1; + ui.showPage_Label_Checkdata_2->setText(tr("%1ҳ %2ҳ").arg(m_pagelog).arg(m_totalPagelog + 1)); + if (m_PrevNumlog <= 0) + { + m_PrevNumlog = 0; + ui.Prev_checklog->setDisabled(true); + } + ui.Next_checklog->setDisabled(false); + } + else if ("Next_checklog" == strObj) { + if (m_PrevNumlog >= m_totlaNumlog) + return; + int limitNum = ui.LineNumber_log->text().toInt(); + if (limitNum <= 0) + { + limitNum = 10; + ui.LineNumber_log->setText("10"); + } + m_PrevNumlog += limitNum; + if (m_PrevNumlog >= m_totlaNumlog) + m_PrevNumlog = m_totlaNumlog - limitNum; + QString strString = getLogCheckString(); + + strString += QString(" LIMIT %1 OFFSET %2 ").arg(limitNum).arg(m_PrevNumlog); + /*̲߳ѯ ٽ濨*/ + CheckThread *workerThread = new CheckThread(this); + workerThread->setCheckStr(m_pDb, strString); + connect(workerThread, SIGNAL(resultReady(QSqlQuery)), this, SLOT(onUpdateTableViewShowlog(QSqlQuery))); + connect(workerThread, &CheckThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + m_totalPagelog = (m_totlaNumlog / limitNum); + m_pagelog = (m_PrevNumlog + limitNum) / limitNum; + ui.showPage_Label_Checkdata_2->setText(tr("%1ҳ %2ҳ").arg(m_pagelog).arg(m_totalPagelog + 1)); + if ((m_PrevNumlog + limitNum) >= m_totlaNumlog) + { + m_PrevNumlog = m_totlaNumlog; + ui.Next_checklog->setDisabled(true); + } + ui.Prev_checklog->setDisabled(false); + } +} + +QString lpReport::getLogCheckString(int nCheckCount/*=0*/) +{ + QString m_strLast = ui.label_Time1_warning->text(); + QString m_endLast = ui.label_Time2_warning->text(); + QString strCombox = ui.comboBox_Wandring_Log->currentText(); + int mType = 0; + if (strCombox == tr("ʹü¼ѯ")) { + mType = (int)emTypeUseState; + } + else if (strCombox == tr("¼ѯ")) { + mType = (int)emTypeWaring; + } + else if (strCombox == tr("״̬ѯ")) { + mType = (int)emTypeRunState; + } + QVariantMap m_vlaue; + m_vlaue.insert(_CHECK_TIME1_, m_strLast); + m_vlaue.insert(_CHECK_TIME2_, m_endLast); + m_vlaue.insert(_CHECK_LOGTYPE, mType); + m_vlaue.insert(_CHECK_TYPE_, EMT_CHECK_BY_LOG); + if (nCheckCount == 1) + m_vlaue.insert(_CHECK_COUNT_, 1); + return m_pDb->genCheckStr(m_vlaue); +} + +Q_SLOT void lpReport::onUpdateTableViewShow(QSqlQuery sql) +{ + updateModelShowHistory(sql); +} + +void lpReport::updateModelShowHistory(QSqlQuery &sql) +{ + QStandardItemModel *testmodel = new QStandardItemModel; + ui.tableView_checkShengchang->setModel(testmodel);//ȽģͲһʾ ʾ + ui.tableView_checkShengchang->setEditTriggers(QAbstractItemView::NoEditTriggers); + ui.tableView_checkShengchang->setSelectionBehavior(QAbstractItemView::SelectRows); + ui.tableView_checkShengchang->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//Ӧп + ui.tableView_checkShengchang->horizontalHeader()->setMaximumHeight(100); + + if (m_tableModel == NULL) + m_tableModel = new QStandardItemModel; + m_tableModel->clear(); + ui.CheckDlg_label_Pic->clear(); + m_tableModel->setHorizontalHeaderItem(0, new QStandardItem(tr("ʱ"))); + m_tableModel->setHorizontalHeaderItem(1, new QStandardItem(tr("ƥͺ"))); + m_tableModel->setHorizontalHeaderItem(2, new QStandardItem(tr("ƶ"))); + m_tableModel->setHorizontalHeaderItem(3, new QStandardItem(tr("ʱs"))); + m_tableModel->setHorizontalHeaderItem(4, new QStandardItem(tr("ֱmm"))); + m_tableModel->setHorizontalHeaderItem(5, new QStandardItem(tr("mm"))); + m_tableModel->setHorizontalHeaderItem(6, new QStandardItem(tr("ͼ"))); + m_tableModel->setHorizontalHeaderItem(7, new QStandardItem(tr("uid"))); + int nIndex = 0; + + while (sql.next()) + { + /*ͳƲѯͨӦIJƷ*/ + int uid = sql.value("uid").toInt(); + QString time = sql.value("time").toString(); + QString model = sql.value("model").toString(); + double dCorrelate = sql.value("correlate").toDouble(); + QString correlate; + if (dCorrelate >= 1.7976931348623158e+308) + dCorrelate = 0; + correlate = QString::number(dCorrelate * 100, 'f', 3) + "%"; + double dDetecttime = sql.value("detecttime").toDouble(); + QString detecttime = QString::number(dDetecttime, 'f', 3); + double dDiameter = sql.value("diameter").toDouble(); + QString diameter = QString::number(dDiameter, 'f', 3); + double dHight = sql.value("hight").toDouble(); + QString hight = QString::number(dHight, 'f', 3); + QByteArray pic = sql.value("pic").toByteArray(); + QImage img = QImage::fromData(pic); + QSize s = img.size(); + QPixmap m_Pix = QPixmap::fromImage(img); + ui.CheckDlg_label_Pic->setPixmap(m_Pix.scaled(WHEEL_PIC_SIZE, WHEEL_PIC_SIZE)); + m_tableModel->setItem(nIndex, 0, new QStandardItem(time)); + m_tableModel->setItem(nIndex, 1, new QStandardItem(model)); + m_tableModel->setItem(nIndex, 2, new QStandardItem(correlate)); + m_tableModel->setItem(nIndex, 3, new QStandardItem(detecttime)); + m_tableModel->setItem(nIndex, 4, new QStandardItem(diameter)); + m_tableModel->setItem(nIndex, 5, new QStandardItem(hight)); + m_tableModel->setItem(nIndex, 6, new QStandardItem(QIcon(m_Pix.scaled(50, 50)), "")); + m_tableModel->setItem(nIndex, 7, new QStandardItem(QString("%1").arg(uid))); + nIndex++; + } + ui.showNum_Label_Checkdata->setText(tr("ʾ%1¼").arg(nIndex)); + ui.tableView_checkShengchang->setModel(m_tableModel); + ui.tableView_checkShengchang->hideColumn(7); + ui.tableView_checkShengchang->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + connect(ui.tableView_checkShengchang, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(onTableViewClick(QModelIndex))); + delete testmodel; + testmodel = NULL; +} + +Q_SLOT void lpReport::onUpdateTableViewShowlog(QSqlQuery sql) +{ + updateModelShowLog(sql); +} + +Q_SLOT void lpReport::onResultCountlog(int nCount) +{ + m_totlaNumlog = nCount; + emit(sgFinish()); +} + +Q_SLOT void lpReport::onResultCount(int nCount) +{ + m_totlaNum = nCount; + emit(sgFinish()); +} + +void lpReport::CheckDataWarningByDate(int nType, QString m_strLast, QString m_endLast) +{ + QString strString = getLogCheckString(1); + m_PrevNumlog = 0; + m_totlaNumlog = 0; + CheckThread *workThread = new CheckThread(this); + workThread->setCheckStr(m_pDb, strString); + workThread->setModelFlags(true); + connect(workThread, SIGNAL(resultCount(int)), this, SLOT(onResultCountlog(int))); + connect(workThread, &CheckThread::finished, workThread, &QObject::deleteLater); + workThread->start(); + onEventLoop(tr("ڲѯ¼Ե")); + + strString = getLogCheckString(); + int nlimit = ui.LineNumber_log->text().toInt(); + if (nlimit <= 0) + { + nlimit = 10; + ui.LineNumber_log->setText("10"); + } + strString += QString(" LIMIT %1 OFFSET %2 ").arg(nlimit).arg(m_PrevNumlog); + CheckThread *workerThread = new CheckThread(this); + workerThread->setCheckStr(m_pDb, strString); + connect(workerThread, SIGNAL(resultReady(QSqlQuery)), this, SLOT(onUpdateTableViewShowlog(QSqlQuery))); + connect(workerThread, &CheckThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + + QString m_Title = tr("%1 %2 ļ¼ %3").arg(m_strLast).arg(m_endLast).arg(m_totlaNumlog); + QFont font; + font.setPixelSize(14); + font.setBold(true); + ui.label_Tab3_Title->setFont(font); + ui.label_Tab3_Title->setText(m_Title); + + ui.Next_checklog->setDisabled(false); + m_totalPagelog = (m_totlaNumlog / nlimit); + if (m_totlaNumlog > 0) + { + m_totalPagelog = m_totalPagelog + 1; + m_pagelog = 1; + } + else + { + m_totlaNumlog = 0; + m_pagelog = 0; + } + ui.showPage_Label_Checkdata_2->setText(tr("%1ҳ %2ҳ").arg(m_pagelog).arg(m_totalPagelog)); +} + +void lpReport::updateModelShowLog(QSqlQuery &sql) +{ + QStandardItemModel *testmodel = new QStandardItemModel; + ui.tableView_TWarning->setModel(testmodel);//ȽģͲһʾ ʾ + ui.tableView_TWarning->setEditTriggers(QAbstractItemView::NoEditTriggers); + ui.tableView_TWarning->setSelectionBehavior(QAbstractItemView::SelectRows); + ui.tableView_TWarning->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//Ӧп + if (m_tableWarnModel == NULL) + m_tableWarnModel = new QStandardItemModel; + m_tableWarnModel->clear(); + m_tableWarnModel->setHorizontalHeaderItem(0, new QStandardItem(tr("ʱ"))); + m_tableWarnModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Ϣ"))); + + int nIndex = 0; + while (sql.next()) + { + /*ͳƲѯͨӦIJƷ*/ + QString time = sql.value("time").toString(); + QString message = sql.value("message").toString(); + QString classd = sql.value("class").toString(); + m_tableWarnModel->setItem(nIndex, 0, new QStandardItem(time)); + m_tableWarnModel->setItem(nIndex, 1, new QStandardItem(message)); + nIndex++; + } + ui.showNum_Label_Checkdata_2->setText(tr("ʾ%1¼").arg(nIndex)); + ui.tableView_TWarning->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + ui.tableView_TWarning->setModel(m_tableWarnModel); + delete testmodel; + testmodel = NULL; +} + +Q_SLOT void lpReport::SlotCombox(int index) +{ + QObject *strobj = sender(); + QString objname = strobj->objectName(); + if ("comboBox_Banci_Calculate" == objname) + { + QString str = ui.comboBox_Banci_Calculate->currentText(); + + if (m_Totaltime.contains(str)) + { + if (m_Totaltime.value(str).m_startTime >= m_Totaltime.value(str).m_endTime) + { + QDate m = m_endDate_Count.date(); + m = m.addDays(-1); + QString strdata = m.toString("yyyy-MM-dd"); + m_startDate_Count.setDate(m); + } + else + { + m_startDate_Count.setDate(m_endDate_Count.date()); + } + if (m_startDate_Count.date() > m_endDate_Count.date()) + m_startDate_Count.setDate(m_endDate_Count.date()); + + m_startDate_Count.setTime(m_Totaltime.value(str).m_startTime);// + m_endDate_Count.setTime(m_Totaltime.value(str).m_endTime);// + } + else + { + if (str == tr("ȫ")) + { + QString strTime = nstartTime.toString("hh:mm:ss"); + if (m_startDate_Count.date() > m_endDate_Count.date()) + m_startDate_Count.setDate(m_endDate_Count.date()); + + m_startDate_Count.setTime(m_startTime); + m_endDate_Count.setTime(nEndTime); + QString strStart = m_startDate_Count.toString("yyyy-MM-dd hh:mm:ss"); + } + } + ui.label_Time1_Count->setText(m_startDate_Count.toString("yyyy-MM-dd hh:mm:ss")); + ui.label_Time2_Count->setText(m_endDate_Count.toString("yyyy-MM-dd hh:mm:ss")); + } + else if ("comboBox_Banci" == objname) + { + QString str = ui.comboBox_Banci->currentText(); + + if (m_Totaltime.contains(str)) + { + if (m_Totaltime.value(str).m_startTime >= m_Totaltime.value(str).m_endTime) + { + QDate m = m_endDate_History.date(); + m = m.addDays(-1); + QString strdata = m.toString("yyyy-MM-dd"); + m_startDate_History.setDate(m); + } + else + { + m_startDate_History.setDate(m_endDate_History.date()); + } + if (m_startDate_History.date() > m_endDate_History.date()) + m_startDate_History.setDate(m_endDate_History.date()); + m_startDate_History.setTime(m_Totaltime.value(str).m_startTime);// + m_endDate_History.setTime(m_Totaltime.value(str).m_endTime);// + } + else + { + if (str == tr("ȫ")) + { + QString strTime = nstartTime.toString("hh:mm:ss"); + if (m_startDate_History.date() > m_endDate_History.date()) + m_startDate_History.setDate(m_endDate_History.date()); + m_startDate_History.setTime(m_startTime); + m_endDate_History.setTime(nEndTime); + QString strStart = m_startDate_History.toString("yyyy-MM-dd hh:mm:ss"); + } + } + ui.label_Time1_History->setText(m_startDate_History.toString("yyyy-MM-dd hh:mm:ss")); + ui.label_Time2_History->setText(m_endDate_History.toString("yyyy-MM-dd hh:mm:ss")); + } +} + +Q_SLOT void lpReport::onSlowPixmap(QSqlQuery sql) +{ + static bool nFlag = false; + if (nFlag == true) + return; + nFlag = true; + + sql.next(); + double dHight = sql.value("hight").toDouble(); + QByteArray pic = sql.value("pic").toByteArray(); + QImage img = QImage::fromData(pic); + QSize s = img.size(); + QPixmap m_Pix = QPixmap::fromImage(img); + + { + int dhight = m_Pix.height(); + int dwidth = m_Pix.width(); + double nRate = m_Pix.width()*1.0 / m_Pix.height(); + int scarew = 150; + int scareh = 150 * 1.0 / nRate; + + if (scareh > 150) + { + scarew = 150; + scareh = 150 * 1.0 / nRate; + } + ui.CheckDlg_label_Pic->setPixmap(m_Pix.scaled(scarew, scareh)); + } + nFlag = false; +} + +Q_SLOT void lpReport::onTableViewClick(QModelIndex mIndex) +{ + QString strObj = sender()->objectName(); + if ("tableView_checkShengchang" == strObj) { + if (m_tableModel) + { + QModelIndex ItemIndex = m_tableModel->index(mIndex.row(), 7); + QString strdata = ItemIndex.data().toString(); + if (m_pDb) + { + QVariantMap m_value; + m_value.insert(_CHECK_UID_, strdata); + m_value.insert(_CHECK_TYPE_, EMT_CHECK_BY_UID); + QString seletcStr = m_pDb->genCheckStr(m_value); + + /*̲߳ѯ ٽ濨*/ + CheckThread *workerThread = new CheckThread(this); + workerThread->setCheckStr(m_pDb, seletcStr); + connect(workerThread, SIGNAL(resultReady(QSqlQuery)), this, SLOT(onSlowPixmap(QSqlQuery))); + connect(workerThread, &CheckThread::finished, workerThread, &QObject::deleteLater); + workerThread->start(); + } + } + } +} +//ʼUI +void lpReport::InitUIParam() +{ + m_startDate_History = QDateTime::currentDateTime(); + m_endDate_History = QDateTime::currentDateTime(); + QString strstartDate = m_startDate_History.toString("yyyy-MM-dd hh:mm:ss"); + ui.label_Time1_History->setText(m_startDate_History.toString("yyyy-MM-dd hh:mm:ss")); + ui.label_Time2_History->setText(m_endDate_History.toString("yyyy-MM-dd hh:mm:ss")); + ui.label_Time1_Count->setText(m_startDate_Count.toString("yyyy-MM-dd hh:mm:ss")); + ui.label_Time2_Count->setText(m_endDate_Count.toString("yyyy-MM-dd hh:mm:ss")); + + m_startDate_Count = QDateTime::currentDateTime(); + m_endDate_Count = QDateTime::currentDateTime(); + m_endDate_Warning = m_startDate_Warning = QDateTime::currentDateTime(); + m_startDate_Warning.setTime(nstartTime); + ui.label_Time1_warning->setText(m_startDate_Warning.toString("yyyy-MM-dd hh:mm:ss")); + ui.label_Time2_warning->setText(m_endDate_Warning.toString("yyyy-MM-dd hh:mm:ss")); + + ui.comboBox_Banci->clear(); + ui.comboBox_Banci->addItem(tr("ȫ")); + ui.comboBox_Banci->addItems(m_Totaltime.keys()); + ui.comboBox_Banci_Calculate->clear(); + ui.comboBox_Banci_Calculate->addItem(tr("ȫ")); + ui.comboBox_Banci_Calculate->addItems(m_Totaltime.keys()); + + ui.comboBox_Wandring_Log->clear(); + ui.comboBox_Wandring_Log->addItem(tr("¼ѯ")); + ui.comboBox_Wandring_Log->addItem(tr("״̬ѯ")); + ui.comboBox_Wandring_Log->addItem(tr("ʹü¼ѯ")); + + ui.label_Title->setText(tr("ݲѯ")); + ui.stackedWidget->setCurrentIndex(0); + + if (m_tableModel) + { + m_tableModel->clear(); + } + if (m_tableWarnModel) + m_tableWarnModel->clear(); + + ui.label_Number->setText("0"); + ui.CheckDlg_label_Pic->clear(); + + if (reportdlg) + reportdlg->ClearData(); +} + +void lpReport::SetModelNames(QStringList models) +{ + ui.comboBox_Model->clear(); + ui.comboBox_Model->addItem(tr("ȫ")); + if (!models.contains("NG")) + ui.comboBox_Model->addItem(tr("NG")); + ui.comboBox_Model->addItems(models); + if (_pCompleter) + delete _pCompleter; + _pCompleter = new QCompleter(models); + _pCompleter->setCaseSensitivity(Qt::CaseInsensitive); + ui.comboBox_Model->setCompleter(_pCompleter); +} \ No newline at end of file diff --git a/tpvs17/lpReport/lpReport.h b/tpvs17/lpReport/lpReport.h new file mode 100644 index 0000000..5872a2d --- /dev/null +++ b/tpvs17/lpReport/lpReport.h @@ -0,0 +1,130 @@ +/*! + *FileName: lpReport.h + *Author: Pan Yingdong + *Email: bob.pan@hzleaper.com + *Created:2021/4/6 11:54 + *Note:ݲѯ ģ +*/ +#ifndef _H_LPREPORT_H_ +#define _H_LPREPORT_H_ + +#include +#include "ui_lpReport.h" +#include +#include "InfoFile.h" +#include +#include "QThread" +#include "workfordb.h" +#include "countdata.h" +#include "waitingdialog.h" +#include "checkdata.h" +#include +#include "DetectDataDB.h" + +class lpReport : public QMainWindow +{ + Q_OBJECT + +public: + lpReport(QWidget *parent = Q_NULLPTR); + ~lpReport(); + + void onInitUI(); + +protected: + virtual void timerEvent(QTimerEvent *event); + Q_SLOT void SlotEditTime(); + Q_SLOT void onCheckButton(); + bool onMessageBox(QMessageBox::Icon ntype, QString strTitle, QString strAtl, int onlyOK = 0); + void CheckDataHistoryByDate(QString m_strLast, QString m_endLast, QString modelname); + bool SaveDataToCSV(QString filePath, QMap &m_mapTable); + void CheckDataByDate(QString m_strLast, QString m_endLast); + void onEventLoop(QString strMsg); + void SaveLog(QString str); + QString getHistoryCheckString(); + Q_SLOT void onHistoryButton(); + void cleanHistorycal(); + Q_SLOT void onSetCurrentIndex(int nIndex); + Q_SLOT void onSaveCSVDone(int); + Q_SLOT void handleResults(QString str); + Q_SLOT void onShowMessage(QString str); + Q_SLOT void onProgressForTsk(QVariantMap m_map); + Q_SLOT void handleResultsHistory(QVariantMap Mapstr, QSqlQuery sql); + Q_SLOT void onShowMsg(); + Q_SLOT void handleResultsCount(const QString &result, const QMap *p); + Q_SLOT void onLogButton(); + QString getLogCheckString(int nCheckCount = 0); + + Q_SLOT void onUpdateTableViewShow(QSqlQuery sql); + void updateModelShowHistory(QSqlQuery &sql); + Q_SLOT void onUpdateTableViewShowlog(QSqlQuery sql); + Q_SLOT void onResultCountlog(int nCount); + Q_SLOT void onResultCount(int nCount); + void CheckDataWarningByDate(int nType, QString m_strLast, QString m_endLast); + void updateModelShowLog(QSqlQuery &sql); + Q_SLOT void SlotCombox(int index); + Q_SLOT void onSlowPixmap(QSqlQuery sql); + Q_SLOT void onTableViewClick(QModelIndex mIndex); + void InitUIParam(); + void SetModelNames(QStringList models); +signals: + void sgSetCurrentIndex(int); + void sgFinish(); + void operate(const QString& strTime, const int &ncount); + void operateCount(QVariantMap m_Map); + void operateHistory(QVariantMap m_map); + void sgshowMsg(); +private: + Ui::lpReportClass ui; + class QReportWidget *reportdlg{ nullptr }; + class QGridLayout *m_GridLayout{ nullptr }; + class QVBoxLayout *Hbox{ nullptr }; + class QWidget *m_countwidget{ nullptr }; +protected: + QDateTime m_startDate_Count, m_endDate_Count; + QDateTime m_startDate_History, m_endDate_History; + QDateTime m_startDate_Warning, m_endDate_Warning; + QTime m_startTime, m_endTime; + bool m_CheckFlags{ false }; + QTime nstartTime; + QTime nEndTime; + QString m_userName; + + QMap m_tableView; + QMap m_standItemModel; + QMap m_Totaltime;//ʱ + QMap m_CountNumber; + QMap> m_channels; + + int m_PrevNum{ 0 }; + int m_NextNum{ 0 }; + int m_totlaNum{ 0 }; + int m_page{ 0 }, m_totalPage{ 0 }; + + int m_PrevNumlog{ 0 }; + int m_NextNumlog{ 0 }; + int m_totlaNumlog{ 0 }; + int m_pagelog{ 0 }, m_totalPagelog{ 0 }; + + QThread m_Workthread; + WorkForDB *m_WorkDB{ nullptr }; + + QThread m_WorkThreadCount; + CountData *m_WorkCount{ nullptr }; + + QThread m_WorkThreadCheckHistory; + CheckData *m_WorkHistory{ nullptr }; + + WaitingDialog m_Progressdlg; + + bool m_IsRunCountTsk{ false }; + QCompleter *_pCompleter{ nullptr }; + + QStandardItemModel *m_tableModel{ nullptr }; + QStandardItemModel *m_tableWarnModel{ nullptr }; + + class DetectDataDB *m_pDb{ nullptr }; + class ModelDB *m_pModeDB{ nullptr }; +}; + +#endif diff --git a/tpvs17/lpReport/lpReport.qrc b/tpvs17/lpReport/lpReport.qrc new file mode 100644 index 0000000..717d2d5 --- /dev/null +++ b/tpvs17/lpReport/lpReport.qrc @@ -0,0 +1,6 @@ + + + Resources/Log.png + Resources/log.ico + + diff --git a/tpvs17/lpReport/lpReport.rc b/tpvs17/lpReport/lpReport.rc new file mode 100644 index 0000000000000000000000000000000000000000..528296634bb4421e50c21ef8e88718b48204d006 GIT binary patch literal 3244 zcmd6p$!-%t5QgiF;2j$0k_h6kJON%XBOE7+7lCBSitHFHd6O3qf&(|68p8MYxRdcR z2FzvDnyK#Us_yFAZ-1THnK?VRfpu+W6Pxq(Z2_(YZf;AvwjrycJz+TeU^h1An}J^d zd*Eh3@hzEknLAcGZD3Pq^7hCcaLbv8M_|Y74x#RO+T0d@-acB+Q;YM+)Ac={&VFT= zR=0*Vtz?m1SjVoc47S9)W>tF+rq2J|3Sg?t!~K#Wdm~5}ptA~k+0=0#Elq61`xj_O zdT8+Kcl;w>UF4n8M;ZJJzDJiI-v{cN4=u=G3;Hv_Me$7}J^vtzXM8qbO2rcR7BiJ&6B)4_wP z44wOp;ZivpoN(CXrE#}#zPz*=J z@Ff%x@{+ ztL@4$+ujyzl(ciU=8{kn1?cdUE)`~che^KSe%E;`ss=e~_=J^ezxss;zj5}-_X|s3 zp{7t=`;I_ef-3lIMZ190c@3+>P}OlzP8ma}y1usY@|MC}`aZXZo@FGr4C?~La7dK-Br^ilcM z%aWarWZ&g;f1mlY + + lpReportClass + + + + 0 + 0 + 1009 + 766 + + + + lpReport + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 120 + 120 + 120 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + font: 75 14pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 生产数据查询 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 140 + 16777215 + + + + Qt::NoFocus + + + true + + + font: 75 14pt "Consolas"; + + + + Qt::ImhNone + + + QFrame::NoFrame + + + QFrame::Plain + + + QListView::TopToBottom + + + QListView::Adjust + + + QListView::SinglePass + + + 1 + + + QListView::ListMode + + + + 生产数据查询 + + + + 12 + 75 + false + true + PreferAntialias + true + + + + AlignCenter + + + + + 182 + 182 + 182 + + + + + + + 0 + 0 + 0 + + + + + + + 生产数据统计 + + + + 12 + 75 + true + + + + AlignCenter + + + + + 182 + 182 + 182 + + + + + + + 日志记录 + + + + 12 + 75 + true + + + + AlignCenter + + + + + 182 + 182 + 182 + + + + + + + + + + + 0 + 0 + + + + 0 + + + + + + + + + + 12 + + + + 显示数据数(条) + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 100 + 50 + + + + + 12 + + + + 50 + + + 4 + + + Qt::AlignCenter + + + + + + + + 12 + + + + 上一页 + + + + + + + + 12 + + + + TextLabel + + + + + + + + 12 + + + + 下一页 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 12 + + + + TextLabel + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 12 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 150 + 150 + + + + QFrame::Box + + + QFrame::Plain + + + 0 + + + + + + + + + + + 0 + 30 + + + + + 11 + + + + QFrame::Box + + + 标题 + + + + + + + + 10 + + + + 双击单条记录显示图片 + + + + + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 开始日期时间: + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; +background-color: rgb(255, 255, 255); + + + 2017-11-11 11:11:11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 设置开始时间 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 结束日期时间: + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; +background-color: rgb(255, 255, 255); + + + 2017-11-11 11:11:11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 设置结束时间 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 0 + 25 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 120 + 120 + 120 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + background-color: rgb(170, 170, 127); +font: 75 14pt "Consolas"; + + + 筛选型号 + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; + + + + + 所有 + + + + + + + + + 0 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 120 + 120 + 120 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + background-color: rgb(170, 170, 127); +font: 75 14pt "Consolas"; + + + 生产班次 + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; + + + + 全天 + + + + + + + + + 0 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 120 + 120 + 120 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + background-color: rgb(170, 170, 127); +font: 75 14pt "Consolas"; + + + 查询数量 + + + Qt::AlignCenter + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 0 + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 查询 + + + + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 导出CSV + + + + + + + + + + + + + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 结束日期时间: + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; +background-color: rgb(255, 255, 255); + + + 2017-11-11 11:11:11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 设置结束时间 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 开始日期时间: + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; +background-color: rgb(255, 255, 255); + + + 2017-11-11 11:11:11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 设置开始时间 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + true + + + + + 0 + 0 + 661 + 531 + + + + + + + + + + + + 0 + 30 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 0 + 0 + 0 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + + 120 + 120 + 120 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + 170 + 170 + 127 + + + + + + + + background-color: rgb(170, 170, 127); +font: 75 14pt "Consolas"; + + + 生产班次 + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; + + + + 所有 + + + + + + + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 导出CSV + + + + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 查询 + + + + + + + + + + + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 结束日期时间: + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; +background-color: rgb(255, 255, 255); + + + 2017-11-11 11:11:11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 设置结束时间 + + + + + + + + 0 + 0 + + + + + 100 + 30 + + + + + 12 + + + + + 数据类型查询 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + + 16777215 + 50 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 查询 + + + + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 导出CSV + + + + + + + + + + + font: 75 12pt "Consolas"; +background-color: rgb(170, 170, 127); + + + 起始日期时间: + + + Qt::AlignCenter + + + + + + + + 0 + 30 + + + + font: 75 12pt "Consolas"; +background-color: rgb(255, 255, 255); + + + 2017-11-11 11:11:11 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 30 + + + + background-color: rgb(85, 255, 0); +font: 75 12pt "Consolas"; + + + 设置起始时间 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + 11 + + + + 报警记录查询 + + + + + + + + 12 + + + + + + + + + + + 12 + + + + 显示数据数(条) + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 100 + 50 + + + + + 12 + + + + 50 + + + 4 + + + Qt::AlignCenter + + + + + + + + 12 + + + + 上一页 + + + + + + + + 12 + + + + TextLabel + + + + + + + + 12 + + + + 下一页 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 12 + + + + TextLabel + + + + + + + + + + + + + + + 0 + 0 + 1009 + 23 + + + + + + + + + + + diff --git a/tpvs17/lpReport/lpReport.vcxproj b/tpvs17/lpReport/lpReport.vcxproj new file mode 100644 index 0000000..70f51d3 --- /dev/null +++ b/tpvs17/lpReport/lpReport.vcxproj @@ -0,0 +1,232 @@ + + + + + Debug + x64 + + + Release + x64 + + + + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51} + Qt4VSv1.0 + 10.0.17763.0 + + + + Application + v141 + + + Application + v141 + + + + $(MSBuildProjectDirectory)\QtMsBuild + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + $(SolutionDir)$(Platform)\$(Configuration)\ + + + + + + + + + + + + + + + + + + + true + UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_SQL_LIB;%(PreprocessorDefinitions) + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql;%(AdditionalIncludeDirectories) + Disabled + ProgramDatabase + MultiThreadedDebugDLL + true + + + Windows + $(SolutionDir)..\runner17\$(ProjectName).exe + $(QTDIR)\lib;%(AdditionalLibraryDirectories) + true + qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;Qt5Sqld.lib;%(AdditionalDependencies) + + + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + Moc'ing %(Identity)... + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql;%(AdditionalIncludeDirectories) + UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_SQL_LIB;%(PreprocessorDefinitions) + + + Uic'ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h + + + Rcc'ing %(Identity)... + .\GeneratedFiles\qrc_%(Filename).cpp + + + + + true + UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_SQL_LIB;%(PreprocessorDefinitions) + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql;%(AdditionalIncludeDirectories) + + MultiThreadedDLL + true + + + Windows + $(OutDir)\$(ProjectName).exe + $(QTDIR)\lib;%(AdditionalLibraryDirectories) + false + qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;Qt5Sql.lib;%(AdditionalDependencies) + + + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + Moc'ing %(Identity)... + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql;%(AdditionalIncludeDirectories) + UNICODE;_UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_SQL_LIB;%(PreprocessorDefinitions) + + + Uic'ing %(Identity)... + .\GeneratedFiles\ui_%(Filename).h + + + Rcc'ing %(Identity)... + .\GeneratedFiles\qrc_%(Filename).cpp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql + + + + + + + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql + .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtANGLE;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSql + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tpvs17/lpReport/lpReport.vcxproj.filters b/tpvs17/lpReport/lpReport.vcxproj.filters new file mode 100644 index 0000000..bac7b7f --- /dev/null +++ b/tpvs17/lpReport/lpReport.vcxproj.filters @@ -0,0 +1,141 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E} + qrc;* + false + + + {99349809-55BA-4b9d-BF79-8FDBB0286EB3} + ui + + + {D9D6E242-F8AF-46E4-B9FD-80ECBC20BA3E} + qrc;* + false + + + {71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11} + moc;h;cpp + False + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Form Files + + + Form Files + + + Form Files + + + + + Resource Files + + + + + Header Files + + + Header Files + + + + + + + + + \ No newline at end of file diff --git a/tpvs17/lpReport/lpReport.vcxproj.user b/tpvs17/lpReport/lpReport.vcxproj.user new file mode 100644 index 0000000..123c113 --- /dev/null +++ b/tpvs17/lpReport/lpReport.vcxproj.user @@ -0,0 +1,15 @@ + + + + + D:\Qt\Qt5.9.4\5.9.4\msvc2017_64 + $(SolutionDir)..\runner17\$(ProjectName).exe + $(SolutionDir)..\runner17\ + WindowsLocalDebugger + PATH=$(QTDIR)\bin%3b$(PATH) + + + D:\Qt\Qt5.9.4\5.9.4\msvc2017_64 + PATH=$(QTDIR)\bin%3b$(PATH) + + \ No newline at end of file diff --git a/tpvs17/lpReport/main.cpp b/tpvs17/lpReport/main.cpp new file mode 100644 index 0000000..0b98297 --- /dev/null +++ b/tpvs17/lpReport/main.cpp @@ -0,0 +1,10 @@ +#include "lpReport.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + lpReport w; + w.show(); + return a.exec(); +} diff --git a/tpvs17/lpReport/qcheckcal.cpp b/tpvs17/lpReport/qcheckcal.cpp new file mode 100644 index 0000000..d819b20 --- /dev/null +++ b/tpvs17/lpReport/qcheckcal.cpp @@ -0,0 +1,12 @@ +#include "qcheckcal.h" + +QCheckCal::QCheckCal(QWidget *parent) + : QWidget(parent) +{ + +} + +QCheckCal::~QCheckCal() +{ + +} diff --git a/tpvs17/lpReport/qcheckcal.h b/tpvs17/lpReport/qcheckcal.h new file mode 100644 index 0000000..a657ee1 --- /dev/null +++ b/tpvs17/lpReport/qcheckcal.h @@ -0,0 +1,18 @@ +#ifndef QCHECKCAL_H +#define QCHECKCAL_H + +#include + +class QCheckCal : public QWidget +{ + Q_OBJECT + +public: + QCheckCal(QWidget *parent); + ~QCheckCal(); + +private: + +}; + +#endif // QCHECKCAL_H diff --git a/tpvs17/lpReport/qreportwidget.cpp b/tpvs17/lpReport/qreportwidget.cpp new file mode 100644 index 0000000..70f037b --- /dev/null +++ b/tpvs17/lpReport/qreportwidget.cpp @@ -0,0 +1,186 @@ +#include "qreportwidget.h" +#include +#include +#pragma execution_character_set("utf-8") +QReportWidget::QReportWidget(QString str /*=QString()*/, QWidget *parent/*=0*/) : QWidget(parent) +{ + m_Title = str; + m_titleLabel = new QLabel; + m_TableView = new QTableView; + m_tableViewModel = new QStandardItemModel; + + m_TableView->setAlternatingRowColors(true); + m_TableView->setSelectionBehavior(QAbstractItemView::SelectRows); + m_TableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + m_TableView->setWordWrap(true); + m_TableView->resizeColumnsToContents(); + m_TableView->resizeRowsToContents(); + //m_TableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//自适应行宽 + m_TableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + m_TableView->horizontalScrollBar()->setEnabled(false); + m_TableView->setMinimumHeight(100); + QVBoxLayout *VBox = new QVBoxLayout; + VBox->addWidget(m_titleLabel); + VBox->addWidget(m_TableView); + setLayout(VBox); +} + +QReportWidget::~QReportWidget() +{ + if (m_TableView){ + delete m_TableView; + m_TableView = NULL; + } + if (m_tableViewModel){ + m_tableViewModel->clear(); + delete m_tableViewModel; + m_tableViewModel = NULL; + } +} + +void QReportWidget::UpdateTableView() +{ + m_titleLabel->setText(m_Title); + QStandardItemModel *m_tableViewModelTmp = new QStandardItemModel; + m_TableView->setModel(m_tableViewModelTmp); + QFont font; + font.setPixelSize(14); + m_titleLabel->setFont(font); + m_tableViewModel->clear(); + m_tableViewModel->setHorizontalHeaderItem(0, new QStandardItem(tr("型号"))); + m_tableViewModel->setHorizontalHeaderItem(1, new QStandardItem(tr("数量"))); + int nIndex = 0; + for (QMap::iterator its = m_str.begin(); its != m_str.end(); ++its) + { + m_tableViewModel->setItem(nIndex, 0, new QStandardItem(its.key())); + m_tableViewModel->setItem(nIndex, 1, new QStandardItem(QString::number(*its))); + nIndex++; + } + if (m_listStr.size() > 0) + { + for (int m_Index = 0; m_Index < m_listStr.size(); m_Index++) + { + m_tableViewModel->setItem(nIndex, 0, new QStandardItem(m_listStr.at(m_Index).m_str)); + m_tableViewModel->setItem(nIndex, 1, new QStandardItem(QString::number(m_listStr.at(m_Index).num))); + nIndex++; + } + } + m_TableView->setModel(m_tableViewModel); + delete m_tableViewModelTmp; + m_tableViewModelTmp = NULL; +} +void QReportWidget::drawTexts(QPainter* painter) +{ + QDateTime cuttrnt_date_time = QDateTime::currentDateTime(); + QString current_date = cuttrnt_date_time.toString("yyyy-MM-dd hh:mm:ss ddd"); + + QPoint point(10, 14); + QFont font; + font.setPixelSize(14); + painter->setFont(font); + //if (!m_Title.isEmpty()) + { + // return; + } + QTextOption option(Qt::AlignLeft | Qt::AlignVCenter); + option.setWrapMode(QTextOption::WordWrap); + + painter->drawText(rect(), m_Title, option); + if (m_str.size() > 0) + { + int y = point.y(); + point.setY(y + 20); + painter->drawText(point, tr("编号")); + point.setX(10 + 2 * 28); + painter->drawText(point, tr("型号")); + point.setX(10 + 2 * 28 + 3 * 28); + painter->drawText(point, tr("数量")); + int i = 1; + point.setX(10); + font.setPixelSize(14); + painter->setFont(font); + for (QMap::iterator its = m_str.begin(); its != m_str.end(); ++its) + { + int y = point.y(); + point.setX(10); + point.setY(y + 20); + painter->drawText(point, QString::number(i++)); + point.setX(10 + 2 * 28); + painter->drawText(point, its.key()); + point.setX(10 + 2 * 28 + 3 * 28); + painter->drawText(point, QString::number(*its)); + } + if (m_listStr.size() > 0) + { + for (int nIndex = 0; nIndex < m_listStr.size(); nIndex++) + { + int y = point.y(); + point.setX(10); + point.setY(y + 20); + painter->drawText(point, QString::number(i++)); + point.setX(10 + 2 * 28); + painter->drawText(point, m_listStr.at(nIndex).m_str); + point.setX(10 + 2 * 28 + 3 * 28); + painter->drawText(point, QString::number(m_listStr.at(nIndex).num)); + } + } + } + else + { + int y = point.y(); + point.setY(y + 20); + painter->drawText(point, tr("请选择对应时间并查询数据!")); + } + //painter->drawLine(80, 100, 650, 500); + //painter->setPen(Qt::red); + //painter->drawRect(10, 10, 100, 400); + //painter->setPen(QPen(Qt::green, 5)); + //painter->setBrush(Qt::blue); + //painter->drawEllipse(50, 150, 400, 200); +} +void QReportWidget::DrawOneItem(QPainter* painter, QPoint& point, QStringList &mList) +{ + +} + +void QReportWidget::paintEvent(QPaintEvent *event) +{ + //QPainter painter_text(this); + //drawTexts(&painter_text); + //painter_text.end(); +} +void QReportWidget::AppendData(QString str, int num, bool model) +{ + if (model == 0) + { + m_listStr.clear(); + } + DataItem m_item; + m_item.m_str = str; + m_item.num = num; + m_listStr.append(m_item); + update(); +} + +void QReportWidget::setTitle(QString str) +{ + m_Title = str; +} + +void QReportWidget::ClearData() +{ + m_Title.clear(); + m_listStr.clear(); + m_str.clear(); +} + +Q_SLOT void QReportWidget::SetData(QMap &m_strMap) +{ + m_str = m_strMap; +} + + +void QReportWidget::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); +} diff --git a/tpvs17/lpReport/qreportwidget.h b/tpvs17/lpReport/qreportwidget.h new file mode 100644 index 0000000..dac4d8a --- /dev/null +++ b/tpvs17/lpReport/qreportwidget.h @@ -0,0 +1,51 @@ +#ifndef QREPORTWIDGET_H +#define QREPORTWIDGET_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +struct DataItem +{ + QString m_str; + int num; +}; + + +class QReportWidget : public QWidget +{ + Q_OBJECT + +public: + QReportWidget(QString str =QString(), QWidget *parent=0); + ~QReportWidget(); +protected: + virtual void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); +private: + void drawTexts(QPainter* painter); +private: + QMap m_str; + QString m_Title; +public: + Q_SLOT void SetData(QMap &m_strMap); + void UpdateTableView(); + void DrawOneItem(QPainter* painter, QPoint& point, QStringList &mList); + void AppendData(QString str, int num, bool model = 0); + void ClearData(); + void setTitle(QString str); + QList m_listStr; + + QLabel *m_titleLabel; + QTableView *m_TableView; + QStandardItemModel *m_tableViewModel; +}; + +#endif // QREPORTWIDGET_H diff --git a/tpvs17/lpReport/qsavecsvthread.h b/tpvs17/lpReport/qsavecsvthread.h new file mode 100644 index 0000000..8a6180f --- /dev/null +++ b/tpvs17/lpReport/qsavecsvthread.h @@ -0,0 +1,124 @@ +#ifndef QSAVECSVTHREAD_H +#define QSAVECSVTHREAD_H + +#include +#include "QFile" +#include "QTextStream" +#include "QSqlQuery" +#include "QDateTime" +#include "databasesql.h" +#pragma execution_character_set("utf-8") +class QSaveCSVThread : public QThread +{ + Q_OBJECT + +public: + QSaveCSVThread(QObject *parent){}; + ~QSaveCSVThread(){}; + void setInform(QString Title, QString username) + { + m_title = Title; + m_username = username; + } + void setCheckStr(DataBaseSql *pDb, QString m_str, QString savefilePath,int nType){ + m_pDb = pDb; + m_CheckStr = m_str; + m_saveFilename = savefilePath; + m_Type = nType; + }; + void run() Q_DECL_OVERRIDE{ + if (m_Type == 0){ + saveHistory(); + } + else if (m_Type==1) + { + saveLog(); + } + + emit(resultReady(m_Type)); + }; +private: + void saveLog() + { + QSqlQuery sql; + if (m_pDb){ + m_pDb->checkoutData(m_CheckStr, sql); + QFile file(m_saveFilename); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text/* | QIODevice::Append*/))// 追加写入数据 + return; + QTextStream out(&file); + QString tableData; + int nIndex = 0; + out << m_title << "\n"; + out << QString("序号") << "," << QString("时间") << "," << QString("信息") << "\n"; + while (sql.next()) + { + nIndex = nIndex + 1; + out << nIndex << ","; + QString time = sql.value("time").toString(); + QString message = sql.value("message").toString(); + QString classd = sql.value("class").toString(); + out << time << "," << message << ","; + out << "\n"; + } + + out << QString("总数") << "," << QString::number(nIndex) << "\n"; + out << QString("保存时间:") << "," << QDateTime::currentDateTime().toString("yyyy-MM-dd") << "," << QDateTime::currentDateTime().toString("hh:mm:ss") << "\n"; + out << QString("用户:") << "," << m_username << "," << "\n"; + file.close(); + } + }; + void saveHistory() + { + QSqlQuery sql; + if (m_pDb){ + m_pDb->checkoutData(m_CheckStr, sql); + + QFile file(m_saveFilename); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text/* | QIODevice::Append*/))// 追加写入数据 + return ; + QTextStream out(&file); + QString tableData; + + out << m_title << "\n"; + + out << QString("序号") << "," << QString("时间") << "," << QString("匹配型号") << "," << QString("相似度") << "," << QString("消耗时间") << "," << QString("直径") << "," << QString("厚度") << "\n"; + int nIndex = 0; + while (sql.next()) + { + QString time = sql.value("time").toString(); + QString model = sql.value("model").toString(); + double dCorrelate = sql.value("correlate").toDouble(); + QString correlate; + if (dCorrelate >= 1.7976931348623158e+308) + dCorrelate = 0; + correlate = QString::number(dCorrelate * 100, 'f', 3) + "%"; + double dDetecttime = sql.value("detecttime").toDouble(); + QString detecttime = QString::number(dDetecttime, 'f', 3); + double dDiameter = sql.value("diameter").toDouble(); + QString diameter = QString::number(dDiameter, 'f', 3); + double dHight = sql.value("hight").toDouble(); + QString hight = QString::number(dHight, 'f', 3); + + nIndex = nIndex + 1; + out << nIndex << ","; + out << time << "," << model << "," << correlate << "," << detecttime << "," << diameter << "," << hight << "\n"; + } + out << QString("总数") << "," << QString::number(nIndex) << "\n"; + out << QString("时间:") << "," << QDateTime::currentDateTime().toString("yyyy-MM-dd") << "," << QDateTime::currentDateTime().toString("hh:mm:ss") << "\n"; + out << QString("用户:") << "," << m_username << "," << "\n"; + file.close(); + } + }; +private: + int m_Type; + DataBaseSql *m_pDb; + QString m_CheckStr; + QString m_saveFilename; + QString m_title; + QString m_username; +signals: + void resultReady(int nType); +}; + +#endif // QSAVECSVTHREAD_H diff --git a/tpvs17/lpReport/qtimedlg.cpp b/tpvs17/lpReport/qtimedlg.cpp new file mode 100644 index 0000000..804cf62 --- /dev/null +++ b/tpvs17/lpReport/qtimedlg.cpp @@ -0,0 +1,131 @@ +#include "qtimedlg.h" +#pragma execution_character_set("utf-8") +QTimeDlg::QTimeDlg(QWidget *parent) + : QDialog(parent), m_clock(NULL) +{ + ui.setupUi(this); + m_clock = new QClockDlg; + m_clock->setMinimumSize(QSize(100, 150)); + ui.gridLayout->addWidget(m_clock); + setWindowIcon(QIcon(":/image/leaper")); + setWindowFlags(Qt::WindowCloseButtonHint);//|Qt::WindowContextHelpButtonHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint + //connect(ui.dial_timedlg, SIGNAL(valueChanged(int)), this, SLOT(valuechange(int))); + //connect(ui.dial_2_timedlg, SIGNAL(valueChanged(int)), this, SLOT(valuechange(int))); + connect(ui.hour_comboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(onCurrentStrChange(QString))); + connect(ui.minute_comboBox, SIGNAL(currentTextChanged(QString)), this, SLOT(onCurrentStrChange(QString))); + connect(ui.pushButton_timedlg, SIGNAL(clicked()), this, SLOT(SlotOk())); + connect(ui.calendarWidget_timedlg, SIGNAL(clicked(const QDate &)), this, SLOT(SlotCalWidget(const QDate &))); + connect(ui.calendarWidget_timedlg, SIGNAL(currentPageChanged(int, int)), this, SLOT(oncurrentPageChanged(int, int))); +} + +QTimeDlg::~QTimeDlg() +{ + if (m_clock) + { + delete m_clock; + m_clock = NULL; + } +} +Q_SLOT void QTimeDlg::oncurrentPageChanged(int nyear, int nMonth) +{ + m_Day = m_date.day(); + m_date.setDate(nyear, nMonth, m_Day); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); +} + +Q_SLOT void QTimeDlg::onCurrentStrChange(QString str) +{ + QString strObj = sender()->objectName(); + if (strObj == "hour_comboBox"){ + int m_minute = m_time.minute(); + int m_value = str.toInt(); + m_time.setHMS(m_value, m_minute, 0); + m_clock->SetTime(m_value, m_minute); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); + } + else if (strObj == "minute_comboBox"){ + int m_hour = m_time.hour(); + int m_value = str.toInt(); + m_clock->SetTime(m_hour, m_value); + m_time.setHMS(m_hour, m_value, 0); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); + } + int a = 0; +} + +Q_SLOT void QTimeDlg::valuechange(int m_value) +{ + QObject *watch = sender(); + QString m_objname = watch->objectName(); + if (m_objname == "dial_timedlg") + { + int m_minute = m_time.minute(); + m_time.setHMS(m_value, m_minute, 0); + m_clock->SetTime(m_value, m_minute); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); + } + else if (m_objname == "dial_2_timedlg") + { + int m_hour = m_time.hour(); + m_clock->SetTime(m_hour, m_value); + m_time.setHMS(m_hour, m_value, 0); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); + } +} + +Q_SLOT void QTimeDlg::SlotOk() +{ + emit(QDialog::accept()); +} + +void QTimeDlg::SetDateTime(QDateTime m_datetime) +{ + this->m_time = m_datetime.time(); + this->m_date = m_datetime.date(); + m_clock->InitTime(m_time.hour(), m_time.minute()); + ui.hour_comboBox->setCurrentText(QString::number(m_time.hour())); + ui.minute_comboBox->setCurrentText(QString::number(m_time.minute())); + //ui.dial_timedlg->setValue(m_time.hour()); + //ui.dial_2_timedlg->setValue(m_time.minute()); + ui.calendarWidget_timedlg->setSelectedDate(m_date); + + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); +} + +void QTimeDlg::SetDateTime(QDate m_date, QTime m_time) +{ + this->m_time = m_time; + this->m_date = m_date; + m_clock->InitTime(m_time.hour(), m_time.minute()); + ui.hour_comboBox->setCurrentText(QString::number(m_time.hour())); + ui.minute_comboBox->setCurrentText(QString::number(m_time.minute())); + //ui.dial_timedlg->setValue(m_time.hour()); + //ui.dial_2_timedlg->setValue(m_time.minute()); + ui.calendarWidget_timedlg->setSelectedDate(m_date); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); +} +void QTimeDlg::GetDateTime(QDateTime &m_datetime) +{ + m_datetime.setDate(m_date); + m_datetime.setTime(m_time); +} + +void QTimeDlg::GetDateTime(QDate &m_date, QTime &m_time) +{ + m_time = this->m_time; + m_date = this->m_date; +} + +Q_SLOT void QTimeDlg::SlotCalWidget(const QDate &mdate) +{ + m_date = ui.calendarWidget_timedlg->selectedDate(); + QString m_str = QString("%1 %2").arg(m_date.toString("yyyy-MM-dd")).arg(m_time.toString("hh:mm")); + ui.label_timedlg->setText(m_str); +} diff --git a/tpvs17/lpReport/qtimedlg.h b/tpvs17/lpReport/qtimedlg.h new file mode 100644 index 0000000..e29bb6e --- /dev/null +++ b/tpvs17/lpReport/qtimedlg.h @@ -0,0 +1,477 @@ +#ifndef QTIMEDLG_H +#define QTIMEDLG_H + +#include +#include "ui_qtimedlg.h" +#include +#include +#include +#include +#include +#include +#include +#include +class Digits : public QWidget +{ + Q_OBJECT + +public: + + /*Define three transition modes of the digital clock*/ + enum { + Slide, + Flip, + Rotate + }; + + Digits(QWidget *parent) + : QWidget(parent) + , m_number(0) + , m_transition(Slide) + { + setAttribute(Qt::WA_OpaquePaintEvent, true); + //Widget paints all its pixels when it receives a paint event + + setAttribute(Qt::WA_NoSystemBackground, true); + //Indicates that the widget has no background, i.e. when the widget receives paint events, the background is not automatically repainted. + + connect(&m_animator, SIGNAL(frameChanged(int)), SLOT(update())); + //start animation + + m_animator.setFrameRange(0, 100); + m_animator.setDuration(600); + //Construct a 0.6-second timeline with a frame range of 0 - 100 + + m_animator.setCurveShape(QTimeLine::EaseInOutCurve); + //starts growing slowly, then runs steadily, then grows slowly again + } + + /*Set transition when time changed*/ + void setTransition(int tr) { + m_transition = tr; + } + + /*Get transition mode*/ + int transition() const { + return m_transition; + } + + /*Set hours and minutes*/ + void setNumber(int n) { + if (m_number != n) { + m_number = qBound(0, n, 99); + preparePixmap(); + update(); + } + } + + /*Flip to next state*/ + void flipTo(int n) { + if (m_number != n) { + m_number = qBound(0, n, 99); + m_lastPixmap = m_pixmap; + preparePixmap(); + m_animator.stop(); + m_animator.start(); + } + } + +protected: + + /*Draw the main frame of the digits area*/ + void drawFrame(QPainter *p, const QRect &rect) { + p->setPen(Qt::NoPen); + QLinearGradient gradient(rect.topLeft(), rect.bottomLeft()); + //Set linear gradient area + + gradient.setColorAt(0.00, QColor(245, 245, 245)); + gradient.setColorAt(0.49, QColor(192, 192, 192)); + gradient.setColorAt(0.51, QColor(245, 245, 245)); + gradient.setColorAt(1.00, QColor(192, 192, 192)); + //Creates stop points at the given position with the given color + + p->setBrush(gradient); + QRect r = rect; + p->drawRoundedRect(r, 15, 15, Qt::RelativeSize); + /* + Draws outer rectangle rect with rounded corners. + Qt::RelativeSize specifies the size relative to the bounding rectangle, + typically using percentage measurements. + */ + + r.adjust(1, 4, -1, -4); + //Adds 1, 4, -1 and -4 respectively to the existing coordinates of the rectangle + + p->setPen(QColor(181, 181, 181)); + p->setBrush(Qt::NoBrush); + p->drawRoundedRect(r, 15, 15, Qt::RelativeSize); + //Draws inner rectangle rect with rounded corners. + + p->setPen(QColor(159, 159, 159)); + int y = rect.top() + rect.height() / 2 - 1; + p->drawLine(rect.left(), y, rect.right(), y); + //Draws the mid-line from (rect.left(), y) to (rect.right(), y) and sets the current pen position to (rect.right(), y) + + } + + /*Draw the digits*/ + QPixmap drawDigits(int n, const QRect &rect) { + + int scaleFactor = 2; +#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM) + if (rect.height() > 240) + scaleFactor = 1; +#endif + + QString str = QString::number(n); + if (str.length() == 1) + str.prepend("0"); + //Ensure it is double-digit + + QFont font; + font.setFamily("Helvetica"); + int fontHeight = scaleFactor * 0.55 * rect.height(); + font.setPixelSize(fontHeight); + //Sets the font size to pixelSize pixels + + font.setBold(true); + + QPixmap pixmap(rect.size() * scaleFactor); + pixmap.fill(Qt::transparent); + + QLinearGradient gradient(QPoint(0, 0), QPoint(0, pixmap.height())); + //Constructs a linear gradient with interpolation area between (0,0) and (0,pixmap.height()) + + gradient.setColorAt(0.00, QColor(128, 128, 128)); + gradient.setColorAt(0.49, QColor(64, 64, 64)); + gradient.setColorAt(0.51, QColor(128, 128, 128)); + gradient.setColorAt(1.00, QColor(16, 16, 16)); + //Creates stop points at the given position with the given color + + QPainter p; + p.begin(&pixmap); + p.setFont(font); + QPen pen; + pen.setBrush(QBrush(gradient)); + //Set penbrush with linergrident + + p.setPen(pen); + p.drawText(pixmap.rect(), Qt::AlignCenter, str); + //Draws the digit number(str here) within the provided rectangle + + p.end(); + + return pixmap.scaledToWidth(width(), Qt::SmoothTransformation); + //Returns a scaled copy of the image which is transformed using bilinear filtering + } + + /*prepare the pixmap */ + void preparePixmap() { + m_pixmap = QPixmap(size()); + m_pixmap.fill(Qt::transparent); + //Fills the pixmap with the given transparent black value (i.e., QColor(0, 0, 0, 0)) + + QPainter p; + p.begin(&m_pixmap); + p.drawPixmap(0, 0, drawDigits(m_number, rect())); + //Draws the given digits-pixmap at position (0, 0) + + p.end(); + } + + /*define a resize event*/ + void resizeEvent(QResizeEvent*) { + preparePixmap(); + update();//Causes a paintEvent() call + + } + + /*Paint the static state*/ + void paintStatic() { + QPainter p(this); + p.fillRect(rect(), Qt::black); + //Fill the widget rec with black color + + int pad = width() / 10; + drawFrame(&p, rect().adjusted(pad, pad, -pad, -pad)); + p.drawPixmap(0, 0, m_pixmap); + } + + /*Paint the slide state*/ + void paintSlide() { + QPainter p(this); + p.fillRect(rect(), Qt::black); + + int pad = width() / 10; + QRect fr = rect().adjusted(pad, pad, -pad, -pad); + drawFrame(&p, fr); + p.setClipRect(fr); + //sets the clip region to the given rectangle using the given clip operation + + int y = height() * m_animator.currentFrame() / 100; + p.drawPixmap(0, y, m_lastPixmap); + //Draw last-time state pixmap from 0 to height()(Y Coordinate) in 0.6 second + + p.drawPixmap(0, y - height(), m_pixmap); + //Draw current-time state pixmap from -height() to 0 (Y Coordinate) in 0.6 second + } + + /*Paint the flip state*/ + void paintFlip() { + QPainter p(this); +#if !defined(Q_OS_SYMBIAN) && !defined(Q_OS_WINCE_WM) + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + p.setRenderHint(QPainter::Antialiasing, true); +#endif + p.fillRect(rect(), Qt::black); + + int hw = width() / 2; + int hh = height() / 2; + + // behind is the new pixmap + int pad = width() / 10; + QRect fr = rect().adjusted(pad, pad, -pad, -pad); + drawFrame(&p, fr); + p.drawPixmap(0, 0, m_pixmap); + + int index = m_animator.currentFrame(); + + if (index <= 50) { + + // the top part of the old pixmap is flipping + int angle = -180 * index / 100; + QTransform transform; + transform.translate(hw, hh); + //Moves the coordinate system to the center of widget + + transform.rotate(angle, Qt::XAxis); + //Rotates the coordinate system counterclockwise by angle about the X axis + + p.setTransform(transform); + drawFrame(&p, fr.adjusted(-hw, -hh, -hw, -hh)); + p.drawPixmap(-hw, -hh, m_lastPixmap); + + // the bottom part is still the old pixmap + p.resetTransform(); + p.setClipRect(0, hh, width(), hh); + //Enables clipping, and sets the clip region to the rectangle beginning at (0, hh) with the given width and height + + drawFrame(&p, fr); + p.drawPixmap(0, 0, m_lastPixmap); + } + else { + + p.setClipRect(0, hh, width(), hh); + + // the bottom part is still the old pixmap + drawFrame(&p, fr); + p.drawPixmap(0, 0, m_lastPixmap); + + // the bottom part of the new pixmap is flipping + int angle = 180 - 180 * m_animator.currentFrame() / 100; + QTransform transform; + transform.translate(hw, hh); + transform.rotate(angle, Qt::XAxis); + p.setTransform(transform); + drawFrame(&p, fr.adjusted(-hw, -hh, -hw, -hh)); + p.drawPixmap(-hw, -hh, m_pixmap); + + } + + } + + /*Paint the rotate state*/ + void paintRotate() { + QPainter p(this); + + int pad = width() / 10; + QRect fr = rect().adjusted(pad, pad, -pad, -pad); + drawFrame(&p, fr); + p.setClipRect(fr); + + int angle1 = -180 * m_animator.currentFrame() / 100; + int angle2 = 180 - 180 * m_animator.currentFrame() / 100; + int angle = (m_animator.currentFrame() <= 50) ? angle1 : angle2; + QPixmap pix = (m_animator.currentFrame() <= 50) ? m_lastPixmap : m_pixmap; + + QTransform transform; + transform.translate(width() / 2, height() / 2); + transform.rotate(angle, Qt::XAxis); + + p.setTransform(transform); + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + p.drawPixmap(-width() / 2, -height() / 2, pix); + } + + void paintEvent(QPaintEvent *event) { + Q_UNUSED(event); + if (m_animator.state() == QTimeLine::Running) { + if (m_transition == Slide) + paintSlide(); + if (m_transition == Flip) + paintFlip(); + if (m_transition == Rotate) + paintRotate(); + } + else { + paintStatic(); + } + } + +private: + int m_number;//number to set to digits + + int m_transition;//transition mode(change effect) + + QPixmap m_pixmap;//current time pixmap + + QPixmap m_lastPixmap;//next state time pixmap + + QTimeLine m_animator; + //used to animate a GUI control by calling a slot periodically + //The timeline's duration describes for how long the animation will run + //connect the frameChanged() signal to a suitable slot in the widget you wish to animate +}; +class QClockDlg : public QWidget +{ + Q_OBJECT + +public: + QClockDlg(QWidget *parent = 0) : QWidget(parent) + { + m_Ihour = 0; + m_Iminute = 0; + m_hour = new Digits(this); + m_hour->show(); + m_minute = new Digits(this); + m_minute->show(); + + QPalette pal = palette(); + pal.setColor(QPalette::Window, Qt::gray); + //Sets the color used for the given color role, in all color groups, to the specified solid color. + + setPalette(pal); + QAction *slideAction = new QAction("&Slide", this); + QAction *flipAction = new QAction("&Flip", this); + QAction *rotateAction = new QAction("&Rotate", this); + connect(slideAction, SIGNAL(triggered()), SLOT(chooseSlide())); + connect(flipAction, SIGNAL(triggered()), SLOT(chooseFlip())); + connect(rotateAction, SIGNAL(triggered()), SLOT(chooseRotate())); +#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM) + menuBar()->addAction(slideAction); + menuBar()->addAction(flipAction); + menuBar()->addAction(rotateAction); +#else + addAction(slideAction); + addAction(flipAction); + addAction(rotateAction); + setContextMenuPolicy(Qt::ActionsContextMenu); + //Shows a context menu(right click) +#endif + } + void InitTime(int hour, int min){ + m_hour->setNumber(hour); + m_minute->setNumber(min); + } + void SetTime(int hour, int min){ + + m_hour->flipTo(hour); + m_minute->flipTo(min); + m_Ihour = hour; + m_Iminute = min; + } +private: + QBasicTimer m_ticker; + Digits *m_hour; + Digits *m_minute; +protected: + void resizeEvent(QResizeEvent*) { + int digitsWidth = width() / 2; + int digitsHeight = digitsWidth * 1.2; + + int y = (height() - digitsHeight) / 3; + + m_hour->resize(digitsWidth, digitsHeight); + m_hour->move(0, y); + + m_minute->resize(digitsWidth, digitsHeight); + m_minute->move(width() / 2, y); + } + + /*Timer event,receive timer events */ + void timerEvent(QTimerEvent*) { + updateTime(); + } + + /* Get key press event */ + void keyPressEvent(QKeyEvent *event) { + if (event->key() == Qt::Key_Right) { + switchTransition(1); + event->accept(); + } + if (event->key() == Qt::Key_Left) { + switchTransition(-1); + event->accept(); + } + } + + private slots: + void chooseSlide() { + m_hour->setTransition(0); + m_minute->setTransition(0); + updateTime(); + } + + void chooseFlip() { + m_hour->setTransition(1); + m_minute->setTransition(1); + updateTime(); + } + + void chooseRotate() { + m_hour->setTransition(2); + m_minute->setTransition(2); + updateTime(); + } +public: + int m_Ihour, m_Iminute; + /*Real-time updates*/ + void updateTime() { + m_hour->flipTo(m_Ihour); + m_minute->flipTo(m_Iminute); + } + + /*Switch transition mode*/ + void switchTransition(int delta) { + int i = (m_hour->transition() + delta + 3) % 3; + m_hour->setTransition(i); + m_minute->setTransition(i); + updateTime(); + } +}; + +class QTimeDlg : public QDialog +{ + Q_OBJECT + +public: + QTimeDlg(QWidget *parent = 0); + ~QTimeDlg(); + Q_SLOT void SlotOk(); + Q_SLOT void valuechange(int m_value); + Q_SLOT void SlotCalWidget(const QDate &m_date); + void SetDateTime(QDate m_date, QTime m_time); + void SetDateTime(QDateTime m_datetime); + void GetDateTime(QDate &m_date, QTime &m_time); + void GetDateTime(QDateTime &m_datetime); + Q_SLOT void onCurrentStrChange(QString str); + Q_SLOT void oncurrentPageChanged(int nyear, int nMonth); +private: + Ui::QTimeDlg ui; + QDate m_date; + QTime m_time; + QClockDlg *m_clock; + int m_year, m_month, m_Day; +}; + +#endif // QTIMEDLG_H diff --git a/tpvs17/lpReport/qtimedlg.ui b/tpvs17/lpReport/qtimedlg.ui new file mode 100644 index 0000000..5bbe584 --- /dev/null +++ b/tpvs17/lpReport/qtimedlg.ui @@ -0,0 +1,611 @@ + + + QTimeDlg + + + + 0 + 0 + 584 + 380 + + + + 时间设置 + + + + + + + + + background-color: rgb(170, 170, 127); + + + + + + + + + + + + + 60 + 45 + + + + + Consolas + 12 + 50 + false + false + + + + Qt::LeftToRight + + + font: 12pt "Consolas"; + + + + 30 + 30 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 24 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 31 + + + + + 32 + + + + + 33 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + 40 + + + + + 41 + + + + + 42 + + + + + 43 + + + + + 44 + + + + + 45 + + + + + 46 + + + + + 47 + + + + + 48 + + + + + 49 + + + + + 50 + + + + + 51 + + + + + 52 + + + + + 53 + + + + + 54 + + + + + 55 + + + + + 56 + + + + + 57 + + + + + 58 + + + + + 59 + + + + + + + + + 0 + 0 + + + + + 60 + 45 + + + + + Consolas + 12 + 50 + false + false + + + + Qt::WheelFocus + + + font: 12pt "Consolas"; + + + + 30 + 30 + + + + + 0 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + + + + font: 12pt "Consolas"; + + + 小时 + + + + + + + font: 12pt "Consolas"; + + + 分钟 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Consolas + 14 + 50 + false + false + + + + Qt::DefaultContextMenu + + + + + + 2017/00/00 00:00 + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 100 + 60 + + + + background-color: rgb(76, 230, 0); +font: 75 12pt "Consolas"; + + + 确定 + + + + + + + + + diff --git a/tpvs17/lpReport/resource.h b/tpvs17/lpReport/resource.h new file mode 100644 index 0000000..68a41c6 --- /dev/null +++ b/tpvs17/lpReport/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ ɵİļ +// lpReport.rc ʹ +// +#define IDI_ICON1 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/tpvs17/lpReport/testwidget.cpp b/tpvs17/lpReport/testwidget.cpp new file mode 100644 index 0000000..84e5a94 --- /dev/null +++ b/tpvs17/lpReport/testwidget.cpp @@ -0,0 +1,103 @@ +#include "testwidget.h" +#include "QPushButton" +#include "QLineEdit" +#include "QAbstractItemView" +#pragma execution_character_set("utf-8") +TestWidget::TestWidget(QWidget *parent) + : QWidget(parent) +{ + ui.setupUi(this); + m_treewidget = ui.treeWidget; + + initTreewidget(m_treewidget); + +} + +void TestWidget::initTreewidget(QTreeWidget* pTreewidget) +{ + QStringList header; + header.append("属性"); + header.append("值"); + pTreewidget->setHeaderLabels(header); + pTreewidget->header()->setStretchLastSection(true); + pTreewidget->setColumnCount(2); + pTreewidget->setStyleSheet("QTreeView::item:hover{background-color:rgb(0,255,0,50)}" + "QTreeView::item:selected{background-color:rgb(255,0,0,100)}"); + //pTreewidget->setSelectionModel(QAbstractItemView::ExtendedSelection); + pTreewidget->setColumnWidth(0, 100); + addIPRoot(pTreewidget); + addEDitRoot(pTreewidget); + +} + +void TestWidget::addIPRoot(QTreeWidget *pTreewidget) +{ + + QRegExp regExpIP("((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])[\\.]){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])"); + QRegExp regExpNetPort("((6553[0-5])|[655[0-2][0-9]|65[0-4][0-9]{2}|6[0-4][0-9]{3}|[1-5][0-9]{4}|[1-9][0-9]{3}|[1-9][0-9]{2}|[1-9][0-9]|[0-9])"); + QRegExp regExpChannel("[0-5]"); + + QTreeWidgetItem *m_IPItems = new QTreeWidgetItem(pTreewidget, QStringList(QString("IP地址配置"))); + + QTreeWidgetItem *m_ServerItems = new QTreeWidgetItem(m_IPItems, QStringList(QString("本机服务器IP地址设置"))); + QList serveritems; + serveritems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("操作")))); + serveritems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("IP地址")))); + serveritems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("开放端口")))); + m_ServerItems->addChildren(serveritems); + QPushButton* m_pButOpen = new QPushButton("打开服务"); + QLineEdit *m_EditserverIP = new QLineEdit; + QLineEdit *m_EditserverPort = new QLineEdit; + m_EditserverIP->setValidator(new QRegExpValidator(regExpIP, this)); + m_EditserverPort->setValidator(new QRegExpValidator(regExpNetPort, this)); + m_EditserverIP->setText("192.168.1.1"); + m_EditserverPort->setText("100"); + pTreewidget->setItemWidget(serveritems.at(0), 1, m_pButOpen); + pTreewidget->setItemWidget(serveritems.at(1), 1, m_EditserverIP); + pTreewidget->setItemWidget(serveritems.at(2), 1, m_EditserverPort); + + QTreeWidgetItem *m_ClientItems = new QTreeWidgetItem(m_IPItems, QStringList(QString("目标客户端IP地址设置"))); + QList clientitems; + clientitems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("IP地址")))); + clientitems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("源端口")))); + + m_ClientItems->addChildren(clientitems); + QLineEdit *m_EditclientIP = new QLineEdit; + QLineEdit *m_EditclientPort = new QLineEdit; + m_EditclientIP->setValidator(new QRegExpValidator(regExpIP, this)); + m_EditclientPort->setValidator(new QRegExpValidator(regExpNetPort, this)); + + pTreewidget->setItemWidget(clientitems.at(0), 1, m_EditclientIP); + pTreewidget->setItemWidget(clientitems.at(1), 1, m_EditclientPort); + + QPushButton *pSaveButton = new QPushButton("保存"); + QTreeWidgetItem* saveItem = new QTreeWidgetItem(m_IPItems, QStringList(QString("保存设置"))); + pTreewidget->setItemWidget(saveItem, 1, pSaveButton); + +} + +void TestWidget::addEDitRoot(QTreeWidget *pTreewidget) +{ + QTreeWidgetItem *m_IPItems = new QTreeWidgetItem(pTreewidget, QStringList(QString("Edit设置"))); + + QList items; + QList pLineEdits; + for (int i = 0; i < 10; i++) + { + items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i)))); + QLineEdit *pEdit = new QLineEdit; + pEdit->setText(QString("%1").arg(i)); + pLineEdits.append(pEdit); + } + m_IPItems->addChildren(items); + pTreewidget->insertTopLevelItem(0, m_IPItems); + for (int nIndex = 0; nIndex < pLineEdits.size(); nIndex++) + { + pTreewidget->setItemWidget(items.at(nIndex), 1, pLineEdits.at(nIndex)); + } +} + +TestWidget::~TestWidget() +{ + m_treewidget->clear(); +} diff --git a/tpvs17/lpReport/testwidget.h b/tpvs17/lpReport/testwidget.h new file mode 100644 index 0000000..3153169 --- /dev/null +++ b/tpvs17/lpReport/testwidget.h @@ -0,0 +1,22 @@ +#ifndef TESTWIDGET_H +#define TESTWIDGET_H + +#include +#include "ui_testwidget.h" +#include +class TestWidget : public QWidget +{ + Q_OBJECT + +public: + TestWidget(QWidget *parent = 0); + ~TestWidget(); + void initTreewidget(QTreeWidget* pTreewidget); + void addIPRoot(QTreeWidget *pTreewidget); + void addEDitRoot(QTreeWidget *pTreewidget); +private: + Ui::TestWidget ui; + QTreeWidget * m_treewidget; +}; + +#endif // TESTWIDGET_H diff --git a/tpvs17/lpReport/testwidget.ui b/tpvs17/lpReport/testwidget.ui new file mode 100644 index 0000000..72ba893 --- /dev/null +++ b/tpvs17/lpReport/testwidget.ui @@ -0,0 +1,35 @@ + + + TestWidget + + + + 0 + 0 + 659 + 562 + + + + TestWidget + + + + + 0 + 0 + 491 + 541 + + + + + 1 + + + + + + + + diff --git a/tpvs17/lpReport/waitingdialog.cpp b/tpvs17/lpReport/waitingdialog.cpp new file mode 100644 index 0000000..062cac9 --- /dev/null +++ b/tpvs17/lpReport/waitingdialog.cpp @@ -0,0 +1,50 @@ +#include "waitingdialog.h" +#include "QBoxLayout" +#include +WaitingDialog::WaitingDialog(QWidget *parent) + : QDialog(parent) +{ + m_ProgressBar = NULL; + m_ProgressBar = new QProgressBar(this); + m_CurrentValue = m_MaxValue = m_UpdateInterval = 0; + m_ProgressBar->setRange(0, 100); + connect(&m_Timer, SIGNAL(timeout()), this, SLOT(UpdateSlot())); + m_ProgressBar->setTextVisible(false); + QHBoxLayout *layout = new QHBoxLayout; + layout->addWidget(m_ProgressBar); + setLayout(layout); +} + +WaitingDialog::~WaitingDialog() +{ + if (m_ProgressBar) + { + delete m_ProgressBar; + m_ProgressBar = NULL; + } +} + +void WaitingDialog::Start(int interval /*= 100*/, int maxValue /*= 100*/) +{ + m_UpdateInterval = interval; + m_MaxValue = maxValue; + m_CurrentValue = 0; + if (m_Timer.isActive()) + m_Timer.stop(); + m_Timer.start(m_UpdateInterval); + m_ProgressBar->setRange(0, m_MaxValue); + m_ProgressBar->setValue(0); +} + +void WaitingDialog::Stop() +{ + m_Timer.stop(); +} + +void WaitingDialog::UpdateSlot() +{ + m_CurrentValue++; + if (m_CurrentValue == m_MaxValue) + m_CurrentValue = 0; + m_ProgressBar->setValue(m_CurrentValue); +} diff --git a/tpvs17/lpReport/waitingdialog.h b/tpvs17/lpReport/waitingdialog.h new file mode 100644 index 0000000..6459a9b --- /dev/null +++ b/tpvs17/lpReport/waitingdialog.h @@ -0,0 +1,28 @@ +#ifndef WAITINGDIALOG_H +#define WAITINGDIALOG_H + +#include +#include "QTimer" +#include +class WaitingDialog : public QDialog +{ + Q_OBJECT + +public: + WaitingDialog(QWidget *parent =0); + ~WaitingDialog(); + void Start(int interval = 100, int maxValue = 100); + void Stop(); + +private slots: + void UpdateSlot(); +private: + int m_CurrentValue; + int m_UpdateInterval; + int m_MaxValue; + QTimer m_Timer; + QProgressBar *m_ProgressBar; + +}; + +#endif // WAITINGDIALOG_H diff --git a/tpvs17/lpReport/workfordb.h b/tpvs17/lpReport/workfordb.h new file mode 100644 index 0000000..8a768e6 --- /dev/null +++ b/tpvs17/lpReport/workfordb.h @@ -0,0 +1,32 @@ +#ifndef WORKFORDB_H +#define WORKFORDB_H + +#include +#include "databasesql.h" + +class WorkForDB : public QObject +{ + Q_OBJECT + +public: + WorkForDB(QObject *parent = 0){ m_pDb = NULL; }; + ~WorkForDB(){}; + void setDB(DataBaseSql* pDB){ m_pDb = pDB; }; +public slots: + void doWork(const QString& strTime, const int &ncount) + { + QString str; + if (m_pDb){ + m_pDb->DelDatasByTime(strTime); + m_pDb->DelWarnDataByCount(1, ncount); + m_pDb->DelWarnDataByCount(4, ncount); + } + emit resultReady(str); + }; +private: + class DataBaseSql *m_pDb; +signals: + void resultReady(QString str); +}; + +#endif // WORKFORDB_H diff --git a/tpvs17/wheel.sln b/tpvs17/wheel.sln index 95f801e..b08db5c 100644 --- a/tpvs17/wheel.sln +++ b/tpvs17/wheel.sln @@ -9,30 +9,80 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tpAlgorithmQt", "tpAlgorith EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RasterSDG20", "RasterSDG20\RasterSDG20.vcxproj", "{CE765894-2106-48FE-99C3-D8D7624889A0}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lpCoreCtrl", "..\..\Valve\tpvs17\lpCoreCtrl\lpCoreCtrl.vcxproj", "{784071A9-BF94-4D27-B62E-588ACD7E0633}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QUserInfo", "QUserInfo\QUserInfo.vcxproj", "{D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tpCamHik", "..\..\Valve\tpvs17\tpCamHik\tpCamHik.vcxproj", "{64C9A32D-82E8-4C36-9AA6-52D58B23F687}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tpCamBaumer", "..\..\Valve\tpvs17\tpCamBaumer\tpCamBaumer.vcxproj", "{4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lpReport", "lpReport\lpReport.vcxproj", "{0E042214-1B06-40D6-9D20-C6D5FA3D7A51}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A229CF5C-81EF-4909-AB6E-49C746F1ED4C}.Debug|x64.ActiveCfg = Debug|x64 {A229CF5C-81EF-4909-AB6E-49C746F1ED4C}.Debug|x64.Build.0 = Debug|x64 + {A229CF5C-81EF-4909-AB6E-49C746F1ED4C}.Debug|x86.ActiveCfg = Debug|x64 {A229CF5C-81EF-4909-AB6E-49C746F1ED4C}.Release|x64.ActiveCfg = Release|x64 {A229CF5C-81EF-4909-AB6E-49C746F1ED4C}.Release|x64.Build.0 = Release|x64 + {A229CF5C-81EF-4909-AB6E-49C746F1ED4C}.Release|x86.ActiveCfg = Release|x64 {B12702AD-ABFB-343A-A199-8E24837244A3}.Debug|x64.ActiveCfg = Debug|x64 {B12702AD-ABFB-343A-A199-8E24837244A3}.Debug|x64.Build.0 = Debug|x64 + {B12702AD-ABFB-343A-A199-8E24837244A3}.Debug|x86.ActiveCfg = Debug|x64 {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x64.ActiveCfg = Release|x64 {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x64.Build.0 = Release|x64 + {B12702AD-ABFB-343A-A199-8E24837244A3}.Release|x86.ActiveCfg = Release|x64 {CE765894-2106-48FE-99C3-D8D7624889A0}.Debug|x64.ActiveCfg = Debug|x64 {CE765894-2106-48FE-99C3-D8D7624889A0}.Debug|x64.Build.0 = Debug|x64 + {CE765894-2106-48FE-99C3-D8D7624889A0}.Debug|x86.ActiveCfg = Debug|x64 {CE765894-2106-48FE-99C3-D8D7624889A0}.Release|x64.ActiveCfg = Release|x64 {CE765894-2106-48FE-99C3-D8D7624889A0}.Release|x64.Build.0 = Release|x64 + {CE765894-2106-48FE-99C3-D8D7624889A0}.Release|x86.ActiveCfg = Release|x64 + {784071A9-BF94-4D27-B62E-588ACD7E0633}.Debug|x64.ActiveCfg = Debug|x64 + {784071A9-BF94-4D27-B62E-588ACD7E0633}.Debug|x64.Build.0 = Debug|x64 + {784071A9-BF94-4D27-B62E-588ACD7E0633}.Debug|x86.ActiveCfg = Debug|x64 + {784071A9-BF94-4D27-B62E-588ACD7E0633}.Release|x64.ActiveCfg = Release|x64 + {784071A9-BF94-4D27-B62E-588ACD7E0633}.Release|x64.Build.0 = Release|x64 + {784071A9-BF94-4D27-B62E-588ACD7E0633}.Release|x86.ActiveCfg = Release|x64 + {D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}.Debug|x64.ActiveCfg = Debug|x64 + {D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}.Debug|x64.Build.0 = Debug|x64 + {D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}.Debug|x86.ActiveCfg = Debug|x64 + {D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}.Release|x64.ActiveCfg = Release|x64 + {D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}.Release|x64.Build.0 = Release|x64 + {D7AF8AA1-0F2C-407F-B135-FBDA4448EE16}.Release|x86.ActiveCfg = Release|x64 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x64.ActiveCfg = Debug|x64 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x64.Build.0 = Debug|x64 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x86.ActiveCfg = Debug|Win32 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Debug|x86.Build.0 = Debug|Win32 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x64.ActiveCfg = Release|x64 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x64.Build.0 = Release|x64 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x86.ActiveCfg = Release|Win32 + {64C9A32D-82E8-4C36-9AA6-52D58B23F687}.Release|x86.Build.0 = Release|Win32 + {4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}.Debug|x64.ActiveCfg = Debug|x64 + {4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}.Debug|x64.Build.0 = Debug|x64 + {4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}.Debug|x86.ActiveCfg = Debug|x64 + {4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}.Release|x64.ActiveCfg = Release|x64 + {4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}.Release|x64.Build.0 = Release|x64 + {4CB8DBEB-EE73-4CEA-B662-E18B79EE113C}.Release|x86.ActiveCfg = Release|x64 + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51}.Debug|x64.ActiveCfg = Debug|x64 + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51}.Debug|x64.Build.0 = Debug|x64 + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51}.Debug|x86.ActiveCfg = Debug|x64 + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51}.Release|x64.ActiveCfg = Release|x64 + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51}.Release|x64.Build.0 = Release|x64 + {0E042214-1B06-40D6-9D20-C6D5FA3D7A51}.Release|x86.ActiveCfg = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {CD365F32-5EAC-4A16-AD47-BFB1D8E5511A} Qt5Version = qt5.9.4-msvc2017-x64 + SolutionGuid = {CD365F32-5EAC-4A16-AD47-BFB1D8E5511A} EndGlobalSection EndGlobal