迁移工程初始化代码

main
windsdreamer 4 years ago
parent 9aca214e77
commit 0218865835

@ -0,0 +1,45 @@
#include "todaywidget.h"
#include "ui_TodayWidget.h"
#include "widget/distributewidget.h"
#include <QTableView>
#include <QLabel>
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;
}

@ -0,0 +1,51 @@
#ifndef DATAMANAGERBASE_H
#define DATAMANAGERBASE_H
#include <QObject>
#include <QHash>
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<QString,QString> params;//参数
};
#endif // DATAMANAGERBASE_H

@ -0,0 +1,36 @@
#include "datamanagerthread.h"
#include <QDebug>
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;
}

@ -0,0 +1,25 @@
#ifndef DATAMANAGERTHREAD_H
#define DATAMANAGERTHREAD_H
#include <QThread>
#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

@ -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 "";
}

@ -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

@ -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 "";
}

@ -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

@ -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 "";
}

@ -0,0 +1,19 @@
#ifndef STOCKSSQLMANAGER_H
#define STOCKSSQLMANAGER_H
#include <QObject>
#include "excel/stocksdecoder.h"
#include "db/structs.h"
class StocksSqlManager
{
public:
StocksSqlManager();
~StocksSqlManager();
QString toInsertSql(_stocksInfo stock);
QString toDeleteSql();
QString toQuerySql();
};
#endif // STOCKSSQLMANAGER_H

@ -0,0 +1,118 @@
#ifndef STRUCTS_H
#define STRUCTS_H
#include <QString>
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

@ -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 "";
}

@ -0,0 +1,21 @@
#ifndef NHIGHSTOCKINDEXS_H
#define NHIGHSTOCKINDEXS_H
#include <QObject>
#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

@ -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 "";
}

@ -0,0 +1,21 @@
#ifndef NHIGHSTOCKS_H
#define NHIGHSTOCKS_H
#include <QObject>
#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

@ -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();
}

@ -0,0 +1,40 @@
#ifndef XSQLEXCUTE_H
#define XSQLEXCUTE_H
#include <QObject>
#include <QMutex>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
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

@ -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 "";
}

@ -0,0 +1,34 @@
#ifndef NWHOLEINDEXS_H
#define NWHOLEINDEXS_H
#include <QObject>
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

@ -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 "";
}

@ -0,0 +1,25 @@
#ifndef NWHOLESTOCKS_H
#define NWHOLESTOCKS_H
#include <QObject>
#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

@ -0,0 +1,6 @@
#include "exceldecoder.h"
ExcelDecoder::ExcelDecoder()
{
}

@ -0,0 +1,22 @@
#ifndef EXCELDECODER_H
#define EXCELDECODER_H
#include <QObject>
#include <QVariant>
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<QList<QVariant> > datas,QString date = ""){}
};
#endif // EXCELDECODER_H

@ -0,0 +1,76 @@
#include "limitupstockdecoder.h"
#include <QDebug>
LimitUpStockDecoder::LimitUpStockDecoder()
{
}
void LimitUpStockDecoder::decode(QList<QList<QVariant> > edatas,QString date)
{
if(edatas.count() <= 1)
return;
QList<QVariant> headDatas = edatas.at(0);
data.clear();
parseStockHead(headDatas);
qDebug() << " datas count :" << edatas.count();
for (int row = 1; row < edatas.count();row++)
{
QList<QVariant> 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<QVariant> 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 : " <<m_wholeStocksKeyIndexs[i];
}
return tradeDay;
}

@ -0,0 +1,23 @@
#ifndef LIMITUPSTOCKDECODER_H
#define LIMITUPSTOCKDECODER_H
#include "exceldecoder.h"
#include "db/structs.h"
class LimitUpStockDecoder : public ExcelDecoder
{
public:
QList<_limitUpStocksInfo> data;
public:
LimitUpStockDecoder();
virtual DecoderType decoderType(){ return DecoderType::limit_up;}
virtual ~LimitUpStockDecoder(){}
virtual void decode(QList<QList<QVariant> > edatas,QString date = "");
private:
QString parseStockHead(QList<QVariant> headDatas);//解析头 返回交易日
private:
QMap<int,QString> m_wholeStocksKeyIndexs;
};
#endif // LIMITUPSTOCKDECODER_H

