From f7dd8173db8f3c2eb5beefa960d86a2bc2144f9f Mon Sep 17 00:00:00 2001
From: wumu <mayi@mayi.com>
Date: 星期日, 02 三月 2025 23:58:44 +0800
Subject: [PATCH] 250302

---
 historydata.cpp |  319 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 316 insertions(+), 3 deletions(-)

diff --git a/historydata.cpp b/historydata.cpp
index 1ee12b0..2513297 100644
--- a/historydata.cpp
+++ b/historydata.cpp
@@ -19,6 +19,28 @@
 {
     ui->setupUi(this);
 
+    // 娉ㄥ唽鍏冪被鍨�
+    qRegisterMetaType<QVector<QVector<QString>>>("QVector<QVector<QString>>");
+    qRegisterMetaType<QVector<QVector<QString>>>("QVector<QVector<QString>> &");
+
+    // ui鐩稿叧
+    ui->dateEdit->setDate(QDate::currentDate());
+    ui->dateEdit_2->setDate(QDate::currentDate());
+
+    m_model = new QStandardItemModel(1,9,this);
+
+    m_customModel = new CustomSortProxyModel; // 鍙嚜瀹氫箟鎺掑簭鐨勬ā鍨�
+    m_customModel->setSourceModel(m_model); // 璁剧疆婧愭ā鍨�
+
+    //ui->tableView->setModel(m_model);
+    ui->tableView->setModel(m_customModel);
+    // 琛ㄦ牸鍒楁帓搴�
+    ui->tableView->setSortingEnabled(true);
+
+    QStringList labels;
+    labels<<"鑲$エ鍚嶅瓧"<<"鑲$エ浠e彿"<<"甯傚��(浜�)"<<"娑ㄨ穼骞�"<<"鏀剁洏浠�"<<"鎴愪氦棰�(浜�)"<<"鎴愪氦閲�"<<"鎹㈡墜鐜�"<<"PE_TTM";
+    m_model->setHorizontalHeaderLabels(labels);
+
     initMySQL(); // 鍒濆鍖朚ySQL
 
     // 澶勭悊鏁版嵁鐖彇鐨勬搷浣�
@@ -46,6 +68,22 @@
     // 鍘昏姹傞椤�
     m_manager.get(m_request);
 
+    // 鑲$エ姹犵浉鍏�
+    m_poolModel = new QStandardItemModel(1,9,this);
+
+    QStringList poolLabel;
+    poolLabel<<"id"<<"鑲$エ鍚嶅瓧"<<"鑲$エ浠e彿"<<"鐩戞帶涔板叆浠锋牸"<<"鐩戞帶璁板綍鏃堕棿"<<"褰撳墠浠锋牸"<<"鐩堜簭鐧惧垎姣�"<<"鐩戞帶鍗栧嚭浠锋牸"<<"鐩戞帶鍗栧嚭鏃堕棿"<<"绛栫暐鍛ㄦ湡";
+    m_poolModel->setHorizontalHeaderLabels(poolLabel);
+    ui->tableView_2->setModel(m_poolModel);
+
+
+    // 鑲$エ姹犲畾鏃跺埛鏂�
+    m_poolTimer = new QTimer(this);
+    connect(m_poolTimer,SIGNAL(timeout()),this,SLOT(poolTimerSlot()));
+    m_poolTimer->start(10*1000);
+
+    m_getPoolCloseTimer = new QTimer(this); // 鍒锋柊鑲$エ姹犳渶鏂颁环鏍�
+    connect(m_getPoolCloseTimer,SIGNAL(timeout()),this,SLOT(getLastCloseSlot()));
 
 }
 
