UpdateAccountiPhone.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. const API = require("../../../../lib/API.js")
  2. const db = require("../../../../plugin/DataBase/db.js")
  3. const axios = require('axios')
  4. const EmailTemplate = require('../../../../plugin/Email/emailTemplate.js')
  5. const config = require('../../../../config.json')
  6. const lepao = require("../../../../lib/Lepao/Lepao.js").lepao
  7. const mq = require('../../../../plugin/mq')
  8. const { BaseStdResponse } = require("../../../../BaseStdResponse.js")
  9. // 客户端上传数据接口
  10. class UpdateAccountiPhone extends API {
  11. constructor() {
  12. super()
  13. this.messageQueue = 'runforge_message_queue'
  14. this.runpy = config.runpy
  15. this.noEncrypt()
  16. this.setPath('/Lepao/UpdateAccountiPhone')
  17. this.setMethod('POST')
  18. }
  19. async onRequest(req, res) {
  20. let { reqData, resData, headers } = req.body
  21. if ([reqData, resData, headers].some(value => value === '' || value === null || value === undefined))
  22. return res.json({
  23. ...BaseStdResponse.MISSING_PARAMETER,
  24. msg: '账号信息不完整,请稍后再试获联系客服处理'
  25. })
  26. try {
  27. const endpoint = config.runpy + '/decrypted_data'
  28. const ReqData = await axios.post(endpoint, { data: reqData })
  29. let userData = ReqData.data
  30. if (userData?.code !== 200 || !userData.data)
  31. return res.json({
  32. ...BaseStdResponse.ERR,
  33. msg: '无法解析用户数据,请重试'
  34. })
  35. const { token } = userData.data
  36. if ([token].some(value => value === '' || value === null || value === undefined))
  37. return res.json({
  38. ...BaseStdResponse.ERR,
  39. msg: '未提取出用户登录信息,请重试'
  40. })
  41. const ResData = await axios.post(endpoint, { data: resData })
  42. let userData2 = ResData.data
  43. if (userData2?.code !== 200 || !userData2.data)
  44. return res.json({
  45. ...BaseStdResponse.ERR,
  46. msg: '无法解析用户数据,请重试'
  47. })
  48. const { uid, user_avatar, student_num, school_id, grade_id, class_id, sex, name, academy_name } = userData2.data
  49. if ([uid, student_num, school_id, grade_id, class_id, sex, name, academy_name].some(value => value === '' || value === null || value === undefined))
  50. return res.json({
  51. ...BaseStdResponse.ERR,
  52. msg: '未提取出用户登录信息,请重试'
  53. })
  54. let findSql = `
  55. SELECT
  56. a.email, a.create_user, a.auto_run, a.auto_day, a.notice_type, e.umo
  57. FROM
  58. lepao_account a
  59. LEFT JOIN
  60. lepao_extra e
  61. ON
  62. a.student_num = e.student_num
  63. WHERE
  64. a.student_num = ? AND a.create_user IS NOT NULL
  65. `
  66. let findRows = await db.query(findSql, [student_num])
  67. if (!findRows)
  68. return res.json({
  69. ...BaseStdResponse.ERR,
  70. msg: '无法解析用户数据,请重试'
  71. })
  72. if (findRows.length === 0)
  73. return res.json({
  74. ...BaseStdResponse.ERR,
  75. msg: '该乐跑账号尚未在RunForge系统中添加,请先添加你的账户'
  76. })
  77. const time = new Date().getTime()
  78. let updateSql = 'UPDATE lepao_account SET uid = ?, token = ?, school_id = ?, name = ?, grade_id = ?, class_id = ?, sex = ?, academy_name = ?, update_time = ?, user_avatar = ?, state = 1, userAgent = ?, deviceModel = ? WHERE student_num = ?'
  79. 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', headers["User-Agent"] ?? 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.29(0x18001d21) NetType/WIFI Language/zh_CN wxwork/5.0.6', 'unknown<iPhone18,3>', student_num])
  80. if (updateRows && updateRows.affectedRows > 0) {
  81. let msg
  82. if (findRows[0].auto_run === 1) {
  83. msg = `当前已开启自动乐跑,系统将自动进行乐跑。后续通知将发送到您的邮箱:${findRows[0].email}。请留意邮箱提醒。`
  84. }
  85. else {
  86. msg = `当前未开启自动乐跑,如需进行乐跑,请前往 RunForge 手动执行乐跑操作。后续通知将发送到您的邮箱:${findRows[0].email},请留意邮箱提醒。`
  87. }
  88. res.json({
  89. ...BaseStdResponse.OK,
  90. data: {
  91. name,
  92. user_avatar,
  93. sex,
  94. academy_name,
  95. grade_id,
  96. auto_run: findRows[0].auto_run,
  97. account: student_num,
  98. msg
  99. }
  100. })
  101. let emailData = {
  102. name,
  103. type: 'lepao_update',
  104. umo: findRows[0].umo,
  105. account: student_num,
  106. academy_name,
  107. grade_id,
  108. auto_run: findRows[0].auto_run
  109. }
  110. if (findRows[0].notice_type === 'bot' && findRows[0].bot_umo) {
  111. this.logger.info(`${account}发送乐跑更新Bot通知,UMO=${rows[0].bot_umo}`)
  112. const ch = await mq.getChannel(this.messageQueue)
  113. await ch.assertQueue(this.messageQueue, {
  114. durable: true
  115. })
  116. ch.sendToQueue(
  117. this.messageQueue,
  118. Buffer.from(JSON.stringify(emailData)),
  119. {
  120. persistent: true,
  121. contentType: 'application/json'
  122. }
  123. )
  124. this.logger.info(`${account}乐跑更新Bot通知发送完成`)
  125. } else if (findRows[0].notice_type === 'email' && findRows[0].email) {
  126. await EmailTemplate.updateSuccess(findRows[0].email, emailData)
  127. this.logger.info(`${account}乐跑更新邮件发送完成`)
  128. }
  129. if (findRows[0].auto_run === 1 && Array.isArray(findRows[0].auto_day) && findRows[0].auto_day.includes(new Date().getDay())) {
  130. lepao.beginLepao(findRows[0].create_user, student_num, token, uid, school_id, 1)
  131. }
  132. }
  133. // 获取新加账号中存在的路径
  134. try {
  135. let sql = 'SELECT id FROM lepao_record WHERE lepao_account = ?'
  136. let rows = await db.query(sql, [student_num])
  137. // 不是老帐号就不获取
  138. if (!rows || rows.length !== 0) return
  139. const reqData = { uid, token, school_id, student_id: student_num }
  140. this.logger.info(`开始请求获取跑步记录 uid=${uid} student_id=${student_num}`)
  141. const recordUrl = this.runpy + '/get_path_data'
  142. await axios.post(recordUrl, reqData)
  143. } catch (error) {
  144. this.logger.info(`获取跑步记录出错 ${error.stack}`)
  145. }
  146. } catch (error) {
  147. this.logger.error(`更新用户信息时出错。${error.stack}`)
  148. return res.json({
  149. ...BaseStdResponse.ERR,
  150. msg: '更新用户信息失败,请重试'
  151. })
  152. }
  153. }
  154. }
  155. module.exports.UpdateAccountiPhone = UpdateAccountiPhone