@ -0,0 +1,234 @@
#include "stocksdecoder.h"
#include <QDebug>
StocksDecoder::StocksDecoder()
{
}
void StocksDecoder::decode(QList<QList<QVariant> > edatas,QString date)
{
if(edatas.count() <= 1)
return;
QList<QVariant> 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<QVariant> 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<QVariant> 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 : " <<m_wholeStocksKeyIndexs[i];
}
return tradeDay;
}
void StocksDecoder::toValueStockInfo(_stocksInfo &param ,int index,QString value)
{
if(m_wholeStocksKeyIndexs[index] == "code")
{
param.code = value;
}
else if(m_wholeStocksKeyIndexs[index] == "name")
{
param.name = value;
}
else if(m_wholeStocksKeyIndexs[index] == "open")
{
// param.open = value.toDouble();
param.open = value;
}
else if(m_wholeStocksKeyIndexs[index] == "close")
{
// param.close = value.toDouble();
param.close = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange")
{
// param.differRange = value.toDouble();
param.differRange = value;
}
else if(m_wholeStocksKeyIndexs[index] == "blemind2")
{
param.blemind2 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "blemind3")
{
param.blemind3 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange10")
{
// param.differRangeP20 = value.toDouble();
param.differRangeP10 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange20")
{
// param.differRangeP20 = value.toDouble();
param.differRangeP20 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange60")
{
// param.differRangeP60 = value.toDouble();
param.differRangeP60 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "listDate")
{
param.listDate = value;
}
else if(m_wholeStocksKeyIndexs[index] == "tradeDays")
{
// param.tradeDaysP = value.toInt();
param.tradeDays = value;
}
else if(m_wholeStocksKeyIndexs[index] == "volumn")
{
// param.volumn = value.toDouble();
param.volumn = value;
}
else if(m_wholeStocksKeyIndexs[index] == "amount")
{
// param.amount = value.toDouble();
param.amount = value;
}
else if(m_wholeStocksKeyIndexs[index] == "freeFloatMarketValue")
{
// param.freeFloatMv = value.toDouble();
param.freeFloatMarketValue = value;
}
else if(m_wholeStocksKeyIndexs[index] == "totalMarketValue")
{
// param.mvByCSRC = value.toDouble();
param.totalMarketValue = value;
}
else if(m_wholeStocksKeyIndexs[index] == "avgVolume20")
{
// param.avgVolumeP20 = value.toDouble();
param.avgVolume20 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "agenciesHold")
{
// param.avgVolumeP20 = value.toDouble();
param.agenciesHold = value;
}
}

@ -0,0 +1,26 @@
#ifndef STOCKSDECODER_H
#define STOCKSDECODER_H
#include "exceldecoder.h"
#include <QMap>
#include <QVariant>
#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<QList<QVariant> > edatas,QString date = "");
private:
QString parseStockHead(QList<QVariant> headDatas);//½âÎöÍ· ·µ»Ø½»Ò×ÈÕ
void toValueStockInfo(_stocksInfo &param ,int index,QString value);
private:
QMap<int,QString> m_wholeStocksKeyIndexs;
};
#endif // STOCKSDECODER_H

@ -0,0 +1,195 @@
#include "xexcel.h"
#include <QAxObject>
#include <QDebug>
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<QList<QVariant> > XExcel::readExcel(QString fileName)
{
QList<QList<QVariant> > 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<QList<QVariant> > 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<QString> 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<QList<QVariant> > 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)");
}

@ -0,0 +1,27 @@
#ifndef XEXCEL_H
#define XEXCEL_H
#include <QObject>
class QAxObject;
class XExcel : public QObject
{
Q_OBJECT
public:
explicit XExcel(QObject *parent = nullptr);
//打开excel com
void openExcelCom();
//关闭excel com
void closeExcelCom();
QList<QList<QVariant> > readExcel(QString fileName);
void readExcels(QList<QString> fileNames);
signals:
private:
QAxObject* m_pExcel;
QAxObject* m_pWorkbooks;
};
#endif // XEXCEL_H

@ -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;
}

@ -0,0 +1,22 @@
#ifndef HISTORYWIDGET_H
#define HISTORYWIDGET_H
#include <QWidget>
namespace Ui {
class HistoryWidget;
}
class HistoryWidget : public QWidget
{
Q_OBJECT
public:
explicit HistoryWidget(QWidget *parent = nullptr);
~HistoryWidget();
private:
Ui::HistoryWidget *ui;
};
#endif // HISTORYWIDGET_H

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>HistoryWidget</class>
<widget class="QWidget" name="HistoryWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>959</width>
<height>622</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="styleSheet">
<string notr="true">background-color:rgb(0, 0, 255);</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,165 @@
#include "importwidget.h"
#include "ui_importwidget.h"
#include <QStandardItemModel>
#include "db/xsqlexcute.h"
#include "db/xwholestocks.h"
#include "db/xwholestockindexs.h"
#include "db/xhighstocks.h"
#include "db/xhighstockindexs.h"
#include <QtDebug>
#include <QFileDialog>
#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<QList<QVariant> > 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<StocksDecoder::_stocksInfo> 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();
}

