StartLepao.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const API = require("../../lib/API");
  2. const db = require('../../plugin/DataBase/db')
  3. const Redis = require('../../plugin/DataBase/Redis')
  4. const mq = require('../../plugin/mq')
  5. const {
  6. assertRunforgeTaskIngress,
  7. publishRunforgeTask
  8. } = require('../../plugin/mq/runforgeTaskMq')
  9. const { BaseStdResponse } = require("../../BaseStdResponse")
  10. const { planJkesAutoRun } = require('../../plugin/jkes/monthPolicy')
  11. const { buildAutoRunTaskExtrasFromAccountRow } = require('../../plugin/jkes/autoRunAccountOptions')
  12. const jkesRedisKeys = require('../../plugin/jkes/redisKeys')
  13. class StartLepao extends API {
  14. constructor() {
  15. super();
  16. this.noEncrypt()
  17. this.setPath('/Corn/StartLepao');
  18. this.setMethod('GET');
  19. }
  20. async onRequest(req, res) {
  21. try {
  22. let { time } = req.query
  23. if ([time].some(value => value === '' || value === null || value === undefined))
  24. return res.json({
  25. ...BaseStdResponse.MISSING_PARAMETER
  26. })
  27. res.json({
  28. ...BaseStdResponse.OK
  29. })
  30. this.logger.info('开始执行补充乐跑任务')
  31. const day = new Date().getDay()
  32. let sql = `
  33. SELECT name, student_num, auto_day, token, target_count,
  34. auto_run_distance_min_km, auto_run_distance_max_km, pace_min_sec_per_km, pace_max_sec_per_km
  35. FROM lepao_account
  36. WHERE auto_run = 1 AND state = 1
  37. AND JSON_CONTAINS(auto_day, CAST(? AS JSON))
  38. AND (auto_time = ? OR (auto_time = -1 AND today_auto_time = ?))
  39. `
  40. let r = await db.query(sql, [day, time, time])
  41. if (!r)
  42. return this.logger.error('获取补充乐跑账号失败!')
  43. for (const item of r) {
  44. const { name, student_num, auto_day, token, target_count } = item
  45. const runExtras = buildAutoRunTaskExtrasFromAccountRow(item)
  46. this.logger.info(`${name}(${student_num})开始补充乐跑`)
  47. const isSuccess = await Redis.get(jkesRedisKeys.lepaoSuccess(student_num))
  48. if (isSuccess) {
  49. this.logger.info(`${name}(${student_num})当天已乐跑成功,不执行补充乐跑`)
  50. continue
  51. }
  52. const plan = await planJkesAutoRun(student_num, auto_day, token, {
  53. monthTargetKm: target_count,
  54. stopAfterMinimum: true
  55. })
  56. if (!plan.run) {
  57. this.logger.info(`${name}(${student_num}) JKES 补充乐跑跳过:${plan.reason}`)
  58. continue
  59. }
  60. try {
  61. const channel = await mq.getChannel('lepao_corn')
  62. await assertRunforgeTaskIngress(channel, this.logger)
  63. const taskId = `lepao:repair:${Date.now()}:${student_num}`
  64. const payload = {
  65. id: taskId,
  66. type: 'lepao.startRun',
  67. data: {
  68. taskId,
  69. account: student_num,
  70. targetKm: runExtras.targetKm,
  71. autoDoubleSlot: runExtras.autoDoubleSlot,
  72. paceRandomMinSecPerKm: runExtras.paceRandomMinSecPerKm,
  73. paceRandomMaxSecPerKm: runExtras.paceRandomMaxSecPerKm
  74. },
  75. retry: 0
  76. }
  77. publishRunforgeTask(channel, payload)
  78. this.logger.info(`${name}(${student_num})已投递补充乐跑任务`)
  79. } catch (err) {
  80. this.logger.error(`${name}(${student_num})补充乐跑失败:${err.message || err}`)
  81. }
  82. }
  83. this.logger.info('补充乐跑任务执行完毕')
  84. } catch (error) {
  85. this.logger.error(error)
  86. }
  87. }
  88. }
  89. module.exports.StartLepao = StartLepao