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 +++++++++++++++++++++++++++
 analysisbyrediscache.ui   |   40 ++--
 etfstockinfo.h            |   11 +
 etfstockinfo.ui           |  140 +++++++++++++++++++
 agilestrategy.cpp         |    1 
 stock_plan_251106_etf.sql |   36 +++++
 6 files changed, 395 insertions(+), 23 deletions(-)

diff --git a/agilestrategy.cpp b/agilestrategy.cpp
index 6b72896..489af39 100644
--- a/agilestrategy.cpp
+++ b/agilestrategy.cpp
@@ -7,6 +7,7 @@
 {
     ui->setupUi(this);
 
+
     m_widget = new QWidget(this);
     m_gridLayout = new QGridLayout(m_widget);
 
diff --git a/analysisbyrediscache.ui b/analysisbyrediscache.ui
index 567c697..4c44ffa 100644
--- a/analysisbyrediscache.ui
+++ b/analysisbyrediscache.ui
@@ -82,26 +82,6 @@
        </widget>
       </item>
       <item>
-       <widget class="QDateEdit" name="dateEdit_end">
-        <property name="dateTime">
-         <datetime>
-          <hour>0</hour>
-          <minute>0</minute>
-          <second>0</second>
-          <year>2025</year>
-          <month>1</month>
-          <day>1</day>
-         </datetime>
-        </property>
-        <property name="displayFormat">
-         <string>yyyy-MM-dd</string>
-        </property>
-        <property name="calendarPopup">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
        <widget class="QLabel" name="label_load">
         <property name="text">
          <string>缂撳瓨鏈姞杞�</string>
@@ -129,6 +109,26 @@
        </widget>
       </item>
       <item>
+       <widget class="QDateEdit" name="dateEdit_end">
+        <property name="dateTime">
+         <datetime>
+          <hour>0</hour>
+          <minute>0</minute>
+          <second>0</second>
+          <year>2025</year>
+          <month>1</month>
+          <day>1</day>
+         </datetime>
+        </property>
+        <property name="displayFormat">
+         <string>yyyy-MM-dd</string>
+        </property>
+        <property name="calendarPopup">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item>
        <widget class="QPushButton" name="pushButton_analysisByRedis">
         <property name="text">
          <string>缂撳瓨鍒嗘瀽</string>
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);
+    }
+}
diff --git a/etfstockinfo.h b/etfstockinfo.h
index 10b993f..77d777b 100644
--- a/etfstockinfo.h
+++ b/etfstockinfo.h
@@ -23,8 +23,10 @@
     explicit ETFStockInfo(QWidget *parent = 0);
     ~ETFStockInfo();
 
+    void initMySQL();
     void getEtfInfo(QByteArray &buffer);
     void getStockFundPosition(QByteArray &buffer,QString url); // 鑾峰彇涓偂瀵瑰簲鍩洪噾鎸佷粨鎯呭喌--鎬荤殑缁熻
+    void getStockOne(QByteArray &buffer); // 鑾峰彇鍗曞彧etf鑲$エ鐨勪俊鎭�
 
 signals:
     void sendSymbolNums(int); // 閫氳繃鏁伴噺鑾峰彇鎺掑悕鍓峃鍚嶇殑鑲$エ浠e彿杩囨潵
@@ -40,6 +42,12 @@
 
     void getStockFundPosSlot(QString symbol); // 閫氳繃鑲$エ浠e彿鑾峰彇鍩洪噾鎸佷粨鎯呭喌
 
+    void on_pushButton_search_date_clicked();
+
+    void on_pushButton_update_clicked();
+
+    void on_checkBox_update_clicked();
+
 private:
     Ui::ETFStockInfo *ui;
 
@@ -50,10 +58,13 @@
     QSqlDatabase db;
 
     QMap<QString,QString> m_codeNames; // 鑲$エ浠e彿鍜屽悕瀛�
+    QMap<QString,QString> m_codeNamesEtf; // Etf浠e彿鍜屽悕瀛�
 
     QNetworkRequest m_request; // 鐢ㄤ簬绠$悊璇锋眰澶寸殑
     QString m_cookie; // 缂撳瓨
     QNetworkAccessManager m_manager; // 鐢ㄤ簬绠$悊http璇锋眰鍙婂搷搴旂殑
+
+    int m_days = 0;
 };
 
 #endif // ETFSTOCKINFO_H
diff --git a/etfstockinfo.ui b/etfstockinfo.ui
index 1639fd6..154e743 100644
--- a/etfstockinfo.ui
+++ b/etfstockinfo.ui
@@ -18,7 +18,7 @@
     <item row="0" column="0">
      <widget class="QTabWidget" name="tabWidget">
       <property name="currentIndex">
-       <number>1</number>
+       <number>0</number>
       </property>
       <widget class="QWidget" name="tab">
        <attribute name="title">
@@ -35,7 +35,7 @@
             <widget class="QComboBox" name="comboBox">
              <item>
               <property name="text">
-               <string>绫诲瀷1</string>
+               <string>鏃堕棿</string>
               </property>
              </item>
              <item>
