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 GetTask extends API { constructor() { super() this.setPath('/QK/Task') this.setMethod('GET') } async onRequest(req, res) { try { const { uuid, status, student_num, name, batch_id } = req.query const list = await scheduler.listUserTasks(uuid, { status, student_num, name, batch_id }) return res.json({ ...BaseStdResponse.OK, data: list }) } catch (err) { this.logger.error(`获取抢课任务失败:${err.stack || err}`) return fail(res, err, '获取抢课任务失败') } } } class GetTaskDetail extends API { constructor() { super() this.setPath('/QK/Task/Detail') this.setMethod('GET') } async onRequest(req, res) { try { const { uuid, id } = req.query if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } const detail = await scheduler.getTaskDetail(uuid, id) if (!detail) { return res.json({ ...BaseStdResponse.ERR, msg: '任务不存在' }) } return res.json({ ...BaseStdResponse.OK, data: detail }) } catch (err) { this.logger.error(`获取抢课任务详情失败:${err.stack || err}`) return fail(res, err, '获取抢课任务详情失败') } } } class SaveTask extends API { constructor() { super() this.setPath('/QK/Task') this.setMethod('POST') } async onRequest(req, res) { try { const { uuid, id, name, batch_id, student_num, password } = req.body if ([uuid, batch_id, student_num].some(value => value === '' || value === null || value === undefined)) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } if (!id && !password) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER, msg: '新建任务需要填写教务密码' }) } if (id) { await scheduler.updateTask(uuid, id, req.body) this.logger.info(`[QK][API][SaveTask] 用户更新任务 uuid=${uuid} taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } const taskId = await scheduler.createTask(uuid, req.body) this.logger.info(`[QK][API][SaveTask] 用户创建任务 uuid=${uuid} taskId=${taskId} student_num=${student_num}`) return res.json({ ...BaseStdResponse.OK, data: { id: taskId } }) } catch (err) { this.logger.error(`保存抢课任务失败:${err.stack || err}`) return fail(res, err, '保存抢课任务失败') } } } class DeleteTask extends API { constructor() { super() this.setPath('/QK/Task') this.setMethod('DELETE') } async onRequest(req, res) { try { const { uuid, id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.cancelTask(uuid, id) this.logger.info(`[QK][API][DeleteTask] 用户取消任务 uuid=${uuid} 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('/QK/Task/Start') this.setMethod('POST') } async onRequest(req, res) { try { const { uuid, id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.startTask(uuid, id) this.logger.info(`[QK][API][StartTask] 用户开启任务 uuid=${uuid} 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('/QK/Task/Pause') this.setMethod('POST') } async onRequest(req, res) { try { const { uuid, id } = req.body if (!id) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } await scheduler.pauseTask(uuid, id) this.logger.info(`[QK][API][PauseTask] 用户暂停任务 uuid=${uuid} taskId=${id}`) return res.json({ ...BaseStdResponse.OK }) } catch (err) { this.logger.error(`暂停抢课任务失败:${err.stack || err}`) return fail(res, err, '暂停抢课任务失败') } } } module.exports = { GetTask, GetTaskDetail, SaveTask, DeleteTask, StartTask, PauseTask }