Newer
Older
AutomaticVerification / softwareDirectory / AutoVerScheme / synctask.cpp
张嘉 on 22 Apr 2024 4 KB 增加数据上传
#include "synctask.h"
#include "QMap"
#include <QtSql>
#include "basecommonapi.h"



SyncTask::SyncTask( QSqlDatabase srcDb,
                    QSqlDatabase dstDb,
                    QString tableName)
    :srcDb(srcDb),dstDb(dstDb), tableName(tableName)
{

   //

}
void SyncTask::run()
{

    this->syncTable();
}

void SyncTask::syncTable()
{

   if(syncstate==SyncRunStatus::Stopped){return;};

       while (syncstate==SyncRunStatus::Paused) {
           //等待
          QThread::sleep(1);
       }

     emit taskCompleted(2,tableName, "表:"+tableName);
    // 清空目标数据库中的表数据
     QSqlQuery clearQuery(dstDb);

     clearQuery.prepare("DELETE FROM "+tableName);

     if (!clearQuery.exec()) {
         qDebug() << "删除错误:"  << clearQuery.lastError().text();
         //错误处理
         //触发信号
         emit taskCompleted(1,tableName,tableName+"|删除本地表时错误:"+clearQuery.lastError().text());
         return;
     }
     // 从源数据库复制数据到目标数据库
     QSqlQuery copyQuery(srcDb);
     copyQuery.prepare("SELECT * FROM " + tableName);
     if (!copyQuery.exec()) {
         qDebug() << tableName+"查询错误:" << copyQuery.lastError().text();

        emit taskCompleted(1, tableName,tableName+"|查询主系统表时错误:"+copyQuery.lastError().text());


        return;
     }

     while (copyQuery.next()) {
       if(syncstate==SyncRunStatus::Stopped){return;};
        // 构建插入语句并执行
        QStringList values;
        QString ValueJoin;
        QSqlRecord record;
        QString ResValue;
        record=copyQuery.record();
        for (int i = 0; i < copyQuery.record().count(); ++i) {
           if(syncstate==SyncRunStatus::Stopped){return;};
           while (syncstate==SyncRunStatus::Paused) {
               //等待
              QThread::sleep(1);
           }
            //处理时间类型
            if (record.fieldName(i).count("date")||record.fieldName(i).count("TIME")
                    ||record.fieldName(i).count("time")
                    ||record.fieldName(i).count("vaild")||
                    record.fieldName(i).count("BIRTHDAY")||
                    record.fieldName(i).count("person_id") ||
                    record.fieldName(i).count("valid") ){
                  if(copyQuery.value(i).toString()==""){
                      if(i==copyQuery.record().count()-1)
                      {
                          ValueJoin+="NULL";


                      }else{
                          ValueJoin+="NULL,";
                      }

                      continue;
                   };
             }
            //处理内容的 "\T
            ResValue=copyQuery.value(i).toString();
            // 替换双引号
            ResValue = ResValue.replace("\"", " ");

            ResValue = ResValue.replace("\\", "\\\\");
            // 替换字母T
            ResValue = ResValue.replace("T", " ");

            if(i==copyQuery.record().count()-1)
            {
               ValueJoin+="\""+ResValue+"\"";


            }else{
              ValueJoin+="\""+ResValue+"\""+",";
            }

        }
        QSqlQuery insertQuery(dstDb);
        QString str="INSERT INTO " + tableName + " VALUES (" + ValueJoin + ")";
        insertQuery.prepare(str);
        if (!insertQuery.exec()) {

           emit taskCompleted(1, tableName,tableName+"|添加本地表数据时错误:"+insertQuery.lastError().text()+"\t"+ValueJoin);
           qDebug() <<tableName+"1" << copyQuery.lastError().text();
           return;
            // 或者可以记录错误并继续
        }
   }
     emit taskCompleted(0, tableName,"表:"+tableName);
     emit TextState();
}
void SyncTask::UpdateState(int state)
 {
    if(state==0)
    {
       syncstate=SyncRunStatus::Running;
    }else if(state==1){
        syncstate=SyncRunStatus::Paused;
    }else{
          syncstate=SyncRunStatus::Stopped;
    }
 }