@@ -46,9 +46,84 @@
             </widget>
            </item>
            <item>
+            <widget class="QDateTimeEdit" name="dateTimeEdit">
+             <property name="date">
+              <date>
+               <year>2025</year>
+               <month>1</month>
+               <day>1</day>
+              </date>
+             </property>
+             <property name="displayFormat">
+              <string>yyyy-MM-dd HH:mm:ss</string>
+             </property>
+             <property name="calendarPopup">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="pushButton_search_date">
+             <property name="text">
+              <string>鏌ヨ鎸囧畾鏃ユ湡</string>
+             </property>
+            </widget>
+           </item>
+           <item>
             <widget class="QPushButton" name="pushButton_market">
              <property name="text">
               <string>鏌ヨ鏈�鏂�</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="checkBox_update">
+             <property name="text">
+              <string>鏇存柊</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QComboBox" name="comboBox_days">
+             <property name="editable">
+              <bool>true</bool>
+             </property>
+             <item>
+              <property name="text">
+               <string>0</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>1</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>2</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>3</string>
+              </property>
+             </item>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="label_3">
+             <property name="text">
+              <string>澶�</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QPushButton" name="pushButton_update">
+             <property name="enabled">
+              <bool>false</bool>
+             </property>
+             <property name="text">
+              <string>鏇存柊</string>
              </property>
             </widget>
            </item>
@@ -149,6 +224,67 @@
         </item>
        </layout>
       </widget>
+      <widget class="QWidget" name="tab_3">
+       <attribute name="title">
+        <string>ETF瓒嬪娍</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_4">
+        <item row="0" column="0">
+         <widget class="QGroupBox" name="groupBox_3">
+          <property name="title">
+           <string>鏌ヨ鏉′欢</string>
+          </property>
+          <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <item>
+            <layout class="QHBoxLayout" name="horizontalLayout_3">
+             <item>
+              <widget class="QComboBox" name="comboBox_2">
+               <item>
+                <property name="text">
+                 <string>鎺掑悕</string>
+                </property>
+               </item>
+               <item>
+                <property name="text">
+                 <string>鍏ㄩ儴</string>
+                </property>
+               </item>
+              </widget>
+             </item>
+             <item>
+              <widget class="QDateTimeEdit" name="dateTimeEdit_3">
+               <property name="date">
+                <date>
+                 <year>2025</year>
+                 <month>1</month>
+                 <day>1</day>
+                </date>
+               </property>
+               <property name="displayFormat">
+                <string>yyyy-MM-dd HH:mm:ss</string>
+               </property>
+               <property name="calendarPopup">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QPushButton" name="pushButton_2">
+               <property name="text">
+                <string>鏌ヨ</string>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </item>
+          </layout>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QTableView" name="tableView_trend"/>
+        </item>
+       </layout>
+      </widget>
      </widget>
     </item>
    </layout>
diff --git a/stock_plan_251106_etf.sql b/stock_plan_251106_etf.sql
new file mode 100644
index 0000000..65268f5
--- /dev/null
+++ b/stock_plan_251106_etf.sql
@@ -0,0 +1,36 @@
+-- --------------------------------------------------------
+-- 涓绘満:                           127.0.0.1
+-- 鏈嶅姟鍣ㄧ増鏈�:                        5.6.35-log - MySQL Community Server (GPL)
+-- 鏈嶅姟鍣ㄦ搷浣滅郴缁�:                      Win64
+-- HeidiSQL 鐗堟湰:                  9.5.0.5196
+-- --------------------------------------------------------
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET NAMES utf8 */;
+/*!50503 SET NAMES utf8mb4 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+
+
+-- 瀵煎嚭 stock_plan 鐨勬暟鎹簱缁撴瀯
+CREATE DATABASE IF NOT EXISTS `stock_plan` /*!40100 DEFAULT CHARACTER SET utf8 */;
+USE `stock_plan`;
+
+-- 瀵煎嚭  琛� stock_plan.etf_day_info 缁撴瀯
+CREATE TABLE IF NOT EXISTS `etf_day_info` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `code` varchar(50) DEFAULT NULL COMMENT '浠g爜',
+  `name` varchar(50) DEFAULT NULL COMMENT '鍚嶅瓧',
+  `amount` bigint(20) DEFAULT NULL COMMENT '鎴愪氦棰�',
+  `chg` double DEFAULT NULL COMMENT '娑ㄨ穼棰�',
+  `percent` double DEFAULT NULL COMMENT '娑ㄨ穼骞�',
+  `volume` bigint(20) DEFAULT NULL COMMENT '鎴愪氦閲�',
+  `close` double DEFAULT NULL COMMENT '甯備环',
+  `time_trade` varchar(50) DEFAULT NULL COMMENT '浜ゆ槗鏃堕棿',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=640561 DEFAULT CHARSET=utf8 COMMENT='etf鍩洪噾鏃ョ嚎鏁版嵁';
+
+-- 鏁版嵁瀵煎嚭琚彇娑堥�夋嫨銆�
+/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
+/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

--
Gitblit v1.8.0