#include "HistoryAlarm.h" #include "ui_HistoryAlarm.h" #include #include "sqlitedb.h" #include "QMyTableViewBtnDelegate.h" #include "AlarmDetails.h" #include "ftpclient.h" #include "global.h" CHistoryAlarm::CHistoryAlarm(QWidget *parent) : QWidget(parent), ui(new Ui::CHistoryAlarm) { ui->setupUi(this); headerStr = QObject::tr("序号,报警级别,报警内容,报警时间,复归时间,报警详情"); model = new QStandardItemModel(ui->tableView); ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //选中行 QStringList headerList = headerStr.split(","); model->setHorizontalHeaderLabels(headerList); model->setColumnCount(headerList.size()); ui->tableView->setModel(model); ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); ui->tableView->setColumnWidth(2, 500); ui->tableView->setColumnWidth(3, 200); ui->tableView->setColumnWidth(4, 200); ui->tableView->setAlternatingRowColors(true); ui->tableView->horizontalHeader()->setSectionResizeMode(0,QHeaderView::ResizeToContents); ui->tableView->horizontalHeader()->setSectionResizeMode(5,QHeaderView::ResizeToContents); ui->dateTimeEdit_start->setCalendarPopup(true); ui->dateTimeEdit_end->setCalendarPopup(true); QDateTime curDateTime=QDateTime::currentDateTime();//通过QDateTime的currentDateTime获得当前的日期时间,并赋值给curDateTime ui->dateTimeEdit_start->setDateTime(curDateTime.addDays(-7)); ui->dateTimeEdit_end->setDateTime(curDateTime.addSecs(300)); ui->comboBox_channel->setView(new QListView()); connect(ui->comboBox_channel,SIGNAL(currentIndexChanged(const QString &)),this,SLOT(on_comboBox_channel_currentTextChanged(const QString&))); ui->comboBox_channel->addItem("请选择通道..."); for (int i = 0; i < g_ChannelBaseInfo.size(); i++) { ui->comboBox_channel->insertItem(i,g_ChannelBaseInfo[i].channelName); } ui->comboBox_channel->setCurrentText("请选择通道..."); } CHistoryAlarm::~CHistoryAlarm() { delete ui; } void CHistoryAlarm::on_comboBox_channel_currentTextChanged(const QString& strChannelName) { int i = 0; for (i = 0; i < g_ChannelBaseInfo.size(); i++) { if(strChannelName == g_ChannelBaseInfo[i].channelName){ m_strChannelID = g_ChannelBaseInfo[i].channelID; break; } } } void CHistoryAlarm::createRowItem(int Row,QVariantList RowItem) { model->setRowCount(Row+1); for (int j = 0; j < RowItem.size(); ++j) { model->setData(model->index(Row,j,QModelIndex()),RowItem.at(j)); } } void CHistoryAlarm::on_pushButton_search_clicked() { model->removeRows(0, model->rowCount()); QDateTime dateTimeStart =ui->dateTimeEdit_start->dateTime(); QDateTime dateTimeEnd =ui->dateTimeEdit_end->dateTime(); int timestampStart = dateTimeStart.toTime_t(); int timestampEnd = dateTimeEnd.toTime_t(); QString strTableName = "t_AlarmStatusInfo",strSql; if(ui->comboBox_channel->currentText() == "请选择通道..."){ strSql = QString(" timestamp > %1 and timestamp < %2 order by timestamp ").arg(timestampStart).arg(timestampEnd); } else{ strSql = QString(" channelId = '%1' and timestamp > %2 and timestamp < %3 order by timestamp desc").arg(m_strChannelID).arg(timestampStart).arg(timestampEnd); } m_vecTriggerAlarmStatusInfo = g_SqliteDB->GetTriggerAlarmStatusInfo(strTableName,strSql); if(m_vecTriggerAlarmStatusInfo.size() > 0){ for (int i = 0; i < m_vecTriggerAlarmStatusInfo.size(); i++) { QVariantList strRowItem ; QString TStr = QDateTime::fromSecsSinceEpoch(m_vecTriggerAlarmStatusInfo[i].timestamp).toString("yyyy-MM-dd hh:mm:ss"); QString resetTime = ""; if(m_vecTriggerAlarmStatusInfo[i].resetTimestamp != 0) resetTime = QDateTime::fromSecsSinceEpoch(m_vecTriggerAlarmStatusInfo[i].resetTimestamp).toString("yyyy-MM-dd hh:mm:ss"); strRowItem << i + 1 << m_vecTriggerAlarmStatusInfo[i].triggerLevel << m_vecTriggerAlarmStatusInfo[i].triggerEventName << TStr << resetTime; createRowItem(i,strRowItem); } QMyTableViewBtnDelegate *m_btnDelegate = new QMyTableViewBtnDelegate(QStringList()<<"详情", this); ui->tableView->setItemDelegateForColumn(5, m_btnDelegate); connect(m_btnDelegate, SIGNAL(editData(const QModelIndex &)), this,SLOT(Details(const QModelIndex &))); }else{ QMessageBox::information(this, "提示", QString("未查询到数据!")); } } void CHistoryAlarm::OpenDatFile(QString& strFileName) { QProgressDialog *progressDialog = new QProgressDialog(this); progressDialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); progressDialog->setWindowModality(Qt::WindowModal); progressDialog->setWindowTitle(tr("Please Wait")); progressDialog->setLabelText(tr("读取中...")); progressDialog->setCancelButton(0); progressDialog->show(); QTime startTime = QTime::currentTime(); m_vecGroupdata.clear(); m_vecWaveInfo.clear(); QVector().swap(m_vecGroupdata); QVector().swap(m_vecWaveInfo); QVector().swap(m_vecAllData); QMap>::Iterator iter1 = mapWaveData.begin(); for(iter1 = mapWaveData.begin();iter1 != mapWaveData.end();iter1++){ QVector().swap(iter1.value()); mapWaveData.erase(iter1); } int channelwork[64]; int channelEnabled[64]; int theSize = 0; //通道数 //读12字节头文件 int iJsonSize, iChannelsize; char equipNo[12]; //设备No 12字节 char time[10]; //数据起始时间 10字节 QFile file(strFileName); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "::MainWidget::ReadDatData() cannot open file for read"; return; } file.read((char*)&iChannelsize, sizeof(iChannelsize)); //qDebug() << "::MainWidget::ReadDatData() Channelsize:" << iChannelsize; int iCount; //存储dat文件原始数据秒数 file.read((char*)&iCount, sizeof(iCount)); //qDebug() << "::MainWidget::ReadDatData() iCount:" << iCount; file.read(equipNo, sizeof(equipNo)); QString sEquipNo(equipNo); file.read(time, sizeof(time)); QString CollectTime(time); file.read((char *)&iJsonSize, sizeof(iJsonSize)); //qDebug() << "::MainWidget::ReadDatData() iJsonSize:" << iJsonSize; //读json串 char *buf0 = (char *)malloc(sizeof(char) *iJsonSize); file.read(buf0,iJsonSize); QJsonParseError parseJsonErr; QJsonDocument document = QJsonDocument::fromJson(buf0,&parseJsonErr); if(!(parseJsonErr.error == QJsonParseError::NoError)) { qDebug()< pData; int j = 0; int temCount = 0; int flag = -1; progressDialog->setRange(0, iCount * channels-1); while (!file.atEnd()) { file.read((char *)&Count, sizeof(Count)); //qDebug()<<"Count" << Count << "temCount" < temCount && flag == 0)//过滤超出的秒数的数据 break; if(Count == temCount && flag == 0) flag = 1; if(Count < temCount || flag == 1){//过滤原始数据中转速多余数据 file.read(buf, sizeof(buf)); file.read((char *)&waveSize, sizeof(waveSize)); float f = 0.0; QVector vecSpeed; //qDebug()<<"waveSize1" < 131072){ //qDebug() << "waveSize2" << waveSize << endl; delete progressDialog; file.close(); return; } for (int i = 0; i < waveSize; i++) { file.read((char *)&f, sizeof(f)); m_WaveChnData[j].channelId = buf; m_WaveChnData[j].waveData.push_back((double)f); m_WaveChnData[j].Second = Count; } temCount = Count; //qDebug()<<"::MainWidget::ReadDatData() wave.channelId" << m_WaveChnData[j].channelId<<" wave.count"<setValue(j); if (progressDialog->wasCanceled()) { delete progressDialog; file.close(); return ; } j++; } /*if(temCount != iCount){ MyMsgBox(QMessageBox::Warning,"警告","Dat文件采集秒数与实际读取秒数不一致"); iCount = temCount; }*/ //qDebug()<::iterator iter = m_vecWaveInfo.begin(); int linecolor = 0; for (;iter != m_vecWaveInfo.end() ; iter++ ) { WAVE_DATA wave; int ii = 0; QVector m_vecPushData1; for(int i = 0; i < j; i++){ //qDebug() << "i" << iter->channelId.left(bufferSiz) << "j " << m_WaveChnData[i].channelId.left(bufferSiz) <channelId.left(bufferSiz) == m_WaveChnData[i].channelId.left(bufferSiz)){ wave.waveData = m_WaveChnData[i].waveData; double sum = 0.0; if(iter->sensorType == "ACCELEROMETER" || iter->sensorType == "MICROPHONE" || iter->sensorType == "PROXIMETER" || iter->sensorType == "VELOCITY" || iter->sensorType == "TACHOMETER" || iter->sensorType == "THRUST" || iter->sensorType == "FAST_VOLTAGE"){ sum = std::accumulate(std::begin(wave.waveData), std::end(wave.waveData), 0.0); double size = m_WaveChnData[i].waveData.size(); wave.mean = sum/size; }else{ sum = 0.0; } if(iter->sensorType == "TACHOMETER"){ wave.TimeStamp = m_WaveChnData[i].TimeStamp; //qDebug()<< "iCount" <SpeedProfileSpeed; wave.wavesize = wave.waveData.size(); wave.SamleRate = iter->channelSamleRate; wave.sensorType = iter->sensorType; wave.channelId = iter->channelId; wave.channelNo = theSize; wave.Time = iCount; wave.channelName = iter->channelName; wave.pairChannelID = iter->pairChannelID; wave.sensorEngineeringUnit = iter->sensorEngineeringUnit; wave.speedRefChannelId = iter->speedRefChannelId; wave.RMSValue = iter->RMSValue; wave.iTrigger = iter->iTrigger; wave.iKeyCount = iter->iKeyCount; wave.iTriggerValue = iter->iTriggerValue; wave.iHysteresis = iter->iHysteresis; wave.tachAutoTach = iter->tachAutoTach; wave.sensorGapVoltage = iter->sensorGapVoltage; wave.sensorSensitivity = iter->sensorSensitivity; switch(linecolor){ case 0: wave.linColor = Qt::green ; break; case 1: wave.linColor = QColor(30,144,255) ; break; case 2: wave.linColor = QColor(255,182,193) ; break; case 3: wave.linColor = Qt::cyan ; break; case 4: wave.linColor = Qt::magenta ; break; case 5: wave.linColor = Qt::yellow ; break; case 6: wave.linColor = QColor(255,69,0) ; break; case 7: wave.linColor = QColor(0, 255, 127) ; break; case 8: wave.linColor = QColor(255,140,0) ; break; case 9: wave.linColor = QColor(0, 191, 255) ; break; case 10: wave.linColor = Qt::darkMagenta ; break; case 11: wave.linColor = Qt::lightGray ; break; case 12: wave.linColor = Qt::darkYellow ; break; case 13: wave.linColor = QColor(153, 51, 250); break; case 14: wave.linColor = QColor(255, 218, 185) ; break; case 15: wave.linColor = QColor(0,199,140) ; break; default: break; } m_vecPushData1.push_back(wave); } } linecolor++; if(linecolor > 15){ linecolor = 0; } mapWaveData.insert(iter->channelId,m_vecPushData1); } file.close(); free(buf0); QTime stopTime = QTime::currentTime(); // qDebug() << "Time: " << startTime.msecsTo(stopTime) << "ms" <setWindowModality(Qt::ApplicationModal); DateViewdialog->setAttribute(Qt::WA_DeleteOnClose); DateViewdialog->show(); QStringList strIDList,strChannleType,strChannleNameList; QMap>::Iterator iter2 = mapWaveData.begin(); for (; iter2 != mapWaveData.end(); iter2 ++) { if(!strIDList.contains(iter2.key())) strIDList.push_back(iter2.key()); strChannleType.push_back(iter2.value()[0].sensorType); strChannleNameList.push_back(iter2.value()[0].channelName); } DateViewdialog->SetDataIDs(strIDList, tr("Data Watch "),strChannleType,strChannleNameList); } void CHistoryAlarm::downloadProcess_Slot(qint64 byteSend, qint64 byteTotal) { qDebug() << byteSend << byteTotal << endl; downloadProgressDialog->setRange(0, byteTotal); downloadProgressDialog->setValue(byteSend); if(byteSend == byteTotal){ disconnect(g_FtpClient,SIGNAL(sigDownloadProcess(qint64 , qint64 )),this,SLOT(downloadProcess_Slot(qint64 , qint64))); OpenDatFile(g_LocalFile); } } void CHistoryAlarm::Details(const QModelIndex &index) { int row = index.row(); QString strCol = "triggeredFileName"; QString strTimeStamp = QString("%1").arg(m_vecTriggerAlarmStatusInfo[row].timestamp); qDebug() << "TriggerAlarm timestamp" << strTimeStamp << endl; QString strTableName = QString("t_TriggerEvent ORDER BY ABS(triggeredTime - %1) LIMIT 1").arg(m_vecTriggerAlarmStatusInfo[row].timestamp); QString strFileName = g_SqliteDB->GetSingelLine(strTableName,strCol); strFileName = strFileName.left(strFileName.size()-1); QStringList strList = strFileName.split("/"); QString strPath = QCoreApplication::applicationDirPath() + "\\dat\\" + strList[5]; customLogMessageHandler(QtDebugMsg,"HistoryAlarm:" + strPath); QFile file(strPath); g_LocalFile = strPath; if(file.exists()){ OpenDatFile(strPath); }else{ downloadProgressDialog = new QProgressDialog(this); downloadProgressDialog->setWindowFlags(Qt::CustomizeWindowHint | Qt::FramelessWindowHint); downloadProgressDialog->setWindowModality(Qt::WindowModal); downloadProgressDialog->setWindowTitle(tr("Please Wait")); downloadProgressDialog->setLabelText(tr("下载中...")); //downloadProgressDialog->setCancelButton(0); downloadProgressDialog->show(); qDebug() << "file2" << endl; connect(g_FtpClient,SIGNAL(sigDownloadProcess(qint64 , qint64 )),this,SLOT(downloadProcess_Slot(qint64 , qint64))); //connect(g_FtpClient,SIGNAL(sigDownloadStatus()),this,SLOT(DownloadStatus_Slot())); QString str = QString("ftp://%1/").arg(IP); g_FtpClient->SetServerInfo(str); g_FtpClient->SetUserInfo("root","@#cidw!@123456"); g_FtpClient->DownLoad(strFileName,strPath); } } void CHistoryAlarm::ItemCheckStateSlot(QString strID, bool bChecked) { DateViewdialog->ViewData(strID,mapWaveData[strID]); }