databasethread.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #include "databasethread.h"
  2. #include "databoardmem.h"
  3. DatabaseThread::DatabaseThread(QObject *parent) : QThread(parent)
  4. {
  5. sqlList.clear();
  6. keepwork = false;
  7. }
  8. void DatabaseThread::stop()
  9. {
  10. keepwork = false;
  11. }
  12. void DatabaseThread::mem_init()
  13. {
  14. int nrow[2];
  15. QSqlQuery qry = db.exec("select count(*) from yt_t_station ");
  16. if(qry.next()){
  17. ytStationCount->StationCount = qry.value(0).toInt();
  18. }
  19. qry.clear();
  20. nrow[0] = 0;
  21. for(int i=0;i<16;i++)
  22. ytStationCount->station[i].Enabled = 0x00;
  23. 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");
  24. while (qry.next()) {
  25. if(nrow[0]>15)
  26. break;
  27. sprintf(ytStationCount->station[nrow[0]].StationID,"%s",qry.value(0).toString().toUtf8().data());
  28. sprintf(ytStationCount->station[nrow[0]].StationName,"%s",qry.value(1).toString().toUtf8().data());
  29. ytStationCount->station[nrow[0]].DeviceCount = qry.value(2).toInt();
  30. ytStationCount->station[nrow[0]].Enabled = 0x01;
  31. nrow[1] = 0;
  32. for(int i=0;i<128;i++)
  33. ytStationCount->station[nrow[0]].StationDevice[i].Enabled = 0x00;
  34. 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()));
  35. while(qry2.next()){
  36. if(nrow[1]>127)
  37. break;
  38. sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceID,"%s",qry2.value(0).toString().toUtf8().data());
  39. sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceName,"%s",qry2.value(1).toString().toUtf8().data());
  40. sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceTypeID,"%s",qry2.value(2).toString().toUtf8().data());
  41. sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceType,"%s",qry2.value(3).toString().toUtf8().data());
  42. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceStatus=0;
  43. sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DeviceStatusNote,"正常");
  44. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].UpTime = QDateTime::currentDateTime().toTime_t();
  45. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].Enabled = 0x01;
  46. for(int i=0;i<256;i++)
  47. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[i].Enabled = 0x00;
  48. 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()));
  49. while (qry3.next()) {
  50. int addr = qry3.value(0).toInt();
  51. if((addr>=0)&&(addr<256)){
  52. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].BusAddr = addr;
  53. sprintf(ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].PointName,"%s",qry3.value(1).toString().toUtf8().data());
  54. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].PointType = qry3.value(2).toInt();
  55. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].AlarmType = qry3.value(3).toInt();
  56. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].IsKeyPoint = qry3.value(4).toInt();
  57. ytStationCount->station[nrow[0]].StationDevice[nrow[1]].DevicePoint[addr].Enabled = 0x01;
  58. }
  59. }
  60. qry3.clear();
  61. nrow[1]++;
  62. }
  63. qry2.clear();
  64. nrow[0]++;
  65. }
  66. qry.clear();
  67. }
  68. void DatabaseThread::savedata() //保存整点数据
  69. {
  70. int minute = QDateTime::currentDateTime().time().minute();
  71. printf(" enter into savedata() -----minute %d",minute);
  72. for(int i=0;i<16;i++)
  73. {
  74. QString data;
  75. QString stationStr;
  76. if(ytStationCount->station[i].Enabled==0x01)
  77. {
  78. QString deviceStr;
  79. for(int j=0;j<128;j++)
  80. {
  81. if(ytStationCount->station[i].StationDevice[j].Enabled==0x01)
  82. {
  83. QString pointStr;
  84. for(int k=0;k<256;k++){
  85. if(ytStationCount->station[i].StationDevice[j].DevicePoint[k].Enabled==0x01){
  86. QString pointvalueStr;
  87. 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));
  88. if(pointvalueStr.size()>1)
  89. {
  90. 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));
  91. }else{
  92. 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));
  93. }
  94. }
  95. }
  96. pointStr=pointStr.left(pointStr.length()-1);
  97. 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));
  98. }
  99. }
  100. deviceStr=deviceStr.left(deviceStr.length()-1);
  101. 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));
  102. 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"));
  103. 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));
  104. }
  105. }
  106. }
  107. void DatabaseThread::run()
  108. {
  109. QString savetime = "2430";
  110. QString savesecond = "1000";
  111. keepwork = true;
  112. db = QSqlDatabase::addDatabase("QMYSQL","databoard_db");
  113. db.setHostName("127.0.0.1");
  114. db.setUserName("root");
  115. db.setPassword("root");
  116. db.setDatabaseName("DataDashBoard");
  117. if(db.open()){
  118. mem_init();
  119. while (keepwork) {
  120. QDateTime dt = QDateTime::currentDateTime();
  121. for(int s=0;s<16;s++){
  122. if(ytStationCount->station[s].Enabled==0x01){
  123. for(int d=0;d<128;d++){
  124. if(ytStationCount->station[s].StationDevice[d].Enabled==0x01){
  125. if((dt.toTime_t()-ytStationCount->station[s].StationDevice[d].UpTime)>300){
  126. if(ytStationCount->station[s].StationDevice[d].DeviceStatus!=1){
  127. ytStationCount->station[s].StationDevice[d].DeviceStatus = 2;
  128. sprintf(ytStationCount->station[s].StationDevice[d].DeviceStatusNote,"%s",QString::fromUtf8("故障").toUtf8().data());
  129. }
  130. }
  131. }
  132. }
  133. }
  134. }
  135. if((dt.time().minute()==0)||(dt.time().minute()==30)){
  136. QString Stime = dt.toString("HHmm");
  137. if(QString::compare(Stime,savetime)!=0){
  138. savetime = Stime;
  139. savedata();
  140. }
  141. }
  142. //将从数据库查询出来的所有电子巡检记录封装到QList中,然后emit到Core主程序,然后主程序再调用前端处理线程中的函数
  143. if(dt.time().second()==0){
  144. QString Ssecond = dt.toString("mmss");
  145. if(QString::compare(Ssecond,savesecond)!=0)
  146. {
  147. savesecond = Ssecond;
  148. printf(" dt.time().second() ----- %d\n",dt.time().second());
  149. sendPatrolList.clear();
  150. QSqlQuery patrol = db.exec("select v_datatime,uq_station_id,t_values from yt_t_rec");
  151. while (patrol.next()) {
  152. QString DataTime = patrol.value(0).toDateTime().toString("yyyy-MM-dd HH:mm:ss").toUtf8().data();
  153. QString StationId = patrol.value(1).toString().toUtf8().data();
  154. QString Values = patrol.value(2).toString().toUtf8().data();
  155. sqlList.clear();
  156. sqlList<<DataTime<<StationId<<Values;
  157. if(sendPatrolList.size() == 2688){ //保留最近28天的数据 2*24*2*28
  158. sendPatrolList.removeAt(0);
  159. }
  160. sendPatrolList.append(sqlList);
  161. }
  162. patrol.clear();
  163. emit sendpatrol(sendPatrolList);
  164. }
  165. }
  166. usleep(500000);
  167. }
  168. db.close();
  169. }
  170. }