const EmailTemplate = require('../Email/emailTemplate.js') const { enqueueLepaoStartRun } = require('../mq/enqueueLepaoStartRun') const mq = require('../mq') const { BaseStdResponse } = require('../../BaseStdResponse.js') const Redis = require('../DataBase/Redis.js') const jkesRedisKeys = require('./redisKeys.js') const { syncLepaoAccountFromToken } = require('./syncLepaoAccountFromToken.js') async function executeLepaoTokenUpdate(ctx, req, res) { const { logger, messageQueue } = ctx const { token } = req.body if ([token].some((value) => value === '' || value === null || value === undefined)) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } try { const sync = await syncLepaoAccountFromToken(token) if (!sync.ok) { logger.error(`获取/更新用户信息失败: ${sync.msg}`) return res.json({ ...BaseStdResponse.ERR, msg: sync.msg }) } const { student_num, findRows, profile } = sync try { await Redis.set(jkesRedisKeys.runnerFlag(student_num), '1') } catch (e) { logger.error(`${student_num} 写入 jkes_runner 标记失败:${e.message || e}`) } let msg if (findRows[0].auto_run === 1) { msg = `当前已开启自动乐跑,系统将自动进行乐跑。后续通知将发送到您预留的联系方式,请留意。` } else { msg = `当前未开启自动乐跑,如需进行乐跑,请前往 哪吒乐跑 手动执行乐跑操作。后续通知将发送到您预留的联系方式,请留意。` } res.json({ ...BaseStdResponse.OK, data: { name: profile.name, user_avatar: profile.user_avatar, sex: profile.sex, academy_name: profile.academy_name, grade_id: profile.grade_id, class_id: profile.class_id, auto_run: findRows[0].auto_run, account: student_num, msg } }) const emailData = { name: profile.name, type: 'lepao_update', umo: findRows[0].bot_umo, account: student_num, academy_name: profile.academy_name, grade_id: profile.grade_id, auto_run: findRows[0].auto_run } if (findRows[0].notice_type === 'bot' && findRows[0].bot_umo) { logger.info(`${student_num}发送乐跑更新Bot通知,UMO=${findRows[0].bot_umo}`) const ch = await mq.getChannel(messageQueue) await ch.assertQueue(messageQueue, { durable: true }) ch.sendToQueue(messageQueue, Buffer.from(JSON.stringify(emailData)), { persistent: true, contentType: 'application/json' }) logger.info(`${student_num}乐跑更新Bot通知发送完成`) } else if (findRows[0].notice_type === 'email' && findRows[0].email) { await EmailTemplate.updateSuccess(findRows[0].email, emailData) logger.info(`${student_num}乐跑更新邮件发送完成`) } if ( findRows[0].auto_run === 1 && Array.isArray(findRows[0].auto_day) && findRows[0].auto_day.includes(new Date().getDay()) ) { const { planJkesAutoRun } = require('./monthPolicy') planJkesAutoRun(student_num, findRows[0].auto_day, token, { monthTargetKm: findRows[0].target_count, stopAfterMinimum: true }) .then((plan) => { if (plan.run) { enqueueLepaoStartRun(student_num, logger, { targetKm: plan.targetKm, autoDoubleSlot: plan.targetKm >= 2 }) } else { logger.info(`${student_num} 登录后未触发 JKES 自动乐跑:${plan.reason}`) } }) .catch((e) => { logger.error(`${student_num} JKES 自动乐跑计划失败:${e.message || e}`) }) } } catch (error) { logger.error(`更新用户信息时出错。${error.stack}`) return res.json({ ...BaseStdResponse.ERR, msg: '更新用户信息失败,请重试' }) } } module.exports = { executeLepaoTokenUpdate }