Admin.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. const API = require('../../../lib/API')
  2. const { BaseStdResponse } = require('../../../BaseStdResponse')
  3. const { TaskScheduler } = require('../../../lib/QK/TaskScheduler')
  4. const scheduler = new TaskScheduler()
  5. function fail(res, err, fallback = '后台抢课管理操作失败') {
  6. return res.json({
  7. ...BaseStdResponse.ERR,
  8. msg: err?.message || fallback
  9. })
  10. }
  11. class ListClient extends API {
  12. constructor() {
  13. super()
  14. this.setPath('/Admin/QK/Client/List')
  15. this.setMethod('GET')
  16. }
  17. async onRequest(req, res) {
  18. try {
  19. const list = await scheduler.listClients()
  20. return res.json({ ...BaseStdResponse.OK, data: list })
  21. } catch (err) {
  22. this.logger.error(`获取抢课客户端列表失败:${err.stack || err}`)
  23. return fail(res, err, '获取抢课客户端列表失败')
  24. }
  25. }
  26. }
  27. class DeleteClient extends API {
  28. constructor() {
  29. super()
  30. this.setPath('/Admin/QK/Client/Delete')
  31. this.setMethod('DELETE')
  32. }
  33. async onRequest(req, res) {
  34. try {
  35. const { client_id } = req.body
  36. if (!client_id) {
  37. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  38. }
  39. await scheduler.deleteClient(client_id)
  40. this.logger.info(`[QK][API][DeleteClient] 已禁用客户端 clientId=${client_id}`)
  41. return res.json({ ...BaseStdResponse.OK })
  42. } catch (err) {
  43. this.logger.error(`禁用抢课客户端失败:${err.stack || err}`)
  44. return fail(res, err, '禁用抢课客户端失败')
  45. }
  46. }
  47. }
  48. class ListTask extends API {
  49. constructor() {
  50. super()
  51. this.setPath('/Admin/QK/Task/List')
  52. this.setMethod('GET')
  53. }
  54. async onRequest(req, res) {
  55. try {
  56. const result = await scheduler.listAdminTasks(req.query)
  57. return res.json({ ...BaseStdResponse.OK, data: result })
  58. } catch (err) {
  59. this.logger.error(`获取抢课任务列表失败:${err.stack || err}`)
  60. return fail(res, err, '获取抢课任务列表失败')
  61. }
  62. }
  63. }
  64. class GetTask extends API {
  65. constructor() {
  66. super()
  67. this.setPath('/Admin/QK/Task/Detail')
  68. this.setMethod('GET')
  69. }
  70. async onRequest(req, res) {
  71. try {
  72. const { id } = req.query
  73. if (!id) {
  74. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  75. }
  76. const task = await scheduler.getAdminTask(id)
  77. if (!task) {
  78. return res.json({ ...BaseStdResponse.ERR, msg: '任务不存在' })
  79. }
  80. return res.json({ ...BaseStdResponse.OK, data: task })
  81. } catch (err) {
  82. this.logger.error(`获取抢课任务详情失败:${err.stack || err}`)
  83. return fail(res, err, '获取抢课任务详情失败')
  84. }
  85. }
  86. }
  87. class UpdateTask extends API {
  88. constructor() {
  89. super()
  90. this.setPath('/Admin/QK/Task/Update')
  91. this.setMethod('POST')
  92. }
  93. async onRequest(req, res) {
  94. try {
  95. const { id } = req.body
  96. if (!id) {
  97. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  98. }
  99. await scheduler.adminUpdateTask(id, req.body)
  100. this.logger.info(`[QK][API][AdminUpdateTask] 管理员更新任务 taskId=${id}`)
  101. return res.json({ ...BaseStdResponse.OK })
  102. } catch (err) {
  103. this.logger.error(`管理员更新抢课任务失败:${err.stack || err}`)
  104. return fail(res, err, '更新抢课任务失败')
  105. }
  106. }
  107. }
  108. class CancelTask extends API {
  109. constructor() {
  110. super()
  111. this.setPath('/Admin/QK/Task/Cancel')
  112. this.setMethod('DELETE')
  113. }
  114. async onRequest(req, res) {
  115. try {
  116. const { id } = req.body
  117. if (!id) {
  118. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  119. }
  120. await scheduler.adminCancelTask(id)
  121. this.logger.info(`[QK][API][AdminCancelTask] 管理员取消任务 taskId=${id}`)
  122. return res.json({ ...BaseStdResponse.OK })
  123. } catch (err) {
  124. this.logger.error(`管理员取消抢课任务失败:${err.stack || err}`)
  125. return fail(res, err, '取消抢课任务失败')
  126. }
  127. }
  128. }
  129. class RetryTask extends API {
  130. constructor() {
  131. super()
  132. this.setPath('/Admin/QK/Task/Retry')
  133. this.setMethod('POST')
  134. }
  135. async onRequest(req, res) {
  136. try {
  137. const { id } = req.body
  138. if (!id) {
  139. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  140. }
  141. await scheduler.adminRetryTask(id)
  142. this.logger.info(`[QK][API][AdminRetryTask] 管理员重试任务 taskId=${id}`)
  143. return res.json({ ...BaseStdResponse.OK })
  144. } catch (err) {
  145. this.logger.error(`管理员重试抢课任务失败:${err.stack || err}`)
  146. return fail(res, err, '重试抢课任务失败')
  147. }
  148. }
  149. }
  150. class ListReport extends API {
  151. constructor() {
  152. super()
  153. this.setPath('/Admin/QK/Report/List')
  154. this.setMethod('GET')
  155. }
  156. async onRequest(req, res) {
  157. try {
  158. const result = await scheduler.listAdminReports(req.query)
  159. return res.json({ ...BaseStdResponse.OK, data: result })
  160. } catch (err) {
  161. this.logger.error(`获取抢课回报记录失败:${err.stack || err}`)
  162. return fail(res, err, '获取抢课回报记录失败')
  163. }
  164. }
  165. }
  166. class ListBatch extends API {
  167. constructor() {
  168. super()
  169. this.setPath('/Admin/QK/Batch/List')
  170. this.setMethod('GET')
  171. }
  172. async onRequest(req, res) {
  173. try {
  174. const list = await scheduler.listBatches()
  175. return res.json({ ...BaseStdResponse.OK, data: list })
  176. } catch (err) {
  177. this.logger.error(`获取抢课批次列表失败:${err.stack || err}`)
  178. return fail(res, err, '获取抢课批次列表失败')
  179. }
  180. }
  181. }
  182. class SaveBatch extends API {
  183. constructor() {
  184. super()
  185. this.setPath('/Admin/QK/Batch/Save')
  186. this.setMethod('POST')
  187. }
  188. async onRequest(req, res) {
  189. try {
  190. const { id, name, jx0502zbid, enabled } = req.body
  191. if (!name || !jx0502zbid) {
  192. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  193. }
  194. if (id) {
  195. await scheduler.updateBatch(id, req.body)
  196. this.logger.info(`[QK][API][SaveBatch] 更新批次 batchId=${id}`)
  197. return res.json({ ...BaseStdResponse.OK, data: { id } })
  198. }
  199. const batchId = await scheduler.createBatch({ name, jx0502zbid, enabled })
  200. this.logger.info(`[QK][API][SaveBatch] 创建批次 batchId=${batchId}`)
  201. return res.json({ ...BaseStdResponse.OK, data: { id: batchId } })
  202. } catch (err) {
  203. this.logger.error(`保存抢课批次失败:${err.stack || err}`)
  204. return fail(res, err, '保存抢课批次失败')
  205. }
  206. }
  207. }
  208. module.exports = {
  209. ListClient,
  210. DeleteClient,
  211. ListTask,
  212. GetTask,
  213. UpdateTask,
  214. CancelTask,
  215. RetryTask,
  216. ListReport,
  217. ListBatch,
  218. SaveBatch
  219. }