const API = require('../../../lib/API') const { BaseStdResponse } = require('../../../BaseStdResponse') const { TaskScheduler } = require('../../../lib/QK/TaskScheduler') const scheduler = new TaskScheduler() function fail(res, err, fallback = '后台抢课管理操作失败') { return res.json({ ...BaseStdResponse.ERR, msg: err?.message || fallback }) } class ListClient extends API { constructor() { super() this.setPath('/Admin/QK/Client/List') this.setMethod('GET') } async onRequest(req, res) { try { const list = await scheduler.listClients() return res.json({ ...BaseStdResponse.OK, data: list }) } catch (err) { this.logger.error(`获取抢课客户端列表失败:${err.stack || err}`) return fail(res, err, '获取抢课客户端列表失败') } } } class DeleteClient extends API { constructor() { super() this.setPath('/Admin/QK/Client/Delete') this.setMethod('DELETE') } async onRequest(req, res) { try { const { client_id } = req.body if (!client_id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.deleteClient(client_id) this.logger.info(`[QK][API][DeleteClient] 已禁用客户端 clientId=${client_id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`禁用抢课客户端失败:${err.stack || err}`) return fail(res, err, '禁用抢课客户端失败') } } } class ListTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/List') this.setMethod('GET') } async onRequest(req, res) { try { const result = await scheduler.listAdminTasks(req.query) return res.json({ ...BaseStdResponse.OK, data: result }) } catch (err) { this.logger.error(`获取抢课任务列表失败:${err.stack || err}`) return fail(res, err, '获取抢课任务列表失败') } } } class GetTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/Detail') this.setMethod('GET') } async onRequest(req, res) { try { const { id } = req.query if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } const task = await scheduler.getAdminTask(id) if (!task) { return res.json({ ...BaseStdResponse.ERR, msg: '任务不存在' }) } return res.json({ ...BaseStdResponse.OK, data: task }) } catch (err) { this.logger.error(`获取抢课任务详情失败:${err.stack || err}`) return fail(res, err, '获取抢课任务详情失败') } } } class UpdateTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/Update') this.setMethod('POST') } async onRequest(req, res) { try { const { id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.adminUpdateTask(id, req.body) this.logger.info(`[QK][API][AdminUpdateTask] 管理员更新任务 taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`管理员更新抢课任务失败:${err.stack || err}`) return fail(res, err, '更新抢课任务失败') } } } class CancelTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/Cancel') this.setMethod('DELETE') } async onRequest(req, res) { try { const { id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.adminCancelTask(id) this.logger.info(`[QK][API][AdminCancelTask] 管理员取消任务 taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`管理员取消抢课任务失败:${err.stack || err}`) return fail(res, err, '取消抢课任务失败') } } } class RetryTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/Retry') this.setMethod('POST') } async onRequest(req, res) { try { const { id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.adminRetryTask(id) this.logger.info(`[QK][API][AdminRetryTask] 管理员重试任务 taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`管理员重试抢课任务失败:${err.stack || err}`) return fail(res, err, '重试抢课任务失败') } } } class StartTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/Start') this.setMethod('POST') } async onRequest(req, res) { try { const { id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.adminStartTask(id) this.logger.info(`[QK][API][AdminStartTask] 管理员开启任务 taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`管理员开启抢课任务失败:${err.stack || err}`) return fail(res, err, '开启抢课任务失败') } } } class PauseTask extends API { constructor() { super() this.setPath('/Admin/QK/Task/Pause') this.setMethod('POST') } async onRequest(req, res) { try { const { id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.adminPauseTask(id) this.logger.info(`[QK][API][AdminPauseTask] 管理员暂停任务 taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`管理员暂停抢课任务失败:${err.stack || err}`) return fail(res, err, '暂停抢课任务失败') } } } class ListReport extends API { constructor() { super() this.setPath('/Admin/QK/Report/List') this.setMethod('GET') } async onRequest(req, res) { try { const result = await scheduler.listAdminReports(req.query) return res.json({ ...BaseStdResponse.OK, data: result }) } catch (err) { this.logger.error(`获取抢课回报记录失败:${err.stack || err}`) return fail(res, err, '获取抢课回报记录失败') } } } class ListBatch extends API { constructor() { super() this.setPath('/Admin/QK/Batch/List') this.setMethod('GET') } async onRequest(req, res) { try { const list = await scheduler.listBatches() return res.json({ ...BaseStdResponse.OK, data: list }) } catch (err) { this.logger.error(`获取抢课批次列表失败:${err.stack || err}`) return fail(res, err, '获取抢课批次列表失败') } } } class SaveBatch extends API { constructor() { super() this.setPath('/Admin/QK/Batch/Save') this.setMethod('POST') } async onRequest(req, res) { try { const { id, name, jx0502zbid, enabled } = req.body if (!name || !jx0502zbid) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } if (id) { await scheduler.updateBatch(id, req.body) this.logger.info(`[QK][API][SaveBatch] 更新批次 batchId=${id}`) return res.json({ ...BaseStdResponse.OK, data: { id } }) } const batchId = await scheduler.createBatch({ name, jx0502zbid, enabled }) this.logger.info(`[QK][API][SaveBatch] 创建批次 batchId=${batchId}`) return res.json({ ...BaseStdResponse.OK, data: { id: batchId } }) } catch (err) { this.logger.error(`保存抢课批次失败:${err.stack || err}`) return fail(res, err, '保存抢课批次失败') } } } module.exports = { ListClient, DeleteClient, ListTask, GetTask, UpdateTask, CancelTask, RetryTask, StartTask, PauseTask, ListReport, ListBatch, SaveBatch }