#include "syncdialog.h" #include "ui_syncdialog.h" int SyncDialog::m_totalTasks; int SyncDialog::stepcount; int SyncDialog::filecount; SyncDialog::SyncDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SyncDialog) { ui->setupUi(this); } SyncDialog::~SyncDialog() { delete ui; } void SyncDialog::on_button_Start_clicked() { //qint64 id = dbmang.generateId(); //zdlogId=QString::number(id); zdDataSyncList.clear(); querydstList.clear(); //从主系统下载 //连接两个数据库 bool IsOpen=false; bool IsOpenMain=false; DatabaseConnection *Conn=DatabaseConnection::getInstance(); //DatabaseConnectionMainSys *MainConn=DatabaseConnectionMainSys::getInstance(); if(!Conn->isopen()){IsOpen=Conn->open();}else{IsOpen=true;}; if(!Conn->isopenmain()){IsOpenMain=Conn->openmain();}else{IsOpenMain=true;}; // 记录任务数量 m_totalTasks=0; stepcount=0; filecount=0; // 获取第一个数据库的所有表名 dstDb=Conn->getDatabase(); srcDb=Conn->getDatabaseMain(); QSqlQuery querydst(dstDb); querydst.exec("SHOW TABLES"); QSqlQuery query(srcDb); query.exec("SHOW TABLES"); while(querydst.next()){ QString tableName = querydst.value(0).toString(); if(tableName.contains("act_") ||tableName.contains("flw_ru_")){continue;}; querydstList.append(tableName);}; // 创建一个线程池 threadPool= QThreadPool::globalInstance(); threadPool->setMaxThreadCount(5); // 设置线程池中的最大线程数 // 遍历表名,为每个表创建一个任务并提交到线程池 BaseCommonApi::SaveLogInfo(0,"开始下载同步"); while (query.next()) { QString tableName = query.value(0).toString(); if(!querydstList.contains(tableName)){continue;}; if(tableName.contains("ACT_") ||tableName.contains("FLW_RU_") ||tableName.contains("zd")) {continue;}; SyncTask *task = new SyncTask(srcDb, dstDb, tableName); connectTaskSignals(task); // 提交任务到线程池 threadPool->start(task); ++m_totalTasks; // } //总数量 ui->lab_sum->setText(QString::number(m_totalTasks)); progressDecrement=static_cast<double>(100) / m_totalTasks; } void SyncDialog::connectTaskSignals(SyncTask *task) { connect(task, &SyncTask::taskCompleted, this, &SyncDialog::onTaskCompleted); connect(task, &SyncTask::TextState, this, &SyncDialog::onTextState); connect(this,&SyncDialog::StopRequested,task,&SyncTask::UpdateState); //当前正在执行的 } void SyncDialog::onTaskCompleted(int success,QString tableName, const QString& errorMessage) { if(success!=2){ if(querydstList.contains(tableName)){querydstList.removeAll(tableName);}; //添加同步表 //任务完成 任务失败 都需要添加 qint64 id = dbmang.generateId(); zdDataSync zdDataSyncentity; zdDataSyncentity.id=QString::number(id);; zdDataSyncentity.remark=errorMessage; zdDataSyncentity.log_sync_id=""; zdDataSyncentity.sync_type=QString::number(success+1); zdDataSyncList.append(zdDataSyncentity); // dbmang.InsertzdDataSync(zdDataSyncentity); }; QString mess; if (success==0) { // 任务成功完成 mess = "任务完成"; mess+=errorMessage; } else if(success==1){ // 任务执行失败 mess = "任务失败"; mess +=errorMessage; filecount++; //失败数量 ui->lab_fail->setText(QString::number(filecount));; }else{ mess = "正在执行"; mess +=errorMessage+"....."; } //log保存 BaseCommonApi::SaveLogInfo(0,mess); //界面listview显示 ui->listWidget->addItem(mess); // 当添加新项后,滚动到底部 ui->listWidget->scrollToBottom(); } void SyncDialog::onTextState() { stepcount++; //成功数量 ui->lab_succ->setText(QString::number(stepcount));; //更新进度条 int progress = static_cast<int>(progressDecrement * stepcount); ui->progressBar->setValue(progress); if(stepcount>=m_totalTasks) { this->StopSync(); } } void SyncDialog::on_button_Close_clicked() { emit StopRequested(2); threadPool->waitForDone(); this->StopSync(); srcDb.close(); this->close(); } void SyncDialog::StopSync() { ui->progressBar->setValue(100); srcDb.close(); //dstDb.close(); //添加日志表 zdLog zlog; zlog.id=QString::number( dbmang.generateId());; zlog.type="1"; if(filecount==0) { zlog.is_sync="成功"; }else { zlog.is_sync="失败"; } zlog.sync_time=QDateTime::currentDateTime(); zlog.remark="错误数量"+QString::number(filecount); dbmang.InsertzdLog(zlog); //添加记录表 for (int i=0;i<zdDataSyncList.count();i++) { zdDataSyncList[i].log_sync_id=zlog.id; dbmang.InsertzdDataSync(zdDataSyncList[i]); } if(querydstList.count()!=0) { for (int i=0;i<querydstList.count();i++) { zdDataSync entity; entity.id=QString::number(dbmang.generateId()); entity.sync_type="0"; entity.log_sync_id=zlog.id; entity.remark="表:"+querydstList[i]; dbmang.InsertzdDataSync(entity); } } BaseCommonApi::SaveLogInfo(0,"结束下载同步"); QMessageBox::warning(this, "提示", "结束!"); } void SyncDialog::on_button_step_clicked() { if(ui->button_step->text()=="暂停") { ui->button_step->setText("继续"); emit StopRequested(1); }else{ ui->button_step->setText("暂停"); emit StopRequested(0); }; }