updateAccountCore.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. const EmailTemplate = require('../Email/emailTemplate.js')
  2. const { enqueueLepaoStartRun } = require('../mq/enqueueLepaoStartRun')
  3. const mq = require('../mq')
  4. const { BaseStdResponse } = require('../../BaseStdResponse.js')
  5. const Redis = require('../DataBase/Redis.js')
  6. const jkesRedisKeys = require('./redisKeys.js')
  7. const { syncLepaoAccountFromToken } = require('./syncLepaoAccountFromToken.js')
  8. async function executeLepaoTokenUpdate(ctx, req, res) {
  9. const { logger, messageQueue } = ctx
  10. const { token } = req.body
  11. if ([token].some((value) => value === '' || value === null || value === undefined)) {
  12. return res.json({
  13. ...BaseStdResponse.MISSING_PARAMETER
  14. })
  15. }
  16. try {
  17. const sync = await syncLepaoAccountFromToken(token)
  18. if (!sync.ok) {
  19. logger.error(`获取/更新用户信息失败: ${sync.msg}`)
  20. return res.json({
  21. ...BaseStdResponse.ERR,
  22. msg: sync.msg
  23. })
  24. }
  25. const { student_num, findRows, profile } = sync
  26. try {
  27. await Redis.set(jkesRedisKeys.runnerFlag(student_num), '1')
  28. } catch (e) {
  29. logger.error(`${student_num} 写入 jkes_runner 标记失败:${e.message || e}`)
  30. }
  31. let msg
  32. if (findRows[0].auto_run === 1) {
  33. msg = `当前已开启自动乐跑,系统将自动进行乐跑。后续通知将发送到您预留的联系方式,请留意。`
  34. } else {
  35. msg = `当前未开启自动乐跑,如需进行乐跑,请前往 哪吒乐跑 手动执行乐跑操作。后续通知将发送到您预留的联系方式,请留意。`
  36. }
  37. res.json({
  38. ...BaseStdResponse.OK,
  39. data: {
  40. name: profile.name,
  41. user_avatar: profile.user_avatar,
  42. sex: profile.sex,
  43. academy_name: profile.academy_name,
  44. grade_id: profile.grade_id,
  45. class_id: profile.class_id,
  46. auto_run: findRows[0].auto_run,
  47. account: student_num,
  48. msg
  49. }
  50. })
  51. const emailData = {
  52. name: profile.name,
  53. type: 'lepao_update',
  54. umo: findRows[0].bot_umo,
  55. account: student_num,
  56. academy_name: profile.academy_name,
  57. grade_id: profile.grade_id,
  58. auto_run: findRows[0].auto_run
  59. }
  60. if (findRows[0].notice_type === 'bot' && findRows[0].bot_umo) {
  61. logger.info(`${student_num}发送乐跑更新Bot通知,UMO=${findRows[0].bot_umo}`)
  62. const ch = await mq.getChannel(messageQueue)
  63. await ch.assertQueue(messageQueue, { durable: true })
  64. await mq.sendToQueueSafe(
  65. messageQueue,
  66. messageQueue,
  67. Buffer.from(JSON.stringify(emailData)),
  68. { persistent: true, contentType: 'application/json' }
  69. )
  70. logger.info(`${student_num}乐跑更新Bot通知发送完成`)
  71. } else if (findRows[0].notice_type === 'email' && findRows[0].email) {
  72. await EmailTemplate.updateSuccess(findRows[0].email, emailData)
  73. logger.info(`${student_num}乐跑更新邮件发送完成`)
  74. }
  75. if (
  76. findRows[0].auto_run === 1 &&
  77. Array.isArray(findRows[0].auto_day) &&
  78. findRows[0].auto_day.includes(new Date().getDay())
  79. ) {
  80. const { planJkesAutoRun } = require('./monthPolicy')
  81. planJkesAutoRun(student_num, findRows[0].auto_day, token, {
  82. monthTargetKm: findRows[0].target_count,
  83. stopAfterMinimum: true
  84. })
  85. .then((plan) => {
  86. if (plan.run) {
  87. enqueueLepaoStartRun(student_num, logger, {
  88. targetKm: plan.targetKm,
  89. autoDoubleSlot: plan.targetKm >= 2
  90. })
  91. } else {
  92. logger.info(`${student_num} 登录后未触发 JKES 自动乐跑:${plan.reason}`)
  93. }
  94. })
  95. .catch((e) => {
  96. logger.error(`${student_num} JKES 自动乐跑计划失败:${e.message || e}`)
  97. })
  98. }
  99. } catch (error) {
  100. logger.error(`更新用户信息时出错。${error.stack}`)
  101. return res.json({
  102. ...BaseStdResponse.ERR,
  103. msg: '更新用户信息失败,请重试'
  104. })
  105. }
  106. }
  107. module.exports = {
  108. executeLepaoTokenUpdate
  109. }