#include "databasethread.h" #include "databoardmem.h" DatabaseThread::DatabaseThread(QObject *parent) : QThread(parent) { sqlList.clear(); keepwork = false; } void DatabaseThread::stop() { keepwork = false; } void DatabaseThread::mem_init() { int nrow[2]; QSqlQuery qry = db.exec("select count(*) from yt_t_station "); if(qry.next()){ ytStationCount->StationCount = qry.value(0).toInt(); } qry.clear(); nrow[0] = 0; for(int i=0;i<16;i++) ytStationCount->station[i].Enabled = 0x00; qry = db.exec("select a.uq_station_id,a.v_station_name,(select count(*) from yt_t_devices where uq_station_id = a.uq_station_id) from yt_t_station a"); while (qry.next()) { if(nrow[0]>15) break; sprintf(ytStationCount->station[nrow[0]].StationID,"%s",qry.value(0).toString().toUtf8().data()); sprintf(ytStationCount->station[nrow[0]].StationName,"%s",qry.value(1).toString().toUtf8().data()); ytStationCount->station[nrow[0]].DeviceCount = qry.value(2).toInt(); ytStationCount->station[nrow[0]].Enabled = 0x01; nrow[1] = 0; for(int i=0;i<128;i++) ytStationCount->station[nrow[0]].StationDevice[i].Enabled = 0x00; QSqlQuery qry2 = db.exec(QString("select a.uq_device_id,a.v_devicename,a.uq_devicetype_id,(select v_devicetype from yt_t_devicetype where uq_devicetype_id = a.uq_devicetype_id) from yt_t_devices a where a.uq_station_id = '%1' order by a.uq_devicetype_id,a.v_devicename").arg(qry.value(0).toString())); while(qry2.next()){ if(nrow[1]>127) break; sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceID,"%s",qry2.value(0).toString().toUtf8().data()); sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceName,"%s",qry2.value(1).toString().toUtf8().data()); sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceTypeID,"%s",qry2.value(2).toString().toUtf8().data()); sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceType,"%s",qry2.value(3).toString().toUtf8().data()); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceStatus=0; sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceStatusNote,"正常"); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].UpTime = QDateTime::currentDateTime().toTime_t(); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].Enabled = 0x01; for(int i=0;i<256;i++) ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[i].Enabled = 0x00; QSqlQuery qry3 = db.exec(QString("select i_busaddr,v_pointname,e_pointtype,e_alarmtype,b_iskeypoint from yt_t_point where uq_device_id = '%1'").arg(qry2.value(0).toString())); while (qry3.next()) { int addr = qry3.value(0).toInt(); if((addr>=0)&&(addr<256)){ ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].BusAddr = addr; sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].PointName,"%s",qry3.value(1).toString().toUtf8().data()); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].PointType = qry3.value(2).toInt(); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].AlarmType = qry3.value(3).toInt(); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].IsKeyPoint = qry3.value(4).toInt(); ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].Enabled = 0x01; } } qry3.clear(); nrow[1]++; } qry2.clear(); nrow[0]++; } qry.clear(); } void DatabaseThread::savedata() //保存整点数据 { int minute = QDateTime::currentDateTime().time().minute(); printf(" enter into savedata() -----minute %d",minute); for(int i=0;i<16;i++) { QString data; QString stationStr; if(ytStationCount->station[i].Enabled==0x01) { QString deviceStr; //幼儿园只有电气火灾设备特殊处理 if(QString::compare(ytStationCount->station[i].StationID,"3b153d74-84f4-4441-902c-22960fb97aa5") ==0){ deviceStr.append("{},{},{},"); } for(int j=0;j<128;j++) { if(ytStationCount->station[i].StationDevice[j].Enabled==0x01) { QString pointStr; for(int k=0;k<256;k++){ if(ytStationCount->station[i].StationDevice[j].DevicePoint[k].Enabled==0x01){ QString pointvalueStr; pointvalueStr.append(QString("\"AlarmStatus\":%1,\"Value\":%2,\"Time\":\"%3\"").arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].pointvaluelist[0].AlarmStatus).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].pointvaluelist[0].Value).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].pointvaluelist[0].Time)); if(pointvalueStr.size()>1) { pointStr.append(QString("{\"BusAddr\":%1,\"PointName\":\"%2\",\"PointType\":%3,\"AlarmType\":%4,%5},").arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].BusAddr).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].PointName).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].PointType).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].AlarmType).arg(pointvalueStr)); }else{ pointStr.append(QString("{\"BusAddr\":%1,\"PointName\":\"%2\",\"PointType\":%3,\"AlarmType\":%4},").arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].BusAddr).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].PointName).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].PointType).arg(ytStationCount->station[i].StationDevice[j].DevicePoint[k].AlarmType)); } } } pointStr=pointStr.left(pointStr.length()-1); deviceStr.append(QString("{\"DeviceID\":\"%1\",\"DeviceName\":\"%2\",\"DeviceTypeID\":\"%3\",\"DeviceType\":\"%4\",\"DeviceStatus\":%5,\"DeviceStatusNote\":\"%6\",\"Points\":[%7]},").arg(ytStationCount->station[i].StationDevice[j].DeviceID).arg(ytStationCount->station[i].StationDevice[j].DeviceName).arg(ytStationCount->station[i].StationDevice[j].DeviceTypeID).arg(ytStationCount->station[i].StationDevice[j].DeviceType).arg(ytStationCount->station[i].StationDevice[j].DeviceStatus).arg(ytStationCount->station[i].StationDevice[j].DeviceStatusNote).arg(pointStr)); } } deviceStr=deviceStr.left(deviceStr.length()-1); stationStr.append(QString("{\"StationID\":\"%1\",\"StationName\":\"%2\",\"Time\":\"%3\",\"LIST\":[%4]}").arg(ytStationCount->station[i].StationID).arg(ytStationCount->station[i].StationName).arg(ytStationCount->station[i].LastCommTime).arg(deviceStr)); data=QString("{\"time\":\"%1\",\"CMD\":\"getPatrolDetail\",\"VER\":\"1.00\",\"RESULT\":%2,\"TimeStamp\":\"%3\",\"REPLY\":1}").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(stationStr).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")); db.exec(QString("insert into yt_t_rec(v_datatime,uq_station_id,t_values) values('%1','%2','%3')").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss")).arg(ytStationCount->station[i].StationID).arg(data)); } } } void DatabaseThread::run() { QString savetime = "2430"; QString savesecond = "1000"; keepwork = true; db = QSqlDatabase::addDatabase("QMYSQL","databoard_db"); db.setHostName("127.0.0.1"); db.setUserName("root"); db.setPassword("root"); db.setDatabaseName("DataDashBoard"); if(db.open()){ mem_init(); while (keepwork) { QDateTime dt = QDateTime::currentDateTime(); for(int s=0;s<16;s++){ if(ytStationCount->station[s].Enabled==0x01){ for(int d=0;d<128;d++){ if(ytStationCount->station[s].StationDevice[d].Enabled==0x01){ if((dt.toTime_t()-ytStationCount->station[s].StationDevice[d].UpTime)>300){ if(ytStationCount->station[s].StationDevice[d].DeviceStatus!=1){ ytStationCount->station[s].StationDevice[d].DeviceStatus = 2; sprintf(ytStationCount->station[s].StationDevice[d].DeviceStatusNote,"%s",QString::fromUtf8("故障").toUtf8().data()); } } } } } } if((dt.time().minute()==0)||(dt.time().minute()==30)){ QString Stime = dt.toString("HHmm"); if(QString::compare(Stime,savetime)!=0){ savetime = Stime; int savecount = 0; QSqlQuery savesql = db.exec(QString("select count(*) from yt_t_rec where SUBSTR(v_datatime,1,16) = '%1'").arg(dt.toString("yyyy-MM-dd HH:mm"))); while(savesql.next()) { savecount = savesql.value(0).toInt(); } if(savecount > 0) { db.exec(QString("delete from yt_t_rec where SUBSTR(v_datatime,1,16) = '%1'").arg(dt.toString("yyyy-MM-dd HH:mm"))); } savedata(); } } //将从数据库查询出来的所有电子巡检记录封装到QList中,然后emit到Core主程序,然后主程序再调用前端处理线程中的函数 if(dt.time().second()==0){ QString Ssecond = dt.toString("mmss"); if(QString::compare(Ssecond,savesecond)!=0) { savesecond = Ssecond; printf(" dt.time().second() ----- %d\n",dt.time().second()); sendPatrolList.clear(); QSqlQuery patrol = db.exec("select v_datatime,uq_station_id,t_values from yt_t_rec"); while (patrol.next()) { QString DataTime = patrol.value(0).toDateTime().toString("yyyy-MM-dd HH:mm:ss").toUtf8().data(); QString StationId = patrol.value(1).toString().toUtf8().data(); QString Values = patrol.value(2).toString().toUtf8().data(); sqlList.clear(); sqlList<