@@ -90,9 +128,10 @@
 {
     // 鎶�5000鏀偂绁ㄦ尐涓幏鍙栧埌锛岀劧鍚庤繘琛屾暟鎹繚瀛橈紝瀛樺埌琛ㄦ牸涓�
     // 鏇存柊鐨勬椂鍊欙紝榛樿鏀寔10骞寸殑鏁版嵁鏌ヨ
+    if(m_days <= 0) return;
 
     QString time_tar=QString::number(QDateTime::currentMSecsSinceEpoch());
-    QString dayCnt=QString::number(3000);
+    QString dayCnt=QString::number(m_days);
     QString type = "day"; // day week month
     for(auto code:m_codeNames.keys()){
         QString url = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=%3&type=before&count=-%4&indicator=kline,pe,market_capital,ma").arg(code)
@@ -103,6 +142,15 @@
         m_manager.get(m_request);
         //break; // 娴嬭瘯鐢�
 
+    }
+    // 鏇存柊鏃堕棿
+    QString curDate = QDate::currentDate().toString("yyyy-MM-dd");
+    QString sql = QString("insert into days_info (log_time) values ('%1')").arg(curDate);
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        qDebug()<<"update log time ok:"<<curDate;
+    }else{
+        qDebug()<<"update log time fail:"<<curDate;
     }
     
 }
@@ -135,6 +183,9 @@
         qDebug()<<"鏌ョ湅涓偂鎯呭喌:";
         getOneStock(buffer);
 
+    }else if(reply->url().toString().indexOf("https://hqm.stock.sohu.com/getqjson") != -1){
+        qDebug()<<"鑾峰彇鑲$エ姹犱釜鑲′环鏍�";
+        getPoolStock(buffer);
     }
 }
 
@@ -195,10 +246,272 @@
 
         QSqlQuery que(db);
         if(que.exec(sql)){
-            qDebug()<<"intsert ok";
+            qDebug()<<"insert ok";
         }else{
-            qDebug()<<"intsert fail"<<que.lastError().text();
+            qDebug()<<"insert fail"<<que.lastError().text();
         }
     }
 
 }
