From fcc4de01b336e73df6788fa6129ec15162ac6701 Mon Sep 17 00:00:00 2001
From: wumu <mayi@mayi.com>
Date: 星期四, 06 十一月 2025 23:40:51 +0800
Subject: [PATCH] 251106

---
 etfstockinfo.cpp |  190 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 189 insertions(+), 1 deletions(-)

diff --git a/etfstockinfo.cpp b/etfstockinfo.cpp
index 417cef9..07e0d98 100644
--- a/etfstockinfo.cpp
+++ b/etfstockinfo.cpp
@@ -8,6 +8,8 @@
 #include <QJsonDocument>
 #include <QJsonObject>
 #include <QJsonArray>
+#include <QMessageBox>
+#include <QDateTime>
 
 ETFStockInfo::ETFStockInfo(QWidget *parent) :
     QMainWindow(parent),
@@ -65,11 +67,34 @@
     m_manager.get(m_request);
     qDebug()<<"璇锋眰涓�...";
 
+    ui->dateTimeEdit->setDateTime(QDateTime::currentDateTime());
+    ui->dateTimeEdit_3->setDateTime(QDateTime::currentDateTime());
+
 }
 
 ETFStockInfo::~ETFStockInfo()
 {
     delete ui;
+}
+
+void ETFStockInfo::initMySQL()
+{
+    //娣诲姞涓�涓暟鎹簱
+      db=QSqlDatabase::addDatabase("QMYSQL");    //鎷彿鍐呰鍐欏嚭鏁版嵁搴撶殑绫诲瀷
+      //璁剧疆鏁版嵁搴�
+      db.setHostName("127.0.0.1"); //璁剧疆鏁版嵁搴撶殑涓绘満ip
+      //璁剧疆鏁版嵁搴撶殑鐢ㄦ埛鍚�
+      db.setUserName("root");
+      //璁剧疆鏁版嵁搴撶殑瀵嗙爜
+      db.setPassword("root");    //杩欎釜灏辨槸瀹夎MySQL鏃惰缃殑瀵嗙爜
+      //璁剧疆鏁版嵁搴撶殑鍚嶅瓧
+      db.setDatabaseName("stock_plan");
+      //鎵撳紑鏁版嵁搴擄紙宸茬粡瀹夎杩噈ysql椹卞姩浜嗭級
+      if(db.open()==false){
+          QMessageBox::warning(this,"waring",db.lastError().text());
+      }else{
+          qDebug()<<"mysql conn ok";
+      }
 }
 
 void ETFStockInfo::getEtfInfo(QByteArray &buffer)
@@ -151,6 +176,9 @@
             // 娣诲姞涓�琛屾暟鎹」鍒版ā鍨嬩腑
             //m_model->appendRow(rowItems);
             m_model_market->appendRow(rowItems);
+
+            // 淇濆瓨etf鍩洪噾鐨勪唬鍙峰拰鍚嶅瓧
+            m_codeNamesEtf[symbol] = name;
         }
     }
 
@@ -210,6 +238,64 @@
     }
 }
 
+void ETFStockInfo::getStockOne(QByteArray &buffer)
+{
+    QJsonDocument jd = QJsonDocument::fromJson(buffer);
+    if(jd.isObject()){
+        QJsonObject jObject = jd.object();
+        QJsonArray jArr = jObject.value("data").toObject().value("item").toArray(); // 閫氳繃閿�煎鍙栧��
+        int cnt = jArr.count();
+        qDebug()<<"鏁扮粍size:"<<cnt;
+        QString symbol = jObject.value("data").toObject().value("symbol").toString();
+        QString code = symbol; // 鑲$エ浠e彿
+        QString name = m_codeNamesEtf[code];
+        qDebug()<<"鍘嗗彶:"<<code<<symbol;
+
+        // 浠ユ壒閲忓啓鍏ョ殑鏂瑰紡鏉ヨ幏鍙栧骞存暟鎹�
+        QString sql = "insert into etf_day_info (code,name,amount,chg,percent,volume,close,time_trade) values ";
+        //qDebug()<<"sql 1:"<<sql;
+        for(int i=0;i<cnt;++i){
+            qint64 timestamp = jArr.at(i).toArray().at(0).toVariant().toLongLong();
+//            double open = jArr.at(i).toArray().at(2).toVariant().toDouble();
+//            double high = jArr.at(i).toArray().at(3).toVariant().toDouble();
+//            double low = jArr.at(i).toArray().at(4).toVariant().toDouble();
+            double close = jArr.at(i).toArray().at(5).toVariant().toDouble();
+            double percent = jArr.at(i).toArray().at(7).toVariant().toDouble();
+//            double turnoverrate = jArr.at(i).toArray().at(8).toVariant().toDouble();
+            double amount = jArr.at(i).toArray().at(9).toVariant().toDouble();
+//            double pe_ttm = jArr.at(i).toArray().at(16).toVariant().toDouble();
+//            double market_capital = jArr.at(i).toArray().at(17).toVariant().toDouble();
+            long long volume = jArr.at(i).toArray().at(1).toVariant().toLongLong()/100;
+            double chg = jArr.at(i).toArray().at(6).toVariant().toDouble();
+
+            //long long amount = jArr.at(i).toArray().at(9).toVariant().toLongLong()/100000000; // 浜�
+            QString curDateTime = QDateTime::fromMSecsSinceEpoch(timestamp).toString("yyyy-MM-dd");
+//            qDebug()<<timestamp<<curDateTime<<close<<volume<<amount;
+
+            // 澶勭悊鏁版嵁淇濆瓨鍒版ā鍨嬩腑
+            QString vals = QString("('%1','%2',%3,%4,%5,%6,%7,'%8')").arg(code).arg(name).arg(QString::number(amount))
+                    .arg(QString::number(chg)).arg(QString::number(percent)).arg(QString::number(volume)).arg(QString::number(close))
+                    .arg(curDateTime);
+            if(i != cnt - 1){
+                vals.append(",");
+            }
+            sql.append(vals);
+            //qDebug()<<"sql 3:"<<sql;
+
+        }
+        qDebug()<<"over:"<<sql.size();
+//        qDebug()<<"sql 2:"<<sql; // 澶ぇ浜� 鏄剧ず涓嶅嚭鏉�
+
+        QSqlQuery que(db);
+        if(que.exec(sql)){
+            qDebug()<<"insert ok";
+        }else{
+            qDebug()<<"insert fail"<<que.lastError().text();
+        }
+    }
+
+}
+
 void ETFStockInfo::showAplyData(QNetworkReply *reply)
 {
     qDebug()<<"鏀跺埌鍝嶅簲etf";
@@ -224,7 +310,7 @@
 
     }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/chart/kline.json") != -1){
         qDebug()<<"鏌ョ湅涓偂鎯呭喌:";