@ -0,0 +1,41 @@
#ifndef IMPORTWIDGET_H
#define IMPORTWIDGET_H
#include <QWidget>
#include "datamanagerthread.h"
#include <QSqlQueryModel>
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

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>importWidget</class>
<widget class="QWidget" name="importWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>938</width>
<height>580</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>日期</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDateEdit" name="currentDate"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>文件</string>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="pushButton_Stocks_query">
<property name="text">
<string>查询个股</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QPushButton" name="pushButton_LimitUp">
<property name="text">
<string>导入涨停板</string>
</property>
</widget>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pushButton_Stocks">
<property name="text">
<string>导入个股</string>
</property>
</widget>
</item>
<item row="1" column="6">
<widget class="QPushButton" name="pushButton_LimitUp_query">
<property name="text">
<string>查询涨停板</string>
</property>
</widget>
</item>
<item row="0" column="1" colspan="6">
<widget class="QLineEdit" name="lineEdit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QTableView" name="tableView_import"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

Binary file not shown.

Binary file not shown.

@ -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 <QtDebug>
#include <QFileDialog>
#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<QList<QVariant> > 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()
{
}

@ -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

@ -0,0 +1,21 @@
#include "loadingdialog.h"
#include "ui_loadingdialog.h"
#include <QMovie>
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;
}

@ -0,0 +1,22 @@
#ifndef LOADINGDIALOG_H
#define LOADINGDIALOG_H
#include <QDialog>
namespace Ui {
class LoadingDialog;
}
class LoadingDialog : public QDialog
{
Q_OBJECT
public:
explicit LoadingDialog(QWidget *parent = nullptr);
~LoadingDialog();
private:
Ui::LoadingDialog *ui;
};
#endif // LOADINGDIALOG_H

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>LoadingDialog</class>
<widget class="QDialog" name="LoadingDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>750</width>
<height>750</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>750</width>
<height>750</height>
</rect>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="resource.qrc">:/resource/loading2.gif</pixmap>
</property>
</widget>
</widget>
<resources>
<include location="resource.qrc"/>
</resources>
<connections/>
</ui>

@ -0,0 +1,11 @@
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

@ -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 <QtDebug>
#include <QFileDialog>
#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<QList<QVariant> > 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<QList<QVariant> > 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<QString> 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<QList<QVariant> > 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<XWholeStockIndexs::_WholeStockIndexsParam> 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");
}
}
}

