#include "srunprocess.h" #include "sutilclass.h" #include "sutilfunction.h" #include #include #include #include #include #include namespace { const QString strDatabaseName("processlist"); const int ONE_SECOND = 1000; // 1 second const int HALF_SECOND = 500; // 0.5 second } enum class SRunProcess::E_INNER_RUN_MODE:unsigned short { MODE_WAIT = 0, MODE_RUN_INIT, MODE_RUN_EVENTCODE, MODE_WAIT_INIT, MODE_WAIT_EVENTCODE, MODE_FINISH = MODE_WAIT }; SRunProcess::SRunProcess():m_eRunMode(E_RUN_MODE::MODE_WAIT), m_pTimer(new QTimer(this)), m_pProcess(new QProcess(this)), m_eListMode(E_LIST_MODE::MODE_COMPANY), m_bRun(false), m_eInnerRunMode(E_INNER_RUN_MODE::MODE_WAIT) { initDatabase(); connect(m_pTimer.get(), &QTimer::timeout, this, &SRunProcess::update); } void SRunProcess::initDatabase() { databaseSetting(strDatabaseName); } bool SRunProcess::isRunning() { return m_eRunMode == E_RUN_MODE::MODE_RUN; } void SRunProcess::setList(const QVector &_runList) { init(); m_eListMode = E_LIST_MODE::MODE_COMPANY; m_vecRunList = _runList; } void SRunProcess::setList(QVector &&_runList) { init(); m_eListMode = E_LIST_MODE::MODE_COMPANY; m_vecRunList = std::move(_runList); } void SRunProcess::setList(const QVector &_errorList) { init(); m_eListMode = E_LIST_MODE::MODE_ERROR; m_vecErrorList = _errorList; } void SRunProcess::setList(QVector &&_errorList) { init(); m_eListMode = E_LIST_MODE::MODE_ERROR; m_vecErrorList = std::move(_errorList); } void SRunProcess::init() { m_vecRunList.clear(); m_vecErrorList.clear(); m_vecRunOrderList.clear(); m_mapEffectRow.clear(); } void SRunProcess::stop() { if (m_pTimer->isActive()) m_pTimer->stop(); m_bRun = false; } template void SRunProcess::start(QVector&& _list) { setList(std::forward(_list)); start(); } void SRunProcess::start() { if (!m_pTimer->isActive()) m_pTimer->start(ONE_SECOND); m_bRun = true; } SReportSummary SRunProcess::getReportSummary() { SReportSummary a; return a; } QVector SRunProcess::getErrorList() { QVector hahaha; return hahaha; } void SRunProcess::update() { switch (m_eListMode) { case E_LIST_MODE::MODE_COMPANY: { updateCompany(); break; } case E_LIST_MODE::MODE_ERROR: { updateError(); break; } } } void SRunProcess::updateCompany() { switch(m_eInnerRunMode) { case E_INNER_RUN_MODE::MODE_WAIT: { m_eInnerRunMode = E_INNER_RUN_MODE::MODE_RUN_INIT; break; } case E_INNER_RUN_MODE::MODE_RUN_INIT: { runInitCompany(); break; } case E_INNER_RUN_MODE::MODE_RUN_EVENTCODE: { runEventcodeCompany(); break; } case E_INNER_RUN_MODE::MODE_WAIT_INIT: case E_INNER_RUN_MODE::MODE_WAIT_EVENTCODE: { break; } } } void SRunProcess::updateError() { switch(m_eInnerRunMode) { case E_INNER_RUN_MODE::MODE_WAIT: { m_eInnerRunMode = E_INNER_RUN_MODE::MODE_RUN_INIT; break; } case E_INNER_RUN_MODE::MODE_RUN_INIT: { runInitCompany(); break; } case E_INNER_RUN_MODE::MODE_RUN_EVENTCODE: { runEventcodeCompany(); break; } case E_INNER_RUN_MODE::MODE_WAIT_INIT: case E_INNER_RUN_MODE::MODE_WAIT_EVENTCODE: { break; } } } void SRunProcess::setInnerMode(E_INNER_RUN_MODE _inner_mode) { m_eInnerRunMode = _inner_mode; } void SRunProcess::runInitCompany() { setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_INIT); QSqlDatabase db = QSqlDatabase::database(strDatabaseName); if (!db.open()) { processError(SError(E_ERROR_CODE::DB_OPEN_ERROR)); return; } //select company.num, name, startdate, enddate, t.event_num, t.date, t.url, t.eventcode, t.platformname_num from company join (select company_num, event_num, event.date, event.url, event.eventcode, event.platformname_num from company_event_map join event on company_event_map.event_num = event.num) as t on company.num = t.company_num where company.num in (71, 72, 73) QString strQuery("select num, enddate from company where enddate in ("); foreach (auto& num, m_vecRunList) { strQuery += (QString::number(num) + ","); } strQuery = strQuery.left(strQuery.length() - 1); strQuery += ")"; QSqlQuery query(db); if (!query.exec(strQuery)) { SError err(E_ERROR_CODE::DB_QUERY_ERROR, query.lastQuery() + "\n" + query.lastError().text()); //processError(std::move(err)); processError(err); return; } while (query.next()) { QDate enddate = QDate::fromString(query.value(1).toString(), "yyyy-MM-dd"); QDate today = QDate::currentDate(); if (today <= enddate.addMonths(1)) { m_vecRunOrderList.push_back(query.value(0).toInt()); } } strQuery = "select company.num, name, startdate, enddate, t.event_num, " "t.date, t.url, t.eventcode, t.platformname_num from company " "join (select company_num, event_num, event.date, event.url, event.eventcode, " "event.platformname_num from company_event_map join event on company_event_map.event_num = event.num) " "as t on company.num = t.company_num where company.num in ("; foreach (auto &num, m_vecRunOrderList) { strQuery += (QString::number(num) + ","); } strQuery = strQuery.left(strQuery.length() - 1); strQuery += ")"; if (!query.exec(strQuery)) { SError err(E_ERROR_CODE::DB_QUERY_ERROR, query.lastQuery() + "\n" + query.lastError().text()); //processError(std::move(err)); processError(err); return; } while (query.next()) { if (!m_mapEffectRow.contains(query.value(0).toInt())) m_mapEffectRow.insert(query.value(0).toInt(), QVector()); SEffectRow row(query.value(0).toInt(), query.value(1).toString().trimmed(), QDate::fromString(query.value(2).toString().trimmed(), "yyyy-MM-dd"), QDate::fromString(query.value(3).toString().trimmed(), "yyyy-MM-dd"), query.value(4).toInt(), QDate::fromString(query.value(5).toString().trimmed(), "yyyy-MM-dd"), query.value(6).toString().trimmed(), query.value(7).toString().trimmed(), query.value(8).toInt() ); m_mapEffectRow[query.value(0).toInt()].append(row); } setInnerMode(E_INNER_RUN_MODE::MODE_RUN_EVENTCODE); db.close(); } void SRunProcess::processError(const SError& _error) { m_pTimer->stop(); m_eInnerRunMode = E_INNER_RUN_MODE::MODE_WAIT; m_eRunMode = E_RUN_MODE::MODE_WAIT; m_errError = _error; emit signalError(); } void SRunProcess::processError(SError&& _error) { m_pTimer->stop(); m_eInnerRunMode = E_INNER_RUN_MODE::MODE_WAIT; m_eRunMode = E_RUN_MODE::MODE_WAIT; m_errError = std::move(_error); emit signalError(); } SError SRunProcess::gerError() { return m_errError; } void SRunProcess::userAbort() { } void SRunProcess::runInitError() { setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_INIT); for (int i = 0; i < m_vecRunOrderList.size(); ++i) { if (!m_bRun) { userAbort(); return; } for (auto iterPos = m_mapEffectRow[m_vecRunOrderList.at(i)].cbegin(); iterPos != m_mapEffectRow[m_vecRunOrderList.at(i)].cend(); ++iterPos) { if (!m_bRun) { userAbort(); return; } //execute process; } emit signalTerminateCompany(); } setInnerMode(E_INNER_RUN_MODE::MODE_RUN_EVENTCODE); } void SRunProcess::runEventcodeCompany() { setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_EVENTCODE); for (int i = 0; i < m_vecErrorList.size(); ++i) { if (!m_bRun) { userAbort(); return; } } } void SRunProcess::runEventcodeError() { setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_EVENTCODE); setInnerMode(E_INNER_RUN_MODE::MODE_RUN_EVENTCODE); } SRunProcess::~SRunProcess() { }