| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #include "gradesapi.h"
- #include <QJsonDocument>
- #include <QJsonObject>
- #include <QJsonValue>
- #include <optional>
- #include "appevent.h"
- #include "tapi.h"
- #include <QDebug>
- namespace TC {
- extern std::optional<QJsonValue> sendRequest(QNetworkAccessManager::Operation op,
- const QString &url,
- const QByteArray &postData);
- extern std::optional<QJsonValue> 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<QJsonValue> 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<void(const Data&)> callback, int maxRetries)
- {
- // 创建任务并添加到线程池
- std::shared_ptr<GradesUpdateTask> task = std::make_shared<GradesUpdateTask>(url, postData, callback);
- task->setMaxRetries(maxRetries);
- RequestThreadPool::instance()->addTask(task);
- }
- // GradesUpdateTask 实现
- GradesUpdateTask::GradesUpdateTask(const QString &url, const QByteArray &postData, std::function<void(const GradesUpdate::Data&)> callback)
- : m_url(url)
- , m_postData(postData)
- , m_callback(callback)
- {
- }
- void GradesUpdateTask::run()
- {
- // 执行请求
- std::optional<QJsonValue> 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
|