@ -0,0 +1,42 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#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

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1294</width>
<height>701</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="18">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QWidget" name="widget_2" native="true">
<property name="styleSheet">
<string notr="true"/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="ImportWidget" name="iwidget">
<attribute name="title">
<string>导入数据</string>
</attribute>
</widget>
<widget class="trendWidet" name="twidget">
<attribute name="title">
<string>动量分析</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1294</width>
<height>25</height>
</rect>
</property>
<widget class="QMenu" name="menuklui">
<property name="title">
<string>开始</string>
</property>
<addaction name="action"/>
<addaction name="action_5"/>
<addaction name="action_3"/>
<addaction name="actionaa"/>
<addaction name="action_4"/>
<addaction name="action_import"/>
<addaction name="separator"/>
</widget>
<widget class="QMenu" name="menu">
<property name="title">
<string>配置</string>
</property>
</widget>
<widget class="QMenu" name="menu_2">
<property name="title">
<string>帮助</string>
</property>
<addaction name="action_2"/>
</widget>
<addaction name="menuklui"/>
<addaction name="menu"/>
<addaction name="menu_2"/>
</widget>
<action name="action">
<property name="text">
<string>导入全A股票</string>
</property>
</action>
<action name="action_2">
<property name="text">
<string>关于我们</string>
</property>
</action>
<action name="actionaa">
<property name="text">
<string>导入东财指数</string>
</property>
</action>
<action name="action_import">
<property name="text">
<string>批量导入</string>
</property>
</action>
<action name="action_3">
<property name="text">
<string>导入涨跌停</string>
</property>
</action>
<action name="action_4">
<property name="text">
<string>导入板块创新高</string>
</property>
</action>
<action name="action_5">
<property name="text">
<string>导入个股创新高</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
<class>ImportWidget</class>
<extends>QWidget</extends>
<header location="global">importwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>trendWidet</class>
<extends>QWidget</extends>
<header location="global">trendwidet.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>resource/loading.gif</file>
<file>resource/loading2.gif</file>
</qresource>
</RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 KiB

@ -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

@ -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 <QtDebug>
#include <QFileDialog>
#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<QList<QVariant> > 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()
{
}

@ -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

@ -0,0 +1,22 @@
#ifndef TODAYWIDGET_H
#define TODAYWIDGET_H
#include <QWidget>
namespace Ui {
class TodayWidget;
}
class TodayWidget : public QWidget
{
Q_OBJECT
public:
explicit TodayWidget(QWidget *parent = nullptr);
~TodayWidget();
private:
Ui::TodayWidget *ui;
};
#endif // TODAYWIDGET_H

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>TodayWidget</class>
<widget class="QWidget" name="TodayWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1121</width>
<height>654</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>3</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>涨跌分布</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>热点板块</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>指数涨跌</string>
</attribute>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>资金流向</string>
</attribute>
</widget>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,232 @@
#include "trendmanager.h"
#include "db/xsqlexcute.h"
#include <QDebug>
#include <QDate>
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: " <<blemind2 << "count: " << count;
}
//获取当前榜单数据
sql = QString("select b.blemind2 as blemind2 , COUNT(s.code) as count from stocks_in_trend s, stock_basis b where trade_day = '%1' and s.code = b.code GROUP BY b.blemind2 ORDER BY count DESC;").arg(getParam("date"));
q = sqlIns->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: " <<t.blemind2 << " count: " << t.stocksCount << " tvalue:" << tvalue;
}
//插入到数据库中
QHashIterator<QString, trends> 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<QString, trends> 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: " <<tstocks.tradeDay << "code: " << tstocks.code << " name: " << tstocks.name << " blemind2: " << tstocks.blemind2;
}
qDebug() << " trendDatas count : " << trendStocksDatas.count();
}
bool TrendManager::hasTrendData()
{
XSqlExcute* sqlIns = new XSqlExcute;
sqlIns->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;
}

@ -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<QString,trends> trendsDatas;
QHash<QString,QString> blemind2StockCounts;
};
#endif // TRENDMANAGER_H

@ -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<QString> columns;
for(int c = 0 ; c < m_nColumnCount ; c++)
{
columns.append("");
}
columns[column] = data;
m_datas.append(columns);
}
else
{
m_datas[row][column] = data;
}
}

@ -0,0 +1,33 @@
#ifndef TRENDTABLEMODEL_H
#define TRENDTABLEMODEL_H
#include <QAbstractTableModel>
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<int,QString> headerDatas;
QList<QList<QString> > m_datas;
QList<QString> m_headers;
int m_nColumnCount = 0;
};
#endif // TRENDTABLEMODEL_H