-//        getStockOne(buffer);
+        getStockOne(buffer);
 
     }else if(reply->url().toString().indexOf("https://stock.xueqiu.com/v5/stock/screener/quote/list.json?page=1&size=100&order=desc&order_by=percent&market=CN&ind_code") != -1){
         qDebug()<<"鏍规嵁琛屼笟鑾峰彇鑲$エ淇℃伅"<<reply->url();
@@ -290,3 +376,105 @@
     }
 
 }
+
+void ETFStockInfo::on_pushButton_search_date_clicked()
+{
+    // 鎸夋棩鏈熸煡璇㈡暟鎹簱锛屼簡瑙h秼鍔�
+    QString cur_date = ui->dateTimeEdit->date().toString("yyyy-MM-dd");
+    QString sql = QString("select *  from etf_day_info where time_trade = '%1' order by percent desc").arg(cur_date);
+
+    QSqlQuery que(db);
+    if(que.exec(sql)){
+        qDebug()<<"select ok";
+
+        m_model_market->setRowCount(0); // 閲嶇疆妯″瀷琛屾暟
+        int rows = 0;
+        while (que.next()) {
+            QString code = que.value(1).toString();
+            QString name = que.value(2).toString();
+            QString amount = QString::number(que.value(3).toDouble()/100000000);
+            QString chg = QString::number(que.value(4).toDouble());
+            QString percent = que.value(5).toString();
+            QString volume = que.value(6).toString();
+            QString close = que.value(7).toString();
+            QString time_trade = que.value(8).toString();
+
+//            QString turnover_rate = que.value(7).toString();
+//            QString pe_ttm = que.value(8).toString();
+//            QString amount_rank = que.value(9).toString();
+
+//            m_modelDatas.append({name,code,market_capital,percent,close,amount,volume,turnover_rate,pe_ttm,amount_rank});
+
+            QList<QStandardItem*> items;
+            items.append(new QStandardItem(code));
+            items.append(new QStandardItem(name));
+            items.append(new QStandardItem(amount));
+            items.append(new QStandardItem(chg));
+            items.append(new QStandardItem("0"));
+            items.append(new QStandardItem("0"));
+            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(volume));
+            items.append(new QStandardItem(close));
+            items.append(new QStandardItem(time_trade));
+
+//            items.append(new QStandardItem(pe_ttm));
+//            items.append(new QStandardItem(amount_rank));
+            m_model_market->appendRow(items);
+            rows++;
+        }
+        qDebug()<<"鏌ヨ鍒拌鏁�:"<<rows;
+
+
+    }else{
+        qDebug()<<"select fail"<<que.lastError().text();
+    }
+
+}
+
+void ETFStockInfo::on_pushButton_update_clicked()
+{
+    // 鏇存柊鍒版渶鏂帮紝榛樿鍏ㄦ洿
+    // 涔熷彲浠ユ寚瀹氬ぉ鏁扮殑鏁伴噺鏉ユ洿鏂�
+
+    // 鍏堜繚璇佽幏鍙栧埌褰撳墠鎵�鏈夌殑etf鍩洪噾鐨勪唬鐮佸拰鍚嶅瓧锛岀劧鍚庢牴鎹唬鐮佹潵鍙戣捣鏇存柊璇锋眰
+    m_days = ui->comboBox_days->currentText().toInt();
+
+    if(m_days == 0) return;
+
+    if(m_codeNamesEtf.size() > 0){
+        qint64 cur_time = QDateTime::currentMSecsSinceEpoch();
+
+        for(auto code:m_codeNamesEtf.keys()){
+            QString url = QString("https://stock.xueqiu.com/v5/stock/chart/kline.json?symbol=%1&begin=%2&period=day&type=before&count=-%3&indicator=kline,pe,market_capital,ma")
+                    .arg(code).arg(QString::number(cur_time)).arg(m_days);
+            m_request.setUrl(QUrl(url));
+            m_manager.get(m_request);
+
+        }
+        qDebug()<<"鍙戣捣璇锋眰瀹屾垚";
+    }else{
+        // 濡傛灉涓虹┖锛屽垯闇�瑕佸幓鍒锋柊涓�涓嬫渶鏂扮殑鎯呭喌锛岃幏鍙栧熀閲戜俊鎭�
+        on_pushButton_market_clicked();
+    }
+
+}
+
+void ETFStockInfo::on_checkBox_update_clicked()
+{
+
+    if(ui->checkBox_update->isChecked()){
+        ui->pushButton_update->setEnabled(true);
+    }else{
+        ui->pushButton_update->setEnabled(false);
+    }
+}

--
Gitblit v1.8.0