229 lines
6.2 KiB
C++
229 lines
6.2 KiB
C++
#include "scompanyprocess.h"
|
|
#include "sutilfunction.h"
|
|
#include <QSqlDatabase>
|
|
#include <QSqlQuery>
|
|
#include <QSqlError>
|
|
#include <QString>
|
|
#include <QDate>
|
|
#include <QStringList>
|
|
#include <QDebug>
|
|
|
|
|
|
namespace
|
|
{
|
|
const QString strDatabaseName("processlist");
|
|
}
|
|
|
|
|
|
SCompanyProcess::SCompanyProcess():SParentProcess(),
|
|
m_iterEffectRow(nullptr), m_iterRunOrderList(nullptr), m_bDoneCompany(false)
|
|
{
|
|
databaseSetting(strDatabaseName);
|
|
QObject::connect(this, &SCompanyProcess::signalTerminateEachEvent,
|
|
this, &SCompanyProcess::slotTerminateEachEvent);
|
|
}
|
|
|
|
void SCompanyProcess::setList(const QVector<int>& _list)
|
|
{
|
|
clear();
|
|
m_vecRunList = _list;
|
|
}
|
|
|
|
void SCompanyProcess::setList(QVector<int>&& _list)
|
|
{
|
|
clear();
|
|
m_vecRunList = std::move(_list);
|
|
}
|
|
|
|
void SCompanyProcess::setList(const QVector<SEffectRow>& _list)
|
|
{
|
|
|
|
}
|
|
|
|
void SCompanyProcess::setList(QVector<SEffectRow>&& _list)
|
|
{
|
|
|
|
}
|
|
|
|
void SCompanyProcess::runInit()
|
|
{
|
|
setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_INIT);
|
|
|
|
QSqlDatabase db = QSqlDatabase::database(strDatabaseName);
|
|
if (!db.open())
|
|
{
|
|
setError(SError(E_ERROR_CODE::DB_OPEN_ERROR, db.lastError().text()));
|
|
emit signalTerminateError(getError());
|
|
return;
|
|
}
|
|
|
|
QString strQuery("select num, enddate from company where num in (");
|
|
foreach (auto num, m_vecRunList)
|
|
{
|
|
strQuery += (QString::number(num) + ",");
|
|
}
|
|
strQuery = strQuery.left(strQuery.length() - 1);
|
|
strQuery += ")";
|
|
signalLog(strQuery);
|
|
|
|
QSqlQuery query(db);
|
|
if (!query.exec(strQuery))
|
|
{
|
|
setError(SError(E_ERROR_CODE::DB_QUERY_ERROR, query.lastQuery() + "\n" + query.lastError().text()));
|
|
emit signalTerminateError(getError());
|
|
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))
|
|
{
|
|
setError(SError(E_ERROR_CODE::DB_QUERY_ERROR, query.lastQuery() + "\n" + query.lastError().text()));
|
|
emit signalTerminateError(getError());
|
|
return;
|
|
}
|
|
/*
|
|
foreach (auto &num, m_vecRunOrderList)
|
|
{
|
|
m_vecRunOrderList.insert(num, QVector<SEffectRow>());
|
|
}
|
|
*/
|
|
while (query.next())
|
|
{
|
|
|
|
if (!m_mapEffectRow.contains(query.value(0).toInt()))
|
|
m_mapEffectRow.insert(query.value(0).toInt(), QVector<SEffectRow>());
|
|
|
|
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);
|
|
}
|
|
|
|
initIterator();
|
|
|
|
setInnerMode(E_INNER_RUN_MODE::MODE_RUN_EVENTCODE);
|
|
db.close();
|
|
}
|
|
|
|
void SCompanyProcess::initIterator()
|
|
{
|
|
m_iterRunOrderList = m_vecRunOrderList.begin();
|
|
|
|
while (m_iterRunOrderList != m_vecRunOrderList.end())
|
|
{
|
|
if (m_mapEffectRow.contains(*m_iterRunOrderList))
|
|
{
|
|
m_iterEffectRow = m_mapEffectRow[*m_iterRunOrderList].begin();
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
++m_iterRunOrderList;
|
|
}
|
|
}
|
|
}
|
|
|
|
void SCompanyProcess::nextIterator()
|
|
{
|
|
++m_iterEffectRow;
|
|
if (m_iterEffectRow == m_mapEffectRow[*m_iterRunOrderList].end())
|
|
{
|
|
m_bDoneCompany = true;
|
|
while (++m_iterRunOrderList != m_vecRunOrderList.end())
|
|
{
|
|
if (m_mapEffectRow.contains(*m_iterRunOrderList))
|
|
{
|
|
m_iterEffectRow = m_mapEffectRow[*m_iterRunOrderList].begin();
|
|
break;
|
|
}
|
|
/*
|
|
else
|
|
{
|
|
++m_iterRunOrderList;
|
|
}
|
|
*/
|
|
}
|
|
}
|
|
else
|
|
m_bDoneCompany = false;
|
|
}
|
|
|
|
bool SCompanyProcess::isDone()
|
|
{
|
|
return m_iterRunOrderList == m_vecRunOrderList.end();
|
|
}
|
|
|
|
void SCompanyProcess::runEventCode()
|
|
{
|
|
setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_EVENTCODE);
|
|
if (isUserAbort())
|
|
{
|
|
setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_TERMINATE);
|
|
emit signalUserAbort();
|
|
return;
|
|
}
|
|
|
|
if (isDone())
|
|
{
|
|
qDebug() << "Done";
|
|
setInnerMode(E_INNER_RUN_MODE::MODE_WAIT_TERMINATE);
|
|
emit signalTerminateNormal();
|
|
return;
|
|
}
|
|
|
|
SEffectRow row = *m_iterEffectRow;
|
|
setCurrentEffectRow(row);
|
|
nextIterator();
|
|
|
|
emit signalCompanyStart(row.company_num);
|
|
|
|
runProcess(getProcessArguments(row));
|
|
}
|
|
|
|
void SCompanyProcess::clear()
|
|
{
|
|
SParentProcess::clear();
|
|
m_vecRunList.clear();
|
|
m_vecRunOrderList.clear();
|
|
m_mapEffectRow.clear();
|
|
m_bDoneCompany = false;
|
|
m_iterEffectRow = nullptr;
|
|
m_iterRunOrderList = nullptr;
|
|
}
|
|
|
|
void SCompanyProcess::slotTerminateEachEvent(int _num, E_CRAWL_STATE _state)
|
|
{
|
|
if (m_bDoneCompany)
|
|
emit signalTerminateCompany(_num);
|
|
}
|
|
|