@ -0,0 +1,182 @@
#include "trendwidet.h"
#include "ui_trendwidet.h"
#include "trendmanager.h"
#include "loadingdialog.h"
#include <QStandardItemModel>
#include <QSqlQuery>
#include <QStandardItem>
#include <QDebug>
#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<trends> 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<QString,QList<trends> > ti(trends20);
while (ti.hasNext()) {
ti.next();
QList<trends> 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++;
}
}

@ -0,0 +1,48 @@
#ifndef TRENDWIDET_H
#define TRENDWIDET_H
#include <QWidget>
#include <QSqlQueryModel>
#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<QString,QList<trends> > trends20;
};
#endif // TRENDWIDET_H

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>trendWidet</class>
<widget class="QWidget" name="trendWidet">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1184</width>
<height>640</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="1">
<widget class="QDateEdit" name="currentDate"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>文件</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pushButton_trend">
<property name="text">
<string>分析</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>日期</string>
</property>
</widget>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1" colspan="4">
<widget class="QLineEdit" name="lineEdit">
<property name="enabled">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QPushButton" name="pushButton_query">
<property name="text">
<string>查询</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2" rowstretch="6,4">
<item row="0" column="0">
<widget class="QTableView" name="tableView_trend20"/>
</item>
<item row="0" column="1">
<widget class="QTableView" name="tableView_trend10"/>
</item>
<item row="1" column="0">
<widget class="QTableView" name="tableView_stocks20"/>
</item>
<item row="1" column="1">
<widget class="QTableView" name="tableView_stocks10"/>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,71 @@
#include "distributewidget.h"
#include "ui_DistributeWidget.h"
#include <QtCharts>
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;
}

@ -0,0 +1,22 @@
#ifndef DISTRIBUTEWIDGET_H
#define DISTRIBUTEWIDGET_H
#include <QWidget>
namespace Ui {
class DistributeWidget;
}
class DistributeWidget : public QWidget
{
Q_OBJECT
public:
explicit DistributeWidget(QWidget *parent = nullptr);
~DistributeWidget();
private:
Ui::DistributeWidget *ui;
};
#endif // DISTRIBUTEWIDGET_H

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DistributeWidget</class>
<widget class="QWidget" name="DistributeWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>896</width>
<height>517</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

