prepareAutoRunTask.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const Redis = require('../DataBase/Redis.js')
  2. const jkesRedisKeys = require('./redisKeys.js')
  3. const { planJkesAutoRun, parseAutoDay } = require('./monthPolicy.js')
  4. const { buildAutoRunTaskFromPlan } = require('./autoRunAccountOptions.js')
  5. async function checkAutoRunBlockedToday(studentNum) {
  6. const isSuccess = await Redis.get(jkesRedisKeys.lepaoSuccess(studentNum))
  7. if (isSuccess) {
  8. return { blocked: true, reason: '当天已乐跑成功' }
  9. }
  10. const inProgress = await Redis.get(jkesRedisKeys.lepaoProgress(studentNum))
  11. if (inProgress) {
  12. return { blocked: true, reason: '乐跑进行中' }
  13. }
  14. return { blocked: false }
  15. }
  16. function isAutoRunDayToday(autoDayRaw) {
  17. const days = parseAutoDay(autoDayRaw)
  18. return days.length === 0 || days.includes(new Date().getDay())
  19. }
  20. /**
  21. * 校验当日是否应投递自动乐跑,并合并月度计划距离与双倍日策略。
  22. * @param {object} accountRow lepao_account 行(含 student_num / auto_day / token / target_count 等)
  23. */
  24. async function prepareAutoRunTask(accountRow, options = {}) {
  25. const studentNum = accountRow?.student_num
  26. if (!studentNum) {
  27. return { run: false, reason: '缺少学号' }
  28. }
  29. const blocked = await checkAutoRunBlockedToday(studentNum)
  30. if (blocked.blocked) {
  31. return { run: false, reason: blocked.reason }
  32. }
  33. const plan = await planJkesAutoRun(studentNum, accountRow.auto_day, accountRow.token, {
  34. monthTargetKm: accountRow.target_count,
  35. stopAfterMinimum: options.stopAfterMinimum !== false
  36. })
  37. if (!plan.run) {
  38. return plan
  39. }
  40. const task = buildAutoRunTaskFromPlan(accountRow, plan)
  41. return { run: true, plan, task }
  42. }
  43. function buildStartRunPayload(studentNum, task, options = {}) {
  44. const taskId = options.taskId || `${options.prefix || 'lepao:auto'}:${Date.now()}:${studentNum}`
  45. return {
  46. id: taskId,
  47. type: 'lepao.startRun',
  48. data: {
  49. taskId,
  50. account: studentNum,
  51. targetKm: task.targetKm,
  52. autoDoubleSlot: task.autoDoubleSlot,
  53. paceRandomMinSecPerKm: task.paceRandomMinSecPerKm,
  54. paceRandomMaxSecPerKm: task.paceRandomMaxSecPerKm
  55. },
  56. retry: 0
  57. }
  58. }
  59. module.exports = {
  60. checkAutoRunBlockedToday,
  61. isAutoRunDayToday,
  62. prepareAutoRunTask,
  63. buildStartRunPayload
  64. }