databasethread.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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. //幼儿园只有电气火灾设备特殊处理
  80. if(QString::compare(ytStationCount->station[i].StationID,"3b153d74-84f4-4441-902c-22960fb97aa5") ==0){
  81. deviceStr.append("{},{},{},");
  82. }
  83. for(int j=0;j<128;j++)
  84. {
  85. if(ytStationCount->station[i].StationDevice[j].Enabled==0x01)
  86. {
  87. QString pointStr;
  88. for(int k=0;k<256;k++){
  89. if(ytStationCount->station[i].StationDevice[j].DevicePoint[k].Enabled==0x01){
  90. QString pointvalueStr;
  91. 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));
  92. if(pointvalueStr.size()>1)
  93. {
  94. 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));
  95. }else{
  96. 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));
  97. }
  98. }
  99. }
  100. pointStr=pointStr.left(pointStr.length()-1);
  101. 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));
  102. }
  103. }
  104. deviceStr=deviceStr.left(deviceStr.length()-1);
  105. 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));
  106. 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"));
  107. 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));
  108. }
  109. }
  110. }
  111. void DatabaseThread::run()
  112. {
  113. QString savetime = "2430";
  114. QString savesecond = "1000";
  115. keepwork = true;
  116. db = QSqlDatabase::addDatabase("QMYSQL","databoard_db");
  117. db.setHostName("127.0.0.1");
  118. db.setUserName("root");
  119. db.setPassword("root");
  120. db.setDatabaseName("DataDashBoard");
  121. if(db.open()){
  122. mem_init();
  123. while (keepwork) {
  124. QDateTime dt = QDateTime::currentDateTime();
  125. for(int s=0;s<16;s++){
  126. if(ytStationCount->station[s].Enabled==0x01){
  127. for(int d=0;d<128;d++){
  128. if(ytStationCount->station[s].StationDevice[d].Enabled==0x01){
  129. if((dt.toTime_t()-ytStationCount->station[s].StationDevice[d].UpTime)>300){
  130. if(ytStationCount->station[s].StationDevice[d].DeviceStatus!=1){
  131. ytStationCount->station[s].StationDevice[d].DeviceStatus = 2;
  132. sprintf(ytStationCount->station[s].StationDevice[d].DeviceStatusNote,"%s",QString::fromUtf8("故障").toUtf8().data());
  133. }
  134. }
  135. }
  136. }
  137. }
  138. }
  139. if((dt.time().minute()==0)||(dt.time().minute()==30)){
  140. QString Stime = dt.toString("HHmm");
  141. if(QString::compare(Stime,savetime)!=0){
  142. savetime = Stime;
  143. int savecount = 0;
  144. 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")));
  145. while(savesql.next())
  146. {
  147. savecount = savesql.value(0).toInt();
  148. }
  149. if(savecount > 0)
  150. {
  151. db.exec(QString("delete from yt_t_rec where SUBSTR(v_datatime,1,16) = '%1'").arg(dt.toString("yyyy-MM-dd HH:mm")));
  152. }
  153. savedata();
  154. }
  155. }
  156. //将从数据库查询出来的所有电子巡检记录封装到QList中,然后emit到Core主程序,然后主程序再调用前端处理线程中的函数
  157. if(dt.time().second()==0){
  158. QString Ssecond = dt.toString("mmss");
  159. if(QString::compare(Ssecond,savesecond)!=0)
  160. {
  161. savesecond = Ssecond;
  162. printf(" dt.time().second() ----- %d\n",dt.time().second());
  163. sendPatrolList.clear();
  164. QSqlQuery patrol = db.exec("select v_datatime,uq_station_id,t_values from yt_t_rec");
  165. while (patrol.next()) {
  166. QString DataTime = patrol.value(0).toDateTime().toString("yyyy-MM-dd HH:mm:ss").toUtf8().data();
  167. QString StationId = patrol.value(1).toString().toUtf8().data();
  168. QString Values = patrol.value(2).toString().toUtf8().data();
  169. sqlList.clear();
  170. sqlList<<DataTime<<StationId<<Values;
  171. if(sendPatrolList.size() == 2688){ //保留最近28天的数据 2*24*2*28
  172. sendPatrolList.removeAt(0);
  173. }
  174. sendPatrolList.append(sqlList);
  175. }
  176. patrol.clear();
  177. emit sendpatrol(sendPatrolList);
  178. }
  179. }
  180. usleep(500000);
  181. }
  182. db.close();
  183. }
  184. }