#include "gradesapi.h" #include #include #include #include #include "appevent.h" #include "tapi.h" #include namespace TC { extern std::optional sendRequest(QNetworkAccessManager::Operation op, const QString &url, const QByteArray &postData); extern std::optional sendRawRequest(QNetworkAccessManager::Operation op, const QString &url, const QByteArray &postData); GradesUpdate::GradesUpdate() : QObject() , url("/score-api/grades/create") {} GradesUpdate::GradesUpdate(const QString &answerFileName, const QString &checkinNumber, int endTime, const QString &examRoom, const QString &examSessions, const QString &examText, const QString &examineNumber, const QString &groupName, const QString &name, int onlineStatus, const QString &schoolAddress, const QString &schoolName, int sex, int startTime, int status, const QString &swId) : QObject() , url("/score-api/grades/create") { QJsonObject json; json["answerFileName"] = answerFileName; json["checkinNumber"] = checkinNumber; json["endTime"] = endTime; json["examRoom"] = examRoom; json["examSessions"] = examSessions; json["examText"] = examText; json["examineNumber"] = examineNumber; json["groupName"] = groupName; json["name"] = name; json["onlineStatus"] = onlineStatus; json["schoolAddress"] = schoolAddress; json["schoolName"] = schoolName; json["sex"] = sex; json["startTime"] = startTime; json["status"] = status; json["swId"] = swId; QJsonDocument jsonData(json); postData = jsonData.toJson(); } GradesUpdate::Data GradesUpdate::post() { GradesUpdate::Data ret; ret.success = false; ret.message = "Failed to update grades"; std::optional data = sendRequest(QNetworkAccessManager::PostOperation, url, postData); if (!data.has_value()) { return ret; } const QJsonObject &object = data.value().toObject(); qDebug() << object; ret.success = object["status"].toBool(); ret.message = object["message"].toString(); // 如果成功,触发考试更新事件 if (ret.success) { AppEvent::instance()->examsTestUpdate(); } return ret; } // 添加异步版本的 post 方法 void GradesUpdate::postAsync(std::function callback, int maxRetries) { // 创建任务并添加到线程池 std::shared_ptr task = std::make_shared(url, postData, callback); task->setMaxRetries(maxRetries); RequestThreadPool::instance()->addTask(task); } // GradesUpdateTask 实现 GradesUpdateTask::GradesUpdateTask(const QString &url, const QByteArray &postData, std::function callback) : m_url(url) , m_postData(postData) , m_callback(callback) { } void GradesUpdateTask::run() { // 执行请求 std::optional data = sendRawRequest(QNetworkAccessManager::PostOperation, m_url, m_postData); GradesUpdate::Data ret; ret.success = false; ret.message = "Failed to update grades"; bool success = false; if (data.has_value()) { const QJsonObject &object = data.value().toObject(); qDebug() << object << object.isEmpty() << object.empty(); if (object.contains("code")) { int code = object.value("code").toInt(); if (code == 0) { ret.success = true; } } if (object.contains("msg")) { ret.message = object.value("msg").toString(); } // 如果成功,触发考试更新事件 if (ret.success) { AppEvent::instance()->examsTestUpdate(); success = true; } } // 调用回调函数 if (m_callback) { m_callback(ret); } // 发送任务完成信号 emit taskCompleted(success); // 如果失败,发送失败信号,可能会触发重试 if (!success) { emit taskFailed(); } } bool GradesUpdateTask::retry() { // 这里可以添加重试前的准备工作,如果需要的话 return true; // 返回 true 表示可以重试 } } // namespace TC