Files
clients/FilterProcess/sconsumerstatistics.cpp

216 lines
7.4 KiB
C++

#include "sconsumerstatistics.h"
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>
#include <QDate>
#include <QDebug>
#include <QFile>
SCousumerStatistics::SCousumerStatistics(QString _strBodyJson, QString _strReplyJson, QString _strAllJson)
{
m_BodyJsonArray = convertStringToJsonArray(_strBodyJson);
m_ReplyJsonArray = convertStringToJsonArray(_strReplyJson);
m_AllJsonArray = convertStringToJsonArray(_strAllJson);
setBanCategoryName();
makeConsumerStatistics();
}
void SCousumerStatistics::setBanCategoryName()
{
m_listBanCategoryName.append("ALLCATEGORY");
m_listBanCategoryName.append("ALL");
}
QJsonArray SCousumerStatistics::convertStringToJsonArray(QString _strJson)
{
QJsonDocument jdoc = QJsonDocument::fromJson(_strJson.toUtf8());
return getDataArrayFromJsonDocument(jdoc);
}
void SCousumerStatistics::makeConsumerStatistics()
{
makeBodyStatistics();
makeReplyStatistics();
makeAllStatistics();
}
QString SCousumerStatistics::getCategoryNameFromJsonObject(QJsonObject _jsonObject)
{
return _jsonObject["name"].toString().toUtf8();
}
QJsonArray SCousumerStatistics::getDataArrayFromJsonDocument(QJsonDocument _jsonDocument)
{
return _jsonDocument.object()["data"].toArray();
}
QJsonArray SCousumerStatistics::getValueArrayFromJsonObject(QJsonObject _jsonObject)
{
return _jsonObject["value"].toArray();
}
void SCousumerStatistics::makeBodyStatistics()
{
for (int i=0; i < m_BodyJsonArray.count(); i++)
{
QJsonObject categoryObject = m_BodyJsonArray.at(i).toObject();
QString strCategoryName = getCategoryNameFromJsonObject(categoryObject);
if (isBanCategory(strCategoryName))
continue;
stConsumerCategoryStatistics& consumerCategoryStatistics = getCategory(strCategoryName);
QJsonArray valueArray = getValueArrayFromJsonObject(categoryObject);
for (int j=0; j < valueArray.count(); j++)
{
QJsonObject valueObject = valueArray.at(j).toObject();
QString strDate = valueObject["date"].toString();
QDate date = QDate::fromString(strDate, "yyyyMMdd");
int nCount = valueObject["count"].toInt();
consumerCategoryStatistics.mapCountInfoOfDate[strDate].bodyCount = nCount;
consumerCategoryStatistics.mapCountInfoOfDate[date.toString("yyyyMM")].bodyCount += nCount;
}
}
}
void SCousumerStatistics::makeReplyStatistics()
{
for (int i=0; i < m_ReplyJsonArray.count(); i++)
{
QJsonObject categoryObject = m_ReplyJsonArray.at(i).toObject();
QString strCategoryName = getCategoryNameFromJsonObject(categoryObject);
if (isBanCategory(strCategoryName))
continue;
stConsumerCategoryStatistics& consumerCategoryStatistics = getCategory(strCategoryName);
QJsonArray valueArray = getValueArrayFromJsonObject(categoryObject);
for (int j=0; j < valueArray.count(); j++)
{
QJsonObject valueObject = valueArray.at(j).toObject();
QString strDate = valueObject["date"].toString();
QDate date = QDate::fromString(strDate, "yyyyMMdd");
int nCount = valueObject["count"].toInt();
consumerCategoryStatistics.mapCountInfoOfDate[strDate].replyCount = nCount;
consumerCategoryStatistics.mapCountInfoOfDate[date.toString("yyyyMM")].replyCount += nCount;
}
}
}
void SCousumerStatistics::makeAllStatistics()
{
for (QList<stConsumerCategoryStatistics>::iterator iter = m_listConsumerCategoryStatistics.begin(); iter != m_listConsumerCategoryStatistics.end(); iter++)
{
stConsumerCategoryStatistics& consumerCategoryStatistics = (*iter);
sumBodyAndReplyCount(consumerCategoryStatistics);
}
}
void SCousumerStatistics::sumBodyAndReplyCount(stConsumerCategoryStatistics& _consumerCategoryStatistics)
{
for (QMap<QString, stCountInfo>::iterator iter = _consumerCategoryStatistics.mapCountInfoOfDate.begin(); iter != _consumerCategoryStatistics.mapCountInfoOfDate.end(); iter++)
{
iter->allCount = iter->bodyCount + iter->replyCount;
}
}
stConsumerCategoryStatistics& SCousumerStatistics::getCategory(QString _strCategoryName)
{
if (!hasCategory(_strCategoryName))
m_listConsumerCategoryStatistics.append(createCategory(_strCategoryName));
for (QList<stConsumerCategoryStatistics>::iterator iter = m_listConsumerCategoryStatistics.begin(); iter != m_listConsumerCategoryStatistics.end(); iter++)
{
if (iter->categoryName == _strCategoryName)
return *iter;
}
}
bool SCousumerStatistics::hasCategory(QString _strCategoryName)
{
foreach (stConsumerCategoryStatistics consumerCategoryStatistics, m_listConsumerCategoryStatistics)
{
if (consumerCategoryStatistics.categoryName == _strCategoryName)
return true;
}
return false;
}
stConsumerCategoryStatistics SCousumerStatistics::createCategory(QString _strCategoryName)
{
stConsumerCategoryStatistics consumerCategoryStatistics;
consumerCategoryStatistics.categoryName = _strCategoryName;
return consumerCategoryStatistics;
}
bool SCousumerStatistics::isLastDayOfMonth(QString _strDate)
{
QDate date = QDate::fromString(_strDate, "yyyyMMdd");
if (date.day() == date.daysInMonth())
return true;
return false;
}
bool SCousumerStatistics::isBanCategory(QString _strCategoryName)
{
return m_listBanCategoryName.contains(_strCategoryName);
}
void SCousumerStatistics::print()
{
foreach (stConsumerCategoryStatistics a, m_listConsumerCategoryStatistics)
{
QString category = a.categoryName;
for(QMap<QString, stCountInfo>::const_iterator v = a.mapCountInfoOfDate.constBegin(); v!=a.mapCountInfoOfDate.constEnd(); v++)
{
QString date = v.key();
int count = v.value().bodyCount;
//qDebug() << category << " : " << date << " : " << QString::number(count) << endl;
qDebug() << QString::number(count) << QString::number(v.value().replyCount) << QString::number(v.value().allCount);
}
}
}
bool SCousumerStatistics::saveCousumerStatisticsToExcelFile(int _nCompany)
{
QString strFileName = QString::number(_nCompany) + "_Consumer_" + QDate::currentDate().toString("yyyyMMdd") + ".csv";
QFile statisticsFile(strFileName);
if (!statisticsFile.open(QFile::WriteOnly | QFile::Truncate))
{
//process
return false;
}
QTextStream stream(&statisticsFile);
stream.setAutoDetectUnicode(true);
stream << "Category Name" << "," << "All" << "," << "Body" << "," << "Reply" << "," << "Date" << "\n";
foreach (stConsumerCategoryStatistics consumerCategoryStatistics, m_listConsumerCategoryStatistics)
{
QString strCategoryName = consumerCategoryStatistics.categoryName;
stream << strCategoryName.toUtf8();
QMapIterator<QString, stCountInfo> iter(consumerCategoryStatistics.mapCountInfoOfDate);
while (iter.hasNext())
{
iter.next();
stream << "," << iter.value().allCount << "," << iter.value().bodyCount << "," << iter.value().replyCount << "," << iter.key() << "\n";
}
}
statisticsFile.close();
return true;
}