@ -0,0 +1,641 @@
#include "xexceltomysq.h"
#include <QVariant>
#include <QString>
#include <QDebug>
XStocksDataParser::XStocksDataParser(QObject *parent) : QObject(parent)
{
}
QList<_WholeStocksParam> XStocksDataParser::parseWholeStocks(QList<QList<QVariant> > datas)
{
QList<_WholeStocksParam> wholeStocksParamList;
if(datas.count() <= 1)
return wholeStocksParamList;
QList<QVariant> 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<QVariant> 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<XWholeStockIndexs::_WholeStockIndexsParam> XStocksDataParser::parseWholeStockIndexs(QList<QList<QVariant> > datas)
{
QList<XWholeStockIndexs::_WholeStockIndexsParam> wholeStockIndexsParamList;
if(datas.count() <= 1)
return wholeStockIndexsParamList;
QList<QVariant> 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<QVariant> 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<QList<QVariant> > datas)
{
QList<_HighStocksParam> highStocksParamList;
if(datas.count() <= 1)
return highStocksParamList;
QList<QVariant> 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<QVariant> 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<QList<QVariant> > datas)
{
QList<_HighStockIndexsParam> highStockIndexParamList;
if(datas.count() <= 1)
return highStockIndexParamList;
QList<QVariant> 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<QVariant> 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<QVariant> 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 : " <<m_wholeStocksKeyIndexs[i];
}
return tradeDay;
}
QString XStocksDataParser::parseWholeStockIndexHead(QList<QVariant> 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 : " <<m_wholeStocksKeyIndexs[i];
}
return tradeDay;
}
QString XStocksDataParser::parseHighStockHead(QList<QVariant> 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 : " <<m_wholeStocksKeyIndexs[i];
}
return tradeDay;
}
QString XStocksDataParser::parseHighStockIndexHead(QList<QVariant> 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 : " <<m_wholeStocksKeyIndexs[i];
}
return tradeDay;
}
void XStocksDataParser::addValueToWholeStockParam(_WholeStocksParam &param ,int index,QString value)
{
if(m_wholeStocksKeyIndexs[index] == "code")
{
param.code = value;
}
else if(m_wholeStocksKeyIndexs[index] == "name")
{
param.name = value;
}
else if(m_wholeStocksKeyIndexs[index] == "open")
{
// param.open = value.toDouble();
param.open = value;
}
else if(m_wholeStocksKeyIndexs[index] == "close")
{
// param.close = value.toDouble();
param.close = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange")
{
// param.differRange = value.toDouble();
param.differRange = value;
}
else if(m_wholeStocksKeyIndexs[index] == "BLEMIND2")
{
param.BLEMIND2 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRangeP20")
{
// param.differRangeP20 = value.toDouble();
param.differRangeP20 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRangeP60")
{
// param.differRangeP60 = value.toDouble();
param.differRangeP60 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "isSTStock")
{
// param.isSTStock = value.toInt();
param.isSTStock = value == QStringLiteral("") ? 1 : 0;
}
else if(m_wholeStocksKeyIndexs[index] == "isSTXStock")
{
param.isSTXStock = value == QStringLiteral("") ? 1 : 0;
}
else if(m_wholeStocksKeyIndexs[index] == "listDate")
{
param.listDate = value;
}
else if(m_wholeStocksKeyIndexs[index] == "tradeDaysP")
{
// param.tradeDaysP = value.toInt();
param.tradeDaysP = value;
}
else if(m_wholeStocksKeyIndexs[index] == "volumn")
{
// param.volumn = value.toDouble();
param.volumn = value;
}
else if(m_wholeStocksKeyIndexs[index] == "amount")
{
// param.amount = value.toDouble();
param.amount = value;
}
else if(m_wholeStocksKeyIndexs[index] == "BLEMINDCODE2")
{
param.BLEMINDCODE2 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "freeFloatMv")
{
// param.freeFloatMv = value.toDouble();
param.freeFloatMv = value;
}
else if(m_wholeStocksKeyIndexs[index] == "mvByCSRC")
{
// param.mvByCSRC = value.toDouble();
param.mvByCSRC = value;
}
else if(m_wholeStocksKeyIndexs[index] == "avgVolumeP20")
{
// param.avgVolumeP20 = value.toDouble();
param.avgVolumeP20 = value;
}
}
void XStocksDataParser::addValueToWholeStockIndexParam(XWholeStockIndexs::_WholeStockIndexsParam &param ,int index,QString value)
{
if(m_wholeStocksKeyIndexs[index] == "code")
{
param.code = value;
}
else if(m_wholeStocksKeyIndexs[index] == "name")
{
param.name = value;
}
else if(m_wholeStocksKeyIndexs[index] == "componentNum")
{
// param.componentNum = value.toInt();
param.componentNum = value;
// qDebug() << "componentNum : " << value << " toInt : " << param.componentNum;
}
else if(m_wholeStocksKeyIndexs[index] == "open")
{
// param.open = value.toDouble();
param.open = value;
// qDebug() << "open : " << param.open;
}
else if(m_wholeStocksKeyIndexs[index] == "close")
{
// param.close = value.toDouble();
param.close = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange")
{
// param.differRange = value.toDouble();
param.differRange = value;
}
else if(m_wholeStocksKeyIndexs[index] == "volumn")
{
// param.volumn = value.toDouble();
param.volumn = value;
}
else if(m_wholeStocksKeyIndexs[index] == "amount")
{
// param.amount = value.toDouble();
param.amount = value;
}
else if(m_wholeStocksKeyIndexs[index] == "freeFloatMv")
{
// param.freeFloatMv = value.toDouble();
param.freeFloatMv = value;
}
else if(m_wholeStocksKeyIndexs[index] == "mvByCSRC")
{
// param.mvByCSRC = value.toDouble();
param.mvByCSRC = value;
}
}
void XStocksDataParser::addValueToHighStockParam(_HighStocksParam &param ,int index,QString value)
{
if(m_wholeStocksKeyIndexs[index] == "code")
{
param.code = value;
}
else if(m_wholeStocksKeyIndexs[index] == "name")
{
param.name = value;
}
else if(m_wholeStocksKeyIndexs[index] == "open")
{
// param.open = value.toDouble();
param.open = value;
}
else if(m_wholeStocksKeyIndexs[index] == "close")
{
// param.close = value.toDouble();
param.close = value;
}
else if(m_wholeStocksKeyIndexs[index] == "high")
{
// param.high = value.toDouble();
param.high = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange")
{
// param.differRange = value.toDouble();
param.differRange = value;
}
else if(m_wholeStocksKeyIndexs[index] == "volumn")
{
// param.volumn = value.toDouble();
param.volumn = value;
}
else if(m_wholeStocksKeyIndexs[index] == "isHighRangeP")
{
// param.isHighRangeP = value.toInt();
param.isHighRangeP = value == QStringLiteral("") ? 1 : 0;
}
else if(m_wholeStocksKeyIndexs[index] == "BLEMIND2")
{
param.BLEMIND2 = value;
}
else if(m_wholeStocksKeyIndexs[index] == "HpDateP")
{
param.HpDateP = value;
}
}
void XStocksDataParser::addValueToHighStockIndexParam(_HighStockIndexsParam &param ,int index,QString value)
{
if(m_wholeStocksKeyIndexs[index] == "code")
{
param.code = value;
}
else if(m_wholeStocksKeyIndexs[index] == "name")
{
param.name = value;
}
else if(m_wholeStocksKeyIndexs[index] == "open")
{
// param.open = value.toDouble();
param.open = value;
}
else if(m_wholeStocksKeyIndexs[index] == "close")
{
// param.close = value.toDouble();
param.close = value;
}
else if(m_wholeStocksKeyIndexs[index] == "differRange")
{
// param.differRange = value.toDouble();
param.differRange = value;
}
else if(m_wholeStocksKeyIndexs[index] == "isHighRangeP")
{
// param.isHighRangeP = value.toInt();
param.isHighRangeP = value == QStringLiteral("") ? 1 : 0;
}
else if(m_wholeStocksKeyIndexs[index] == "HpDateP")
{
// param.HpDateP = value;
param.HpDateP = value;
}
else if(m_wholeStocksKeyIndexs[index] == "LIMITUPNUM")
{
param.LIMITUPNUM = value.toInt();
}
else if(m_wholeStocksKeyIndexs[index] == "mvByCSRC")
{
param.mvByCSRC = value;
}
else if(m_wholeStocksKeyIndexs[index] == "componentNum")
{
param.COMPONENTNUM = value.toInt();
}
}

@ -0,0 +1,42 @@
#ifndef XEXCELTOMYSQ_H
#define XEXCELTOMYSQ_H
#include <QObject>
#include <QMap>
#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<QList<QVariant> > datas);
QList<XWholeStockIndexs::_WholeStockIndexsParam> parseWholeStockIndexs(QList<QList<QVariant> > datas);
QList<_HighStocksParam> parseHightStocks(QList<QList<QVariant> > datas);
QList<_HighStockIndexsParam> parseHightStockIndexs(QList<QList<QVariant> > datas);
signals:
private:
//返回交易日期,从头中能解析出交易日期
QString parseWholeStockHead(QList<QVariant> head);
QString parseWholeStockIndexHead(QList<QVariant> head);
QString parseHighStockHead(QList<QVariant> head);
QString parseHighStockIndexHead(QList<QVariant> head);
void addValueToWholeStockParam(_WholeStocksParam &param ,int index,QString value);
void addValueToWholeStockIndexParam(XWholeStockIndexs::_WholeStockIndexsParam &param ,int index,QString value);
void addValueToHighStockParam(_HighStocksParam &param ,int index,QString value);
void addValueToHighStockIndexParam(_HighStockIndexsParam &param ,int index,QString value);
private:
QMap<int,QString> m_wholeStocksKeyIndexs;
};
#endif // XEXCELTOMYSQ_H
Loading…
Cancel
Save