gradesapi.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "gradesapi.h"
  2. #include <QJsonDocument>
  3. #include <QJsonObject>
  4. #include <QJsonValue>
  5. #include <optional>
  6. #include "appevent.h"
  7. #include "tapi.h"
  8. #include <QDebug>
  9. namespace TC {
  10. extern std::optional<QJsonValue> sendRequest(QNetworkAccessManager::Operation op,
  11. const QString &url,
  12. const QByteArray &postData);
  13. extern std::optional<QJsonValue> sendRawRequest(QNetworkAccessManager::Operation op,
  14. const QString &url,
  15. const QByteArray &postData);
  16. GradesUpdate::GradesUpdate()
  17. : QObject()
  18. , url("/score-api/grades/create")
  19. {}
  20. GradesUpdate::GradesUpdate(const QString &answerFileName,
  21. const QString &checkinNumber,
  22. int endTime,
  23. const QString &examRoom,
  24. const QString &examSessions,
  25. const QString &examText,
  26. const QString &examineNumber,
  27. const QString &groupName,
  28. const QString &name,
  29. int onlineStatus,
  30. const QString &schoolAddress,
  31. const QString &schoolName,
  32. int sex,
  33. int startTime,
  34. int status,
  35. const QString &swId)
  36. : QObject()
  37. , url("/score-api/grades/create")
  38. {
  39. QJsonObject json;
  40. json["answerFileName"] = answerFileName;
  41. json["checkinNumber"] = checkinNumber;
  42. json["endTime"] = endTime;
  43. json["examRoom"] = examRoom;
  44. json["examSessions"] = examSessions;
  45. json["examText"] = examText;
  46. json["examineNumber"] = examineNumber;
  47. json["groupName"] = groupName;
  48. json["name"] = name;
  49. json["onlineStatus"] = onlineStatus;
  50. json["schoolAddress"] = schoolAddress;
  51. json["schoolName"] = schoolName;
  52. json["sex"] = sex;
  53. json["startTime"] = startTime;
  54. json["status"] = status;
  55. json["swId"] = swId;
  56. QJsonDocument jsonData(json);
  57. postData = jsonData.toJson();
  58. }
  59. GradesUpdate::Data GradesUpdate::post()
  60. {
  61. GradesUpdate::Data ret;
  62. ret.success = false;
  63. ret.message = "Failed to update grades";
  64. std::optional<QJsonValue> data = sendRequest(QNetworkAccessManager::PostOperation,
  65. url,
  66. postData);
  67. if (!data.has_value()) {
  68. return ret;
  69. }
  70. const QJsonObject &object = data.value().toObject();
  71. qDebug() << object;
  72. ret.success = object["status"].toBool();
  73. ret.message = object["message"].toString();
  74. // 如果成功,触发考试更新事件
  75. if (ret.success) {
  76. AppEvent::instance()->examsTestUpdate();
  77. }
  78. return ret;
  79. }
  80. // 添加异步版本的 post 方法
  81. void GradesUpdate::postAsync(std::function<void(const Data&)> callback, int maxRetries)
  82. {
  83. // 创建任务并添加到线程池
  84. std::shared_ptr<GradesUpdateTask> task = std::make_shared<GradesUpdateTask>(url, postData, callback);
  85. task->setMaxRetries(maxRetries);
  86. RequestThreadPool::instance()->addTask(task);
  87. }
  88. // GradesUpdateTask 实现
  89. GradesUpdateTask::GradesUpdateTask(const QString &url, const QByteArray &postData, std::function<void(const GradesUpdate::Data&)> callback)
  90. : m_url(url)
  91. , m_postData(postData)
  92. , m_callback(callback)
  93. {
  94. }
  95. void GradesUpdateTask::run()
  96. {
  97. // 执行请求
  98. std::optional<QJsonValue> data = sendRawRequest(QNetworkAccessManager::PostOperation,
  99. m_url,
  100. m_postData);
  101. GradesUpdate::Data ret;
  102. ret.success = false;
  103. ret.message = "Failed to update grades";
  104. bool success = false;
  105. if (data.has_value()) {
  106. const QJsonObject &object = data.value().toObject();
  107. qDebug() << object << object.isEmpty() << object.empty();
  108. if (object.contains("code")) {
  109. int code = object.value("code").toInt();
  110. if (code == 0) {
  111. ret.success = true;
  112. }
  113. }
  114. if (object.contains("msg")) {
  115. ret.message = object.value("msg").toString();
  116. }
  117. // 如果成功,触发考试更新事件
  118. if (ret.success) {
  119. AppEvent::instance()->examsTestUpdate();
  120. success = true;
  121. }
  122. }
  123. // 调用回调函数
  124. if (m_callback) {
  125. m_callback(ret);
  126. }
  127. // 发送任务完成信号
  128. emit taskCompleted(success);
  129. // 如果失败,发送失败信号,可能会触发重试
  130. if (!success) {
  131. emit taskFailed();
  132. }
  133. }
  134. bool GradesUpdateTask::retry()
  135. {
  136. // 这里可以添加重试前的准备工作,如果需要的话
  137. return true; // 返回 true 表示可以重试
  138. }
  139. } // namespace TC