UpdateAccount.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. const API = require("../../../../lib/API.js")
  2. const db = require("../../../../plugin/DataBase/db.js")
  3. const EmailTemplate = require('../../../../plugin/Email/emailTemplate.js')
  4. const { enqueueLepaoStartRun } = require('../../../../plugin/mq/enqueueLepaoStartRun')
  5. const mq = require('../../../../plugin/mq')
  6. const { mq: mqName } = require('../../../../plugin/mq/mqPrefix')
  7. const { BaseStdResponse } = require("../../../../BaseStdResponse.js")
  8. const { dataDecrypt } = require('../../../../plugin/Lepao/Crypto')
  9. const { enqueueLepaoSyncAccountInfo } = require('../../../../plugin/mq/enqueueLepaoSyncAccountInfo')
  10. const WeixinBindingService = require('../../../../lib/AIChat/WeixinBindingService')
  11. const LepaoWechatTemplate = require('../../../../plugin/Wechat/lepaoWechatTemplate')
  12. // 客户端上传数据接口
  13. class UpdateAccount extends API {
  14. constructor() {
  15. super()
  16. this.messageQueue = mqName('runforge_message_queue')
  17. this.noEncrypt()
  18. this.setPath('/Lepao/UpdateAccount')
  19. this.setMethod('POST')
  20. }
  21. async onRequest(req, res) {
  22. let { reqData, resData } = req.body
  23. if ([reqData, resData].some(value => value === '' || value === null || value === undefined))
  24. return res.json({
  25. ...BaseStdResponse.MISSING_PARAMETER
  26. })
  27. try {
  28. const userData = JSON.parse(dataDecrypt(reqData) || '{}')
  29. if (!userData || Object.keys(userData).length === 0)
  30. return res.json({
  31. ...BaseStdResponse.ERR,
  32. msg: '无法解析用户数据,请重试'
  33. })
  34. const { token } = userData
  35. if ([token].some(value => value === '' || value === null || value === undefined))
  36. return res.json({
  37. ...BaseStdResponse.ERR,
  38. msg: '未提取出用户登录信息,请重试'
  39. })
  40. const userData2 = JSON.parse(dataDecrypt(resData) || '{}')
  41. if (!userData2 || Object.keys(userData2).length === 0)
  42. return res.json({
  43. ...BaseStdResponse.ERR,
  44. msg: '无法解析用户数据,请重试'
  45. })
  46. const { uid, user_avatar, student_num, school_id, grade_id, class_id, sex, name, academy_name } = userData2
  47. if ([uid, student_num, school_id, grade_id, class_id, sex, name, academy_name].some(value => value === '' || value === null || value === undefined))
  48. return res.json({
  49. ...BaseStdResponse.ERR,
  50. msg: '未提取出用户登录信息,请重试'
  51. })
  52. let findSql = `
  53. SELECT
  54. a.email, a.create_user, a.auto_run, a.auto_day, a.notice_type, e.bot_umo, a.today_auto_time, a.auto_time, a.auto_day
  55. FROM
  56. lepao_account a
  57. LEFT JOIN
  58. lepao_extra e
  59. ON
  60. a.student_num = e.student_num
  61. WHERE
  62. a.student_num = ? AND a.create_user IS NOT NULL
  63. `
  64. let findRows = await db.query(findSql, [student_num])
  65. if (!findRows)
  66. return res.json({
  67. ...BaseStdResponse.ERR,
  68. msg: '无法解析用户数据,请重试'
  69. })
  70. if (findRows.length === 0)
  71. return res.json({
  72. ...BaseStdResponse.ERR,
  73. msg: '该乐跑账号尚未在RunForge系统中添加,请先前往 https://xxoo365.top/ 添加你的账户'
  74. })
  75. const account = findRows[0]
  76. const time = new Date().getTime()
  77. const hour = new Date().getHours()
  78. const day = new Date().getDay()
  79. let updateSql = ''
  80. if (hour < 7 && account.auto_run === 1 && !account.today_auto_time && account.auto_time === 1 && account.auto_day.includes(day))
  81. updateSql = 'UPDATE lepao_account SET uid = ?, token = ?, school_id = ?, name = ?, grade_id = ?, class_id = ?, sex = ?, academy_name = ?, update_time = ?, user_avatar = ?, state = 1, update_type = "client", today_auto_time = FLOOR(7 + (RAND() * 15)) WHERE student_num = ?'
  82. else
  83. updateSql = 'UPDATE lepao_account SET uid = ?, token = ?, school_id = ?, name = ?, grade_id = ?, class_id = ?, sex = ?, academy_name = ?, update_time = ?, user_avatar = ?, state = 1, update_type = "client" WHERE student_num = ?'
  84. let updateRows = await db.query(updateSql, [uid, token, school_id, name, grade_id, class_id, sex, academy_name, time, user_avatar ?? 'https://lepao-cloud.xxoo365.top/view.php/25aa126dc406974ff3579a99a2c6501a.png', student_num])
  85. if (updateRows && updateRows.affectedRows > 0) {
  86. let msg
  87. if (findRows[0].auto_run === 1) {
  88. msg = `当前已开启自动乐跑,系统随后将自动进行乐跑。后续通知将发送到您预留的联系方式,请留意。`
  89. }
  90. else {
  91. msg = `当前未开启自动乐跑,如需进行乐跑,请前往 RunForge 手动执行乐跑操作。后续通知将发送到您预留的联系方式,请留意。`
  92. }
  93. res.json({
  94. ...BaseStdResponse.OK,
  95. data: {
  96. name,
  97. academy_name,
  98. grade_id,
  99. auto_run: findRows[0].auto_run,
  100. account: student_num,
  101. avatar: user_avatar ?? 'https://lepao-cloud.xxoo365.top/view.php/25aa126dc406974ff3579a99a2c6501a.png',
  102. msg
  103. }
  104. })
  105. let emailData = {
  106. name,
  107. type: 'lepao_update',
  108. umo: findRows[0].bot_umo,
  109. account: student_num,
  110. academy_name,
  111. grade_id,
  112. auto_run: findRows[0].auto_run
  113. }
  114. if (findRows[0].notice_type === 'bot' && findRows[0].bot_umo) {
  115. this.logger.info(`${student_num}发送乐跑更新Bot通知,UMO=${findRows[0].bot_umo}`)
  116. const ch = await mq.getChannel(this.messageQueue)
  117. await ch.assertQueue(this.messageQueue, {
  118. durable: true
  119. })
  120. ch.sendToQueue(
  121. this.messageQueue,
  122. Buffer.from(JSON.stringify(emailData)),
  123. {
  124. persistent: true,
  125. contentType: 'application/json'
  126. }
  127. )
  128. this.logger.info(`${student_num}乐跑更新Bot通知发送完成`)
  129. } else if (findRows[0].notice_type === 'wechat' && findRows[0].create_user) {
  130. await WeixinBindingService.sendTextToUser(findRows[0].create_user, LepaoWechatTemplate.buildUpdateSuccess(emailData))
  131. } else if (findRows[0].notice_type === 'email' && findRows[0].email) {
  132. await EmailTemplate.updateSuccess(findRows[0].email, emailData)
  133. this.logger.info(`${student_num}乐跑更新邮件发送完成`)
  134. }
  135. if (findRows[0].auto_run === 1 && Array.isArray(findRows[0].auto_day) && findRows[0].auto_day.includes(new Date().getDay())) {
  136. enqueueLepaoStartRun(student_num, this.logger)
  137. }
  138. enqueueLepaoSyncAccountInfo(student_num, this.logger)
  139. }
  140. // 获取新加账号中存在的路径
  141. // try {
  142. // let sql = 'SELECT id FROM lepao_record WHERE lepao_account = ?'
  143. // let rows = await db.query(sql, [student_num])
  144. // // 不是老帐号就不获取
  145. // if (!rows || rows.length !== 0) return
  146. // const reqData = { uid, token, school_id, student_id: student_num }
  147. // this.logger.info(`开始请求获取跑步记录 uid=${uid} student_id=${student_num}`)
  148. // } catch (error) {
  149. // this.logger.info(`获取跑步记录出错 ${error.stack}`)
  150. // }
  151. } catch (error) {
  152. this.logger.error(`更新用户信息时出错。${error.stack}`)
  153. return res.json({
  154. ...BaseStdResponse.ERR,
  155. msg: '更新用户信息失败,请重试'
  156. })
  157. }
  158. }
  159. }
  160. module.exports.UpdateAccount = UpdateAccount;