Files
QTradeProgram/Sqbase/qbigordermanager.cpp

241 lines
5.5 KiB
C++
Raw Normal View History

2025-08-15 15:56:40 +08:00
#include "qbigordermanager.h"
#include <QMutexLocker>
#include <QCoreApplication>
#include <QDir>
#include <QDebug>
// <20><>̬<EFBFBD><CCAC>Ա<EFBFBD><D4B1>ʼ<EFBFBD><CABC>
std::atomic<QBigOrderManager*> QBigOrderManager::s_instance(nullptr);
QMutex QBigOrderManager::s_mutex;
QBigOrderManager* QBigOrderManager::instance()
{
QBigOrderManager* tmp = s_instance.load(std::memory_order_acquire);
if (!tmp) {
QMutexLocker locker(&s_mutex);
tmp = s_instance.load(std::memory_order_relaxed);
if (!tmp) {
tmp = new QBigOrderManager();
s_instance.store(tmp, std::memory_order_release);
// ʹ<><CAB9>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>źŽ<C5BA><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QObject::connect(qApp, &QCoreApplication::aboutToQuit, []() {
QBigOrderManager::destroy();
});
}
}
return tmp;
}
void QBigOrderManager::destroy()
{
QMutexLocker locker(&s_mutex);
delete s_instance.load(std::memory_order_acquire);
s_instance.store(nullptr, std::memory_order_release);
}
QBigOrderManager::QBigOrderManager(QObject *parent)
: QObject(parent),
m_autoSaveTimer(new QTimer(this))
{
//// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD>ݴ洢Ŀ¼
m_historyPath = QCoreApplication::applicationDirPath() + "/history";
QDir().mkpath(m_historyPath);
connect(m_autoSaveTimer, &QTimer::timeout, this, &QBigOrderManager::autoSave);
setAutoSaveInterval(12);
setAutoSave(true);
m_autoSaveTimer->start();
}
QBigOrderManager::~QBigOrderManager()
{
if (m_autoSaveEnabled) {
saveToFile();
}
}
bool QBigOrderManager::addBigOrder(const BigOrderInfo &order)
{
QMutexLocker locker(&m_orderMutex); // <20><><EFBFBD><EFBFBD>
QString strId = QString::number(order.orderId);
if (m_bigOrderID.contains(strId)) {
return false; // <20>Ѵ<EFBFBD><D1B4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>false<73><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
auto newOrder = QSharedPointer<BigOrderInfo>::create(order);
m_bigOrders.append(newOrder);
m_bigOrderID.insert(strId);
locker.unlock(); // <20>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD>ٷ<EFBFBD><D9B7>ź<EFBFBD>
emit bigOrderAdded(order);
2025-08-31 23:07:06 +08:00
2025-08-22 10:59:38 +08:00
emit markBigOrderSignal();
2025-08-15 15:56:40 +08:00
return true;
}
QList<QSharedPointer<BigOrderInfo>> QBigOrderManager::getAllBigOrders() const
{
QMutexLocker locker(&m_orderMutex);
return m_bigOrders;
}
QList<QSharedPointer<BigOrderInfo>> QBigOrderManager::getBigOrdersByStock(const QString &stockCode) const
{
QMutexLocker locker(&m_orderMutex);
QList<QSharedPointer<BigOrderInfo>> result;
for (const auto& order : m_bigOrders) {
if (order->code == stockCode) {
result.append(order);
}
}
return result;
}
QList<QSharedPointer<BigOrderInfo>> QBigOrderManager::getBigOrdersByType(const QString &orderType) const
{
QMutexLocker locker(&m_orderMutex);
QList<QSharedPointer<BigOrderInfo>> result;
for (const auto& order : m_bigOrders) {
if (order->nBigOrderType == orderType) {
result.append(order);
}
}
return result;
}
void QBigOrderManager::setAutoSave(bool enabled)
{
m_autoSaveEnabled = enabled;
if (enabled) {
m_autoSaveTimer->start();
}
else {
m_autoSaveTimer->stop();
}
}
void QBigOrderManager::setAutoSavePath(const QString &path)
{
m_autoSavePath = path;
}
void QBigOrderManager::setAutoSaveInterval(int hours)
{
m_autoSaveInterval = hours;
m_autoSaveTimer->setInterval(hours * 60 * 60 * 1000);
}
void QBigOrderManager::saveToFile()
{
if (m_historyPath.isEmpty()) {
qWarning() << "History path not set";
return;
}
// ȷ<><C8B7><EFBFBD><EFBFBD>ʷĿ¼<C4BF><C2BC><EFBFBD><EFBFBD>
QDir historyDir(m_historyPath);
if (!historyDir.exists()) {
historyDir.mkpath(".");
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ļ<EFBFBD>
QDate today = QDate::currentDate();
QString filePath = historyDir.filePath(QString("bigorders_%1.json").arg(today.toString("yyyyMMdd")));
QFile file(filePath);
if (!file.open(QIODevice::Append | QIODevice::Text)) {
qWarning() << "Failed to open file for writing:" << filePath;
return;
}
QTextStream out(&file);
out.setCodec("UTF-8");
QMutexLocker locker(&m_orderMutex);
for (const auto& order : m_bigOrders) {
out << QJsonDocument(order->toJson()).toJson(QJsonDocument::Compact) << "\n";
}
//locker.unlock();
// <20><><EFBFBD><EFBFBD><EFBFBD>ѱ<EFBFBD><D1B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
//QMutexLocker locker(&m_orderMutex);
m_bigOrders.clear();
m_bigOrderID.clear();
locker.unlock();
file.close();
}
void QBigOrderManager::loadFromFile()
{
if (m_autoSavePath.isEmpty() || !QFile::exists(m_autoSavePath)) {
return;
}
QFile file(m_autoSavePath);
if (!file.open(QIODevice::ReadOnly)) {
qWarning() << "Failed to open file for reading:" << m_autoSavePath;
return;
}
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
file.close();
if (doc.isNull() || !doc.isArray()) {
qWarning() << "Invalid JSON data in file:" << m_autoSavePath;
return;
}
QMutexLocker locker(&m_orderMutex);
m_bigOrders.clear();
m_bigOrderID.clear();
QJsonArray jsonArray = doc.array();
for (const auto& jsonValue : jsonArray) {
BigOrderInfo order = BigOrderInfo::fromJson(jsonValue.toObject());
m_bigOrders.append(QSharedPointer<BigOrderInfo>::create(order));
//if (order.isValid()) {
//
//}
}
}
void QBigOrderManager::autoSave()
{
if (m_autoSaveEnabled) {
saveToFile();
emit saveOverRefreshView(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD>½<EFBFBD><C2BD><EFBFBD>
}
}
// ʵ<><CAB5><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
void QBigOrderManager::cleanupOldData(int maxDays)
{
QDir historyDir(m_historyPath);
if (!historyDir.exists()) return;
QDate currentDate = QDate::currentDate();
QStringList files = historyDir.entryList(QStringList() << "bigorders_*.json", QDir::Files);
for (const QString &fileName : files) {
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD> (bigorders_20230515.json)
QString dateStr = fileName.mid(10, 8);
QDate fileDate = QDate::fromString(dateStr, "yyyyMMdd");
if (fileDate.isValid() && fileDate.daysTo(currentDate) > maxDays) {
QString filePath = historyDir.filePath(fileName);
QFile::remove(filePath);
qDebug() << "Removed old data file:" << filePath;
}
}
}