+
+/*
+ * {"cn_000032":["cn_000032","娣辨杈撅肌","26.33","-9.98%","-2.92","1102599","3473","306282","17.10%","2.38","29.87","26.33","0.00","29.25","29.25","\/cn\/000032\/index.shtml","169.77","2025-02-28 15:00:54","\/t\/cn\/032\/000032.html"],
+ * "cn_603729":["cn_603729","榫欓煹鑲′唤","15.50","-4.79%","-0.78","52294","1220","8268","5.60%","0.57","16.27","15.46","407.89","16.28","16.20","\/cn\/603729\/index.shtml","14.47","2025-02-28 15:00:57","\/t\/cn\/729\/603729.html"],
+ * "cn_300253":["cn_300253","鍗畞鍋ュ悍","11.03","-7.08%","-0.84","1667417","11","189099","8.96%","3.64","11.86","10.97","116.11","11.87","11.70","\/cn\/300253\/index.shtml","205.36","2025-02-28 15:30:57","\/t\/cn\/253\/300253.html"],
+ * "cn_300454":["cn_300454","娣变俊鏈�  ","102.06","-7.13%","-7.84","173684","1","181338","6.29%","2.29","109.90","101.00","0.00","109.90","107.14","\/cn\/300454\/index.shtml","281.95","2025-02-28 15:30:57","\/t\/cn\/454\/300454.html"],
+ * "cn_688055":["cn_688055","榫欒吘鍏夌數","3.88","-4.67%","-0.19","98688","1418","3898","0.30%","1.01","4.08","3.87","0.00","4.07","4.07","\/cn\/688055\/index.shtml","129.33","2025-02-28 15:30:56","\/t\/cn\/055\/688055.html"],
+ * "cn_000818":["cn_000818","鑸敠绉戞妧","31.45","-3.82%","-1.25","982520","16510","316446","14.50%","5.41","33.40","30.98","393.13","32.70","32.30","\/cn\/000818\/index.shtml","213.03","2025-02-28 15:00:54","\/t\/cn\/818\/000818.html"]}
+ *
+*/
+void HistoryData::getPoolStock(QByteArray &buffer){
+    // 閫氳繃鎼滅嫄鑲$エ琛屾儏涓績鏉ユ壒閲忚幏鍙栦环鏍兼儏鍐碉紝https://hqm.stock.sohu.com/getqjson?code=cn_603729,cn_688055,cn_000032,cn_000818,cn_300454,cn_300253
+    qDebug()<<buffer;
+    qDebug()<<buffer.left(buffer.size()-1);
+    QJsonDocument jd = QJsonDocument::fromJson(buffer.left(buffer.size()-1));
+    qDebug()<<jd.isObject()<<jd.toJson();
+
+    if(jd.isObject()){
+        QJsonObject jObject = jd.object();
+        //QJsonArray jArr = jObject.keys(); // 閫氳繃閿�煎鍙栧��
+        int cnt = jObject.keys().size();
+        qDebug()<<"鏁扮粍size:"<<cnt;
+        for(auto it = jObject.begin();it != jObject.end();++it){
+            qDebug()<<it.key()<<it.value().toArray().at(1)<<it.value().toArray().at(2);
+        }
+    }else{
+        // 褰撳瓧绗︿覆澶勭悊
+        QList<QByteArray> tmp = buffer.split('[');
+        //qDebug()<<"[ tmp size:"<<tmp.size();
+        for(int i=0;i<tmp.size();++i){
+            //qDebug()<<i<<tmp.at(i);
+            QList<QByteArray> row = tmp.at(i).split(',');
+            if(row.size() > 2){
+                QString code = QString::fromLocal8Bit(row.at(0).mid(1,row.at(0).size()-2)).trimmed().split('_').at(1);
+                QString name = QString::fromLocal8Bit(row.at(1).mid(1,row.at(1).size()-2)).trimmed();
+                double close = row.at(2).mid(1,row.at(2).size()-2).toDouble();
+                //qDebug()<<name<<close<<code;
+                QString sql = QString("update stock_pool set cur_price=%1 where code like '%%2%' and state=1").arg(close).arg(code);
+                qDebug()<<sql;
+                QSqlQuery que(db);
+                if(que.exec(sql)){
+                    qDebug()<<"sql update ok";
+                }else{
+                    qDebug()<<"sql update fail";
+                }
+
+            }
+        }
+
+        // 鏈�鍚庢洿鏂颁竴涓嬭〃鏍肩殑鐧惧垎姣旀儏鍐�
+        QString sql = "update stock_pool set percent = (cur_price/in_price - 1)*100 where cur_price > 0 and in_price > 0 and state=1";
+        QSqlQuery que(db);
+        if(que.exec(sql)){
+            qDebug()<<"sql update percent ok";
+        }else{
+            qDebug()<<"sql update percent fail";
+        }
+    }
+}
+
+void HistoryData::on_pushButton_search_clicked()
+{
+    // 鎻愮ず鏌ヨ绛夊緟
+    ui->statusbar->showMessage("鏌ヨ涓�...璇疯�愬績绛夊緟缁撴灉...");
+
+    QString searchTime = ui->dateEdit->text();
+    qDebug()<<"鏌ヨ鐨勬椂闂�:"<<searchTime;
+    QString sql = QString("select name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm from stock_day_info where time_trade = '%1'").arg(searchTime);
+    qDebug()<<"sql:"<<sql;
+
+    m_modelDatas.clear(); // 娓呯┖鏁扮粍涓殑鏁版嵁
+
+    qint64 tt = QDateTime::currentMSecsSinceEpoch();
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        qDebug()<<"select ok";
+        m_model->setRowCount(0); // 閲嶇疆妯″瀷琛屾暟
+        int rows = 0;
+        while (que.next()) {
+            QString name = que.value(0).toString();
+            QString code = que.value(1).toString();
+            QString market_capital = QString::number(que.value(2).toDouble()/100000000);
+            QString percent = que.value(3).toString();
+            QString close = que.value(4).toString();
+            QString amount = QString::number(que.value(5).toDouble()/100000000);
+            QString volume = que.value(6).toString();
+            QString turnover_rate = que.value(7).toString();
+            QString pe_ttm = que.value(8).toString();
+
+            m_modelDatas.append({name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm});
+
+            QList<QStandardItem*> items;
+            items.append(new QStandardItem(name));
+            items.append(new QStandardItem(code));
+            items.append(new QStandardItem(market_capital));
+            //items.append(new QStandardItem(percent));
+            QStandardItem *percentItem =  new QStandardItem(percent);
+            if(percent.toDouble() > 0){
+                percentItem->setData(QColor("red"),Qt::DecorationRole); // 娣诲姞涓�涓楗扮殑棰滆壊涓虹孩鑹�
+                percentItem->setData(QColor("red"),Qt::TextColorRole);  // 灏嗗瓧浣撻鑹茶缃负绾㈣壊
+                items.at(0)->setData(QColor("red"),Qt::TextColorRole);  // 灏嗚偂绁ㄥ悕瀛楄缃负绾㈣壊
+             }
+            else if(percent.toDouble() < 0){
+                percentItem->setData(QColor("green"),Qt::BackgroundColorRole);
+                items.at(0)->setData(QColor("green"),Qt::TextColorRole);
+            }
+            items.append(percentItem);
+
+            items.append(new QStandardItem(close));
+            items.append(new QStandardItem(amount));
+            items.append(new QStandardItem(volume));
+            items.append(new QStandardItem(turnover_rate));
+            items.append(new QStandardItem(pe_ttm));
+            m_model->appendRow(items);
+            rows++;
+        }
+        qDebug()<<"鏌ヨ鍒拌鏁�:"<<rows;
+
+    }else{
+        qDebug()<<"select fail"<<que.lastError().text();
+    }
+    // 鏈�鍚庢彁绀哄畬鎴�
+    qint64 need = QDateTime::currentMSecsSinceEpoch()-tt;
+    ui->statusbar->showMessage(QString("鑰楁椂:%1 姣,鏌ヨ瀹屾垚.").arg(QString::number(need)),10*1000);
+    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+    //emit sendHistoryModel(m_modelDatas); // 缁欎俊鎭睍绀哄彂妯″瀷
+
+    ui->textBrowser->append(QString("鏌ヨ鏃ユ湡:%1 鑰楁椂: %2 姣 鏌ュ埌鏉℃暟:%3").arg(searchTime).arg(QString::number(need)).arg(QString::number(m_model->rowCount())));
+}
+
+void HistoryData::on_pushButton_2_clicked()
+{
+    //emit sendHistoryModel(m_modelDatas); // 缁欎俊鎭睍绀哄彂妯″瀷
+    emit sendHistoryModel(m_model);
+}
+
+void HistoryData::on_pushButton_addStock_clicked()
+{
+    QString name = ui->lineEdit->text();
+    QString code = ui->lineEdit_2->text();
+    QString price = ui->lineEdit_3->text();
+    QString in_date = ui->dateEdit_2->text();
+    QString type = ui->comboBox->currentText();
+    qDebug()<<name<<code<<price<<in_date<<type;
+
+    QString sql = QString("insert into stock_pool (name,code,in_price,in_time,type) values('%1','%2',%3,'%4','%5')").arg(name).arg(code).arg(price).arg(in_date).arg(type);
+    qDebug()<<"sql:"<<sql;
+
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        qDebug()<<"insert ok";
+        poolTimerSlot(); // 绔嬮┈鍒锋柊鑲$エ姹犵殑妯″瀷锛屽埛鏂拌鍥�
+    }else{
+        qDebug()<<"insert fail";
+    }
+}
+
+void HistoryData::poolTimerSlot()
+{
+    QString sql = "select * from stock_pool where state=1";
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        qDebug()<<"select ok:"<<QDateTime::currentDateTime();
+        m_poolModel->setRowCount(0);
+        while (que.next()) {
+            QList<QStandardItem*> items;
+            for(int i=0;i<10;++i){
+                QString item = que.value(i).toString();
+                QStandardItem *it = new QStandardItem(item);
+                if(i==6){
+                    if(item.toDouble() > 0){
+                        it->setData(QColor("red"),Qt::DecorationRole); // 娣诲姞涓�涓楗扮殑棰滆壊涓虹孩鑹�
+                        it->setData(QColor("red"),Qt::TextColorRole);  // 灏嗗瓧浣撻鑹茶缃负绾㈣壊
+                        items.at(1)->setData(QColor("red"),Qt::TextColorRole);  // 灏嗚偂绁ㄥ悕瀛楄缃负绾㈣壊
+                    }else if(item.toDouble() < 0){
+                        it->setData(QColor("green"),Qt::BackgroundColorRole);
+                        items.at(1)->setData(QColor("green"),Qt::TextColorRole);
+                    }
+                }
+                items.append(it);
+            }
+            m_poolModel->appendRow(items); // 鏁磋娣诲姞 鏁堢巼鏇撮珮
+
+        }
+    }else{
+        qDebug()<<"select fail";
+    }
+    m_poolTimer->setInterval(60*1000);
+}
+
+void HistoryData::on_checkBox_clicked()
+{
+    QString dt = "2025-02-10";
+    QString sql = "select log_time from days_info order by log_time desc";
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        if (que.next()) {
+            dt = que.value(0).toString();
+        }else{
+            qDebug()<<"鏌ヨ缁撴灉闆嗕负绌�";
+            return;
+        }
+    }else{
+        qDebug()<<"鏌ヨ澶辫触";
+        return ;
+    }
+
+    if(ui->checkBox->isChecked()){
+        ui->pushButton_update->setEnabled(true);
+    }else{
+        ui->pushButton_update->setEnabled(false);
+    }
+
+
+
+    QDate d1 = QDate::fromString(dt,"yyyy-MM-dd");
+    QDate d2 = QDate::currentDate();
+    int days = 0; // 缁忚繃浜嗗灏戜釜鍛ㄥ唴鐨勫ぉ鏁�
+    for(QDate begin = d1.addDays(1);begin <= d2;begin = begin.addDays(1)){
+        if(begin.dayOfWeek() != Qt::Saturday && begin.dayOfWeek() != Qt::Sunday){
+            days++;
+        }
+    }
+    qDebug()<<"days:"<<days;
+    m_days = days; // 鍒锋柊鏃堕棿
+
+   getLastCloseSlot();
+
+}
+
+void HistoryData::getLastCloseSlot()
+{
+    // 鑾峰彇鑲$エ姹犳瘡鍙偂绁ㄦ渶鏂颁环鏍�
+    QString url = "https://hqm.stock.sohu.com/getqjson?code=";
+    for(int i=0;i<m_poolModel->rowCount();++i){
+        if(m_poolModel->item(i,2)){
+            QString code="cn_";
+            if(i > 0) code = ",cn_";
+            code += m_poolModel->item(i,2)->text().mid(2);
+            // qDebug()<<"code:"<<code;
+            url+=code;
+            //qDebug()<<"url:"<<url;
+        }
+
+
+    }
+    qDebug()<<QDateTime::currentDateTime()<<"url:"<<url;
+
+    m_request.setUrl(QUrl(url));
+    m_manager.get(m_request);
+
+
+}
+
+void HistoryData::on_checkBox_updatePoolClose_clicked()
+{
+    if(ui->checkBox_updatePoolClose->isChecked()){
+        m_getPoolCloseTimer->start(3*60*1000); // 3鍒嗛挓鏇存柊涓�娆�
+    }else{
+        m_getPoolCloseTimer->stop();
+    }
+}

--
Gitblit v1.8.0