Files
clients/Filter/widget.cpp

1084 lines
40 KiB
C++

#include "widget.h"
#include <QVBoxLayout>
#include <QLabel>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>
#include <QPushButton>
#include <QThread>
#include <QTime>
#include <QMessageBox>
#include <QFile>
#include "../json/sjson.h"
#include "../common.h"
#define D_NONE -1
//#define D_DB_WEB_HOST "db.big-bird.co.kr"
//#define D_DB_WEB_USER "concepters"
//#define D_DB_WEB_PASS "con97996655"
//#define D_DB_WEB_NAME "dbconcepters"
#define D_DB_WEB_HOST "192.168.0.82"
#define D_DB_WEB_USER "root"
#define D_DB_WEB_PASS "1234"
#define D_DB_WEB_NAME "dbconcepters"
Widget::Widget(QWidget *parent) : C_MAP_REAL_BODY (0x01) , C_MAP_REAL_REPLY (0x02) , QWidget(parent)
{
QVBoxLayout *vMainLayout = new QVBoxLayout;
{
{
QHBoxLayout *hLayout = new QHBoxLayout;
QStringList strList;
strList << "Data" << "Filter" << "Company" << "Catalog";
m_plw = new QListWidget[E_LIST_MAX];
int i = 0;
foreach(QString str , strList)
{
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(new QLabel(str));
vLayout->addWidget(&m_plw[i++]);
hLayout->addLayout(vLayout);
}
connect(&m_plw[E_LIST_COMPANY],SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),this,SLOT(CompanyItemChanged(QListWidgetItem*,QListWidgetItem*)));
connect(&m_plw[E_LIST_DATA],SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(DataItemClicked(QListWidgetItem*)));
vMainLayout->addLayout(hLayout);
}
{
QHBoxLayout *hLayout = new QHBoxLayout;
{
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(new QLabel("Filter Process"));
m_plwFilterProcess = new QListWidget;
vLayout->addWidget(m_plwFilterProcess);
{
QHBoxLayout *hLayoutEdit = new QHBoxLayout;
hLayoutEdit->addWidget(new QLabel("Cycle : "));
m_pleCycle = new QLineEdit;
hLayoutEdit->addWidget(m_pleCycle);
m_pleCycle->setText("172800");
m_pleCycle->setEnabled(false);
QPushButton *ppbCount = new QPushButton("Count");
connect(ppbCount, SIGNAL(released()),this, SLOT(on_count()));
hLayoutEdit->addWidget(ppbCount);
QPushButton *ppbInsert = new QPushButton("Insert");
connect(ppbInsert, SIGNAL(released()),this, SLOT(on_insert()));
hLayoutEdit->addWidget(ppbInsert);
QPushButton *ppbSend = new QPushButton("Send");
connect(ppbSend, SIGNAL(released()),this, SLOT(on_send()));
hLayoutEdit->addWidget(ppbSend);
vLayout->addLayout(hLayoutEdit);
}
hLayout->addLayout(vLayout);
}
{
QVBoxLayout *vLayout = new QVBoxLayout;
vLayout->addWidget(new QLabel("Log"));
m_plwLog = new QListWidget;
vLayout->addWidget(m_plwLog);
hLayout->addLayout(vLayout);
}
vMainLayout->addLayout(hLayout);
}
QPushButton *ppbRefresh = new QPushButton("Refresh");
connect(ppbRefresh, SIGNAL(released()),this, SLOT(on_refresh()));
vMainLayout->addWidget(ppbRefresh);
}
/*
QPushButton *ppbSend = new QPushButton("Send");
vMainLayout->addWidget(ppbSend);
connect(ppbSend, SIGNAL(released()),this, SLOT(on_send()));
*/
//connect(&m_timer, SIGNAL(timeout()), this, SLOT(Update()));
//m_pThread = new SGetThread;
setLayout(vMainLayout);
//m_pPutThread = new SPutThread[QThread::idealThreadCount()];
m_nMode = 0;
if (ReloadColumn() == false)
{
QMessageBox::critical(this,"Error","column.txt do not find",QMessageBox::Ok);
exit(0);
return;
}
db = QSqlDatabase::addDatabase("QMYSQL");
//m_timer.start(100);
Refresh();
FilterProcssRefresh();
}
Widget::~Widget()
{
}
void Widget::InsertLog(QString str)
{
QTime time = QTime::currentTime();
QString strOut = time.toString("[hh:mm:ss] ") + str;
m_plwLog->addItem(strOut);
if (m_plwLog->count() > 1024)
{
m_plwLog->removeItemWidget(m_plwLog->item(0));
QListWidgetItem* item = m_plwLog->takeItem(0);
delete item;
}
m_plwLog->setCurrentRow( m_plwLog->count() - 1 );
m_plwLog->repaint();
}
void Widget::Refresh()
{
db.setHostName("bigbird.iptime.org");
db.setUserName("admin");
db.setPassword("admin123");
db.setDatabaseName("concepters");
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
for (int i = 0; i < E_LIST_MAX ; i++)
m_plw[i].clear();
{
QSqlQuery query("select id,name from filtergroup");
while (query.next())
{
QListWidgetItem *pItem = new QListWidgetItem(query.value(1).toString(),&m_plw[E_LIST_FILTER]);
pItem->setData(Qt::UserRole, QVariant(query.value(0)));
}
}
{
QSqlQuery query("select id,name FROM datagroup");
while(query.next())
{
QListWidgetItem *pItem = new QListWidgetItem(query.value(1).toString(),&m_plw[E_LIST_DATA]);
pItem->setData(Qt::UserRole, QVariant(query.value(0)));
}
}
db.close();
db.setHostName(D_DB_WEB_HOST);
db.setUserName(D_DB_WEB_USER);
db.setPassword(D_DB_WEB_PASS);
db.setDatabaseName(D_DB_WEB_NAME);
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
{
QSqlQuery query("select num,name FROM company");
while(query.next())
{
QListWidgetItem *pItem = new QListWidgetItem(query.value(1).toString(),&m_plw[E_LIST_COMPANY]);
pItem->setData(Qt::UserRole, QVariant(query.value(0)));
}
}
db.close();
}
void Widget::CompanyItemChanged(QListWidgetItem* _current,QListWidgetItem*)
{
if (_current == 0) return;
db.setHostName(D_DB_WEB_HOST);
db.setUserName(D_DB_WEB_USER);
db.setPassword(D_DB_WEB_PASS);
db.setDatabaseName(D_DB_WEB_NAME);
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
m_plw[E_LIST_CATALOG].clear();
QSqlQuery query("select num,name FROM category where company_num = '" +_current->data(Qt::UserRole).toString()+ "'");
while(query.next())
{
QListWidgetItem *pItem = new QListWidgetItem(query.value(1).toString(),&m_plw[E_LIST_CATALOG]);
pItem->setData(Qt::UserRole, QVariant(query.value(0)));
}
db.close();
}
void Widget::on_send()
{
foreach (QListWidgetItem *item,m_plw[E_LIST_COMPANY].selectedItems())
{
InsertLog("Data Send Run Start : " + item->text());
DataPut(item->data(Qt::UserRole).toString());
InsertLog("Data Send Run End ");
}
}
void Widget::on_insert()
{
/*
int aId[E_LIST_MAX];
QString aStr[E_LIST_MAX];
for (int i = 0; i < E_LIST_MAX;i++)
{
aId[i] = D_NONE;
foreach (QListWidgetItem *item,m_plw[i].selectedItems())
{
aId[i] = item->data(Qt::UserRole).toInt();
aStr[i] = item->text();
}
if (aId[i] == D_NONE) return;
}
QStringList list;
list.append("0");//0
list.append(QString::number(aId[E_LIST_DATA]));//1
list.append(aStr[E_LIST_DATA]);//2
list.append(QString::number(aId[E_LIST_FILTER]));//3
list.append(aStr[E_LIST_FILTER]);//4
list.append(QString::number(aId[E_LIST_COMPANY]));//5
list.append(aStr[E_LIST_COMPANY]);// company_name 6
list.append(aStr[E_LIST_CATALOG]);// category_name 7
list.append(m_pleCycle->text());
*/
ReloadData();
foreach (QListWidgetItem *item,m_plw[E_LIST_FILTER].selectedItems())
{
InsertLog("Data Filter Run Start : " + item->text());
DataFilter(item->data(Qt::UserRole).toString());
InsertLog("Data Filter Run End ");
}
foreach (QListWidgetItem *item,m_plw[E_LIST_CATALOG].selectedItems())
{
InsertLog("Data Make Run Start : " + item->text());
DataMake(item->data(Qt::UserRole).toInt());
InsertLog("Data Make Run End ");
}
FilterProcssRefresh();
}
void Widget::on_delete()
{
db.setHostName("bigbird.iptime.org");
db.setUserName("admin");
db.setPassword("admin123");
db.setDatabaseName("concepters");
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
foreach (QListWidgetItem *item,m_plwFilterProcess->selectedItems())
{
QSqlQuery query;
QString sql("delete from filterprocess where id = " + item->data(Qt::UserRole).toString());
if(query.exec(sql) == false)
{
InsertLog(query.lastError().text());
}
}
db.close();
FilterProcssRefresh();
}
void Widget::FilterProcssRefresh()
{
db.setHostName("bigbird.iptime.org");
db.setUserName("admin");
db.setPassword("admin123");
db.setDatabaseName("concepters");
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
QString sql("select id,datagroup_name,filtergroup_name,company_name,category_name,cycletime,lastruntime from filterprocess");
QSqlQuery query;
if(query.exec(sql) == false)
{
InsertLog(query.lastError().text());
}
m_plwFilterProcess->clear();
while(query.next())
{
QString str;
str += "(Data : " + query.value(1).toString();
str += ",Filter : " + query.value(2).toString();
str += ") -> (Company : " + query.value(3).toString();
str += ",Category : " + query.value(4).toString();
str += ") (Cycle : " + query.value(5).toString();
str += " sec, Last Run Time : " + query.value(6).toString() +")";
QListWidgetItem *pItem = new QListWidgetItem(str,m_plwFilterProcess);
pItem->setData(Qt::UserRole, QVariant(query.value(0)));
}
db.close();
//datagroup,filtergroup company category cycletime , lastruntime
}
QString Widget::SqlString(QString _str)
{
_str.replace("\\","\\\\");
_str.replace("'","\\'");
_str.replace("\"","\\\"");
_str.replace(",","\\,");
return _str;
}
void Widget::Update()
{
}
void Widget::FilterDate(QString _strJson)
{
SJson json;
int nSelect = json.Get(_strJson,"Article").toInt() - 1;
if (nSelect < 0) return;
m_bDataFlag[nSelect] = true;
QVector <QStringList> copyData;
QDate dateStart = QDate::fromString(json.Get(_strJson,"Start"),"yyyy-MM-dd");
QDate dateEnd = QDate::fromString(json.Get(_strJson,"End"),"yyyy-MM-dd");
foreach(QStringList strList , m_data[nSelect])
{
bool bFlag = false;
QString strTime = strList.at(m_nDateColumn).trimmed();
if (strTime.size() >= 10)
{
QChar ch = strTime.at(4);
QString strFormat = QString("yyyy")+ch+QString("MM")+ch+QString("dd");
QDate date = QDate::fromString(strTime.left(10),strFormat);
if (dateStart <= date && dateEnd >= date)
bFlag = true;
}
if (bFlag)
copyData.push_back(strList);
}
m_data[nSelect].clear();
m_data[nSelect] = copyData;
}
void Widget::FilterLength(QString _strJson)
{
SJson json;
int nSelect = json.Get(_strJson,"Article").toInt() - 1;
if (nSelect < 0) return;
m_bDataFlag[nSelect] = true;
int nCatalog = json.GetNumber(_strJson,"Category");
int nComp = json.GetNumber(_strJson,"Comp");
int nFlag = json.GetNumber(_strJson,"InsDel");
int nLength = json.Get(_strJson,"String").toInt();
QVector <QStringList> copyData;
foreach(QStringList strList , m_data[nSelect])
{
bool bFlag = false;
int nCurrentLength = strList.at(nCatalog).trimmed().length();
switch(nComp)
{
case E_LENGTH_COMP_GREATER:
if (nCurrentLength > nLength)
bFlag = true;
break;
case E_LENGTH_COMP_LESS:
if (nCurrentLength < nLength)
bFlag = true;
break;
case E_LENGTH_COMP_EQUAL:
if (nLength == nCurrentLength)
bFlag = true;
break;
}
if (nFlag == 1) bFlag = !bFlag;
if (bFlag)
copyData.push_back(strList);
}
m_data[nSelect].clear();
m_data[nSelect] = copyData;
}
void Widget::FilterReplace(QString _strJson)
{
SJson json;
int nSelect = json.Get(_strJson,"Article").toInt() - 1;
if (nSelect < 0) return;
m_bDataFlag[nSelect] = true;
int nCatalog = json.GetNumber(_strJson,"Category");
QString strFind = json.Get(_strJson,"String_Find");
QString strReplace = json.Get(_strJson,"String_Replace");
bool bFlag = false;
QStringList strListKeyword;
if (json.GetNumber(_strJson,"Find") == E_REPLACE_SPACE)
{
bFlag = true;
strListKeyword = strFind.split(" ");
}
for (int i = 0 ; i < m_data[nSelect].size(); i++)
{
if (bFlag)
{
foreach(QString str,strListKeyword)
{
m_data[nSelect][i][nCatalog] = m_data[nSelect][i][nCatalog].replace(str,strReplace);
}
}
else
m_data[nSelect][i][nCatalog] = m_data[nSelect][i][nCatalog].replace(strFind,strReplace);
}
}
void Widget::FilterSerach(QString _strJson)
{
SJson json;
int nSelect = json.Get(_strJson,"Article").toInt() - 1;
if (nSelect < 0) return;
m_bDataFlag[nSelect] = true;
int nCategory = json.GetNumber(_strJson,"Category");
int nMethod = json.GetNumber(_strJson,"Method");
int nKeyword = json.GetNumber(_strJson,"Keyword");
QStringList strListKeyword = json.Get(_strJson,"String").split(" ");
if (nMethod == 1)
{
for (int i = 0 ; i < strListKeyword.size(); i++ )
strListKeyword[i] = " " + strListKeyword[i] + " ";
}
QVector <QStringList> copyData;
foreach(QStringList strList , m_data[nSelect])
{
bool bFlag = false;
QString strData = strList.at(nCategory);
switch(nKeyword)
{
case 0:
{
foreach(QString strKey , strListKeyword)
if (strData.contains(strKey)){bFlag = true;break;}
break;
}
case 1:
{
int nKeyCount = 0;
foreach(QString strKey , strListKeyword)
if (strData.contains(strKey)) nKeyCount++;
if (nKeyCount == strListKeyword.size())
bFlag = true;
break;
}
case 2:
{
bFlag = true;
foreach(QString strKey , strListKeyword)
if (strData.contains(strKey)){bFlag = false;break;}
break;
}
case 3:
{
foreach(QString strKey , strListKeyword)
strList[nCategory].replace(strKey,"");
bFlag = true;
break;
}
}
if (bFlag) copyData.push_back(strList);
}
m_data[nSelect].clear();
m_data[nSelect] = copyData;
}
void Widget::ReloadData()
{
for (int i = 0; i < E_ARTICLE_MAX ; i++)
{
m_data[i].clear();
m_bDataFlag[i] = false;
}
foreach(SBody stBody, m_mapData.values())
{
m_data[E_ARTICLE_BODY].push_back(stBody.m_strlist);
foreach(SReply stReply , stBody.m_vecReply.values())
{
m_data[E_ARTICLE_REPLY].push_back(stReply.m_strlist);
}
}
}
void Widget::DataFilter(QString _strFilterGroupID)
{
db.setHostName("bigbird.iptime.org");
db.setUserName("admin");
db.setPassword("admin123");
db.setDatabaseName("concepters");
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
QString sql = "select type,data from filter where filtergroup_id = " + _strFilterGroupID;
QSqlQuery query;
if(query.exec(sql) == false) { InsertLog(query.lastError().text());return;}
while (query.next())
{
switch(query.value(0).toInt())
{
case E_FILTER_TYPE_DATE://Date
FilterDate(query.value(1).toString());
break;
case E_FILTER_TYPE_SEARCH:
FilterSerach(query.value(1).toString());
break;
case E_FILTER_TYPE_LENGTH:
FilterLength(query.value(1).toString());
break;
case E_FILTER_TYPE_REPLACE:
FilterReplace(query.value(1).toString());
break;
}
}
db.close();
}
void Widget::on_refresh()
{
Refresh();
FilterProcssRefresh();
}
/*
void Widget::Update()
{
switch(m_nMode)
{
case 1:
m_data.clear();
db.setHostName("bigbird.iptime.org");
db.setUserName("admin");
db.setPassword("admin123");
db.setDatabaseName("concepters");
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
foreach (QListWidgetItem *item,m_plw[E_LIST_DATA].selectedItems())
{
m_pThread->SetData(QString("data_"+item->data(Qt::UserRole).toString()),&m_data);
}
m_pThread->start();
m_nMode = 2;
InsertLog("Data Read Start");
break;
case 2:
if (m_pThread->isRunning() == false)
{
db.close();
InsertLog("Data Read End");
InsertLog("Data Write Web Start");
db.setHostName(D_DB_WEB_HOST);
db.setUserName(D_DB_WEB_USER);
db.setPassword(D_DB_WEB_PASS);
db.setDatabaseName(D_DB_WEB_NAME);
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
db.exec("delete from data");
qDebug() << QString::number(m_data.size());
m_pPutThread[0].SetData("data",&m_data,0,m_data.size());
m_pPutThread[0].start();
m_nMode = 3;
}
break;
case 3:
if (m_pPutThread[0].isRunning() == false)
{
m_nMode = 0;
InsertLog("Data Write Web End");
}
break;
}
}
*/
bool Widget::ReloadColumn()
{
QVector <QStringList> vecColumn;
QFile file("column.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text) == false) return false;
{
while (!file.atEnd())
{
QString str = QString(file.readLine());
if (str.at(0) == QChar('#')) continue;
if (str.trimmed().isEmpty()) continue;
vecColumn.push_back(str.split(","));
}
}
if (vecColumn.size() <= 0) return false;
foreach(QStringList strList,vecColumn)
m_listDataBaseColumn.push_back(strList.at(E_COLUMN_DATABASE));
for(int i = 0; i < m_listDataBaseColumn.size(); i++)
{
if (m_listDataBaseColumn[i].trimmed() == QString("platform_title")) m_anData[E_DATA_platform_title] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_form")) m_anData[E_DATA_article_form] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_parent")) m_anData[E_DATA_article_parent] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_id")) m_anData[E_DATA_article_id] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_nickname")) m_anData[E_DATA_article_nickname] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_title")) m_anData[E_DATA_article_title] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_data")) m_anData[E_DATA_article_data] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_url")) m_anData[E_DATA_article_url] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_hit")) m_anData[E_DATA_article_hit] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_date")) m_anData[E_DATA_article_date] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_order")) m_anData[E_DATA_article_order] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("platform_id")) m_anData[E_DATA_platform_id] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("platform_name")) m_anData[E_DATA_platform_name] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("platform_form")) m_anData[E_DATA_platform_form] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("reply_url")) m_anData[E_DATA_reply_url] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("keyword_id")) m_anData[E_DATA_keyword_id] = i;
if (m_listDataBaseColumn[i].trimmed() == QString("article_profileurl")) m_anData[E_DATA_article_profileurl] = i;
}
m_nUrlColumn = m_anData[E_DATA_article_url];
m_nDateColumn = m_anData[E_DATA_article_date];
m_nOrderColumn = m_anData[E_DATA_article_order];
m_nDateColumn++;
return true;
}
void Widget::DataItemClicked(QListWidgetItem* item)
{
db.setHostName("bigbird.iptime.org");
db.setUserName("admin");
db.setPassword("admin123");
db.setDatabaseName("concepters");
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
QSqlQuery query;
QString strSelect;
strSelect = "select ";
foreach (QString strColumn,m_listDataBaseColumn)
strSelect += "CONVERT(" + strColumn + " USING utf8),";
strSelect = strSelect.left(strSelect.size() - 1);
strSelect += " from ";
strSelect += "data_" + item->data(Qt::UserRole).toString();
InsertLog("Start Loading data_" + item->data(Qt::UserRole).toString());
m_strlistOrder.clear();
m_mapData.clear();
m_vecMap.clear();
QString astrWhere[E_ARTICLE_MAX] = {" where article_form = 'body' Order by article_date DESC"," where article_form = 'reply'"};
for (int i = 0; i < E_ARTICLE_MAX ; i++)
{
if(query.exec(QString(strSelect + astrWhere[i]).toUtf8()) == false) {InsertLog(query.lastError().text());return;}
int nCount = 0;
while(query.next())
{
QStringList strList;
for(int j = 0; j < m_listDataBaseColumn.size(); j++)
strList << " " + query.value(j).toString() + " ";
QString strURL = strList[m_nUrlColumn].trimmed();
switch(i)
{
case E_ARTICLE_BODY:
{
if (m_mapData.contains(strURL) == false)
{
if (strList[m_anData[E_DATA_article_date]].trimmed().isEmpty()) continue;
if (strList[m_anData[E_DATA_article_id]].trimmed().isEmpty()) continue;
if (strList[m_anData[E_DATA_article_nickname]].trimmed().isEmpty()) continue;
SBody stBody;
stBody.m_nNum = nCount++;
stBody.m_dtLast = QDateTime::fromString(strList[m_anData[E_DATA_article_date]].trimmed(),"yyyy-MM-dd HH:mm:ss");
stBody.m_bSelect = false;
stBody.m_bReplySelect = false;
stBody.m_strlist = strList;
m_mapData.insert(strURL,stBody);
m_strlistOrder.push_back(strURL);
}
}
break;
case E_ARTICLE_REPLY:
{
if (m_mapData.contains(strURL))
{
SReply stReply;
stReply.m_bSelect = false;
stReply.m_nOrder = strList[m_nOrderColumn].toInt();
stReply.m_strlist = strList;
QDateTime dtComp = QDateTime::fromString(strList[m_anData[E_DATA_article_date]].trimmed(),"yyyy-MM-dd HH:mm:ss");
if (m_mapData[strURL].m_dtLast < dtComp)
m_mapData[strURL].m_dtLast = dtComp;
m_mapData[strURL].m_vecReply.insert(stReply.m_nOrder,stReply);
}
}
break;
}
}
}
InsertLog("End Loading");
db.close();
}
void Widget::DataMake(int _nCategory)
{
QMap <QString,int> mapData;
if (m_bDataFlag[E_ARTICLE_BODY] == true)
{
foreach(QStringList strList,m_data[E_ARTICLE_BODY])
{
QString strURL = strList[m_nUrlColumn].trimmed();
if (m_mapData.contains(strURL))
{
m_mapData[strURL].m_bSelect = true;
m_mapData[strURL].m_vecCategory.push_back(_nCategory);
if (mapData.contains(strURL))
mapData[strURL] |= C_MAP_REAL_BODY;
else
mapData.insert(strURL,C_MAP_REAL_BODY);
}
}
}
if (m_bDataFlag[E_ARTICLE_REPLY] == true)
{
foreach(QStringList strList,m_data[E_ARTICLE_REPLY])
{
QString strURL = strList[m_nUrlColumn].trimmed();
if (m_mapData.contains(strURL))
{
m_mapData[strURL].m_bReplySelect = true;
int nSelect = strList[m_nOrderColumn].trimmed().toInt();
if (m_mapData[strURL].m_vecReply.contains(nSelect))
{
m_mapData[strURL].m_vecReply[nSelect].m_bSelect = true;
m_mapData[strURL].m_vecReply[nSelect].m_vecCategory.push_back(_nCategory);
if (mapData.contains(strURL))
mapData[strURL] |= C_MAP_REAL_REPLY;
else
mapData.insert(strURL,C_MAP_REAL_REPLY);
}
}
}
}
foreach(QString strUrl , m_strlistOrder )
{
if (mapData.contains(strUrl))
{
if (mapData.value(strUrl) != 0)
{
SMap stMap;
stMap.m_nBody = m_mapData[strUrl].m_nNum;
stMap.m_nCategory = _nCategory;
stMap.m_nRealIn = mapData.value(strUrl);
stMap.m_strURL = strUrl;
m_vecMap.push_back(stMap);
}
}
}
}
QString Widget::GetVectorToString(QVector <int> _vecCategory,QString _strDelimiter)
{
QString str;
if (_vecCategory.isEmpty()) return QString(" ");
foreach (int n , _vecCategory )
str += QString::number(n) + _strDelimiter;
return str.left(str.length() - _strDelimiter.length());
}
void Widget::DataPut(QString _strCompanyNum)
{
db.setHostName(D_DB_WEB_HOST);
db.setUserName(D_DB_WEB_USER);
db.setPassword(D_DB_WEB_PASS);
db.setDatabaseName(D_DB_WEB_NAME);
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
QSqlQuery query;
QString strQuery;
strQuery = "delete from body_" + _strCompanyNum;
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
strQuery = "delete from reply_" + _strCompanyNum;
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
strQuery = "delete from body_category_map_" + _strCompanyNum;
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
QString strReplyQuery = QString("insert into reply_" + _strCompanyNum + " (num,id,nickname,parent,data,date,body_num,realbycategorynum) VALUES (:NUM,:ID,:NICKNAME,:PARENT,:DATA,:DATE,:BODY_NUM,:REALBYCATEGORYNUM)").toUtf8();
QString strBodyQuery = QString("insert into body_" + _strCompanyNum + " (num,platformname,platformform,platformtitle,id,nickname,title,data,profileurl,url,hit,date,reply_startnum,reply_endnum,lastupdate,realbycategorynum) VALUES (:NUM,:PLATFORMNAME,:PLATFORMFORM,:PLATFORMTITLE,:ID,:NICKNAME,:TITLE,:DATA,:PROFILEURL,:URL,:VIEW,:DATE,:REPLY_STARTNUM,:REPLY_ENDNUM,:LASTUPDATE,:REALBYCATEGORYNUM)").toUtf8();
QString strMapQuery = QString("insert into body_category_map_" + _strCompanyNum + " (num,body_num,category_num,realin) VALUES (:NUM,:BODY_NUM,:CATEGORY_NUM,:REALIN)").toUtf8();
int nReplyCount = 0;
foreach(QString strUrl , m_strlistOrder )
{
int nReplyStart = nReplyCount;
foreach(SReply stReply,m_mapData[strUrl].m_vecReply)
{
query.prepare(strReplyQuery);
query.bindValue(":NUM",nReplyCount);
query.bindValue(":ID",stReply.m_strlist[m_anData[E_DATA_article_id]].trimmed().toUtf8());
query.bindValue(":NICKNAME",stReply.m_strlist[m_anData[E_DATA_article_nickname]].trimmed().toUtf8());
query.bindValue(":PARENT",stReply.m_strlist[m_anData[E_DATA_article_parent]].trimmed().toUtf8());
query.bindValue(":DATA",SqlString(stReply.m_strlist[m_anData[E_DATA_article_data]].trimmed()).toUtf8());
query.bindValue(":DATE",stReply.m_strlist[m_anData[E_DATA_article_date]].trimmed().toUtf8());
query.bindValue(":BODY_NUM",m_mapData[strUrl].m_nNum);
query.bindValue(":REALBYCATEGORYNUM",GetVectorToString(stReply.m_vecCategory," "));
if (query.exec()==false){InsertLog(query.lastError().text());return;}
nReplyCount++;
}
query.prepare(strBodyQuery);
query.bindValue(":NUM",m_mapData[strUrl].m_nNum);
query.bindValue(":PLATFORMNAME",m_mapData[strUrl].m_strlist[m_anData[E_DATA_platform_name]].trimmed());
query.bindValue(":PLATFORMFORM",m_mapData[strUrl].m_strlist[m_anData[E_DATA_platform_form]].trimmed());
query.bindValue(":PLATFORMTITLE",SqlString(m_mapData[strUrl].m_strlist[m_anData[E_DATA_platform_title]]).trimmed());
query.bindValue(":ID",m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_id]].trimmed());
query.bindValue(":NICKNAME",m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_nickname]].trimmed());
query.bindValue(":TITLE",SqlString(m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_title]]).trimmed());
QString strData = m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_data]];
strData=strData.replace(QChar(160),"");
bool bQuit = true;
while(bQuit)
{
if (strData.contains("\n\n\n"))
strData=strData.replace("\n\n\n","");
else
bQuit = false;
}
//strData=SeqDelString(strData,QChar('\n'),2);
query.bindValue(":DATA",SqlString(strData.replace(QString("\n"),QString("<br>"))).trimmed());
query.bindValue(":PROFILEURL",SqlString(m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_profileurl]]).trimmed());
QString strArticleUrl = m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_url]].trimmed();
query.bindValue(":URL",strArticleUrl.right(strArticleUrl.length() - QString("http://").length()));
if (m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_hit]].trimmed().isEmpty())
query.bindValue(":VIEW","-1");
else
query.bindValue(":VIEW",m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_hit]]);
query.bindValue(":DATE",m_mapData[strUrl].m_strlist[m_anData[E_DATA_article_date]].trimmed());
if (m_mapData[strUrl].m_vecReply.size() == 0)
{
query.bindValue(":REPLY_STARTNUM",-1);
query.bindValue(":REPLY_ENDNUM",-1);
}
else
{
query.bindValue(":REPLY_STARTNUM",nReplyStart);
query.bindValue(":REPLY_ENDNUM",nReplyCount-1);
}
QString strDate = m_mapData[strUrl].m_dtLast.toString("yyyy-MM-dd HH:mm:ss");
if (strDate.trimmed().isEmpty())
query.bindValue(":LASTUPDATE","1900-01-01 00:00:00");
else
query.bindValue(":LASTUPDATE",strDate);
query.bindValue(":REALBYCATEGORYNUM",GetVectorToString(m_mapData[strUrl].m_vecCategory," "));
if (query.exec()==false) {InsertLog(query.lastError().text());return; }
}
query.prepare(strMapQuery);
int nCount = 0;
foreach(SMap stMap,m_vecMap)
{
query.bindValue(":NUM",nCount++);
query.bindValue(":BODY_NUM",stMap.m_nBody);
query.bindValue(":CATEGORY_NUM",stMap.m_nCategory);
query.bindValue(":REALIN",stMap.m_nRealIn);
if (query.exec()==false)
{
InsertLog(query.lastError().text());return;
}
}
db.close();
}
bool QSortBody(const SInfluenceCount &stInflunce1, const SInfluenceCount &stInflunce2)
{
return stInflunce1.m_ncBody > stInflunce2.m_ncBody;
}
bool QSortReply(const SInfluenceCount &stInflunce1, const SInfluenceCount &stInflunce2)
{
return stInflunce1.m_ncReply > stInflunce2.m_ncReply;
}
bool QSortInfulrence(const SInfluenceCount &stInflunce1, const SInfluenceCount &stInflunce2)
{
return stInflunce1.m_dinfulrence > stInflunce2.m_dinfulrence;
}
void Widget::on_count()
{
QMap <QString,SInfluenceCount> mapCount;
foreach (QListWidgetItem *item,m_plw[E_LIST_COMPANY].selectedItems())
{
InsertLog("Influence Rank Count Make Start " + item->text());
QString strCompanyNum = item->data(Qt::UserRole).toString();
foreach(SBody stBody, m_mapData.values())
{
if (stBody.m_strlist[m_anData[E_DATA_platform_form]].trimmed().compare(QString("blog")) != 0) continue;
QString strKey = stBody.m_strlist[m_anData[E_DATA_article_id]];
if (mapCount.contains(strKey)==false)
{
SInfluenceCount stInfluence;
stInfluence.m_ncBody = 0;
stInfluence.m_ncReply = 0;
stInfluence.m_strID = strKey;
stInfluence.m_strNick = stBody.m_strlist[m_anData[E_DATA_article_nickname]];
stInfluence.m_strTitle = stBody.m_strlist[m_anData[E_DATA_platform_title]];
stInfluence.m_strProfileUrl = stBody.m_strlist[m_anData[E_DATA_article_profileurl]];
mapCount.insert(strKey,stInfluence);
}
mapCount[strKey].m_ncBody++;
foreach(SReply stReply , stBody.m_vecReply.values())
{
if (stReply.m_strlist[m_anData[E_DATA_article_id]].compare(strKey) != 0)
mapCount[strKey].m_ncReply++;
}
}
foreach (SInfluenceCount stInfluence,mapCount.values())
{
mapCount[stInfluence.m_strID].m_dinfulrence = ((double)stInfluence.m_ncBody * 0.4) + ((double)stInfluence.m_ncReply * 0.6);
}
InsertLog("Influence Rank Count Make End");
{
db.setHostName(D_DB_WEB_HOST);
db.setUserName(D_DB_WEB_USER);
db.setPassword(D_DB_WEB_PASS);
db.setDatabaseName(D_DB_WEB_NAME);
if (db.open() == false)
{
InsertLog(db.lastError().text());
return;
}
InsertLog("Influence Rank Count Send Start");
QSqlQuery query;
QString strQuery;
strQuery = "delete from stats_influencerrank where company_num = " + strCompanyNum;
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
strQuery = "delete from influencer where company_num = " + strCompanyNum;
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
QList<SInfluenceCount> list = mapCount.values();
qSort(list.begin(),list.end(),QSortInfulrence);
strQuery = "insert into influencer (cost,company_num,id,nickname,title,profileurl,bodycount,replycount,influencevalue) VALUES (0," +
strCompanyNum + ",:ID,:NICKNAME,:TITLE,:PROFILE_URL,:BODY_COUNT,:REPLY_COUNT,:INPL)";
query.prepare(strQuery.toUtf8());
foreach(SInfluenceCount stIn,list)
{
if (stIn.m_strID.length() > 42) continue;
query.bindValue(":ID",stIn.m_strID.toUtf8());
query.bindValue(":NICKNAME",stIn.m_strNick.toUtf8());
query.bindValue(":TITLE",stIn.m_strTitle.toUtf8());
query.bindValue(":PROFILE_URL",stIn.m_strProfileUrl.toUtf8());
query.bindValue(":BODY_COUNT",stIn.m_ncBody);
query.bindValue(":REPLY_COUNT",stIn.m_ncReply);
query.bindValue(":INPL",stIn.m_dinfulrence);
if(query.exec() == false) {InsertLog(query.lastError().text());return;}
}
int nCount = 0;
foreach(SInfluenceCount stIn,list)
{
if (nCount >= 10) break; nCount++;
strQuery = MakeInfluencerrankQuery(stIn,"influencevalue",strCompanyNum);
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
}
nCount = 0;
qSort(list.begin(),list.end(),QSortBody);
foreach(SInfluenceCount stIn,list)
{
if (nCount >= 10) break; nCount++;
strQuery = MakeInfluencerrankQuery(stIn,"bodycount",strCompanyNum);
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
}
qSort(list.begin(),list.end(),QSortReply);
nCount = 0;
foreach(SInfluenceCount stIn,list)
{
if (nCount >= 10) break; nCount++;
strQuery = MakeInfluencerrankQuery(stIn,"replycount",strCompanyNum);
if(query.exec(strQuery.toUtf8()) == false) {InsertLog(query.lastError().text());return;}
}
db.close();
InsertLog("Influence Rank Count Send End");
}
}
}
QString Widget::MakeInfluencerrankQuery(SInfluenceCount &_stIn,QString _strOrder,QString _strCompanyNum)
{
QString strOut;
strOut = "insert into stats_influencerrank(id,nickname,bodycount,replycount,influencevalue,orderby,company_num) VALUES (";
strOut += "'" + _stIn.m_strID + "',";
strOut += "'" + _stIn.m_strNick + "',";
strOut += QString::number(_stIn.m_ncBody) + ",";
strOut += QString::number(_stIn.m_ncReply) + ",";
strOut += QString::number(_stIn.m_dinfulrence)+ ",";
strOut += "'" + _strOrder + "',";
strOut += _strCompanyNum + ")";
return strOut;
}
QString Widget::SeqDelString(QString _strData,QChar _chChar,int _nMax)
{
static const int C_SEQ_FIND = 0;
static const int C_SEQ_DEL = 1;
QString strOut;
int nMode = C_SEQ_FIND,nCount=0;
for (int i = 0 ; i < _strData.length(); i++)
{
switch(nMode)
{
case C_SEQ_FIND:
if (_strData[i] == _chChar)
nCount++;
else
nCount = 0;
strOut += _strData[i];
if (nCount >= _nMax)
nMode = C_SEQ_DEL;
break;
case C_SEQ_DEL:
nCount = 0;
if (_strData[i] != _chChar)
{
strOut += _strData[i];
nMode = C_SEQ_FIND;
}
break;
}
}
return strOut;
}