diff --git a/TodayWidget.cpp b/TodayWidget.cpp new file mode 100644 index 0000000..cb0eed6 --- /dev/null +++ b/TodayWidget.cpp @@ -0,0 +1,45 @@ +#include "todaywidget.h" +#include "ui_TodayWidget.h" +#include "widget/distributewidget.h" +#include +#include + +TodayWidget::TodayWidget(QWidget* parent) : + QWidget(parent), + ui(new Ui::TodayWidget) +{ + ui->setupUi(this); + //测试数据,用于观看样式及功能 + QVBoxLayout* exchangeLayout = new QVBoxLayout; + DistributeWidget* m_distributeWidget = new DistributeWidget; + exchangeLayout->addWidget(m_distributeWidget); + //table + QWidget* topRiseWidget = new QWidget; + QVBoxLayout* topRiseLayout = new QVBoxLayout; + topRiseWidget->setLayout(topRiseLayout); + QLabel* topRiseLabel = new QLabel(QStringLiteral("涨幅榜")); + QTableView* topRisetableView = new QTableView; + topRiseLayout->addWidget(topRiseLabel); + topRiseLayout->addWidget(topRisetableView); + + QWidget* topFallWidget = new QWidget; + QVBoxLayout* topFallLayout = new QVBoxLayout; + topFallWidget->setLayout(topFallLayout); + QTableView* topFalltableView = new QTableView; + QLabel* topFallLabel = new QLabel(QStringLiteral("跌幅榜")); + topFallLayout->addWidget(topFallLabel); + topFallLayout->addWidget(topFalltableView); + + QHBoxLayout* tableLayout = new QHBoxLayout; +// tableLayout->addWidget(topRisetableView); + tableLayout->addWidget(topRiseWidget); + tableLayout->addWidget(topFallWidget); + + exchangeLayout->addLayout(tableLayout); + ui->tab->setLayout(exchangeLayout); +} + +TodayWidget::~TodayWidget() +{ + delete ui; +} diff --git a/datamanagerbase.cpp b/datamanagerbase.cpp new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/datamanagerbase.cpp @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/datamanagerbase.h b/datamanagerbase.h new file mode 100644 index 0000000..8d81ffc --- /dev/null +++ b/datamanagerbase.h @@ -0,0 +1,51 @@ +#ifndef DATAMANAGERBASE_H +#define DATAMANAGERBASE_H +#include +#include + +class DataManagerBase +{ +public: + enum ExcuteType{ + none = 0, //当前为空 + decode = 1, //执行解析 + getData //执行获取数据 + }; +public: + ExcuteType toExcuteType(){ return type;} + void setExcuteType(ExcuteType t){type = t;} + + virtual void doExcute() = 0; + + //解析文件 插入数据库 + virtual void decodeToMysql() = 0; + + // + virtual void getDataFromMysql() = 0; + + void setDecodeFile(QString filePath){decodeFilePath = filePath;} + + QString getDecodeFile(){return decodeFilePath;} + + void setDataDate(QString date){decodeDate = date;} + + QString getDataDate(){return decodeDate;} + + void clearParam(){ + params.clear(); + } + void addParam(QString key,QString value){ + params.insert(key,value); + } + QString getParam(QString key){ + return params.value(key); + } + +private: + QString decodeFilePath; + QString decodeDate; + ExcuteType type = decode; + QHash params;//参数 +}; + +#endif // DATAMANAGERBASE_H diff --git a/datamanagerthread.cpp b/datamanagerthread.cpp new file mode 100644 index 0000000..80d18f4 --- /dev/null +++ b/datamanagerthread.cpp @@ -0,0 +1,36 @@ +#include "datamanagerthread.h" +#include + +DataManagerThread::DataManagerThread() +{ + manager = nullptr; + isExit = false; + toManager = false; +} + +void DataManagerThread::run() +{ + while(!isExit) + { + qDebug() << "run"; + while(toManager) + { + if(manager) + { + manager->doExcute(); + emit managerFinished(); + } + toManager = false; + manager = nullptr; + } + sleep(1); + } +} + +int DataManagerThread::startManager() +{ + if(!manager || isExit) + return -1; + toManager = true; + return 1; +} diff --git a/datamanagerthread.h b/datamanagerthread.h new file mode 100644 index 0000000..6adb612 --- /dev/null +++ b/datamanagerthread.h @@ -0,0 +1,25 @@ +#ifndef DATAMANAGERTHREAD_H +#define DATAMANAGERTHREAD_H +#include +#include "datamanagerbase.h" + +class DataManagerThread : public QThread +{ + Q_OBJECT +public: + DataManagerThread(); + void setManager(DataManagerBase* m){manager = m;} + int startManager(); + void run() override; + + void exitThread(){isExit = true;} + +signals: + void managerFinished(); +private: + bool isExit; + bool toManager; + DataManagerBase* manager; +}; + +#endif // DATAMANAGERTHREAD_H diff --git a/db/limitupstocksqlmanager.cpp b/db/limitupstocksqlmanager.cpp new file mode 100644 index 0000000..8198bd6 --- /dev/null +++ b/db/limitupstocksqlmanager.cpp @@ -0,0 +1,30 @@ +#include "limitupstocksqlmanager.h" + +LimitUpStockSqlManager::LimitUpStockSqlManager() +{ + +} + +LimitUpStockSqlManager::~LimitUpStockSqlManager() +{ + +} + +QString LimitUpStockSqlManager::toInsertSql(_limitUpStocksInfo stock) +{ + QString sql = QString("insert into stocks_limit_up (code, trade_day) " + "SELECT ':code', ':trade_day' from DUAL where not exists(select code from stocks_limit_up where code = ':code' and trade_day = ':trade_day');"); + sql.replace(":code",stock.code); + sql.replace(":trade_day",stock.tradeDay); + return sql; +} + +QString LimitUpStockSqlManager::toDeleteSql() +{ + return ""; +} + +QString LimitUpStockSqlManager::toQuerySql() +{ + return ""; +} diff --git a/db/limitupstocksqlmanager.h b/db/limitupstocksqlmanager.h new file mode 100644 index 0000000..3e30067 --- /dev/null +++ b/db/limitupstocksqlmanager.h @@ -0,0 +1,18 @@ +#ifndef LIMITUPSTOCKSQLMANAGER_H +#define LIMITUPSTOCKSQLMANAGER_H + +#include "excel/limitupstockdecoder.h" +#include "db/structs.h" + +class LimitUpStockSqlManager +{ +public: + LimitUpStockSqlManager(); + ~LimitUpStockSqlManager(); + + QString toInsertSql(_limitUpStocksInfo stock); + QString toDeleteSql(); + QString toQuerySql(); +}; + +#endif // LIMITUPSTOCKSQLMANAGER_H diff --git a/db/stockbasissqlmanager.cpp b/db/stockbasissqlmanager.cpp new file mode 100644 index 0000000..eb2e24f --- /dev/null +++ b/db/stockbasissqlmanager.cpp @@ -0,0 +1,37 @@ +#include "stockbasissqlmanager.h" + +StockBasisSqlManager::StockBasisSqlManager() +{ + +} + + +StockBasisSqlManager::~StockBasisSqlManager() +{ + +} + +QString StockBasisSqlManager::toInsertSql(_stocksInfo stock) +{ +// insert into stock_basis (code,name,blemind2,blemind3,listdate) value ('301099.SZ','C雅创','电子元件','电子元件','2021-11-22') +// on DUPLICATE key update name = 'Ccv雅创',blemind2='电子元件' + QString sql = QString("insert into stock_basis (code, name, blemind2,blemind3,listdate) " + "value(':code', ':name', ':blemind2',':blemind3',':listdate') on DUPLICATE key " + "update name = ':name',blemind2=':blemind2',blemind3=':blemind3',listdate=':listdate';"); + sql.replace(":code",stock.code); + sql.replace(":name",stock.name); + sql.replace(":blemind2",stock.blemind2); + sql.replace(":blemind3",stock.blemind3); + sql.replace(":listdate",stock.listDate); + return sql; +} + +QString StockBasisSqlManager::toDeleteSql() +{ + return ""; +} + +QString StockBasisSqlManager::toQuerySql() +{ + return ""; +} diff --git a/db/stockbasissqlmanager.h b/db/stockbasissqlmanager.h new file mode 100644 index 0000000..b53cd77 --- /dev/null +++ b/db/stockbasissqlmanager.h @@ -0,0 +1,17 @@ +#ifndef STOCKBASISSQLMANAGER_H +#define STOCKBASISSQLMANAGER_H +#include "excel/stocksdecoder.h" +#include "db/structs.h" + +class StockBasisSqlManager +{ +public: + StockBasisSqlManager(); + ~StockBasisSqlManager(); + + QString toInsertSql(_stocksInfo stock); + QString toDeleteSql(); + QString toQuerySql(); +}; + +#endif // STOCKBASISSQLMANAGER_H diff --git a/db/stockssqlmanager.cpp b/db/stockssqlmanager.cpp new file mode 100644 index 0000000..0aa8e44 --- /dev/null +++ b/db/stockssqlmanager.cpp @@ -0,0 +1,42 @@ +#include "stockssqlmanager.h" + +StocksSqlManager::StocksSqlManager() +{ + +} + +StocksSqlManager::~StocksSqlManager() +{ + +} + +QString StocksSqlManager::toInsertSql(_stocksInfo stock) +{ + QString sql = QString("insert into stocks (code, trade_day, open,close,differrange,trade_days,volumn,amount,differrange10,differrange20,differrange60,avg_volume20,freefloat_market_value,agencies_hold) " + "SELECT ':code', ':trade_day', :open,:close,:differrange_c,:trade_days,:volumn,:amount,:differrange10,:differrange20,:differrange60,:avg_volume20,:freefloat_market_value,:agencies_hold from DUAL where not exists(select code from stocks where code = ':code' and trade_day = ':trade_day' and open = :open);"); + sql.replace(":code",stock.code); + sql.replace(":trade_days",stock.tradeDays); + sql.replace(":trade_day",stock.tradeDay); + sql.replace(":open",stock.open); + sql.replace(":close",stock.close); + sql.replace(":differrange_c",stock.differRange); + sql.replace(":volumn",QString::number(stock.volumn.toDouble())); + sql.replace(":amount",QString::number(stock.amount.toDouble())); + sql.replace(":differrange10",stock.differRangeP10); + sql.replace(":differrange20",stock.differRangeP20); + sql.replace(":differrange60",stock.differRangeP60); + sql.replace(":avg_volume20",QString::number(stock.avgVolume20.toDouble())); + sql.replace(":freefloat_market_value",stock.freeFloatMarketValue); + sql.replace(":agencies_hold",QString::number(stock.agenciesHold.toDouble())); + return sql; +} + +QString StocksSqlManager::toDeleteSql() +{ + return ""; +} + +QString StocksSqlManager::toQuerySql() +{ + return ""; +} diff --git a/db/stockssqlmanager.h b/db/stockssqlmanager.h new file mode 100644 index 0000000..8468e7e --- /dev/null +++ b/db/stockssqlmanager.h @@ -0,0 +1,19 @@ +#ifndef STOCKSSQLMANAGER_H +#define STOCKSSQLMANAGER_H + +#include +#include "excel/stocksdecoder.h" +#include "db/structs.h" + +class StocksSqlManager +{ +public: + StocksSqlManager(); + ~StocksSqlManager(); + + QString toInsertSql(_stocksInfo stock); + QString toDeleteSql(); + QString toQuerySql(); +}; + +#endif // STOCKSSQLMANAGER_H diff --git a/db/structs.h b/db/structs.h new file mode 100644 index 0000000..6d595c2 --- /dev/null +++ b/db/structs.h @@ -0,0 +1,118 @@ +#ifndef STRUCTS_H +#define STRUCTS_H +#include + +typedef struct WholeStocksParam +{ + QString code;//֤ȯ + QString name;//֤ȯ + QString tradeDay;// + QString open;//̼ + QString close;//̼ + QString differRange;//ǵ + QString BLEMIND2;//ƶ + QString differRangeP20;//ǵǰ20գ + QString differRangeP60;//ǵǰ60գ + int isSTStock;//ǷstƱ 0 1 + int isSTXStock;//Ƿst*Ʊ 0 1 + QString listDate;//׷ + QString tradeDaysP;//ɽ + QString volumn;//ɽ + QString amount;//ɽ Ԫ + QString BLEMINDCODE2;//ƶ + QString freeFloatMv;//ֵͨ + QString mvByCSRC;//ֵ֤㷨 + QString avgVolumeP20;//վɽ +}_WholeStocksParam; + +typedef struct HighStocksParam +{ + QString code;//֤ȯ + QString name;//֤ȯ + QString tradeDay;// + QString open;//̼ + QString close;//̼ + QString high;//߼ + QString differRange;//ǵ + QString volumn;//ɽ + QString BLEMIND2;//ƶ + QString HpDateP;//߼ + int isHighRangeP;//Ƿ300¸ +}_HighStocksParam; + +typedef struct HighStockIndexsParam +{ + QString code;//֤ȯ + QString name;//֤ȯ + QString tradeDay;// + QString open;//̼ + QString close;//̼ + QString differRange;//ǵ + int isHighRangeP;//Ƿ250¸ + QString HpDateP;//߼ + int LIMITUPNUM;//ͣ + QString mvByCSRC;//ֵ֤㷨 + int COMPONENTNUM;//ɷݸ +}_HighStockIndexsParam; + +typedef struct limitUpStocksInfo +{ + QString tradeDay;// + QString code;//֤ȯ +}_limitUpStocksInfo; + +typedef struct stocksInfo +{ + QString code;//֤ȯ + QString name;//֤ȯ + QString tradeDay;// + QString open;//̼ + QString close;//̼ + QString differRange;//ǵ + QString blemind2;//ƶ + QString blemind3;// + QString differRangeP10;//ǵǰ20գ + QString differRangeP20;//ǵǰ20գ + QString differRangeP60;//ǵǰ60գ + QString listDate;//׷ + QString tradeDays;//ɽ + QString volumn;//ɽ + QString amount;//ɽ Ԫ + QString freeFloatMarketValue;//ֵͨ + QString totalMarketValue;//ֵ֤㷨 + QString agenciesHold;//ֲռ + QString avgVolume20;//20վɽ +}_stocksInfo; + +typedef struct trendStocks +{ + QString code;//֤ȯ + QString name;//֤ȯ + QString tradeDay;// + QString open;//̼ + QString close;//̼ + QString differRange;//ǵ + QString blemind2;//ƶ + QString blemind3;// + QString differRangeP10;//ǵǰ20գ + QString differRangeP20;//ǵǰ20գ + QString differRangeP60;//ǵǰ60գ + QString tradeDays;//ɽ + QString agenciesHold;//ֲռ + QString type;//"10" or "20" or "60" + QString sort;// +}_trendStocks; + +typedef struct trends +{ + QString blemind2;//ƶ + QString tradeDay;// + QString stocksCount; + QString type;//"10" or "20" or "60" + QString sort = "-1";// + QString sortChanged = "0";// + QString trendsValue = "0";//ֵ + QString trendsValueChanged = "0";//仯ֵ +}_trends; + +#endif // STRUCTS_H diff --git a/db/xhighstockindexs.cpp b/db/xhighstockindexs.cpp new file mode 100644 index 0000000..ee5e4fd --- /dev/null +++ b/db/xhighstockindexs.cpp @@ -0,0 +1,39 @@ +#include "xhighstockindexs.h" + +XHighStockIndexs::XHighStockIndexs(QObject *parent) : QObject(parent) +{ + +} + +XHighStockIndexs::~XHighStockIndexs() +{ + +} + +QString XHighStockIndexs::toInsertSql(_HighStockIndexsParam stock) +{ + QString sql = QString("insert into highstockindexs (code, name, tradeDay,open,close,differRange,isHighRangeP,hpDateP,LIMITUPNUM,mvByCSRC,COMPONENTNUM) " + "SELECT '%1', '%2', '%3',%4,%5,%6,%7,'%8',%9,%10,%11 from DUAL where not exists(select code from highstockindexs where code = '%1' and hpDateP = '%8');") + .arg(stock.code) + .arg(stock.name) + .arg(stock.tradeDay) + .arg(stock.open) + .arg(stock.close) + .arg(stock.differRange) + .arg(stock.isHighRangeP) + .arg(stock.HpDateP) + .arg(stock.LIMITUPNUM) + .arg(stock.mvByCSRC) + .arg(stock.COMPONENTNUM); + return sql; +} + +QString XHighStockIndexs::toDeleteSql() +{ + return ""; +} + +QString XHighStockIndexs::toQuerySql() +{ + return ""; +} diff --git a/db/xhighstockindexs.h b/db/xhighstockindexs.h new file mode 100644 index 0000000..a68eb40 --- /dev/null +++ b/db/xhighstockindexs.h @@ -0,0 +1,21 @@ +#ifndef NHIGHSTOCKINDEXS_H +#define NHIGHSTOCKINDEXS_H + +#include +#include "structs.h" + +class XHighStockIndexs : public QObject +{ + Q_OBJECT +public: + explicit XHighStockIndexs(QObject *parent = nullptr); + ~XHighStockIndexs(); + + QString toInsertSql(_HighStockIndexsParam stock); + QString toDeleteSql(); + QString toQuerySql(); +signals: + +}; + +#endif // NHIGHSTOCKINDEXS_H diff --git a/db/xhighstocks.cpp b/db/xhighstocks.cpp new file mode 100644 index 0000000..b057899 --- /dev/null +++ b/db/xhighstocks.cpp @@ -0,0 +1,39 @@ +#include "xhighstocks.h" + +XHighStocks::XHighStocks(QObject *parent) : QObject(parent) +{ + +} + +XHighStocks::~XHighStocks() +{ + +} + +QString XHighStocks::toInsertSql(_HighStocksParam stock) +{ + QString sql = QString("insert into highstocks (code, name, tradeDay,open,close,high,differRange,volumn,BLEMIND2,hpDateP,isHighRangeP) " + "SELECT '%1', '%2', '%3',%4,%5,%6,%7,%8,'%9','%10',%11 from DUAL where not exists(select code from highstocks where code = '%1' and tradeDay = '%3' and open = %4);") + .arg(stock.code) + .arg(stock.name) + .arg(stock.tradeDay) + .arg(stock.open) + .arg(stock.close) + .arg(stock.high) + .arg(stock.differRange) + .arg(stock.volumn) + .arg(stock.BLEMIND2) + .arg(stock.HpDateP) + .arg(stock.isHighRangeP); + return sql; +} + +QString XHighStocks::toDeleteSql() +{ + return ""; +} + +QString XHighStocks::toQuerySql() +{ + return ""; +} diff --git a/db/xhighstocks.h b/db/xhighstocks.h new file mode 100644 index 0000000..97fd019 --- /dev/null +++ b/db/xhighstocks.h @@ -0,0 +1,21 @@ +#ifndef NHIGHSTOCKS_H +#define NHIGHSTOCKS_H + +#include +#include "structs.h" + +class XHighStocks : public QObject +{ + Q_OBJECT +public: + explicit XHighStocks(QObject *parent = nullptr); + ~XHighStocks(); + + QString toInsertSql(_HighStocksParam stock); + QString toDeleteSql(); + QString toQuerySql(); +signals: + +}; + +#endif // NHIGHSTOCKS_H diff --git a/db/xsqlexcute.cpp b/db/xsqlexcute.cpp new file mode 100644 index 0000000..ab4718e --- /dev/null +++ b/db/xsqlexcute.cpp @@ -0,0 +1,83 @@ +#include "xsqlexcute.h" + +XSqlExcute* XSqlExcute::g_pSqlExc = NULL; +QMutex XSqlExcute::m_mutex; + +XSqlExcute::XSqlExcute(QObject *parent) : QObject(parent) +{ + +} + +XSqlExcute* XSqlExcute::instance() +{ + if (g_pSqlExc == NULL) + { + QMutexLocker locker(&m_mutex); // 加锁 + if (g_pSqlExc == NULL) + { + g_pSqlExc = new XSqlExcute(); + } + } + return g_pSqlExc; +} + +bool XSqlExcute::openMysql(QString hostName,QString databaseName,QString userName,QString password,QString connectionName) +{ + if(QSqlDatabase::contains(connectionName)) + { + return true; + } + else + { + QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL",connectionName); + db.setHostName(hostName); + db.setDatabaseName(databaseName); + db.setUserName(userName); + db.setPassword(password); + return db.open(); + } +} + +bool XSqlExcute::closeMysql() +{ +// if(db.isOpen()) +// db.close(); + return true; +} + +bool XSqlExcute::excuteSQL(QString sql,QString connectionName) +{ + QSqlQuery q(QSqlDatabase::database(connectionName)); + return q.exec(sql); +} + +//查询 +QSqlQuery XSqlExcute::query(QString sql,QString connectionName) +{ + QSqlQuery q(QSqlDatabase::database(connectionName)); + q.exec(sql); + return q; +} + +QSqlRecord XSqlExcute::record(QString sql,QString connectionName) +{ + QSqlQuery q(QSqlDatabase::database(connectionName)); + q.exec(sql); + QSqlRecord r = q.record(); + return r; +} + +//事务 +void XSqlExcute::transaction(QString connectionName) +{ + QSqlDatabase::database(connectionName).transaction(); +} + +void XSqlExcute::commit(QString connectionName) +{ + QSqlDatabase::database(connectionName).commit(); +} +void XSqlExcute::rollback(QString connectionName) +{ + QSqlDatabase::database(connectionName).rollback(); +} diff --git a/db/xsqlexcute.h b/db/xsqlexcute.h new file mode 100644 index 0000000..3e5bcfb --- /dev/null +++ b/db/xsqlexcute.h @@ -0,0 +1,40 @@ +#ifndef XSQLEXCUTE_H +#define XSQLEXCUTE_H + +#include +#include +#include +#include +#include + +class XSqlExcute : public QObject +{ + Q_OBJECT +public: + explicit XSqlExcute(QObject *parent = nullptr); + static XSqlExcute* instance(); + bool openMysql(QString hostName,QString databaseName,QString userName,QString password,QString connectionName); + bool closeMysql(); + //执行语句 + bool excuteSQL(QString sql,QString connectionName); + + //查询 + QSqlQuery query(QString sql,QString connectionName); + QSqlRecord record(QString sql,QString connectionName); + + //事务 + void transaction(QString connectionName); + void commit(QString connectionName); + void rollback(QString connectionName); + +signals: + +private: +// explicit XSqlExcute(QObject *parent = nullptr); +private: + static XSqlExcute* g_pSqlExc; + static QMutex m_mutex; + QSqlDatabase db; +}; + +#endif // XSQLEXCUTE_H diff --git a/db/xwholestockindexs.cpp b/db/xwholestockindexs.cpp new file mode 100644 index 0000000..06052dc --- /dev/null +++ b/db/xwholestockindexs.cpp @@ -0,0 +1,39 @@ +#include "xwholestockindexs.h" + +XWholeStockIndexs::XWholeStockIndexs(QObject *parent) : QObject(parent) +{ + +} + +XWholeStockIndexs::~XWholeStockIndexs() +{ + +} + +QString XWholeStockIndexs::toInsertSql(_WholeStockIndexsParam stockIndex) +{ + QString sql = QString("insert into wholestockindexs (code, name, tradeDay,componentNum,open,close,differRange,volumn,amount,mvByCSRC,freeFloatMv) " + "SELECT '%1', '%2', '%3',%4,%5,%6,'%7',%8,%9,%10,%11 from DUAL where not exists(select code from wholestockindexs where code = '%1' and tradeDay = '%3' and open = %5);") + .arg(stockIndex.code) + .arg(stockIndex.name) + .arg(stockIndex.tradeDay) + .arg(stockIndex.componentNum) + .arg(stockIndex.open) + .arg(stockIndex.close) + .arg(stockIndex.differRange) + .arg(stockIndex.volumn) + .arg(stockIndex.amount) + .arg(stockIndex.mvByCSRC) + .arg(stockIndex.freeFloatMv); + return sql; +} + +QString XWholeStockIndexs::toDeleteSql() +{ + return ""; +} + +QString XWholeStockIndexs::toQuerySql() +{ + return ""; +} diff --git a/db/xwholestockindexs.h b/db/xwholestockindexs.h new file mode 100644 index 0000000..bebe792 --- /dev/null +++ b/db/xwholestockindexs.h @@ -0,0 +1,34 @@ +#ifndef NWHOLEINDEXS_H +#define NWHOLEINDEXS_H + +#include + +class XWholeStockIndexs : public QObject +{ + Q_OBJECT +public: + typedef struct WholeIndexParam + { + QString code;//指数代码 + QString name;//指数名称 + QString tradeDay;//交易日 + QString componentNum;//成份个数 + QString open;//开盘价 + QString close;//收盘价 + QString differRange;//涨跌幅 + QString volumn;//成交量 股 + QString amount;//成交额 万元 + QString mvByCSRC;//总市值证监会算法 百万 + QString freeFloatMv;//自由流通市值 百万 + }_WholeStockIndexsParam; + explicit XWholeStockIndexs(QObject *parent = nullptr); + ~XWholeStockIndexs(); + + QString toInsertSql(_WholeStockIndexsParam stockIndex); + QString toDeleteSql(); + QString toQuerySql(); +signals: + +}; + +#endif // NWHOLEINDEXS_H diff --git a/db/xwholestocks.cpp b/db/xwholestocks.cpp new file mode 100644 index 0000000..2432ea3 --- /dev/null +++ b/db/xwholestocks.cpp @@ -0,0 +1,73 @@ +#include "xwholestocks.h" + +XWholeStocks::XWholeStocks(QObject *parent) : QObject(parent) +{ + +} + +XWholeStocks::~XWholeStocks() +{ + +} + +QString XWholeStocks::toInsertSql(_WholeStocksParam stock) +{ +// QString sql = QString("insert into wholeStocks (code, name, tradeDay,open,close,differRange,BLEMIND2,differRangeP20,differRangeP60,isSTStock,isSTXStock,listDate,tradeDaysP,volumn,amount,BLEMINDCODE2,freeFloatMv,mvByCSRC,avgVolumeP20) " +// "VALUES ('%1', '%2', '%3',%4,%5,%6,'%7',%8,%9,%10,%11,'%12',%13,%14,%15,'%16',%17,%18,%19);") +// .arg(stock.code) +// .arg(stock.name) +// .arg(stock.tradeDay) +// .arg(stock.open) +// .arg(stock.close) +// .arg(stock.differRange) +// .arg(stock.BLEMIND2) +// .arg(stock.differRangeP20) +// .arg(stock.differRangeP60) +// .arg(stock.isSTStock) +// .arg(stock.isSTXStock) +// .arg(stock.listDate) +// .arg(stock.tradeDaysP) +// .arg(stock.volumn) +// .arg(stock.amount) +// .arg(stock.BLEMINDCODE2) +// .arg(stock.freeFloatMv) +// .arg(stock.mvByCSRC) +// .arg(stock.avgVolumeP20); + QString sql = QString("insert into wholeStocks (code, name, tradeDay,open,close,differRange,BLEMIND2,differRangeP20,differRangeP60,isSTStock,isSTXStock,listDate,tradeDaysP,volumn,amount,BLEMINDCODE2,freeFloatMv,mvByCSRC,avgVolumeP20) " + "SELECT '%1', '%2', '%3',%4,%5,%6,'%7',%8,%9,%10,%11,'%12',%13,%14,%15,'%16',%17,%18,%19 from DUAL where not exists(select code from wholeStocks where code = '%1' and tradeDay = '%3' and open = %4);") + .arg(stock.code) + .arg(stock.name) + .arg(stock.tradeDay) + .arg(stock.open) + .arg(stock.close) + .arg(stock.differRange) + .arg(stock.BLEMIND2) + .arg(stock.differRangeP20) + .arg(stock.differRangeP60) + .arg(stock.isSTStock) + .arg(stock.isSTXStock) + .arg(stock.listDate) + .arg(stock.tradeDaysP) + .arg(stock.volumn) + .arg(stock.amount) + .arg(stock.BLEMINDCODE2) + .arg(stock.freeFloatMv) + .arg(stock.mvByCSRC) + .arg(stock.avgVolumeP20); + return sql; +} + +QString XWholeStocks::toDeleteSql() +{ + return ""; +} + +QString XWholeStocks::toQuerySql() +{ + return ""; +} + +QString XWholeStocks::toUpdateSql() +{ + return ""; +} diff --git a/db/xwholestocks.h b/db/xwholestocks.h new file mode 100644 index 0000000..04399a5 --- /dev/null +++ b/db/xwholestocks.h @@ -0,0 +1,25 @@ +#ifndef NWHOLESTOCKS_H +#define NWHOLESTOCKS_H + +#include +#include "structs.h" + +class XWholeStocks : public QObject +{ +public: + Q_OBJECT +public: + explicit XWholeStocks(QObject *parent = nullptr); + ~XWholeStocks(); + + QString toInsertSql(_WholeStocksParam stock); + QString toDeleteSql(); + QString toQuerySql(); + QString toUpdateSql(); + + +signals: + +}; + +#endif // NWHOLESTOCKS_H diff --git a/excel/exceldecoder.cpp b/excel/exceldecoder.cpp new file mode 100644 index 0000000..a3e4d89 --- /dev/null +++ b/excel/exceldecoder.cpp @@ -0,0 +1,6 @@ +#include "exceldecoder.h" + +ExcelDecoder::ExcelDecoder() +{ + +} diff --git a/excel/exceldecoder.h b/excel/exceldecoder.h new file mode 100644 index 0000000..3e8172b --- /dev/null +++ b/excel/exceldecoder.h @@ -0,0 +1,22 @@ +#ifndef EXCELDECODER_H +#define EXCELDECODER_H +#include +#include + +class ExcelDecoder +{ +public: + enum DecoderType{ + none = 0, //当前为空 + stocks = 1, //每日成交数据 + limit_up, //涨停板 + limit_down //跌停板 + }; + + ExcelDecoder(); + virtual DecoderType decoderType(){ return DecoderType::none;} + virtual ~ExcelDecoder(){} + virtual void decode(QList > datas,QString date = ""){} +}; + +#endif // EXCELDECODER_H diff --git a/excel/limitupstockdecoder.cpp b/excel/limitupstockdecoder.cpp new file mode 100644 index 0000000..a23d453 --- /dev/null +++ b/excel/limitupstockdecoder.cpp @@ -0,0 +1,76 @@ +#include "limitupstockdecoder.h" +#include + +LimitUpStockDecoder::LimitUpStockDecoder() +{ + +} + +void LimitUpStockDecoder::decode(QList > edatas,QString date) +{ + if(edatas.count() <= 1) + return; + QList headDatas = edatas.at(0); + data.clear(); + parseStockHead(headDatas); + qDebug() << " datas count :" << edatas.count(); + for (int row = 1; row < edatas.count();row++) + { + QList rowData = edatas.at(row); + _limitUpStocksInfo param; + for(int column = 0; column < rowData.count() ; column++) + { + if(rowData.at(column).toString().isEmpty()) + { + qDebug() << "break"; + break; + } + if(m_wholeStocksKeyIndexs.value(column) == "code") + param.code = rowData.at(column).toString(); + else if(m_wholeStocksKeyIndexs.value(column) == "tradeDay") + param.tradeDay = rowData.at(column).toString(); + } + if(param.code.isEmpty()) + continue; + data.append(param); + } + +} + +QString LimitUpStockDecoder::parseStockHead(QList headDatas) +{ + QString tradeDay = "";//暂时不查询交易日期 + for(int i = 0; i < headDatas.count(); i++) + { + QVariant value = headDatas[i]; + QString headValue = value.toString(); + if(headValue.contains(QStringLiteral("代码"))) + { + m_wholeStocksKeyIndexs.insert(i,"code"); + } + else if(headValue.contains(QStringLiteral("简称"))) + { + m_wholeStocksKeyIndexs.insert(i,"name"); + } + else if(headValue.contains(QStringLiteral("收盘价"))) + { + m_wholeStocksKeyIndexs.insert(i,"close"); + } + else if(headValue.contains(QStringLiteral("所属东财行业指数")) ) + { + m_wholeStocksKeyIndexs.insert(i,"blemind2"); + } + else if(headValue.contains(QStringLiteral("所属东财")) && + !headValue.contains(QStringLiteral("所属东财行业指数"))) + { + m_wholeStocksKeyIndexs.insert(i,"blemind3"); + } + else if(headValue.contains(QStringLiteral("日期"))) + { + m_wholeStocksKeyIndexs.insert(i,"tradeDay"); + } + qDebug() << "parseLimitUpStockHead : " < data; +public: + LimitUpStockDecoder(); + virtual DecoderType decoderType(){ return DecoderType::limit_up;} + virtual ~LimitUpStockDecoder(){} + virtual void decode(QList > edatas,QString date = ""); + +private: + QString parseStockHead(QList headDatas);//解析头 返回交易日 + +private: + QMap m_wholeStocksKeyIndexs; +}; + +#endif // LIMITUPSTOCKDECODER_H diff --git a/excel/stocksdecoder.cpp b/excel/stocksdecoder.cpp new file mode 100644 index 0000000..fcf23ce --- /dev/null +++ b/excel/stocksdecoder.cpp @@ -0,0 +1,234 @@ +#include "stocksdecoder.h" +#include + +StocksDecoder::StocksDecoder() +{ +} + +void StocksDecoder::decode(QList > edatas,QString date) +{ + if(edatas.count() <= 1) + return; + QList headDatas = edatas.at(0); + data.clear(); + QString tradeDay = parseStockHead(headDatas); + if(tradeDay.isEmpty()) + tradeDay = date; + if(!tradeDay.isEmpty()) + { + qDebug() << " datas count :" << edatas.count(); + for (int row = 1; row < edatas.count();row++) + { + QList rowData = edatas.at(row); + _stocksInfo param; + for(int column = 0; column < rowData.count() ; column++) + { + if(rowData.at(column).toString().isEmpty()) + { + qDebug() << "break"; + break; + } + param.tradeDay = tradeDay; + toValueStockInfo(param,column,rowData.at(column).toString()); + } + if(param.code.isEmpty() || param.name.isEmpty()) + continue; + data.append(param); + } + } +} + +QString StocksDecoder::parseStockHead(QList headDatas) +{ + QString tradeDay = "";//ʱѯ + for(int i = 0; i < headDatas.count(); i++) + { + QVariant value = headDatas[i]; + QString headValue = value.toString(); + if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"code"); + } + else if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"name"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { + m_wholeStocksKeyIndexs.insert(i,"open"); +// if(headValue.contains(QStringLiteral(""))) +// { + +// } +// else +// { +// //̼[](2021-05-20)[Ȩʽ]ǰȨ +// int dayStart = headValue.indexOf("("); +// int dayEnd = headValue.indexOf(")"); +// tradeDay = headValue.mid(dayStart+1,dayEnd - dayStart-1); +// } + } + else if(headValue.contains(QStringLiteral("̼"))) + { + m_wholeStocksKeyIndexs.insert(i,"close"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && + !headValue.contains(QStringLiteral("ǰ10")) && + !headValue.contains(QStringLiteral("ǰ20")) && + !headValue.contains(QStringLiteral("ǰ60"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange"); + } + else if(headValue.contains(QStringLiteral("ҵָ")) && + headValue.contains(QStringLiteral("2")) && + !headValue.contains(QStringLiteral("ҵָ"))) + { + m_wholeStocksKeyIndexs.insert(i,"blemind2"); + } + else if(headValue.contains(QStringLiteral("ҵ")) && + headValue.contains(QStringLiteral("3"))) + { + m_wholeStocksKeyIndexs.insert(i,"blemind3"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && + headValue.contains(QStringLiteral("ǰ10"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange10"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && + headValue.contains(QStringLiteral("ǰ20"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange20"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && + headValue.contains(QStringLiteral("ǰ60"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange60"); + } + else if(headValue.contains(QStringLiteral("׷"))) + { + m_wholeStocksKeyIndexs.insert(i,"listDate"); + } + else if(headValue.contains(QStringLiteral("ɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"tradeDays"); + } + else if(headValue.contains(QStringLiteral("ɽ")) && + !headValue.contains(QStringLiteral("վɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"volumn"); + } + else if(headValue.contains(QStringLiteral("ɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"amount"); + } + else if(headValue.contains(QStringLiteral("ֵͨ"))) + { + m_wholeStocksKeyIndexs.insert(i,"freeFloatMarketValue"); + } + else if(headValue.contains(QStringLiteral("ֵ"))) + { + m_wholeStocksKeyIndexs.insert(i,"totalMarketValue"); + } + else if(headValue.contains(QStringLiteral("վɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"avgVolume20"); + } + else if(headValue.contains(QStringLiteral("ֹɱϼ"))) + { + m_wholeStocksKeyIndexs.insert(i,"agenciesHold"); + } + qDebug() << "parseWholeStockHead : " < +#include +#include "db/structs.h" + +class StocksDecoder : public ExcelDecoder +{ +public: + QList<_stocksInfo> data; +public: + StocksDecoder(); + virtual DecoderType decoderType(){ return DecoderType::stocks;} + virtual ~StocksDecoder(){} + virtual void decode(QList > edatas,QString date = ""); + +private: + QString parseStockHead(QList headDatas);//ͷ ؽ + void toValueStockInfo(_stocksInfo ¶m ,int index,QString value); + +private: + QMap m_wholeStocksKeyIndexs; +}; + +#endif // STOCKSDECODER_H diff --git a/excel/xexcel.cpp b/excel/xexcel.cpp new file mode 100644 index 0000000..4cf5c6e --- /dev/null +++ b/excel/xexcel.cpp @@ -0,0 +1,195 @@ +#include "xexcel.h" +#include +#include + +XExcel::XExcel(QObject *parent) : QObject(parent) +{ + m_pExcel = nullptr; + m_pWorkbooks = nullptr; +} +//打开excel com +void XExcel::openExcelCom() +{ + if(m_pExcel == nullptr) + { + m_pExcel = new QAxObject(this); + m_pExcel->setControl("Excel.Application");//连接Excel控件 + qDebug() << "after set control."; + m_pExcel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 + qDebug() << "after set SetVisible."; + m_pExcel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 + qDebug() << "after set DisplayAlerts."; + m_pWorkbooks = m_pExcel->querySubObject("WorkBooks"); + } +} + +//关闭excel com +void XExcel::closeExcelCom() +{ + if(m_pExcel) + { + m_pExcel->dynamicCall("Quit(void)"); + m_pWorkbooks->deleteLater(); + m_pExcel->deleteLater(); + m_pWorkbooks = nullptr; + m_pExcel = nullptr; + } +} + +QList > XExcel::readExcel(QString fileName) +{ + QList > res; + if(m_pExcel == nullptr || m_pWorkbooks == nullptr) + return res; + QAxObject *workbook = m_pWorkbooks->querySubObject("Open (const QString &)", fileName);//获取当前工作簿 + qDebug() << "after workbook."; + QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);//工作表1,即sheet1 + qDebug() << "after Sheets."; + + QVariant var; + if (worksheet != NULL && ! worksheet->isNull()) + { + QAxObject *usedRange = worksheet->querySubObject("UsedRange"); + qDebug() << "after UsedRange."; + if(NULL == usedRange || usedRange->isNull()) + { + qDebug() << "usedRange is null."; + } + var = usedRange->dynamicCall("Value"); + delete usedRange; + } + workbook->dynamicCall("Close(Boolean)", false); +// excel->dynamicCall("Quit(void)"); + //转list + + QVariantList varRows = var.toList(); + if(varRows.isEmpty()) + { + qDebug() << "varRows is empty."; + return res; + } + const int rowCount = varRows.size(); + qDebug() << "rows: " << rowCount; + QVariantList rowData; + for(int i = 0; i < rowCount; ++i) + { + rowData = varRows[i].toList(); + res.push_back(rowData); +// qDebug() << "row index: " << i << " column count: " << rowData.count(); +// for(int c = 0 ; c < rowData.count() ; c++) +// { +// QVariant value = rowData[c]; +// qDebug()<< "row : " << i << " column : " << c << " value : " << value.toString(); +// } + } + return res; + +// qDebug() << " excel file : " << fileName; +// QAxObject* excel = new QAxObject(this); +// excel->setControl("Excel.Application");//连接Excel控件 +// qDebug() << "after set control."; +// excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 +// qDebug() << "after set SetVisible."; +// excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 +// qDebug() << "after set DisplayAlerts."; +// QAxObject *workbooks = excel->querySubObject("WorkBooks"); +// qDebug() << "after WorkBooks."; +// QAxObject *workbook = workbooks->querySubObject("Open (const QString &)", fileName);//获取当前工作簿 +// qDebug() << "after workbook."; +// QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);//工作表1,即sheet1 +// qDebug() << "after Sheets."; + +// QVariant var; +// if (worksheet != NULL && ! worksheet->isNull()) +// { +// QAxObject *usedRange = worksheet->querySubObject("UsedRange"); +// qDebug() << "after UsedRange."; +// if(NULL == usedRange || usedRange->isNull()) +// { +// qDebug() << "usedRange is null."; +// } +// var = usedRange->dynamicCall("Value"); +// delete usedRange; +// } +// workbook->dynamicCall("Close(Boolean)", false); +// excel->dynamicCall("Quit(void)"); +// //转list +// QList > res; +// QVariantList varRows = var.toList(); +// if(varRows.isEmpty()) +// { +// qDebug() << "varRows is empty."; +// return res; +// } +// const int rowCount = varRows.size(); +// qDebug() << "rows: " << rowCount; +// QVariantList rowData; +// for(int i = 0; i < rowCount; ++i) +// { +// rowData = varRows[i].toList(); +// res.push_back(rowData); +// qDebug() << "row index: " << i << " column count: " << rowData.count(); +// for(int c = 0 ; c < rowData.count() ; c++) +// { +// QVariant value = rowData[c]; +// qDebug()<< "row : " << i << " column : " << c << " value : " << value.toString(); +// } +// } +// return res; +} + +void XExcel::readExcels(QList fileNames) +{ + qDebug() << " excel files : " << fileNames; + QAxObject* excel = new QAxObject(this); + excel->setControl("Excel.Application");//连接Excel控件 + qDebug() << "after set control."; + excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体 + qDebug() << "after set SetVisible."; + excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示 + qDebug() << "after set DisplayAlerts."; + QAxObject *workbooks = excel->querySubObject("WorkBooks"); + qDebug() << "after WorkBooks."; + int fileCount = fileNames.count(); + for(int i = 0 ; i < fileCount ; i++) + { + QString fileName = fileNames.at(i); + QAxObject *workbook = workbooks->querySubObject("Open (const QString &)", fileName);//获取当前工作簿 + qDebug() << "after workbook."; + QAxObject *worksheet = workbook->querySubObject("Sheets(int)",1);//工作表1,即sheet1 + qDebug() << "after Sheets."; + + QVariant var; + if (worksheet != NULL && ! worksheet->isNull()) + { + QAxObject *usedRange = worksheet->querySubObject("UsedRange"); + qDebug() << "after UsedRange."; + if(NULL == usedRange || usedRange->isNull()) + { + qDebug() << "usedRange is null."; + } + var = usedRange->dynamicCall("Value"); + delete usedRange; + } + workbook->dynamicCall("Close(Boolean)", false); + + //转list + QList > res; + QVariantList varRows = var.toList(); + if(varRows.isEmpty()) + { + qDebug() << "varRows is empty."; + return; + } + const int rowCount = varRows.size(); + qDebug() << "rows: " << rowCount; + QVariantList rowData; + for(int i = 0; i < rowCount; ++i) + { + rowData = varRows[i].toList(); + res.push_back(rowData); + qDebug() << "row index: " << i << " column count: " << rowData.count(); + } + } + excel->dynamicCall("Quit(void)"); +} diff --git a/excel/xexcel.h b/excel/xexcel.h new file mode 100644 index 0000000..710b7a0 --- /dev/null +++ b/excel/xexcel.h @@ -0,0 +1,27 @@ +#ifndef XEXCEL_H +#define XEXCEL_H + +#include + +class QAxObject; +class XExcel : public QObject +{ + Q_OBJECT +public: + explicit XExcel(QObject *parent = nullptr); + //打开excel com + void openExcelCom(); + //关闭excel com + void closeExcelCom(); + + QList > readExcel(QString fileName); + void readExcels(QList fileNames); + +signals: + +private: + QAxObject* m_pExcel; + QAxObject* m_pWorkbooks; +}; + +#endif // XEXCEL_H diff --git a/historywidget.cpp b/historywidget.cpp new file mode 100644 index 0000000..4c27fa1 --- /dev/null +++ b/historywidget.cpp @@ -0,0 +1,14 @@ +#include "historywidget.h" +#include "ui_historywidget.h" + +HistoryWidget::HistoryWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::HistoryWidget) +{ + ui->setupUi(this); +} + +HistoryWidget::~HistoryWidget() +{ + delete ui; +} diff --git a/historywidget.h b/historywidget.h new file mode 100644 index 0000000..2e72594 --- /dev/null +++ b/historywidget.h @@ -0,0 +1,22 @@ +#ifndef HISTORYWIDGET_H +#define HISTORYWIDGET_H + +#include + +namespace Ui { +class HistoryWidget; +} + +class HistoryWidget : public QWidget +{ + Q_OBJECT + +public: + explicit HistoryWidget(QWidget *parent = nullptr); + ~HistoryWidget(); + +private: + Ui::HistoryWidget *ui; +}; + +#endif // HISTORYWIDGET_H diff --git a/historywidget.ui b/historywidget.ui new file mode 100644 index 0000000..94032a9 --- /dev/null +++ b/historywidget.ui @@ -0,0 +1,22 @@ + + + HistoryWidget + + + + 0 + 0 + 959 + 622 + + + + Form + + + background-color:rgb(0, 0, 255); + + + + + diff --git a/importwidget.cpp b/importwidget.cpp new file mode 100644 index 0000000..9dc25d7 --- /dev/null +++ b/importwidget.cpp @@ -0,0 +1,165 @@ +#include "importwidget.h" +#include "ui_importwidget.h" +#include +#include "db/xsqlexcute.h" +#include "db/xwholestocks.h" +#include "db/xwholestockindexs.h" +#include "db/xhighstocks.h" +#include "db/xhighstockindexs.h" +#include +#include +#include "excel/xexcel.h" +#include "xexceltomysq.h" +#include "excel/stocksdecoder.h" +#include "db/stockssqlmanager.h" +#include "db/stockbasissqlmanager.h" +#include "excel/limitupstockdecoder.h" +#include "db/limitupstocksqlmanager.h" +#include "stocksmanager.h" +#include "loadingdialog.h" +#include "limitupstocksmanager.h" + +ImportWidget::ImportWidget(QWidget* parent) : + QWidget(parent), + ui(new Ui::importWidget) +{ + ui->setupUi(this); +// initData(); + ui->currentDate->setDate(QDate::currentDate()); + +// connect(&dthread,SIGNAL(managerFinished()),) + dthread.start(); + + + if(!QSqlDatabase::contains("importWidget")) + { + db = QSqlDatabase::addDatabase("QMYSQL","importWidget"); + db.setHostName("192.168.0.201"); + db.setDatabaseName("nstocks"); + db.setUserName("admin"); + db.setPassword("1qazse42W3"); + db.open(); + } + importModel = new QSqlQueryModel; + ui->tableView_import->setModel(importModel); +} + +ImportWidget::~ImportWidget() +{ + dthread.terminate(); + delete ui; +} + +void ImportWidget::initData() +{ +// QStandardItemModel* model = new QStandardItemModel(); +// ui->tableView->setModel(model); +// for (int row = 0 ; row < 10; row++) +// { +// for (int col = 0; col < 6; ++col) +// { +// QStandardItem* newItem = new QStandardItem(QString::number(col * row)); +// model->setItem(row, col, newItem); +// } +// } +} + +void ImportWidget::on_pushButton_Stocks_clicked() +{ + QString filePath = QFileDialog::getOpenFileName(this, QStringLiteral("选择全部A股Excel文件"), "",QStringLiteral("Exel file(*.xls *.xlsx)")); + ui->lineEdit->setText(filePath); + if(!filePath.isEmpty()) + { + StocksManager* sm = new StocksManager; + sm->setDataDate(ui->currentDate->date().toString("yyyy-MM-dd")); + sm->setDecodeFile(filePath); + LoadingDialog ld; + connect(&dthread,SIGNAL(managerFinished()),&ld,SLOT(accept())); + dthread.setManager(sm); + dthread.startManager(); + ld.exec(); + } + queryStocks(); + +// XExcel excel; +// excel.openExcelCom(); +// QList > excelDatas = excel.readExcel(filePath); +// excel.closeExcelCom(); + +// QString cdate = ui->currentDate->date().toString("yyyy-MM-dd"); +// //测试stocks +// StocksDecoder* decoder = new StocksDecoder; +// decoder->decode(excelDatas,cdate); +// QList d = decoder->data; +// if(!d.isEmpty()) +// { +// //插入到数据库 +// StocksSqlManager* ssm = new StocksSqlManager; +// XSqlExcute::instance()->transaction(); +// for(int i = 0 ; i < d.count() ; i++) +// { +// QString sql = ssm->toInsertSql(d[i]); +// qDebug() << sql; +// XSqlExcute::instance()->query(sql); +// } +// XSqlExcute::instance()->commit(); +// } +} + +void ImportWidget::on_pushButton_LimitUp_clicked() +{ + QString filePath = QFileDialog::getOpenFileName(this, QStringLiteral("选择涨停板Excel文件"), "",QStringLiteral("Exel file(*.xls *.xlsx)")); + ui->lineEdit->setText(filePath); + if(!filePath.isEmpty()) + { + LimitUpStocksManager* sm = new LimitUpStocksManager; + sm->setDataDate(ui->currentDate->date().toString("yyyy-MM-dd")); + sm->setDecodeFile(filePath); + LoadingDialog ld; + connect(&dthread,SIGNAL(managerFinished()),&ld,SLOT(accept())); + dthread.setManager(sm); + dthread.startManager(); + ld.exec(); + } + queryLimitUp(); +} + +void ImportWidget::queryLimitUp() +{ + importModel->setQuery(QString("select * from stocks_limit_up where trade_day ='%1'").arg(ui->currentDate->date().toString("yyyy-MM-dd")),db); + importModel->setHeaderData(0, Qt::Horizontal, QObject::tr("id")); + importModel->setHeaderData(1, Qt::Horizontal, QObject::tr("code")); + importModel->setHeaderData(2, Qt::Horizontal, QObject::tr("trade_day")); +} + +void ImportWidget::queryStocks() +{ + importModel->setQuery(QString("select * from stocks where trade_day ='%1'").arg(ui->currentDate->date().toString("yyyy-MM-dd")),db); + importModel->setHeaderData(0, Qt::Horizontal, QObject::tr("id")); + importModel->setHeaderData(1, Qt::Horizontal, QObject::tr("code")); + importModel->setHeaderData(2, Qt::Horizontal, QObject::tr("trade_day")); + importModel->setHeaderData(3, Qt::Horizontal, QObject::tr("open")); + importModel->setHeaderData(4, Qt::Horizontal, QObject::tr("close")); + importModel->setHeaderData(5, Qt::Horizontal, QObject::tr("differrange")); + importModel->setHeaderData(6, Qt::Horizontal, QObject::tr("trade_days")); + importModel->setHeaderData(7, Qt::Horizontal, QObject::tr("volumn")); + importModel->setHeaderData(8, Qt::Horizontal, QObject::tr("amount")); + importModel->setHeaderData(9, Qt::Horizontal, QObject::tr("differrange10")); + importModel->setHeaderData(10, Qt::Horizontal, QObject::tr("differrange20")); + importModel->setHeaderData(11, Qt::Horizontal, QObject::tr("differrange60")); + importModel->setHeaderData(12, Qt::Horizontal, QObject::tr("avg_volume20")); + importModel->setHeaderData(13, Qt::Horizontal, QObject::tr("freefloat_market_value")); + importModel->setHeaderData(14, Qt::Horizontal, QObject::tr("total_market_value")); + importModel->setHeaderData(15, Qt::Horizontal, QObject::tr("agencies_hold")); + +} + +void ImportWidget::on_pushButton_LimitUp_query_clicked() +{ + queryLimitUp(); +} + +void ImportWidget::on_pushButton_Stocks_query_clicked() +{ + queryStocks(); +} diff --git a/importwidget.h b/importwidget.h new file mode 100644 index 0000000..183bb7a --- /dev/null +++ b/importwidget.h @@ -0,0 +1,41 @@ +#ifndef IMPORTWIDGET_H +#define IMPORTWIDGET_H + +#include +#include "datamanagerthread.h" +#include + +namespace Ui +{ + class importWidget; +} + +class ImportWidget : public QWidget +{ + Q_OBJECT + +public: + explicit ImportWidget(QWidget* parent = nullptr); + ~ImportWidget(); + void initData(); + +private slots: + void on_pushButton_Stocks_clicked(); + + void on_pushButton_LimitUp_clicked(); + + void on_pushButton_LimitUp_query_clicked(); + + void on_pushButton_Stocks_query_clicked(); + +private: + void queryLimitUp(); + void queryStocks(); +private: + Ui::importWidget* ui; + DataManagerThread dthread; + QSqlDatabase db; + QSqlQueryModel *importModel; +}; + +#endif // IMPORTWIDGET_H diff --git a/importwidget.ui b/importwidget.ui new file mode 100644 index 0000000..682815e --- /dev/null +++ b/importwidget.ui @@ -0,0 +1,113 @@ + + + importWidget + + + + 0 + 0 + 938 + 580 + + + + Form + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + 40 + 16777215 + + + + 日期 + + + + + + + + + + + 40 + 16777215 + + + + 文件 + + + + + + + 查询个股 + + + + + + + 导入涨停板 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 导入个股 + + + + + + + 查询涨停板 + + + + + + + false + + + + + + + + + + + + + + diff --git a/libmysql.dll b/libmysql.dll new file mode 100644 index 0000000..17b2f9a Binary files /dev/null and b/libmysql.dll differ diff --git a/libmysql.lib b/libmysql.lib new file mode 100644 index 0000000..e325a34 Binary files /dev/null and b/libmysql.lib differ diff --git a/limitupstocksmanager.cpp b/limitupstocksmanager.cpp new file mode 100644 index 0000000..9d1b210 --- /dev/null +++ b/limitupstocksmanager.cpp @@ -0,0 +1,63 @@ +#include "limitupstocksmanager.h" +#include "db/xsqlexcute.h" +#include "db/xwholestocks.h" +#include "db/xwholestockindexs.h" +#include "db/xhighstocks.h" +#include "db/xhighstockindexs.h" +#include +#include +#include "excel/xexcel.h" +#include "xexceltomysq.h" +#include "excel/stocksdecoder.h" +#include "db/stockssqlmanager.h" +#include "db/stockbasissqlmanager.h" +#include "excel/limitupstockdecoder.h" +#include "db/limitupstocksqlmanager.h" + +LimitUpStocksManager::LimitUpStocksManager() +{ + +} + +void LimitUpStocksManager::doExcute() +{ + decodeToMysql(); +} + +void LimitUpStocksManager::decodeToMysql() +{ + qDebug() << "LimitUpStocksManager decodeToMysql"; + XExcel excel; + excel.openExcelCom(); + QList > excelDatas = excel.readExcel(getDecodeFile()); + excel.closeExcelCom(); + + QString cdate = getDataDate(); + //测试stocks + LimitUpStockDecoder* decoder = new LimitUpStockDecoder; + decoder->decode(excelDatas); + QList<_limitUpStocksInfo> d = decoder->data; + if(!d.isEmpty()) + { + //插入到数据库 + LimitUpStockSqlManager* lusm = new LimitUpStockSqlManager; + XSqlExcute* sqlIns = new XSqlExcute; + sqlIns->openMysql("192.168.0.201","nstocks","admin","1qazse42W3","LimitUpStockSqlManager"); + sqlIns->transaction("LimitUpStockSqlManager"); + int count = d.count(); + for(int i = 0 ; i < count ; i++) + { + QString sql = lusm->toInsertSql(d[i]); + qDebug() << sql; + sqlIns->query(sql,"LimitUpStockSqlManager"); + } + sqlIns->commit("LimitUpStockSqlManager"); + sqlIns->closeMysql(); + sqlIns->deleteLater(); + } +} + +void LimitUpStocksManager::getDataFromMysql() +{ + +} diff --git a/limitupstocksmanager.h b/limitupstocksmanager.h new file mode 100644 index 0000000..ec66910 --- /dev/null +++ b/limitupstocksmanager.h @@ -0,0 +1,18 @@ +#ifndef LIMITUPSTOCKSMANAGER_H +#define LIMITUPSTOCKSMANAGER_H +#include "datamanagerbase.h" + + +class LimitUpStocksManager : public DataManagerBase +{ +public: + LimitUpStocksManager(); + + virtual void doExcute(); + + virtual void decodeToMysql(); + + virtual void getDataFromMysql(); +}; + +#endif // LIMITUPSTOCKSMANAGER_H diff --git a/loadingdialog.cpp b/loadingdialog.cpp new file mode 100644 index 0000000..0c1e6d0 --- /dev/null +++ b/loadingdialog.cpp @@ -0,0 +1,21 @@ +#include "loadingdialog.h" +#include "ui_loadingdialog.h" +#include + +LoadingDialog::LoadingDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::LoadingDialog) +{ + ui->setupUi(this); + this->setWindowFlag(Qt::FramelessWindowHint); + this->setAttribute(Qt::WA_TranslucentBackground); + QMovie *movie = new QMovie(":/resource/loading2.gif"); + ui->label->setMovie(movie); + movie->start(); + +} + +LoadingDialog::~LoadingDialog() +{ + delete ui; +} diff --git a/loadingdialog.h b/loadingdialog.h new file mode 100644 index 0000000..b2cc2c0 --- /dev/null +++ b/loadingdialog.h @@ -0,0 +1,22 @@ +#ifndef LOADINGDIALOG_H +#define LOADINGDIALOG_H + +#include + +namespace Ui { +class LoadingDialog; +} + +class LoadingDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LoadingDialog(QWidget *parent = nullptr); + ~LoadingDialog(); + +private: + Ui::LoadingDialog *ui; +}; + +#endif // LOADINGDIALOG_H diff --git a/loadingdialog.ui b/loadingdialog.ui new file mode 100644 index 0000000..6bea8d3 --- /dev/null +++ b/loadingdialog.ui @@ -0,0 +1,37 @@ + + + LoadingDialog + + + + 0 + 0 + 750 + 750 + + + + Dialog + + + + + 0 + 0 + 750 + 750 + + + + + + + :/resource/loading2.gif + + + + + + + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..fd3e533 --- /dev/null +++ b/main.cpp @@ -0,0 +1,11 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..e7b1330 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,229 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "db/xsqlexcute.h" +#include "db/xwholestocks.h" +#include "db/xwholestockindexs.h" +#include "db/xhighstocks.h" +#include "db/xhighstockindexs.h" +#include +#include +#include "excel/xexcel.h" +#include "xexceltomysq.h" +#include "excel/stocksdecoder.h" +#include "db/stockssqlmanager.h" +#include "db/stockbasissqlmanager.h" +#include "excel/limitupstockdecoder.h" +#include "db/limitupstocksqlmanager.h" +#include "loadingdialog.h" + +MainWindow::MainWindow(QWidget* parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); +// m_importWidget = new ImportWidget; + m_todayWidget = new TodayWidget; + m_historyWidget = new HistoryWidget; + m_importWidget = ui->iwidget; + +// QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); +// db.setHostName("127.0.0.1"); +// db.setDatabaseName("nstocks"); +// db.setUserName("admin"); +// db.setPassword("1qazse42W3"); +// db.open(); +// XSqlExcute::instance()->openMysql("127.0.0.1","nstocks","admin","1qazse42W3"); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::testStocks() +{ + QString filePath = QFileDialog::getOpenFileName(this, QStringLiteral("ѡExcelļ"), "",QStringLiteral("Exel file(*.xls *.xlsx)")); + XExcel excel; + excel.openExcelCom(); + QList > excelDatas = excel.readExcel(filePath); + excel.closeExcelCom(); + + //stocks + StocksDecoder* decoder = new StocksDecoder; + decoder->decode(excelDatas,"2021-11-25"); + QList<_stocksInfo> d = decoder->data; + if(!d.isEmpty()) + { + qDebug() << d[0].code << " " + << d[0].name << " " + << d[0].tradeDay << " " + << d[0].open << " " + << d[0].close << " " + << d[0].differRange << " " + << d[0].blemind2 << " " + << d[0].blemind3 << " " + << d[0].differRangeP10 << " " + << d[0].differRangeP20 << " " + << d[0].differRangeP60 << " " + << d[0].listDate << " " + << d[0].tradeDays << " " + << d[0].volumn << " " + << d[0].amount << " " + << d[0].freeFloatMarketValue << " " + << d[0].totalMarketValue << " " + << d[0].agenciesHold << " " + << d[0].avgVolume20; + //뵽ݿ + StocksSqlManager* ssm = new StocksSqlManager; + QString sql = ssm->toInsertSql(d[0]); + qDebug() << "sql : " << sql; + StockBasisSqlManager* sbsm = new StockBasisSqlManager; + QString bsql = sbsm->toInsertSql(d[0]); + qDebug() << "bsql : " << bsql; + } + return; +} + +void MainWindow::testLimitUpStocks() +{ + QString filePath = QFileDialog::getOpenFileName(this, QStringLiteral("ѡExcelļ"), "",QStringLiteral("Exel file(*.xls *.xlsx)")); + XExcel excel; + excel.openExcelCom(); + QList > excelDatas = excel.readExcel(filePath); + excel.closeExcelCom(); + //limitup + LimitUpStockDecoder* decoder = new LimitUpStockDecoder; + decoder->decode(excelDatas); + QList<_limitUpStocksInfo> d = decoder->data; + if(!d.isEmpty()) + { + qDebug() << d[0].code << " " + << d[0].tradeDay << " "; + //뵽ݿ + LimitUpStockSqlManager* ssm = new LimitUpStockSqlManager; + QString sql = ssm->toInsertSql(d[0]); + qDebug() << "sql : " << sql; + } + return; +} + +void MainWindow::on_pushButton_import_clicked() +{ +} + +void MainWindow::on_pushButton_today_clicked() +{ +} + +void MainWindow::on_pushButton_history_clicked() +{ +} + + +void MainWindow::on_pushButton_7_clicked() +{ + LoadingDialog ld; + ld.exec(); + return; + testStocks(); + return; + // QList fileNames; + QString filePath = QFileDialog::getOpenFileName(this, QStringLiteral("ѡExcelļ"), "",QStringLiteral("Exel file(*.xls *.xlsx)")); + // fileNames.append(filePath); + // filePath = QFileDialog::getOpenFileName(this, QStringLiteral("ѡExcelļ"), "",QStringLiteral("Exel file(*.xls *.xlsx)")); + // fileNames.append(filePath); + XExcel excel; + excel.openExcelCom(); + // excel.readExcels(fileNames); + QList > excelDatas = excel.readExcel(filePath); + excel.closeExcelCom(); + + XStocksDataParser stocksParser; + if(filePath.contains(QStringLiteral("ԭʼ"))) + { + //ȫA + QList<_WholeStocksParam> wholeStocks = stocksParser.parseWholeStocks(excelDatas); + if(wholeStocks.count() > 0) + { + qDebug() << " wholeStocks count :" << wholeStocks.count(); + XWholeStocks stock; + XSqlExcute::instance()->transaction("mainWindow"); + for(int i = 0 ; i < wholeStocks.count() ; i++) + { + _WholeStocksParam wp = wholeStocks.at(i); + QString sql = stock.toInsertSql(wp); + qDebug() << sql; + XSqlExcute::instance()->query(sql,"mainWindow"); + } + XSqlExcute::instance()->commit("mainWindow"); + + //ͳֵ + QString totalSql = QString("INSERT INTO wholeaindex (tradeDay,COMPONENTNUM,amount,freeFloatMv,mvByCSRC) " + "SELECT tradeDay,COUNT(`code`),SUM(amount ),SUM(freeFloatMv),SUM(mvByCSRC)" + "FROM wholestocks WHERE tradeDay = '%1';").arg(wholeStocks.at(0).tradeDay); + XSqlExcute::instance()->transaction("mainWindow"); + XSqlExcute::instance()->query(totalSql,"mainWindow"); + XSqlExcute::instance()->commit("mainWindow"); + + } + } + else if(filePath.contains(QStringLiteral("ƶҵָÿճɽ"))) + { + //ȫָ + QList wholeStockIndexs = stocksParser.parseWholeStockIndexs(excelDatas); + if(wholeStockIndexs.count() > 0) + { + qDebug() << " wholeStocks count :" << wholeStockIndexs.count(); + XWholeStockIndexs stockIndex; + XSqlExcute::instance()->transaction("mainWindow"); + for(int i = 0 ; i < wholeStockIndexs.count() ; i++) + { + XWholeStockIndexs::_WholeStockIndexsParam wp = wholeStockIndexs.at(i); + QString sql = stockIndex.toInsertSql(wp); + qDebug() << sql; + XSqlExcute::instance()->query(sql,"mainWindow"); + } + XSqlExcute::instance()->commit("mainWindow"); + } + } + else if(filePath.contains(QStringLiteral("300¸"))) + { + //¸߸ + QList<_HighStocksParam> wholeStockIndexs = stocksParser.parseHightStocks(excelDatas); + if(wholeStockIndexs.count() > 0) + { + qDebug() << " wholeStocks count :" << wholeStockIndexs.count(); + XHighStocks stockIndex; + XSqlExcute::instance()->transaction("mainWindow"); + for(int i = 0 ; i < wholeStockIndexs.count() ; i++) + { + _HighStocksParam wp = wholeStockIndexs.at(i); + QString sql = stockIndex.toInsertSql(wp); + qDebug() << sql; + XSqlExcute::instance()->query(sql,"mainWindow"); + } + XSqlExcute::instance()->commit("mainWindow"); + } + } + else if(filePath.contains(QStringLiteral("ƶ250¸"))) + { + //¸ָ + QList<_HighStockIndexsParam> wholeStockIndexs = stocksParser.parseHightStockIndexs(excelDatas); + if(wholeStockIndexs.count() > 0) + { + qDebug() << " wholeStocks count :" << wholeStockIndexs.count(); + XHighStockIndexs stockIndex; + XSqlExcute::instance()->transaction("mainWindow"); + for(int i = 0 ; i < wholeStockIndexs.count() ; i++) + { + _HighStockIndexsParam wp = wholeStockIndexs.at(i); + QString sql = stockIndex.toInsertSql(wp); + qDebug() << sql; + XSqlExcute::instance()->query(sql,"mainWindow"); + } + XSqlExcute::instance()->commit("mainWindow"); + } + } + +} + diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..9d517cf --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,42 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include "importwidget.h" +#include "todaywidget.h" +#include "historywidget.h" + +QT_BEGIN_NAMESPACE +namespace Ui +{ + class MainWindow; +} +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget* parent = nullptr); + ~MainWindow(); + +private slots: + void on_pushButton_import_clicked(); + + void on_pushButton_today_clicked(); + + void on_pushButton_history_clicked(); + + void on_pushButton_7_clicked(); + +private: + void testStocks(); + void testLimitUpStocks(); +private: + Ui::MainWindow* ui; + ImportWidget* m_importWidget; + TodayWidget* m_todayWidget; + HistoryWidget* m_historyWidget; +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..a171b2c --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,149 @@ + + + MainWindow + + + + 0 + 0 + 1294 + 701 + + + + MainWindow + + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + + + + 0 + + + + 导入数据 + + + + + 动量分析 + + + + + + + + + + + + + 0 + 0 + 1294 + 25 + + + + + 开始 + + + + + + + + + + + + 配置 + + + + + 帮助 + + + + + + + + + + 导入全A股票 + + + + + 关于我们 + + + + + 导入东财指数 + + + + + 批量导入 + + + + + 导入涨跌停 + + + + + 导入板块创新高 + + + + + 导入个股创新高 + + + + + + ImportWidget + QWidget +
importwidget.h
+ 1 +
+ + trendWidet + QWidget +
trendwidet.h
+ 1 +
+
+ + +
diff --git a/resource.qrc b/resource.qrc new file mode 100644 index 0000000..5b4f586 --- /dev/null +++ b/resource.qrc @@ -0,0 +1,6 @@ + + + resource/loading.gif + resource/loading2.gif + + diff --git a/resource/loading.gif b/resource/loading.gif new file mode 100644 index 0000000..950df16 Binary files /dev/null and b/resource/loading.gif differ diff --git a/resource/loading2.gif b/resource/loading2.gif new file mode 100644 index 0000000..37381ae Binary files /dev/null and b/resource/loading2.gif differ diff --git a/stockWolf.pro b/stockWolf.pro new file mode 100644 index 0000000..773c819 --- /dev/null +++ b/stockWolf.pro @@ -0,0 +1,92 @@ +QT += core gui charts sql axcontainer + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++11 + +# The following define makes your compiler emit warnings if you use +# any Qt feature that has been marked deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + datamanagerthread.cpp \ + db/limitupstocksqlmanager.cpp \ + db/stockbasissqlmanager.cpp \ + db/stockssqlmanager.cpp \ + db/xhighstockindexs.cpp \ + db/xhighstocks.cpp \ + db/xsqlexcute.cpp \ + db/xwholestockindexs.cpp \ + db/xwholestocks.cpp \ + excel/exceldecoder.cpp \ + excel/limitupstockdecoder.cpp \ + excel/stocksdecoder.cpp \ + limitupstocksmanager.cpp \ + loadingdialog.cpp \ + stocksmanager.cpp \ + trendmanager.cpp \ + trendtablemodel.cpp \ + trendwidet.cpp \ + widget/distributewidget.cpp \ + historywidget.cpp \ + importwidget.cpp \ + main.cpp \ + mainwindow.cpp \ + todaywidget.cpp \ + excel/xexcel.cpp \ + xexceltomysq.cpp + +HEADERS += \ + datamanagerbase.h \ + datamanagerthread.h \ + db/limitupstocksqlmanager.h \ + db/stockbasissqlmanager.h \ + db/stockssqlmanager.h \ + db/structs.h \ + db/xhighstockindexs.h \ + db/xhighstocks.h \ + db/xsqlexcute.h \ + db/xwholestockindexs.h \ + db/xwholestocks.h \ + excel/exceldecoder.h \ + excel/limitupstockdecoder.h \ + excel/stocksdecoder.h \ + limitupstocksmanager.h \ + loadingdialog.h \ + loadingdialog.h \ + stocksmanager.h \ + trendmanager.h \ + trendtablemodel.h \ + trendwidet.h \ + widget/distributewidget.h \ + historywidget.h \ + importwidget.h \ + mainwindow.h \ + todaywidget.h \ + excel/xexcel.h \ + xexceltomysq.h + +FORMS += \ + loadingdialog.ui \ + trendwidet.ui \ + widget/distributewidget.ui \ + historywidget.ui \ + importwidget.ui \ + mainwindow.ui \ + todaywidget.ui + +RESOURCES += \ + resource.qrc + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + diff --git a/stocksmanager.cpp b/stocksmanager.cpp new file mode 100644 index 0000000..88addbf --- /dev/null +++ b/stocksmanager.cpp @@ -0,0 +1,69 @@ +#include "stocksmanager.h" +#include "db/xsqlexcute.h" +#include "db/xwholestocks.h" +#include "db/xwholestockindexs.h" +#include "db/xhighstocks.h" +#include "db/xhighstockindexs.h" +#include +#include +#include "excel/xexcel.h" +#include "xexceltomysq.h" +#include "excel/stocksdecoder.h" +#include "db/stockssqlmanager.h" +#include "db/stockbasissqlmanager.h" +#include "excel/limitupstockdecoder.h" +#include "db/limitupstocksqlmanager.h" + +StocksManager::StocksManager() +{ + +} + +void StocksManager::doExcute() +{ + decodeToMysql(); +} + +void StocksManager::decodeToMysql() +{ + qDebug() << "StocksManager decodeToMysql"; + XExcel excel; + excel.openExcelCom(); + QList > excelDatas = excel.readExcel(getDecodeFile()); + excel.closeExcelCom(); + + QString cdate = getDataDate(); + //测试stocks + StocksDecoder* decoder = new StocksDecoder; + decoder->decode(excelDatas,cdate); + QList<_stocksInfo> d = decoder->data; + if(!d.isEmpty()) + { + //插入到数据库 + StocksSqlManager* ssm = new StocksSqlManager; + StockBasisSqlManager* sbsm = new StockBasisSqlManager; +// XSqlExcute::instance()->transaction(); + XSqlExcute* sqlIns = new XSqlExcute; + sqlIns->openMysql("192.168.0.201","nstocks","admin","1qazse42W3","StockBasisSqlManager"); +// sqlIns->transaction("StockBasisSqlManager"); + int count = d.count(); + for(int i = 0 ; i < count ; i++) + { + QString sql = ssm->toInsertSql(d[i]); + qDebug() << sql; +// XSqlExcute::instance()->query(sql); + sqlIns->query(sql,"StockBasisSqlManager"); + sql = sbsm->toInsertSql(d[i]); + qDebug() << sql; + sqlIns->query(sql,"StockBasisSqlManager"); + } +// XSqlExcute::instance()->commit(); +// sqlIns->commit("StockBasisSqlManager"); + sqlIns->deleteLater(); + } +} + +void StocksManager::getDataFromMysql() +{ + +} diff --git a/stocksmanager.h b/stocksmanager.h new file mode 100644 index 0000000..32b53a6 --- /dev/null +++ b/stocksmanager.h @@ -0,0 +1,17 @@ +#ifndef STOCKSMANAGER_H +#define STOCKSMANAGER_H +#include "datamanagerbase.h" + +class StocksManager : public DataManagerBase +{ +public: + StocksManager(); + + virtual void doExcute(); + + virtual void decodeToMysql(); + + virtual void getDataFromMysql(); +}; + +#endif // STOCKSMANAGER_H diff --git a/todaywidget.h b/todaywidget.h new file mode 100644 index 0000000..88f0ceb --- /dev/null +++ b/todaywidget.h @@ -0,0 +1,22 @@ +#ifndef TODAYWIDGET_H +#define TODAYWIDGET_H + +#include + +namespace Ui { +class TodayWidget; +} + +class TodayWidget : public QWidget +{ + Q_OBJECT + +public: + explicit TodayWidget(QWidget *parent = nullptr); + ~TodayWidget(); + +private: + Ui::TodayWidget *ui; +}; + +#endif // TODAYWIDGET_H diff --git a/todaywidget.ui b/todaywidget.ui new file mode 100644 index 0000000..88ab173 --- /dev/null +++ b/todaywidget.ui @@ -0,0 +1,63 @@ + + + TodayWidget + + + + 0 + 0 + 1121 + 654 + + + + Form + + + + 0 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + 3 + + + + 涨跌分布 + + + + + 热点板块 + + + + + 指数涨跌 + + + + + 资金流向 + + + + + + + + + diff --git a/trendmanager.cpp b/trendmanager.cpp new file mode 100644 index 0000000..8bfe39a --- /dev/null +++ b/trendmanager.cpp @@ -0,0 +1,232 @@ +#include "trendmanager.h" +#include "db/xsqlexcute.h" +#include +#include + +TrendManager::TrendManager() +{ +} + +TrendManager::~TrendManager() +{ +} + +void TrendManager::doExcute() +{ + if(toExcuteType() == decode) + { + decodeToMysql(); + } + else if(toExcuteType() == getData) + { + getDataFromMysql(); + } +} + +void TrendManager::decodeToMysql() +{ + +// QString sql = QString("insert into stock_basis (code, name, blemind2,blemind3,listdate) " +// "value(':code', ':name', ':blemind2',':blemind3',':listdate') on DUPLICATE key " +// "update name = ':name',blemind2=':blemind2',blemind3=':blemind3',listdate=':listdate';"); +// sql.replace(":code",stock.code); +// sql.replace(":name",stock.name); +// sql.replace(":blemind2",stock.blemind2); +// sql.replace(":blemind3",stock.blemind3); +// sql.replace(":listdate",stock.listDate); + QList<_trendStocks> d = trendStocksDatas; + if(!d.isEmpty()) + { + //插入到数据库 + XSqlExcute* sqlIns = new XSqlExcute; + sqlIns->openMysql("192.168.0.201","nstocks","admin","1qazse42W3","TrendManager"); + sqlIns->transaction("TrendManager"); + int count = d.count(); + QString sql = ""; + for(int i = 0 ; i < count ; i++) + { + sql = QString("insert into stocks_in_trend (code, trade_day, sort,type) " + "value(':code', ':trade_day', :sort,':type') on DUPLICATE key " + "update code = ':code',trade_day=':trade_day',sort=:sort,type=':type';"); + sql.replace(":code",d[i].code); + sql.replace(":trade_day",d[i].tradeDay); + sql.replace(":sort",d[i].sort); + sql.replace(":type",d[i].type); + + qDebug() << sql; + sqlIns->query(sql,"TrendManager"); + } +// XSqlExcute::instance()->commit(); + sqlIns->commit("TrendManager"); + + //获取板块成分数据 + sql = QString("select b.blemind2 as blemind2 , COUNT(s.code) as count from stocks s, stock_basis b where trade_day = '%1' and s.code = b.code GROUP BY b.blemind2;").arg(getParam("date")); + QSqlQuery q = sqlIns->query(sql,"TrendManager"); + qDebug() << "TrendManager bleminds : count : " << q.size(); + while (q.next()) + { + QString blemind2 = q.value("blemind2").toString(); + QString count = q.value("count").toString(); + blemind2StockCounts.insert(blemind2,count); + qDebug()<< "blemind2: " <query(sql,"TrendManager"); + qDebug() << "TrendManager stocks_in_trend bleminds : count : " << q.size(); + while (q.next()) + { + trends t; + t.blemind2 = q.value("blemind2").toString(); + t.stocksCount = q.value("count").toString(); + t.tradeDay = getParam("date"); + t.type = getParam("type"); + double tvalue = (double)t.stocksCount.toInt()*(double)t.stocksCount.toInt()/(double)blemind2StockCounts[t.blemind2].toInt(); + t.trendsValue = QString::number(tvalue); + trendsDatas.insert(t.blemind2,t); + qDebug()<< "stocks_in_trend blemind2: " < i(trendsDatas); + while (i.hasNext()) + { + i.next(); + sql = QString("insert into trends (blemind2, trade_day, stocks_count,trend_value,trend_value_change,sort,sort_change,type) " + "value(':blemind2', ':trade_day', :stocks_count,:trend_value,:trendValueChange,:sort,:SortChange,':type') on DUPLICATE key " + "update blemind2 = ':blemind2',trade_day=':trade_day',stocks_count=:stocks_count,trend_value=:trend_value,trend_value_change=:trendValueChange,sort=:sort,sort_change=:SortChange,type=':type';"); + sql.replace(":blemind2",i.value().blemind2); + sql.replace(":trade_day",i.value().tradeDay); + sql.replace(":stocks_count",i.value().stocksCount); + sql.replace(":trend_value",i.value().trendsValue); + sql.replace(":trendValueChange",i.value().trendsValueChanged); + sql.replace(":sort",i.value().sort); + sql.replace(":SortChange",i.value().sortChanged); + sql.replace(":type",i.value().type); + + qDebug() << sql; + sqlIns->query(sql,"TrendManager"); + } + + //重新查询,并排序 + sql = QString("select blemind2 ,trend_value from trends s where trade_day = '%1' ORDER BY trend_value DESC;").arg(getParam("date")); + q = sqlIns->query(sql,"TrendManager"); + qDebug() << "TrendManager trends bleminds : count : " << q.size(); + QDate lastDate = QDate::fromString(getParam("date"),"yyyy-MM-dd"); + + QString lastDateStr = lastDate.addDays(-1).toString("yyyy-MM-dd"); + int sort = 1; + QString tvSql = ""; + while (q.next()) + { + QString blemind2 = q.value("blemind2").toString(); + if(trendsDatas.contains(blemind2)) + { + trendsDatas[blemind2].sort = QString::number(sort++); + + tvSql = QString("select trend_value,sort from trends where blemind2 = '%1' and trade_day = '%2' and type = '%3'") + .arg(blemind2).arg(lastDateStr).arg(getParam("type")); + QSqlQuery tvq = sqlIns->query(tvSql,"TrendManager"); + if(tvq.next()) + { + double lastTrendValue = tvq.value("trend_value").toDouble(); + int lastSort = tvq.value("sort").toInt(); + trendsDatas[blemind2].sortChanged = QString::number(lastSort - trendsDatas[blemind2].sort.toInt()); + trendsDatas[blemind2].trendsValueChanged = QString::number(trendsDatas[blemind2].trendsValue.toDouble() - lastTrendValue); + } + else + { + trendsDatas[blemind2].sortChanged = "0"; + trendsDatas[blemind2].trendsValueChanged = trendsDatas[blemind2].trendsValue; + } + + //更新到数据库 + sql = QString("update trends set sort = %1 , trend_value_change = %4,sort_change = %5 where blemind2 = '%2' and type = '%3' and trade_day = '%6';") + .arg(trendsDatas[blemind2].sort).arg(trendsDatas[blemind2].blemind2).arg(trendsDatas[blemind2].type) + .arg(trendsDatas[blemind2].trendsValueChanged).arg(trendsDatas[blemind2].sortChanged).arg(getParam("date")); + qDebug() << sql; + sqlIns->query(sql,"TrendManager"); + } + qDebug()<< "trend blemind2: " << blemind2 << " sort: " << QString::number(sort-1); + } + + + //计算sort_change 和 trend_value_change + +// //更新到数据库 +// QHashIterator ii(trendsDatas); +// while (ii.hasNext()) +// { +// ii.next(); +// sql = QString("update trends set sort = %1 where blemind2 = '%2' and type = '%3';") +// .arg(ii.value().sort).arg(i.value().blemind2).arg(i.value().type); +// qDebug() << sql; +// sqlIns->query(sql,"TrendManager"); +// } + + + sqlIns->deleteLater(); + } +} + +void TrendManager::getDataFromMysql() +{ + QString type = getParam("type"); + QString typeId = "differrange10"; + if(type == "20") + typeId = "differrange20"; + QString sql = QString("select s.code as code ,b.name as name,trade_day,open,close,differrange,%3,trade_days,agencies_hold,b.blemind2 as blemind2,b.blemind3 as blemind3 from stocks s, stock_basis b where trade_day = '%1' and s.code = b.code ORDER BY %3 DESC LIMIT %2;") + .arg(getParam("date")).arg(getParam("limitCount")).arg(typeId); + XSqlExcute* sqlIns = new XSqlExcute; + sqlIns->openMysql("192.168.0.201","nstocks","admin","1qazse42W3","TrendManager"); + QSqlQuery q = sqlIns->query(sql,"TrendManager"); + qDebug() << "TrendManager::getDataFromMysql() : count : " << q.size(); + sqlIns->deleteLater(); + int sort = 1; + trendStocksDatas.clear(); + trendsDatas.clear(); + blemind2StockCounts.clear(); + + while (q.next()) + { + _trendStocks tstocks; + tstocks.code = q.value("code").toString(); + tstocks.name = q.value("name").toString(); + tstocks.tradeDay = q.value("trade_day").toString(); + tstocks.open = q.value("open").toString(); + tstocks.close = q.value("close").toString(); + tstocks.differRange = q.value("differrange").toString(); + tstocks.differRangeP10 = q.value("differrange10").toString(); + tstocks.tradeDays = q.value("trade_days").toString(); + tstocks.agenciesHold = q.value("agencies_hold").toString(); + tstocks.blemind2 = q.value("blemind2").toString(); + tstocks.blemind3 = q.value("blemind3").toString(); + if(tstocks.tradeDays.toInt() < 120) + continue; + if(tstocks.agenciesHold.toDouble() < 2) + continue; + tstocks.type = type; + tstocks.sort = QString::number(sort++); + trendStocksDatas.append(tstocks); + qDebug()<< "tradeDay: " <openMysql("192.168.0.201","nstocks","admin","1qazse42W3","TrendManager"); + QString sql = "select COUNT(s.code) as count from stocks_in_trend s where trade_day = '2021-11-25';"; + QSqlQuery q = sqlIns->query(sql,"TrendManager"); + bool hasData = false; + if(q.next()) + { + hasData = q.value("count").toInt() > 0 ? true : false; + } + sqlIns->deleteLater(); + return hasData; +} diff --git a/trendmanager.h b/trendmanager.h new file mode 100644 index 0000000..ad0e6fb --- /dev/null +++ b/trendmanager.h @@ -0,0 +1,28 @@ +#ifndef TRENDMANAGER_H +#define TRENDMANAGER_H +#include "datamanagerbase.h" +#include "db/structs.h" + +class XSqlExcute; +class TrendManager : public DataManagerBase +{ +public: + TrendManager(); + ~TrendManager(); + + virtual void doExcute(); + + virtual void decodeToMysql(); + + virtual void getDataFromMysql(); + +private: + bool hasTrendData(); + +private: + QList<_trendStocks> trendStocksDatas; + QHash trendsDatas; + QHash blemind2StockCounts; +}; + +#endif // TRENDMANAGER_H diff --git a/trendtablemodel.cpp b/trendtablemodel.cpp new file mode 100644 index 0000000..b0e53f1 --- /dev/null +++ b/trendtablemodel.cpp @@ -0,0 +1,80 @@ +#include "trendtablemodel.h" + +TrendTableModel::TrendTableModel(QObject *parent) + : QAbstractTableModel(parent) +{ +} + +QVariant TrendTableModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + // FIXME: Implement me! +// return QVariant(); + if(role == Qt::DisplayRole && orientation == Qt::Horizontal) + return headerDatas[section]; + return QVariant(); +// return QAbstractTableModel::headerData(section,orientation,role); +} + +bool TrendTableModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, + int role /*= Qt::EditRole*/) +{ + headerDatas[section] = value.toString(); + return true; +} + +int TrendTableModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return m_datas.count(); + + // FIXME: Implement me! +} + +int TrendTableModel::columnCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + + return m_nColumnCount; + // FIXME: Implement me! +} + +QVariant TrendTableModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + int row = index.row(); + int column = index.column(); + switch (role) + { + case Qt::DisplayRole: + return m_datas[row][column]; + } +// if (role != Qt::DisplayRole) +// return QVariant(); +// return m_datas[row][column]; + return QVariant(); +} + +void TrendTableModel::addData(int row,int column,QString data) +{ + if(m_nColumnCount <= column) + m_nColumnCount = column; + if(m_datas.count() <= row) + { + QList columns; + for(int c = 0 ; c < m_nColumnCount ; c++) + { + columns.append(""); + } + columns[column] = data; + m_datas.append(columns); + } + else + { + m_datas[row][column] = data; + } +} diff --git a/trendtablemodel.h b/trendtablemodel.h new file mode 100644 index 0000000..9f5c25e --- /dev/null +++ b/trendtablemodel.h @@ -0,0 +1,33 @@ +#ifndef TRENDTABLEMODEL_H +#define TRENDTABLEMODEL_H + +#include + +class TrendTableModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + explicit TrendTableModel(QObject *parent = nullptr); + + // Header: + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, + int role = Qt::EditRole) override; + // Basic functionality: + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + void setColumnCount(int count){m_nColumnCount = count;} + + void addData(int row,int column,QString data); +private: + QMap headerDatas; + QList > m_datas; + QList m_headers; + int m_nColumnCount = 0; +}; + +#endif // TRENDTABLEMODEL_H diff --git a/trendwidet.cpp b/trendwidet.cpp new file mode 100644 index 0000000..ebe338b --- /dev/null +++ b/trendwidet.cpp @@ -0,0 +1,182 @@ +#include "trendwidet.h" +#include "ui_trendwidet.h" +#include "trendmanager.h" +#include "loadingdialog.h" +#include +#include +#include +#include +#include "trendtablemodel.h" + +trendWidet::trendWidet(QWidget *parent) : + QWidget(parent), + ui(new Ui::trendWidet) +{ + ui->setupUi(this); + if(!QSqlDatabase::contains("trendWidet")) + { + db = QSqlDatabase::addDatabase("QMYSQL","trendWidet"); + db.setHostName("192.168.0.201"); + db.setDatabaseName("nstocks"); + db.setUserName("admin"); + db.setPassword("1qazse42W3"); + db.open(); + } + + trend10Model = new QSqlQueryModel; + ui->tableView_trend10->setModel(trend10Model); + trend20Model = new QSqlQueryModel; + ui->tableView_trend20->setModel(trend20Model); + stocks10Model = new QSqlQueryModel; + ui->tableView_stocks10->setModel(stocks10Model); + stocks20Model = new QSqlQueryModel; + ui->tableView_stocks20->setModel(stocks20Model); + + ui->currentDate->setDate(QDate::currentDate()); + + dthread.start(); + +// trend20_Model = new QStandardItemModel(ui->tableView_trend20); +// trend20_Model->setColumnCount(3); +// trend20_Model->setHeaderData(0,Qt::Horizontal,QStringLiteral("名称")); +// trend20_Model->setHeaderData(1,Qt::Horizontal,QDate::currentDate().toString("yyyy-MM-dd")); +// trend20_Model->setHeaderData(2,Qt::Horizontal,QDate::currentDate().addDays(-1).toString("yyyy-MM-dd")); +// ui->tableView_trend20->setModel(trend20_Model); + + m_trend20_Model = new TrendTableModel(ui->tableView_trend20); + m_trend20_Model->setColumnCount(3); + m_trend20_Model->setHeaderData(0,Qt::Horizontal,QStringLiteral("名称")); + m_trend20_Model->setHeaderData(1,Qt::Horizontal,QDate::currentDate().toString("yyyy-MM-dd")); + m_trend20_Model->setHeaderData(2,Qt::Horizontal,QDate::currentDate().addDays(-1).toString("yyyy-MM-dd")); + ui->tableView_trend20->setModel(m_trend20_Model); + +} + +trendWidet::~trendWidet() +{ + dthread.terminate(); + delete ui; +} + +void trendWidet::on_pushButton_trend_clicked() +{ + TrendManager* tm = new TrendManager; + tm->setDataDate(ui->currentDate->date().toString("yyyy-MM-dd")); + tm->addParam("date",ui->currentDate->date().toString("yyyy-MM-dd")); + tm->addParam("limitCount","590"); + tm->addParam("type","10"); + LoadingDialog ld; + connect(&dthread,SIGNAL(managerFinished()),&ld,SLOT(accept())); +// //10日 +// //获取stocks中所有数据 +// tm->setExcuteType(DataManagerBase::getData); +// dthread.setManager(tm); +// dthread.startManager(); +// ld.exec(); +// //简单筛选排序后数据插入数据库 +// tm->setExcuteType(DataManagerBase::decode); +// dthread.setManager(tm); +// dthread.startManager(); +// ld.exec(); + + //20日 + tm->addParam("type","20"); + //获取stocks中所有数据 + tm->setExcuteType(DataManagerBase::getData); + dthread.setManager(tm); + dthread.startManager(); + ld.exec(); + //简单筛选排序后数据插入数据库 + tm->setExcuteType(DataManagerBase::decode); + dthread.setManager(tm); + dthread.startManager(); + ld.exec(); + queryTrends(ui->currentDate->date().toString("yyyy-MM-dd"),"20"); + queryTrends(ui->currentDate->date().addDays(-1).toString("yyyy-MM-dd"),"20"); + QStringList dates; + dates.append(ui->currentDate->date().toString("yyyy-MM-dd")); + dates.append(ui->currentDate->date().addDays(-1).toString("yyyy-MM-dd")); + updateViews(dates); +} + +void trendWidet::on_pushButton_query_clicked() +{ +// queryStocks("10"); +// queryStocks("20"); +// queryTrends("10"); +// queryTrends("20"); +// trend20_Model->setHeaderData(1,Qt::Horizontal,ui->currentDate->date().toString("yyyy-MM-dd")); +// trend20_Model->setHeaderData(2,Qt::Horizontal,ui->currentDate->date().addDays(-1).toString("yyyy-MM-dd")); + m_trend20_Model->setHeaderData(1,Qt::Horizontal,ui->currentDate->date().toString("yyyy-MM-dd")); + m_trend20_Model->setHeaderData(2,Qt::Horizontal,ui->currentDate->date().addDays(-1).toString("yyyy-MM-dd")); + + queryTrends(ui->currentDate->date().toString("yyyy-MM-dd"),"20"); + queryTrends(ui->currentDate->date().addDays(-1).toString("yyyy-MM-dd"),"20"); + + QStringList dates; + dates.append(ui->currentDate->date().toString("yyyy-MM-dd")); + dates.append(ui->currentDate->date().addDays(-1).toString("yyyy-MM-dd")); + updateViews(dates); +} + +void trendWidet::queryStocks(QString type) +{ + +} + +void trendWidet::queryTrends(QString date,QString type) +{ + QSqlQuery q(QSqlDatabase::database("trendWidet")); + QString sql = QString("select * from trends WHERE trade_day = '%1' and type = '%2' ORDER BY sort ASC;").arg(date).arg(type); + qDebug() << sql; + q.exec(sql); + while (q.next()) + { + trends t; + t.blemind2 = q.value("blemind2").toString(); + t.tradeDay = q.value("trade_day").toString(); + t.stocksCount = q.value("stocks_count").toString(); + t.trendsValue = q.value("trend_value").toString(); + t.trendsValueChanged = q.value("trend_value_change").toString(); + t.sort = q.value("sort").toString(); + t.sortChanged = q.value("sort_change").toString(); + t.type = q.value("type").toString(); + if(trends20.contains(t.blemind2)) + { + trends20[t.blemind2].append(t); + } + else + { + QList tl; + tl.append(t); + trends20.insert(t.blemind2,tl); + } + } +} + +void trendWidet::updateViews(QStringList dates) +{ +// int row = trend20_Model->rowCount(); + int row = m_trend20_Model->rowCount(); + QHashIterator > ti(trends20); + while (ti.hasNext()) { + ti.next(); + QList l = ti.value(); +// trend20_Model->setItem(row,0,new QStandardItem(ti.key())); + m_trend20_Model->addData(row,0,ti.key()); + for (int di = 0; di < dates.size(); ++di) + { + for (int i = 0 ; i < l.count() ; i++) + { + if(l[i].tradeDay == dates[di]) + { +// trend20_Model->setItem(row,di+1,new QStandardItem(l[i].sort)); + m_trend20_Model->addData(row,di+1,l[i].sort); + break; + } + } + } + row++; + } + +} diff --git a/trendwidet.h b/trendwidet.h new file mode 100644 index 0000000..d4f9653 --- /dev/null +++ b/trendwidet.h @@ -0,0 +1,48 @@ +#ifndef TRENDWIDET_H +#define TRENDWIDET_H + +#include +#include +#include "datamanagerthread.h" +#include "db/structs.h" + +class QStandardItemModel; +class TrendTableModel; +namespace Ui { +class trendWidet; +} + +class trendWidet : public QWidget +{ + Q_OBJECT + +public: + explicit trendWidet(QWidget *parent = nullptr); + ~trendWidet(); + +private slots: + void on_pushButton_trend_clicked(); + + void on_pushButton_query_clicked(); + +private: + void queryStocks(QString type);//type "10" 10日 “20” 20日 + void queryTrends(QString date,QString type);//type "10" 10日 “20” 20日 + void updateViews(QStringList dates); +private: + Ui::trendWidet *ui; + QSqlDatabase db; + QSqlQueryModel *trend10Model; + QSqlQueryModel *trend20Model; + QSqlQueryModel *stocks10Model; + QSqlQueryModel *stocks20Model; + + DataManagerThread dthread; + + QStandardItemModel* trend20_Model; + TrendTableModel* m_trend20_Model; + + QHash > trends20; +}; + +#endif // TRENDWIDET_H diff --git a/trendwidet.ui b/trendwidet.ui new file mode 100644 index 0000000..4815e32 --- /dev/null +++ b/trendwidet.ui @@ -0,0 +1,112 @@ + + + trendWidet + + + + 0 + 0 + 1184 + 640 + + + + Form + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + + + + + 40 + 16777215 + + + + 文件 + + + + + + + 分析 + + + + + + + + 40 + 16777215 + + + + 日期 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + false + + + + + + + 查询 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/widget/DistributeWidget.cpp b/widget/DistributeWidget.cpp new file mode 100644 index 0000000..480d33f --- /dev/null +++ b/widget/DistributeWidget.cpp @@ -0,0 +1,71 @@ +#include "distributewidget.h" +#include "ui_DistributeWidget.h" +#include + +DistributeWidget::DistributeWidget(QWidget* parent) : + QWidget(parent), + ui(new Ui::DistributeWidget) +{ + ui->setupUi(this); + //![1] + QBarSet* set0 = new QBarSet("Jane"); + QBarSet* set1 = new QBarSet("John"); + QBarSet* set2 = new QBarSet("Axel"); + QBarSet* set3 = new QBarSet("Mary"); + QBarSet* set4 = new QBarSet("Samantha"); + + *set0 << 1 << 2 << 3 << 4 << 5 << 6; + *set1 << 5 << 0 << 0 << 4 << 0 << 7; + *set2 << 3 << 5 << 8 << 13 << 8 << 5; + *set3 << 5 << 6 << 7 << 3 << 4 << 5; + *set4 << 9 << 7 << 5 << 3 << 1 << 2; + //![1] + + //![2] + QBarSeries* series = new QBarSeries(); + series->append(set0); + series->append(set1); + series->append(set2); + series->append(set3); + series->append(set4); + + //![2] + + //![3] + QChart* chart = new QChart(); + chart->addSeries(series); + chart->setTitle(QStringLiteral("涨跌幅分布")); + chart->setAnimationOptions(QChart::SeriesAnimations); + //![3] + + //![4] + QStringList categories; + categories << "Jan" << "Feb" << "Mar" << "Apr" << "May" << "Jun"; + QBarCategoryAxis* axisX = new QBarCategoryAxis(); + axisX->append(categories); + chart->addAxis(axisX, Qt::AlignBottom); + series->attachAxis(axisX); + + QValueAxis* axisY = new QValueAxis(); + axisY->setRange(0, 15); + chart->addAxis(axisY, Qt::AlignLeft); + series->attachAxis(axisY); + //![4] + + //![5] + chart->legend()->setVisible(true); + chart->legend()->setAlignment(Qt::AlignBottom); + //![5] + + //![6] + QChartView* chartView = new QChartView(chart); + chartView->setRenderHint(QPainter::Antialiasing); + QHBoxLayout* layout = new QHBoxLayout; + layout->addWidget(chartView); + this->setLayout(layout); +} + +DistributeWidget::~DistributeWidget() +{ + delete ui; +} diff --git a/widget/distributewidget.h b/widget/distributewidget.h new file mode 100644 index 0000000..2d5ff1c --- /dev/null +++ b/widget/distributewidget.h @@ -0,0 +1,22 @@ +#ifndef DISTRIBUTEWIDGET_H +#define DISTRIBUTEWIDGET_H + +#include + +namespace Ui { +class DistributeWidget; +} + +class DistributeWidget : public QWidget +{ + Q_OBJECT + +public: + explicit DistributeWidget(QWidget *parent = nullptr); + ~DistributeWidget(); + +private: + Ui::DistributeWidget *ui; +}; + +#endif // DISTRIBUTEWIDGET_H diff --git a/widget/distributewidget.ui b/widget/distributewidget.ui new file mode 100644 index 0000000..675e1f3 --- /dev/null +++ b/widget/distributewidget.ui @@ -0,0 +1,19 @@ + + + DistributeWidget + + + + 0 + 0 + 896 + 517 + + + + Form + + + + + diff --git a/xexceltomysq.cpp b/xexceltomysq.cpp new file mode 100644 index 0000000..4ad5efd --- /dev/null +++ b/xexceltomysq.cpp @@ -0,0 +1,641 @@ +#include "xexceltomysq.h" +#include +#include +#include + +XStocksDataParser::XStocksDataParser(QObject *parent) : QObject(parent) +{ +} + +QList<_WholeStocksParam> XStocksDataParser::parseWholeStocks(QList > datas) +{ + QList<_WholeStocksParam> wholeStocksParamList; + if(datas.count() <= 1) + return wholeStocksParamList; + QList headDatas = datas.at(0); + m_wholeStocksKeyIndexs.clear(); + QString tradeDay = parseWholeStockHead(headDatas); + if(!tradeDay.isEmpty()) + { + + qDebug() << " datas count :" << datas.count(); + for (int row = 1; row < datas.count();row++) + { + QList rowData = datas.at(row); + _WholeStocksParam param; + for(int column = 0; column < rowData.count() ; column++) + { + if(rowData.at(column).toString().isEmpty()) + { + qDebug() << "break"; + break; + } + param.tradeDay = tradeDay; + addValueToWholeStockParam(param,column,rowData.at(column).toString()); + } + if(param.code.isEmpty() || param.name.isEmpty()) + continue; + wholeStocksParamList.append(param); + } + } + return wholeStocksParamList; +} + +QList XStocksDataParser::parseWholeStockIndexs(QList > datas) +{ + QList wholeStockIndexsParamList; + if(datas.count() <= 1) + return wholeStockIndexsParamList; + QList headDatas = datas.at(0); + m_wholeStocksKeyIndexs.clear(); + QString tradeDay = parseWholeStockIndexHead(headDatas); + if(!tradeDay.isEmpty()) + { + + qDebug() << " datas count :" << datas.count(); + for (int row = 1; row < datas.count();row++) + { + QList rowData = datas.at(row); + XWholeStockIndexs::_WholeStockIndexsParam param; + for(int column = 0; column < rowData.count() ; column++) + { + if(rowData.at(column).toString().isEmpty()) + { + qDebug() << "break"; + break; + } + param.tradeDay = tradeDay; + addValueToWholeStockIndexParam(param,column,rowData.at(column).toString()); + } + if(param.code.isEmpty() || param.name.isEmpty()) + continue; + wholeStockIndexsParamList.append(param); + } + } + return wholeStockIndexsParamList; +} + +QList<_HighStocksParam> XStocksDataParser::parseHightStocks(QList > datas) +{ + QList<_HighStocksParam> highStocksParamList; + if(datas.count() <= 1) + return highStocksParamList; + QList headDatas = datas.at(0); + m_wholeStocksKeyIndexs.clear(); + QString tradeDay = parseHighStockHead(headDatas); + if(!tradeDay.isEmpty()) + { + + qDebug() << " datas count :" << datas.count(); + for (int row = 1; row < datas.count();row++) + { + QList rowData = datas.at(row); + _HighStocksParam param; + for(int column = 0; column < rowData.count() ; column++) + { + if(rowData.at(column).toString().isEmpty()) + { + qDebug() << "break"; + break; + } + param.tradeDay = tradeDay; + addValueToHighStockParam(param,column,rowData.at(column).toString()); + } + if(param.code.isEmpty() || param.name.isEmpty()) + continue; + highStocksParamList.append(param); + } + } + return highStocksParamList; +} + +QList<_HighStockIndexsParam> XStocksDataParser::parseHightStockIndexs(QList > datas) +{ + QList<_HighStockIndexsParam> highStockIndexParamList; + if(datas.count() <= 1) + return highStockIndexParamList; + QList headDatas = datas.at(0); + m_wholeStocksKeyIndexs.clear(); + QString tradeDay = parseHighStockIndexHead(headDatas); + if(!tradeDay.isEmpty()) + { + + qDebug() << " datas count :" << datas.count(); + for (int row = 1; row < datas.count();row++) + { + QList rowData = datas.at(row); + _HighStockIndexsParam param; + for(int column = 0; column < rowData.count() ; column++) + { + if(rowData.at(column).toString().isEmpty()) + { + qDebug() << "break"; + break; + } + param.tradeDay = tradeDay; + addValueToHighStockIndexParam(param,column,rowData.at(column).toString()); + } + if(param.code.isEmpty() || param.name.isEmpty()) + continue; + highStockIndexParamList.append(param); + } + } + return highStockIndexParamList; +} + +QString XStocksDataParser::parseWholeStockHead(QList headDatas) +{ + QString tradeDay = ""; + for(int i = 0; i < headDatas.count(); i++) + { + QVariant value = headDatas[i]; + QString headValue = value.toString(); + if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"code"); + } + else if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"name"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { +// //̼[](2021-05-20)[Ȩʽ]ǰȨ + int dayStart = headValue.indexOf("("); + int dayEnd = headValue.indexOf(")"); + tradeDay = headValue.mid(dayStart+1,dayEnd - dayStart-1); + m_wholeStocksKeyIndexs.insert(i,"open"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { + m_wholeStocksKeyIndexs.insert(i,"close"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && !headValue.contains(QStringLiteral("ǰ20")) && !headValue.contains(QStringLiteral("ǰ60"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange"); + } + else if(headValue.contains(QStringLiteral("ҵָ")) && !headValue.contains(QStringLiteral("ҵָ"))) + { + m_wholeStocksKeyIndexs.insert(i,"BLEMIND2"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && headValue.contains(QStringLiteral("ǰ20"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRangeP20"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && headValue.contains(QStringLiteral("ǰ60"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRangeP60"); + } + else if(headValue.contains(QStringLiteral("ǷΪSTƱ"))) + { + m_wholeStocksKeyIndexs.insert(i,"isSTStock"); + } + else if(headValue.contains(QStringLiteral("ǷΪ*STƱ"))) + { + m_wholeStocksKeyIndexs.insert(i,"isSTXStock"); + } + else if(headValue.contains(QStringLiteral("׷"))) + { + m_wholeStocksKeyIndexs.insert(i,"listDate"); + } + else if(headValue.contains(QStringLiteral("ɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"tradeDaysP"); + } + else if(headValue.contains(QStringLiteral("ɽ")) && !headValue.contains(QStringLiteral("վɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"volumn"); + } + else if(headValue.contains(QStringLiteral("ɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"amount"); + } + else if(headValue.contains(QStringLiteral("ҵָ"))) + { + m_wholeStocksKeyIndexs.insert(i,"BLEMINDCODE2"); + } + else if(headValue.contains(QStringLiteral("ֵͨ"))) + { + m_wholeStocksKeyIndexs.insert(i,"freeFloatMv"); + } + else if(headValue.contains(QStringLiteral("ֵ"))) + { + m_wholeStocksKeyIndexs.insert(i,"mvByCSRC"); + } + else if(headValue.contains(QStringLiteral("վɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"avgVolumeP20"); + } + qDebug() << "parseWholeStockHead : " < headDatas) +{ + QString tradeDay = ""; + for(int i = 0; i < headDatas.count(); i++) + { + QVariant value = headDatas[i]; + QString headValue = value.toString(); + if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"code"); + } + else if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"name"); + } + else if(headValue.contains(QStringLiteral("ɷݸ"))) + { + m_wholeStocksKeyIndexs.insert(i,"componentNum"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { +// //̼[](2021-05-20)[Ȩʽ]ǰȨ + int dayStart = headValue.indexOf("("); + int dayEnd = headValue.indexOf(")"); + tradeDay = headValue.mid(dayStart+1,dayEnd - dayStart-1); + m_wholeStocksKeyIndexs.insert(i,"open"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { + m_wholeStocksKeyIndexs.insert(i,"close"); + } + else if(headValue.contains(QStringLiteral("ǵ"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange"); + } + else if(headValue.contains(QStringLiteral("ɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"volumn"); + } + else if(headValue.contains(QStringLiteral("ɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"amount"); + } + else if(headValue.contains(QStringLiteral("ֵͨ"))) + { + m_wholeStocksKeyIndexs.insert(i,"freeFloatMv"); + } + else if(headValue.contains(QStringLiteral("ֵ"))) + { + m_wholeStocksKeyIndexs.insert(i,"mvByCSRC"); + } + qDebug() << "parseWholeStockIndexHead : " < headDatas) +{ + QString tradeDay = ""; + for(int i = 0; i < headDatas.count(); i++) + { + QVariant value = headDatas[i]; + QString headValue = value.toString(); + if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"code"); + } + else if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"name"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { +// //̼[](2021-05-20)[Ȩʽ]ǰȨ + int dayStart = headValue.indexOf("("); + int dayEnd = headValue.indexOf(")"); + tradeDay = headValue.mid(dayStart+1,dayEnd - dayStart-1); + m_wholeStocksKeyIndexs.insert(i,"open"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { + m_wholeStocksKeyIndexs.insert(i,"close"); + } + else if(headValue.contains(QStringLiteral("߼")) && !headValue.contains(QStringLiteral("߼"))) + { + m_wholeStocksKeyIndexs.insert(i,"high"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && !headValue.contains(QStringLiteral("ǰ20")) && !headValue.contains(QStringLiteral("ǰ60"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange"); + } + else if(headValue.contains(QStringLiteral("ɽ")) && !headValue.contains(QStringLiteral("վɽ"))) + { + m_wholeStocksKeyIndexs.insert(i,"volumn"); + } + else if(headValue.contains(QStringLiteral("ڴ׶¸"))) + { + m_wholeStocksKeyIndexs.insert(i,"isHighRangeP"); + } + else if(headValue.contains(QStringLiteral("ҵָ")) && !headValue.contains(QStringLiteral("ҵָ"))) + { + m_wholeStocksKeyIndexs.insert(i,"BLEMIND2"); + } + else if(headValue.contains(QStringLiteral("߼"))) + { + m_wholeStocksKeyIndexs.insert(i,"HpDateP"); + } + qDebug() << "parseWholeStockHead : " < headDatas) +{ + QString tradeDay = ""; + for(int i = 0; i < headDatas.count(); i++) + { + QVariant value = headDatas[i]; + QString headValue = value.toString(); + if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"code"); + } + else if(headValue.contains(QStringLiteral("֤ȯ"))) + { + m_wholeStocksKeyIndexs.insert(i,"name"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { +// //̼[](2021-05-20)[Ȩʽ]ǰȨ + int dayStart = headValue.indexOf("("); + int dayEnd = headValue.indexOf(")"); + tradeDay = headValue.mid(dayStart+1,dayEnd - dayStart-1); + m_wholeStocksKeyIndexs.insert(i,"open"); + } + else if(headValue.contains(QStringLiteral("̼"))) + { + m_wholeStocksKeyIndexs.insert(i,"close"); + } + else if(headValue.contains(QStringLiteral("ǵ")) && !headValue.contains(QStringLiteral("ǰ20")) && !headValue.contains(QStringLiteral("ǰ60"))) + { + m_wholeStocksKeyIndexs.insert(i,"differRange"); + } + else if(headValue.contains(QStringLiteral("ڴ׶¸"))) + { + m_wholeStocksKeyIndexs.insert(i,"isHighRangeP"); + } + else if(headValue.contains(QStringLiteral("߼"))) + { + m_wholeStocksKeyIndexs.insert(i,"HpDateP"); + } + else if(headValue.contains(QStringLiteral("ͣ"))) + { + m_wholeStocksKeyIndexs.insert(i,"LIMITUPNUM"); + } + else if(headValue.contains(QStringLiteral("ֵ"))) + { + m_wholeStocksKeyIndexs.insert(i,"mvByCSRC"); + } + else if(headValue.contains(QStringLiteral("ɷݸ"))) + { + m_wholeStocksKeyIndexs.insert(i,"componentNum"); + } + qDebug() << "parseWholeStockHead : " < +#include +#include "db/xwholestocks.h" +#include "db/xwholestockindexs.h" +#include "db/structs.h" + +class XStocksDataParser : public QObject +{ + Q_OBJECT +public: + explicit XStocksDataParser(QObject *parent = nullptr); + + QList<_WholeStocksParam> parseWholeStocks(QList > datas); + + QList parseWholeStockIndexs(QList > datas); + + QList<_HighStocksParam> parseHightStocks(QList > datas); + + QList<_HighStockIndexsParam> parseHightStockIndexs(QList > datas); + +signals: + +private: + //返回交易日期,从头中能解析出交易日期 + QString parseWholeStockHead(QList head); + QString parseWholeStockIndexHead(QList head); + QString parseHighStockHead(QList head); + QString parseHighStockIndexHead(QList head); + void addValueToWholeStockParam(_WholeStocksParam ¶m ,int index,QString value); + void addValueToWholeStockIndexParam(XWholeStockIndexs::_WholeStockIndexsParam ¶m ,int index,QString value); + void addValueToHighStockParam(_HighStocksParam ¶m ,int index,QString value); + void addValueToHighStockIndexParam(_HighStockIndexsParam ¶m ,int index,QString value); + +private: + QMap m_wholeStocksKeyIndexs; + +}; + +#endif // XEXCELTOMYSQ_H